c++ - 如何创建另一个进程内存的二进制/十六进制转储?

标签 c++ memory process

我找不到将另一个进程的内存转储到文件的合理方法。

经过大量搜索,我在 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 的*全部*内容以获取进程的运行内存。

我正在寻找一种方法来获取 30KB 进程的 30-60KB,而不是 30KB 进程的 25MB。或者至少比我目前能得到的更近。

在此先感谢您的建议和指导,不胜感激。

注意:这是针对控制台实用程序的,因此 CodeProject 文章中的 GUI 元素并不重要。

最佳答案

您基本上是在请求用户进程小型转储。 Windows 调试帮助程序库有一个现成的函数,MiniDumpWriteDump .

MINIDUMP_TYPE 的小型转储中包含的详细信息量进行粗略控制。传递给函数的参数。最基本的,MiniDumpNormal,只会捕获进程中每个线程的调用堆栈。对于其他小型转储类型,内存量会逐渐变得更加详细。

您还可以通过向 MiniDumpWriteDump 函数提供回调来精细控制要写入小型转储的信息量,并在回调中设置 MINIDUMP_CALLBACK_OUTPUT 上的标志> 结构。

生成的小型转储可以是 read使用 Windbg 或 Visual Studio 等调试器,或者它们可以由 various functions in the dbghelp.dll 处理图书馆。

关于c++ - 如何创建另一个进程内存的二进制/十六进制转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1296947/

相关文章:

c - 在子进程中操作来自父亲的 var

C# System.Diagnostics.Process.Start() 参数

c++ - 如何使用 POSIX 在 C++ 中执行命令并获取命令的输出?

c++ - numeric_limits<double>::digits10 是什么意思

memory - 确定 node.js 内存泄漏的好方法是什么?

c++ - 图像旋转 OpenCV 错误

push_back 到静态 vector 后的 C++ 释放

c - 在制作大缓冲区时,使用 malloc 分配缓冲区是否比使用静态分配的缓冲区更快?

c++ - 如何使用 Makefile 规则将 .o 文件放入单独的目录

C++模板模板非类型参数