WinDbg缺少托管代码的符号

WinDbg缺少托管代码的符号,windbg,symbols,Windbg,Symbols,我在让WinDbg将这些文件用于我的DLL文件时遇到问题。 我正在查看的挂起转储来自生产版本,但我有来自相同代码的调试版本的PDB文件 我将符号路径设置为包含本地文件夹和Microsoft符号服务器 C:\websymbols\foo;srv*c:\websymbols*http://msdl.microsoft.com/download/symbols 我把所有的PDB文件都放在C:\websymbols\foo中。但是,托管堆栈列表不包含任何方法名称 重新加载时,.reload/f,告诉我

我在让WinDbg将这些文件用于我的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
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

在测试环境中将WinDbg附加到服务时,托管堆栈会显示方法名。转储内存,并在本地分析DMP文件,我在托管堆栈中看不到名称。我可能做错了什么?

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


无论何时您将BIT发布到野外,您的构建团队都应该存储私有PDB文件以供参考,以防六个月后您不得不盯着一个转储…

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

最重要的是 开发人员需要知道:PDB文件是 和源代码一样重要。。。我已经 我去过无数的公司帮忙 他们花了数百美元调试那些bug 几千美元,没人能做到 查找生成的PDB文件 在生产服务器上运行。 如果没有匹配的PDB文件 刚刚完成了调试挑战 几乎不可能

你可以尝试你的运气与一个邪恶的工具称为,愚弄VS接受任何PDB你扔给它。只需知道,获得任何有意义的堆栈的机会几乎为零——PE布局对代码更改极其敏感,从技术上讲,甚至两个版本的相同源代码也是如此


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

好的,我问错了问题。我甚至不需要.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
告诉我的机器上运行时:

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
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

顺便说一句,如果您没有发布位pdb,那么您应该登记并获得发布时的源代码树,然后使用与发布版本相同的设置进行构建。理想情况下,您的源树应该标记每个relese,并且可以很容易地在特定标记处获取树。如果您得到的构建与relese是相同的,那么PDB将加载。最终,您可以通过显式地指定大小和时间戳来强制使用/reload/f中的符号,ovewriding dbg的决定:。里程数会有所不同。Remus,构建过程包括在生成的二进制文件中嵌入构建GUID,用于匹配。同步源代码是不够的。@Ofek:在我辉煌的岁月里,我曾多次使用.reload/f和显式地址/大小/时间戳强制重载不匹配构建中的符号。Windbg将呕吐,但接受不匹配的符号。虽然很少有回报,但拥有正确的符号会好得多。使用相同的源代码,但不同的构建,.reload/f/i强制windbg接受不匹配的符号。顺便说一句,您是否加载了sos并从sos中转储了clr堆栈?即使没有符号,程序集也有丰富的元数据,因此堆栈没有参数通常只能从模块信息中转储。是的,2.0 sos,我也认为对于.net代码,我甚至根本不需要pdb。这几乎告诉我我问错了问题,这不是一个符号问题。事实证明,在服务器上运行windbg时,我获得了有意义的堆栈信息。一旦我在本地发现问题,我将发布更新。