我对 WinDbg 还很陌生,我正在尝试找到一个导致我的应用程序无缘无故挂起的错误。我不确定我做的事情是否正确,但我知道我需要系统 dll 以及我正在调试的 .exe 的符号。因此,我这样设置符号路径:
srv*c:\websymbols*http://msdl.microsoft.com/download/symbols;S:\MY\PATH
第二个路径指向我放置 VS 生成的 .pdb 的文件夹。我确信这是正确的 .pdb 文件,但它是基于不同的体系结构构建的(不确定这是否是一个问题)。我想首先看到完整的堆栈跟踪,所以我运行了 !analyze-v。输出看起来像this http://pastebin.com/00uGSF1k。正如您所看到的,它将 APPLICATION_HANG_WRONG_SYMBOLS 列为主要问题。所以我跑了 .reload /f ,给了我这个输出 http://pastebin.com/Bk2ZnYbG。我没有 dnAnalytics 或 Vertec.Interop 的符号,因此这些错误是有道理的,但缺少一些校验和并且未找到 iphlpapi.pdb。
所以我的问题是:为什么 WinDBG 将错误的符号列为主要问题,即使我确信我确实有正确的 .pdb 文件可用? (我在生成转储的同一台计算机上运行 WinDBG)。即使我的符号看起来是错误的,我在多大程度上可以信任堆栈跟踪?有没有人从堆栈跟踪中看到可能导致我的应用程序挂起的明显问题?任何指示表示赞赏!
这里的“错误符号”可能是因为您使用版本低于 4.0 的 64 位 CLR,并且 !analyze 扩展在解码混合本机/托管堆栈时遇到一些问题。
为什么 WinDBG 寻找 BJM.exe
微软服务器上的符号
这个案例?
这是因为您将符号服务器放在符号路径中的本地路径之前。 Windbg 不知道哪个模块是你的,哪个是微软的。它只是按照符号路径指定的顺序查找模块的 PDB 文件。
即使我的符号看起来是错误的,我在多大程度上可以信任堆栈跟踪?
x64 上的堆栈非常可靠,因为堆栈遍历不需要符号。符号是可靠的(也就是说,你没有错误的符号),除非你强迫 Windbg 忽略错误的时间戳/校验和.reload /f /i
在某些情况下,地址 -> 符号可能看起来是错误的。这通常是由于具有相同代码的小函数(如果函数是虚函数或代码未优化,则在 C++ 代码中很常见)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)