2011-05-16 87 views
5

我使用Reflection(Method.Invoke)在.NET中調用函數。如果在此方法內發生錯誤並引發異常,則調試器不顯示實際的代碼,而是在Invoke()調用中停止。我可以從InnerException中檢索異常信息,但與使用callstack進行常規調試等相比,這非常不方便。可以使用Method.Invoke調用的方法像常規函數調用一樣調試嗎?調試.NET中的調用函數

回答

0

我的解決辦法是建立內部Tick()定時器和呼叫方法:

GUI代碼 - >通過Method.Invoke通話功能 - >功能設置一定時器 - >蜱有函數體

可惜這不是很漂亮(,不適合在某些情況下)

6

你喜歡的是「Just My Code」功能。調試器默認將調試限制爲開發人員認爲已編寫的代碼。這可以減少在調試WPF或WinForms啓動時會出現的大量噪音。

爲了讓像Exception助手這樣的項目運行所有代碼,您應該禁用Just My Code。

  • 工具 - >選項
  • 調試
  • 取消選中「啓用僅我的代碼調試」
+1

不幸的是,「啓用僅我的代碼」已經選中。但它似乎無關緊要,因爲呼叫者和被呼叫者實際上都是我的代碼。 – John 2011-05-16 23:30:57

+1

@John,那很奇怪。我的下一步是打開所有異常類型的「break break」,並查看是否將我拋棄了我的預期。這不會解決你的問題,但它會讓我們更進一步。 – JaredPar 2011-05-16 23:33:07

+0

這是非常奇怪的,在打開「break on throw」之後,我得到了未能加載的XmlSerializer程序集的FileNotFound異常。沒有「投擲」,一切正常。 – John 2011-05-16 23:39:38

2

如果一切都失敗了,你也可以把這樣的事情成被調用的方法:

#if DEBUG 
    System.Diagnostics.Debugger.Break(); 
#endif 

這將基本上「以編程方式」在那裏引起斷點。

你也可以把它做稍微好一點:

if(Debugger.IsAttached) 
    Debugger.Break(); 

所以,如果你實際上是在調試器中運行它,它會只有突破。


編輯:

月2思想,如果你的代碼進行編輯,那麼你可能只是堅持經常有斷點的VisualStudio通過。我想我的答案是沒有意義的...對不起:)

+1

您的回答非常有意義,請參閱@ JaredPar的回答。我遇到了跳過斷點和您的方法奏效的問題。 – ajeh 2016-07-04 15:31:04