两个相同的调用堆栈因调试器显示而不同

时间:2015-10-17 17:54:46

标签: c++ windows visual-studio-2013 crash-dumps

在我的代码中我有一个错误:我锁定std::mutex两次。

我总是运行我的应用程序的调试版本。

有2个运行案例:

  1. 我在调试器下运行它。在这种情况下,我得到以下堆栈跟踪的异常。没关系。
  2. enter image description here

    1. 我只是在没有调试器的情况下运行它。我得到Microsoft Visual C ++运行时库调试错误窗口。 enter image description here
    2. 然后,我将调试器连接到进程,然后单击“重试”。 我得到了以下堆栈跟踪,它实际上没有显示任何内容:

      enter image description here

      完全相同的错误。两个不同的堆栈跟踪。为什么呢?

      添加#1:我正确指定了所有符号(包括Microsoft Windows的符号)。

2 个答案:

答案 0 :(得分:0)

在第一个堆栈中,您位于应用程序中引发异常的位置。我猜你在调试器中设置了某种形式的'break on exception'。

在第二个堆栈中,您位于应用程序中 catch 的例外。这种情况发生在加注之后,在一个catch区块中。看起来你在_Call_func框架的catch块中。

因此,这两个案例看起来不同,因为它们 不同。虽然是同一个事件,但你会在不同的时刻看到它。

如果我冒昧猜测你有某种回调,你没有try / catch块,并且让异常传播到CRT,由于未处理的异常,它会尽职地中止该过程。

强制阅读:A Crash Course on the Depths of Win32™ Structured Exception Handling以了解两个momements之间发生的情况以及第一个堆栈如何转换到第二个堆栈,如果让我们放松并继续。

答案 1 :(得分:0)

Exception Dispatching导致此行为:

  

当用户模式代码中发生异常时,系统使用以下搜索顺序来查找异常处理程序:

     
      
  1. 如果正在调试该进程,系统会通知调试器。有关更多信息,请参阅调试器异常处理。
  2.   
  3. 如果未调试进程,或者关联的调试器未处理异常,则系统会尝试通过搜索发生异常的线程的堆栈帧来查找基于帧的异常处理程序。系统首先搜索当前堆栈帧,然后以相反的顺序搜索前面的堆栈帧。
  4.   
  5. 如果找不到基于帧的处理程序,或者没有基于帧的处理程序处理异常,但正在调试该进程,则系统会再次通知调试器。
  6.   
  7. 如果未调试进程,或者关联的调试器未处理异常,则系统会根据异常类型提供缺省处理。对于大多数例外,默认操作是调用ExitProcess函数。
  8.   

在第一个示例中,调试器在1)处停止,在第二个示例中,系统在4)处停止,并且通常会终止该进程。但是,由于您安装了Visual Studio,因此它认为您可能是开发人员并要求您进行调试。

在抛出异常的地方和4)进程即将死亡的地方之间,发生了很多事情并且调用堆栈不同。