强制 WinDbg 加载已卸载模块的符号

Posted

技术标签:

【中文标题】强制 WinDbg 加载已卸载模块的符号【英文标题】:Forcing WinDbg to load symbols of an unloaded module 【发布时间】:2012-06-14 07:37:20 【问题描述】:

我正在调试一个只有 .exe 和 .pdb 没有私有符号的模块。 在调试会话期间,我需要检查一个内部结构。显然,这个结构不会出现在 PDB 中,因为它是私有的 - 但幸运的是,我有一个 .h 文件,其中定义了这个结构。因此,我可以构建一些使用此结构的虚拟模块并获取包含此结构的 PDB 文件。

现在我有一个带有结构符号的未加载模块,我想加载它的符号以便将一些内存投射到该结构。 (当然没有卸载我正在调试的原始 .exe) 问题:WinDbg 似乎只允许为加载的模块加载符号...

我的问题是:有没有一种简单的方法可以从卸载的模块中加载符号?

我试过.reload /i /f MyDll.dll,但我总是得到...MyDll.dll - unmatched。 设置同情没有帮助。

有什么想法吗?

【问题讨论】:

【参考方案1】:

更好的方法是.reload /unl MyDll.dll

卸载的模块列表包含时间戳(用于图像/pdb 匹配)和图像基地址。使用 /unl 告诉 WinDBG 使用该信息。

【讨论】:

谢谢你:你的命令是唯一对我有用的变体!【参考方案2】:

您可以强制 windbg 在特定地址加载符号,例如

0:000> .reload /f /i MyDll.dll=77777777
    c:\sym\MyDll.pdb - unmatched
0:000> lm
start             end                 module name
00000000`55555555 00000000`55555555   notepad    (no symbols)
00000000`77530000 00000000`7762a000   USER32     (deferred)
00000000`77777777 00000000`77777777   MyDll_77777777   (private pdb symbols)  c:\sym\MyDll.pdb

这里的不匹配警告是因为 windbg 无法判断符号与模块的正确版本匹配,因为它找不到时间戳或校验和。

【讨论】:

以上是关于强制 WinDbg 加载已卸载模块的符号的主要内容,如果未能解决你的问题,请参考以下文章

符号延迟加载

符号延迟加载

WinDbg 加载符号需要很长时间;正在搜索大型网络 UNC 符号存储中的每个目录

WinDbg常用命令系列---符号相关命令

windbg 出现重复的星星框提示时

windbg符号加载和调试