代码之家  ›  专栏  ›  技术社区  ›  Vinnie Falco

Visual Studio 2008团队:引发异常时没有调用堆栈

  •  2
  • Vinnie Falco  · 技术社区  · 16 年前

    我正在用完整的符号构建应用程序的调试版本。我在以下行设置了一个断点:

    throw std::range_error(“invalid utf32”);

    当断点命中时,我的堆栈看起来正常。我能看到我所有的例行程序。但是如果我运行,让异常被抛出,我会看到一个毫无价值的堆栈。它有myapp.exe!_ threadstartex()位于底部,一些被禁用的条目标记为kernel32.dll,行“下面的帧可能不正确和/或丢失”等。

    这真是糟透了!因为我经常会在我的调试构建中得到一个异常,而这个$5000的开发环境甚至没有显示我自己的堆栈!我正在静态链接所有东西,所以它不是一个动态链接库问题。

    救命!

    4 回复  |  直到 13 年前
        1
  •  2
  •   ovanes    16 年前

    我想你搞错了。在这里。

    如果您在某个catch语句中捕获异常,或者将异常传播到主堆栈被释放,并且您不能期望vc++记住整个堆栈。

    例如,Java堆栈跟踪是异常本身的一部分。依赖于编译器,您可以编写一个异常类,如果堆栈跟踪是构造的(而不是复制构造的),它将记录并携带信息。当类被捕获时,您可以计算该信息。如果使用MFC编程,请查看afxdumpstack。

    希望能有所帮助,
    奥凡内斯

    P.S:这篇DDJ文章可能对您有所帮助: C++ Stack Traces

        2
  •  3
  •   Michael Platings Chris B.    13 年前

    问题是,没有为调试器停止的位置加载任何调试符号。这意味着调用堆栈的其余部分是无意义的。

    幸运的是,解决方案很简单:从调用堆栈窗口的顶部开始,右键单击每个灰显条目(例如kernelbase.dll!)……并选择 从/Microsoft符号服务器加载符号 . 对一个或两个条目执行此操作后,将显示真正的调用堆栈。

        3
  •  3
  •   thomas    13 年前

    我敢打赌问题是您没有启用“异常中断”。我也遇到了同样的问题,我不敢相信我找不到有用的答案……我的VS2008是如何被配置成不同的?我不知道。但有一天,当一个调试过的程序崩溃时,我的调用堆栈变得毫无用处。最后,我检查了所有这些类的异常以使程序“在异常时中断”,现在当抛出异常(例如访问错误)并且我有一个有用的调用堆栈来调试时,它就中断了。哎呀!

        4
  •  1
  •   CHP    16 年前

    可能你看的是错误线程的调用堆栈。 转到Debug->Windows->线程中的“踏面”面板,然后选择正确的线程。