2013-01-16 52 views
1

因此,這裏是我遇到的問題。在調試會話期間獲取有關匿名異常的數據

void * something = ???; 
void (*fun)(void*) = ???; 

try 
{ 
    fun(something); 
} 
catch (...) 
{ 
    assert(false); 
} 

我的任務是確定爲什麼斷言會被解僱。不幸的是,我不能改變上面的代碼。此外,這是在多線程環境中,並且在程序關閉期間。執行try/catch的部分在現實世界的代碼中被非常有目的地解鎖。當我試圖通過這個程序時,它突然消失在我身上......我甚至無法步入正確的fun()調用,更不用說進入它了。

我唯一的追求似乎是在catch(...)中放置一個斷點並檢查其中的任何內容。不幸的是,這不會告訴我什麼,因爲我不知道什麼是真正的樂趣,也不知道是什麼。

我現在唯一的希望就是我可以通過Visual Studio調試器告訴我什麼是...,如果我能夠找出它被拋出的位置,我會很高興。至少它不在自動列表中......可能是在其他地方?有什麼方法可以讓我在這裏取得進展,或者我是否搞砸了?我覺得擰......

====

更新:有一個外部程序殺死我的時候沒有及時關閉。這就是踩踏讓它消失的原因。與線程無關。

一旦我意識到我能夠按照建議打開異常。不幸的是,沒有地方拋出一個......這是一個訪問違規。被存儲的函數以某種方式被搗毀。

+0

你正在跨越優化的二進制文件嗎?如果是這樣,理解看看這部分代碼的反彙編可能會更簡單... –

+0

@MatteoItalia - 不,它都是調試構建的。 –

回答

3

嘗試使用Visual Studio功能在拋出異常時中斷執行。轉到Visual Studio主菜單Debug - > Exceptions並勾選所有異常。

這種方式視覺工作室將停止時,你的異常被拋出,你會知道它是什麼。

+0

我會給它一個鏡頭。 –

+0

它可以幫助你,如果你凍結在這個問題的其他線程http://stackoverflow.com/questions/2201849/freeze-all-threads-on-breakpoint-in-vs2010 – evpo

+0

可能!我敢打賭這會有很大幫助! –

1

你能不能去菜單:調試|例外並標記你懷疑被拋出的異常? 如果您可以步/附加到應該可以運行的程序。這將導致調試器在拋出特定異常時中斷。

我通常在Debug | Exceptions對話框中標記整個子樹'Win32異常'。我假設你的程序不會拋出並默默地忽略其他(Win32)異常(在這種情況下,你會有很多'錯誤'警報)。

我希望有幫助。

相關問題