无法在调试版本C ++中获取调用堆栈

时间:2013-02-25 16:27:35

标签: c++ debugging

我有一种奇怪的情况。我的游戏肯定是用调试信息构建的,我可以快乐地点击断点并逐步执行代码,然后查看数据。没有设置是不寻常的。我已经排除了多线程问题。 当我有一个实际的错误和合法的崩溃时,我得不到调用堆栈。典型的崩溃错误将是

First-chance exception at 0x004678da in Democracy3Debug.exe: 0xC0000005: Access violation reading location 0x0000004c.
Unhandled exception at 0x774015de in Democracy3Debug.exe: 0xC0000005: Access violation reading location 0x0000004c.

并且callstack只是ntdll和一些反汇编。我必须在某处更改某些选项,但无法想象。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这些错误表示由于您尝试访问您的进程无法读取或写入的内存而导致的硬件异常。特别是,看起来您直接或间接地尝试从某个指针引用的地址访问某些元素76个字节,但该指针实际上是空的(因此访问冲突读取位置为0x0000004c)。

您的调试信息可能不会以任何方式无效,您可能只是合法地在nt.dll中的某些代码中 - 例如,如果您将空指针传递给不允许它们的Windows API函数。如果您没有为nt.dll加载符号,则不会获得有用的调用堆栈。

访问冲突也可能来自您传递的错误指针,直到Windows API调用某些回调才会使用,这可能解释了为什么您在任何地方都看不到代码 在堆栈框架中。

在VS IDE中启用break-on-throw(调试 - >例外,检查相关异常类型的框)可以帮助您在发生这种情况时提前中断,但如果合法地不直接来自问题,可能无法帮助您诊断问题你的代码。

您还可以使用structured exception handling来集成这些异常和C ++的异常以用于捕获目的。您可能还希望使用symbol server来获取Windows DLL的符号。

答案 1 :(得分:0)

您的异常未被捕获,因此它会将调用堆栈一直向上移动到main并终止您的应用。

MSDN:

  

如果找不到匹配的处理程序(或省略号catch处理程序)   当前异常,预定义的终止运行时函数是   调用。

通常有一个选项允许您在抛出异常时暂停调试。

How to: Break When an Exception is Thrown (Visual Studio 2012)

当你抓住它时,你也可以在顶层有一个catch语句并检查异常(.what()经常给出描述)。

更新:您很可能无法捕获此异常,因为它是一个访问冲突(不是C ++异常,但暂停应该仍然有效)。如果您使用的是Windows,则可以使用SEH来捕获它。