2012-03-08 23 views
12

假設我有一個拋出異常的函數。假設這個函數被第三方DLL調用,並且第三方DLL將處理我拋出的異常。Visual Studio認爲「用戶代碼」是什麼?

如果Visual Studio確定第三方DLL不是「用戶代碼」(如下圖所示),那麼默認情況下它將停止在我的異常處,即使稍後處理它。這不是錯誤這樣做;它清楚地解釋了該異常是由用戶代碼未處理的。但是,什麼讓Visual Studio調用一些DLL「用戶代碼」而其他的不是?

enter image description here

我有一個理論,這是因爲這些符號不會被加載,但在已加載的符號,但仍不能認爲是「用戶代碼」列表模塊。

+0

對於其他人在調試菜單上找到模塊窗口,選擇Windows,然後單擊模塊。一個有用的顯示,用於跟蹤正在使用的.dll(我的代碼不會調試,因爲它使用的是GAC中的lib副本,而不是來自引用項目的輸出),謝謝指出。 – RyanfaeScotland 2015-04-09 13:29:07

回答

12

是的,沒有.pdb文件,調試器無法判斷它是否是用戶代碼。它在MSDN article解釋還算不錯:

要區分非用戶代碼用戶代碼,僅我的代碼着眼於三個方面:DBG文件,PDB文件和優化。

在標準的Debug版本中,關閉優化併爲所有模塊創建調試符號。當您運行調試版本時,這些模塊被認爲是用戶代碼。如果我調用經過優化的庫函數,但沒有調試符號,則不是用戶代碼。只是我的代碼可以防止執行停止在庫代碼中的斷點處,這通常不是您想要調試的代碼。在「斷點」窗口中,這些斷點將顯示「禁用斷點」圖標。

+0

這是完美的。考慮到這一點,我發佈了一個[阻止調試器停止庫中的所有異常]的答案(http://stackoverflow.com/a/9616890/33080),並添加了另一個解決方法,用於NUnit的'Assert.Throws 'halting](http://stackoverflow.com/a/9609494/33080)。太好了! – 2012-03-08 14:40:06

+0

這仍然是模糊的。我認爲可以安全地說「用戶代碼=沒有優化+調試符號」? – 2014-12-26 02:28:45

相關問題