C++ 在调试生成C+;中获取调用堆栈失败+;

C++ 在调试生成C+;中获取调用堆栈失败+;,c++,debugging,C++,Debugging,我有一个奇怪的情况。我的游戏肯定是用调试信息构建的,我可以愉快地点击断点,逐步完成代码,查看数据。没有异常设置。我已经排除了多线程的问题。 当我有一个真正的bug和一个合法的崩溃时,我没有得到任何调用堆栈。一个典型的崩溃错误是 First-chance exception at 0x004678da in Democracy3Debug.exe: 0xC0000005: Access violation reading location 0x0000004c. Unhandled excepti

我有一个奇怪的情况。我的游戏肯定是用调试信息构建的,我可以愉快地点击断点,逐步完成代码,查看数据。没有异常设置。我已经排除了多线程的问题。 当我有一个真正的bug和一个合法的崩溃时,我没有得到任何调用堆栈。一个典型的崩溃错误是

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.

调用堆栈只是ntdll和一些反汇编。我一定在什么地方改变了一些选择,但无法想象会发生什么。有什么想法吗?

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

MSDN:

如果找不到的匹配处理程序(或省略号捕获处理程序) 当前异常是预定义的终止运行时函数 打电话来

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

您还可以在顶层使用catch语句,并在捕获异常时检查异常(.what()通常给出描述)


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

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

MSDN:

如果找不到的匹配处理程序(或省略号捕获处理程序) 当前异常是预定义的终止运行时函数 打电话来

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

您还可以在顶层使用catch语句,并在捕获异常时检查异常(.what()通常给出描述)


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

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

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

访问冲突也可能来自于您传递的错误指针,该指针在Windows API调用某个回调之前未被使用,这可能解释了为什么您在堆栈框架中的任何位置都看不到代码

在VS IDE中启用触发中断(调试->异常,选中相关异常类型的复选框)可以帮助您在发生这种情况时提前中断,但如果问题不是直接来自代码,则可能无助于诊断问题


您还可以使用来集成这些异常和C++的异常,以便捕获。您可能还希望使用来获取Windows DLL的符号。

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

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

访问冲突也可能来自于您传递的错误指针,该指针在Windows API调用某个回调之前未被使用,这可能解释了为什么您在堆栈框架中的任何位置都看不到代码

在VS IDE中启用触发中断(调试->异常,选中相关异常类型的复选框)可以帮助您在发生这种情况时提前中断,但如果问题不是直接来自代码,则可能无助于诊断问题


您还可以使用来集成这些异常和C++的异常,以便捕获。您可能还希望使用获取Windows DLL符号的方法。

您也可以简单地避免使用异常。在游戏开发中,我没有看到任何问题,但这些错误信息并不能说明正在抛出C++异常。他们指的是硬件异常(这看起来像是试图通过空指针访问成员)。啊,很抱歉,那么。下一个想法:错误在Windows DLL中发生得太深,在这种情况下,您需要使用MS中的符号文件来解释此类错误。您也可以简单地避免使用异常。在游戏开发中,我没有看到任何问题,但这些错误信息并不能说明正在抛出C++异常。他们指的是硬件异常(这看起来像是试图通过空指针访问成员)。啊,很抱歉,那么。下一个想法:错误在Windows DLL中发生得太深了,在这种情况下,您需要使用MS中的符号文件来理解此类错误。