如果有一种方法可以指示windbg / loader在给定地址加载尚未加载的模块,那将很有帮助。这样可以使某些脚本/文本比较容易得多。
是的,我确实意识到,例如,相对于符号名称设置断点应该是首选,而不是使用固定的地址,但是能够“重现”参考调试环境绝对具有某些优势。
假设我们正在处理第三方DLL(我无法使用预定义的加载地址重新编译),有没有办法做到这一点?
我很高兴看到.reload
命令具有一个地址参数,该参数看起来确实可以满足我的要求。但是,即使该命令将加载模块,但在继续执行程序时(需要实际加载dll),它仍将继续并为同一模块加载另一个copy(?),并给出如下警告: / p>
WARNING: moduleX_1be0000 overlaps moduleX
所以它并没有真正按照我的预期工作,所以这个问题!
答案 0 :(得分:1)
WinDbg不会加载模块(DLL)。这些模块由可执行文件加载。
WinDbg的ld
和.reload
命令不会加载模块,它们会加载符号信息(PDB文件)。
更改模块地址的过程称为重定基。如果基址不再可用,例如已被堆使用。在这种情况下,您根本无法阻止重新部署。
可能有帮助的一件事是禁用ASLR(地址空间布局随机化)。您可以在DLL或EXE中更改该设置。它是COFF标头的一部分:
在Windows 7上,有to disable ASLR completely种方法,但是不建议您在每个系统的基础上更改该设置,只是为了帮助您调试单个进程。
另一种选择是使用Windows SDK的rebase.exe
并将基地址更改为您认为在加载DLL时更有可能释放的虚拟地址。我从来没有自己做过,但是rebase
帮助说:
如果要重新设置为固定地址(ala QFE) 使用@@ files.txt格式,其中files.txt包含 地址/大小组合以及文件名
所以,听起来可以定义您自己的地址。