我无法找到合理的方法将另一个进程的内存转储到文件中。
经过广泛搜索,我已经能够在CodeProject上找到一篇很棒的文章,它有*我想要的大部分功能: Performing a hex dump of another process's memory.这很好地解决了权限问题,并奠定了良好的基础。
但是,使用此实用程序,我发现即使是一个小的进程,例如干净的Notepad.exe或Calc.exe实例,也可以生成大小超过24MB的转储文件,而进程本身在内存中运行不到20KB根据TaskManager。
这篇文章让我相信,也许它也会在共享内存中丢弃东西,可能还有DLL空间等。例如,Calc.exe的转储将包含包含来自Kernel32.dll的方法名称(以及可能是内存)的部分:
²³´µKERNEL32.dll ActivateActCtx AddAtomA AddAtomW AddConsoleAliasA AddConsoleAliasW AddLocalAlternateComputerNameA AddLocalAlternateComputerNameW AddRefActCtx AddVectoredExceptionHandler AllocConsole AllocateUserPhysicalPages AreFileApisANSI AssignProcessToJobObject AttachConsole BackupRead BackupSeek BackupWrite BaseCheckAppcompatCache BaseCleanupAppcompatCache
有没有更好的方法来转储不会导致这种开销的另一个进程的内存,或者可能是对解决此问题的链接文章代码的改进?我想获得实际属于进程本身的内存。我可以转储DLL中实际使用的函数的内存空间,但似乎没有必要转储多个DLL的* whole *内容来获取进程的运行内存。
我正在寻找一种获得30-60KB 30KB进程的方法,而不是30MB进程的30MB进程。或者至少比目前更接近。
提前感谢您的建议和指导,非常感谢。
注意:这适用于控制台实用程序,因此类似于CodeProject文章中的GUI元素并不重要。
答案 0 :(得分:3)
你基本上要求用户进程minidump。 Windows Debug Helper库有一个现成的函数MiniDumpWriteDump
。
从传递给函数的MINIDUMP_TYPE
参数可以粗略地控制迷你转储中包含的详细信息量。最基本的MiniDumpNormal
只捕获进程中每个线程的调用堆栈。使用其他迷你转储类型,内存量逐渐变得更加详细。
您还可以通过向MiniDumpWriteDump
函数提供回调并在回调中设置MINIDUMP_CALLBACK_OUTPUT
结构上的标记来精确控制要写入迷你转储的信息量。
结果迷你转储可以read使用Windbg或Visual Studio等调试器,也可以由various functions in the dbghelp.dll库处理。
答案 1 :(得分:1)
不是真正的“如何编程”的答案,但我在寻找可以做到这一点的工具时找到了你的问题,当我遇到PMDump:
http://ntsecurity.nu/toolbox/pmdump/
使用简单易用,并创建正确的转储(我只是尝试了一些程序)。