我正在使用完整符号构建我的应用程序的调试版本。我在下一行设置了一个断点:
抛出std :: range_error(“无效的utf32”);
当断点命中时,我的堆栈看起来很正常。我可以看到我的所有惯例。但是如果我运行,并且让异常被抛出,我会看到一个毫无价值的堆栈。它有MyApp.exe!_threadstartex()到底部,一些标记为kernel32.dll的禁用条目,以及“下面的框架可能不正确和/或缺失”等行。
这太糟糕了!因为我的调试版本中经常出现异常,这个5000美元的开发环境甚至没有显示我自己的堆栈!我静态链接所有内容,因此它不是DLL问题。
帮助!
答案 0 :(得分:3)
问题是您没有为调试器停止的位置加载任何调试符号。这意味着调用堆栈的其余部分是无意义的。
幸运的是,解决方案很简单:从调用堆栈窗口的顶部开始,右键单击每个灰色的条目(例如KernelBase.dll!...)并选择从/ Microsoft Symbol服务器加载符号的。在为一两个条目执行此操作后,将显示您的真实调用堆栈。
答案 1 :(得分:3)
我打赌问题是你没有启用“中断异常”。我有同样的问题,不敢相信我找不到有用的答案......我的vs2008怎么配置不同?我不知道。但有一天,当调试程序崩溃时,我的调用堆栈变得无用。最后,我去检查了所有这些异常类,以使程序“异常中断”,现在它在抛出异常(例如访问不良)时正确,并且我有一个有用的调用堆栈来调试。耶!
答案 2 :(得分:2)
我觉得你混淆了。这里。
如果你在一些catch语句中捕获异常,或者它被传播直到你的堆栈被解开,你不能指望VC ++记住整个堆栈。
例如,在Java堆栈中,跟踪是异常本身的一部分。依赖于您的编译器,您可以编写一个异常类,它记录堆栈跟踪(如果它是构造的(但不是复制构造)并携带信息)。当课程被捕获时,您可以评估信息。如果使用MFC编程,请查看AfxDumpStack。
希望有所帮助,
Ovanes
P.S:这篇DDJ文章可能对您有所帮助:C++ Stack Traces
答案 3 :(得分:1)
可能你正在看错误线程的callstack。 转到Tread Panel,在Debug-> Windows-> Threads中,然后选择正确的线程。