2

我在让 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 文件我看不到托管堆栈中的名称。我可能做错了什么?

4

3 回答 3

7

您需要完全相同的 PDB 文件。调试符号不适用于零售转储。您需要来自完全相同构建的 PDB 文件。

每当您将位发布到野外时,您的构建团队都应该存储私有 PDB 文件以供参考,以防您在六个月后不得不盯着转储...

于 2009-09-10T18:03:43.243 回答
3

你现在对此无能为力。正如约翰罗宾斯所说

所有开发人员都需要知道的最重要的事情:PDB 文件与源代码一样重要!...我去过无数公司帮助他们调试那些花费数十万美元的错误,没有人能找到在生产服务器上运行的构建的 PDB 文件。如果没有匹配的 PDB 文件,您的调试挑战几乎是不可能的。

你可以用一个叫做ChkMatch的邪恶工具来试试运气,欺骗 VS 接受你扔给它的任何 PDB。只要知道你得到任何有意义的堆栈的机会几乎为零 - PE 布局对代码更改极为敏感,从技术上讲,即使是相同源的两个构建也不能保证提供相同的 PE

[编辑:] 抱歉,刚刚注意到您使用的是 WinDBG。在这种情况下,正如 Remus 所说, .reload /f /i 可以实现相同的技巧(具有相同的风险)。

于 2009-09-10T18:36:01.470 回答
1

好吧,我问错问题了。我什至不需要 .NET 代码的符号(正如 Remus 指出的那样)。所以这不是我问题的答案,而是我的问题的解决方案,这似乎与运行 WinDbg 的机器上的 .NET 构建有关。

.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
于 2009-09-11T05:30:01.170 回答