2015-10-17 109 views
2

在我的代碼中,我有一個錯誤:我鎖定了兩次std::mutex調試器顯示兩個相同的調用堆棧不同

我總是運行我的應用程序的調試版本。

有2運行情況:

  1. 我運行在調試器下。在這種情況下,我得到以下堆棧跟蹤的異常。沒關係。

enter image description here

  • 我剛運行它沒有調試器。我得到Microsoft Visual C++運行時庫調試錯誤窗口。 enter image description here
  • 然後我將調試器連接到進程並單擊重試。 我得到以下堆棧跟蹤這實在是深藏不露:

    enter image description here

    完全一樣的錯誤。兩個不同的堆棧痕跡。爲什麼?

    加法#1:我已經正確指定了所有符號(包括Microsoft Windows的符號)。

    回答

    0

    在第一個堆棧中,您在應用程序中的例外是,並且產生了。我想你已經在調試器中設置了某種形式的「異常中斷」。

    在第二個堆棧中,您在應用程序中的例外是,被抓到了。這發生在加註之後,在一個catch塊中。看起來你在_Call_func框架的catch塊中。

    所以這兩種情況看起來不同,因爲他們不同。雖然是同一事件,但你在不同的時刻看着它。

    如果我冒險猜測你有某種你沒有try/catch塊的回調,並讓異常傳播給CRT,由於未處理的異常,它會盡職地終止進程。

    強制性閱讀:A Crash Course on the Depths of Win32™ Structured Exception Handling瞭解兩個軀體之間發生了什麼,以及如果放鬆並繼續,第一疊如何過渡到第二疊。

    0

    Exception Dispatching是造成這種現象:當一個異常在用戶模式下的代碼發生

    ,系統使用以下搜索以找到異常處理程序:

    1. 如果進程正在調試時,系統通知調試器。有關更多信息,請參閱調試器異常處理。
    2. 如果進程沒有被調試,或者相關的調試器沒有處理異常,系統將通過搜索發生異常的線程的堆棧幀來嘗試定位一個基於框架的異常處理程序。系統首先搜索當前的堆棧幀,然後以相反的順序搜索前面的堆棧幀。
    3. 如果沒有找到基於框架的處理程序,或者沒有基於幀的處理程序處理異常,但正在調試該過程,系統會再次通知調試程序。
    4. 如果進程沒有被調試,或者相關的調試器沒有處理異常,系統會根據異常類型提供默認處理。對於大多數例外情況,默認操作是調用ExitProcess函數。

    在第一個例子中,調試器停止在1),在第二個例子中,系統停止在4),並且通常會殺死處理。但是,既然你安裝了Visual Studio,它認爲你可能是一個開發人員並要求你去調試。

    在1)拋出異常和4)進程即將死亡的地方,發生了很多事情,調用堆棧也不同。

    相關問題