我遇到问题,让WinDbg将PDB文件用于我的.NET DLL文件。 我正在查看的挂起转储来自生产版本,但是我从相同代码的调试版本中获得了PDB文件。
我将符号路径设置为包含本地文件夹和Microsoft符号服务器。
C:\websymbols\foo;srv*c:\websymbols*http://msdl.microsoft.com/download/symbols
我将所有PDB文件都放在C:\websymbols\foo
中。但是,托管堆栈列表不包含任何方法名称。
重新加载.reload /f
,告诉我:
DBGHELP: No debug info for FOO.dll. Searching for dbg file
SYMSRV: c:\websymbols\foo\FOO.dbg\49B7F17C10000\FOO.dbg not found
SYMSRV: c:\websymbols\FOO.dbg\49B7F17C10000\FOO.dbg not found
SYMSRV: http://msdl.microsoft.com/download/symbols/FOO.dbg/49B7F17C10000/FOO.dbg not found
DBGHELP: .\FOO.dbg - file not found
DBGHELP: .\dll\FOO.dbg - path not found
DBGHELP: .\symbols\dll\FOO.dbg - path not found
DBGHELP: FOO.dll missing debug info. Searching for pdb anyway
DBGHELP: Can't use symbol server for FOO.pdb - no header information available
DBGHELP: FOO.pdb - file not found
*** WARNING: Unable to verify checksum for FOO.dll
*** ERROR: Module load completed but symbols could not be loaded for FOO.dll
DBGHELP: FOO - no symbols loaded
在测试环境中将WinDbg附加到服务时,托管堆栈显示方法名称正常。转储内存,并在本地分析DMP文件我没有看到托管堆栈中的名称。我可能做错了什么?
答案 0 :(得分:7)
您需要完全相同的PDB文件。调试符号不适用于零售转储。并且您需要完全相同构建的PDB文件。
每当你向野外发布时,你的构建团队应该存储私有PDB文件以供参考,以防你六个月后必须盯着转储......
答案 1 :(得分:3)
现在你无能为力。正如John Robbins says:
最重要的是 开发人员需要知道:PDB文件是 和源代码一样重要! ... 我有 曾经无数公司帮忙 他们调试那些花费数百的bug 几千美元,没人能 找到构建的PDB文件 在生产服务器上运行。 没有匹配的PDB文件你 刚刚进行了调试挑战 几乎不可能。
你可以用一个名为ChkMatch的邪恶工具试试你的运气,愚弄VS以接受你抛出的任何PDB。只要知道机会接近于零,你就会得到任何有意义的堆栈 - PE布局对代码更改非常敏感,技术上甚至两个相同来源的版本都是not guaranteed to give the same PE。
[编辑:]抱歉,您注意到您使用的是WinDBG。在那种情况下,正如Remus所说,.reload / f / i可以实现相同的技巧(具有相同的风险)。
答案 2 :(得分:1)
当.chain
告诉我这个时,我得到了有意义的堆栈信息:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos: image 2.0.50727.**1433**, API 1.0.0, built Tue Oct 23 20:41:30 2007
(与服务器上的转储相同。)
在!clrstack
告诉我的机器上运行时,我没有获得.chain
地址以外的任何信息:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos: image 2.0.50727.**3053**, API 1.0.0, built Fri Jul 25 07:08:38 2008