我对 WinDbg 还很陌生,我正在尝试找到一个导致我的应用程序无缘无故挂起的错误。我不确定我做的事情是否正确,但我知道我需要系统 dll 以及我正在调试的 .exe 的符号。因此,我像这样设置符号路径:
srv*c:\websymbols*http://msdl.microsoft.com/download/symbols;S:\MY\PATH
第二个路径指向我放置 VS 生成的 .pdb 的文件夹。我确信这是正确的 .pdb 文件,但它是基于不同的体系结构构建的(不确定这是否是一个问题)。我想首先看到完整的堆栈跟踪,所以我运行了 !analyze-v。输出看起来像 this 。正如您所看到的,它将 APPLICATION_HANG_WRONG_SYMBOLS 列为主要问题。所以我运行了.reload/f,给了我this output 。我没有 dnAnalytics 或 Vertec.Interop 的符号,因此这些错误是有道理的,但缺少一些校验和并且未找到 iphlpapi.pdb。
所以我的问题是:为什么 WinDBG 将错误的符号列为主要问题,即使我确信我确实有正确的 .pdb 文件可用? (我在生成转储的同一台计算机上运行 WinDBG)。即使我的符号看起来是错误的,我在多大程度上可以信任堆栈跟踪?有没有人从堆栈跟踪中看到可能导致我的应用程序挂起的明显问题?任何指示表示赞赏!
最佳答案
这里的“错误符号”可能是因为您使用的 64 位 CLR 版本低于 4.0,并且 !analyze 扩展在解码混合 native /托管堆栈时遇到一些问题。
Why is WinDBG looking for the BJM.exe symbols on the microsoft server in this case?
这是因为您将符号服务器放在符号路径中的本地路径之前。 Windbg 不知道哪个模块是你的,哪个是微软的。它只是按照符号路径指定的顺序查找模块的 PDB 文件。
To what extent can I trust the stack trace even thought my symbols are wrong, appearently?
x64 上的堆栈非常可靠,因为堆栈遍历不需要符号。符号是可靠的(也就是说,你没有错误的符号),除非你用 .reload/f/i
强制 Windbg 忽略错误的时间戳/校验和
在某些情况下,地址 -> 符号可能看起来是错误的。这通常是由于具有相同代码的小函数(如果函数是虚拟的或代码未优化,则在 C++ 代码中很常见)
关于debugging - WinDbg:APPLICATION_HANG_WRONG_SYMBOLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5818679/