强制WinDbg加载未加载模块的符号

21

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

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

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

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

有什么想法吗?

2个回答

25
更好的方法是.reload /unl MyDll.dll
卸载的模块列表包含时间戳(用于图像/pdb匹配)和图像基址。 使用/unl告诉WinDBG使用这些信息。

1
谢谢:您的命令是唯一有效的变化对我来说! - olegvs

22

你可以强制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无法确定符号是否与正确版本的模块相匹配,因为它找不到时间戳或校验和。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接