debugging - WinDbg:APPLICATION_HANG_WRONG_SYMBOLS

标签 debugging windbg symbols debug-symbols freeze

我对 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/

相关文章:

java - 如何将调试器附加到 WAS?

vb6 - WinDbg:如何让 WinDbg 的 Locals/Watch 支持复杂的 VB6 类型(集合、自定义类)?

math - 就内存而言,在 Julia 中将公式保存为字符串还是表达式(符号)更好

java - 在 JavaFX 中设置按钮操作时出现 "Cannot find symbol constructor, EventHandler does not take parameters"

javascript - 在 Chrome 中调试 .vue 组件

java - 无法从类型 SpecialAssignment1 静态引用非静态方法 printMenuGetSelection()

c - 在 C 中使用 getopt 作为命令行参数

c++ - 在 windbg 中查找 STL 双端队列的元素计数

.net - 使用 WinDBG 从 PDB 获取函数签名

c++ - ld 错误的符号