Visual c++ 为什么有时转储文件中的调用堆栈看起来不正确?

Visual c++ 为什么有时转储文件中的调用堆栈看起来不正确?,visual-c++,Visual C++,最近我们遇到了一个应用程序冻结的生产问题,我们试图闯入并分析转储文件,不幸的是转储文件的调用堆栈看起来不好,很难找到冻结的原因 如果应用程序挂起而不是崩溃,请尝试加载到windbg并运行!分析-v-hang或尝试在挂起模式下使用。这将尝试确定挂起的原因,这将为您提供更有意义的调用堆栈。!locks命令在出现死锁时也很有用,它可以显示资源上的阻塞情况。调用堆栈看起来不正确的两个原因: 堆栈可能已损坏。如果堆栈由于某种原因(例如,由于堆栈上分配的缓冲区溢出)而损坏,则所有堆栈帧都将被销毁。这使得无法

最近我们遇到了一个应用程序冻结的生产问题,我们试图闯入并分析转储文件,不幸的是转储文件的调用堆栈看起来不好,很难找到冻结的原因

如果应用程序挂起而不是崩溃,请尝试加载到windbg并运行
!分析-v-hang
或尝试在挂起模式下使用。这将尝试确定挂起的原因,这将为您提供更有意义的调用堆栈。
!locks
命令在出现死锁时也很有用,它可以显示资源上的阻塞情况。

调用堆栈看起来不正确的两个原因:

  • 堆栈可能已损坏。如果堆栈由于某种原因(例如,由于堆栈上分配的缓冲区溢出)而损坏,则所有堆栈帧都将被销毁。这使得无法计算呼叫者列表

  • 您使用的符号(如果有的话)可能不适合崩溃的二进制文件。您需要使用与编译二进制文件时使用的符号完全相同的符号。对源代码稍加修改即可使所有符号无效


  • 如果您调用Windows API,然后Windows API在同一线程上调用您(例如,通过Windows消息处理程序),Windows DLL中的操作使用调试器无法解释的堆栈约定并不少见。在执行c/c++函数/方法期间,不要求堆栈始终可跟踪,堆栈相关寄存器可用于其他目的,并且可以忽略堆栈信息的标准存放位置。我在Windows中经常看到这一点。

    谢谢,如果我可以复制这些命令,我可以在半成品环境中尝试这些命令。对于生产,技术人员没有时间等待我们调试。符号应该与二进制匹配。可能堆栈已损坏。