我可以使用各种工具轻松转储进程的整个内存空间。
但是有可能只转储由某个进程加载的DLL所使用的内存空间吗?我应该使用哪些工具?
谢谢,
吉姆
答案 0 :(得分:0)
您可能意味着查看DLL中代码分配的内存。
我认为这是不可能的。如果DLL分配内存,并且DLL是用C ++编写的,并且C / C ++运行时是动态链接的(即作为DLL),那么它将使用与主应用程序相同的C / C ++运行时,并且所有DLL都已分配内存将在同一堆上分配。
即使DLL将静态链接的C / C ++运行时,或者DLL是用其他语言编写的,它也可能使用相同的默认Windows堆。
如果您自己可以控制DLL,可以尝试为您的DLL实现自定义内存管理器(在C ++中这意味着覆盖新的和删除,总共6个全局运算符),尝试使用不同的(即非默认情况下)Windows堆,然后使用低级Windows调试器WinDbg的heapwalk方法,但要使这一切全部正常工作将非常困难。或者您的DLL的自定义内存管理器可以使用VirtualAlloc(或非固定,然后记录虚拟地址)在固定地址分配内存。然后,您可以在正常进程内存转储中查看此地址空间。