簡體   English   中英

捕獲僅在發布時發生的.NET錯誤,不會引發任何異常

[英]Catch a .NET error that only happens on Release, no exception thrown

我目前正在目睹僅在我的exe的“發布”模式下發生的錯誤。

因此,我沒有連接調試器,應用程序僅顯示“ ...已停止工作”。

我最初的反應是捕獲主循環中的所有異常並顯示其消息,但結果沒有拋出異常,程序只是崩潰了。 (我的程序是單線程的)。

這可能與我集成了非托管代碼的事實有關,但是即使那樣,為什么發布模式也會有所不同? 我有什么辦法可以捕捉到該異常?

我懷疑它是在調試器中運行時出現“無法顯示堆棧跟蹤/查找代碼”的錯誤之一(並且實際上並未引發異常),但是老實說我無法對其進行測試。 建議呢?

即使調試器在發布模式下運行,您仍然可以將其附加到調試器。 您可以嘗試類似...

  • 編寫程序,使其在執行開始時等待按鍵
  • 在發布模式下運行
  • 在等待按鍵時附加調試器
  • 調試一下

然后看看會發生什么。 如果它停止發生並且即使在發布模式下運行也可以在調試器下工作,則您有一個Heisenbug (基本上意味着很難找到此錯誤)。

但是,如果發生這種情況,並且問題發生時Visual Studio調試器中斷,請查看“線程”窗口(我認為是Ctrl + Alt + H)。 盡管您的應用程序僅使用一個線程,但是您運行的本機代碼可能會啟動自己的非托管線程。 如果真是這樣,您可能能夠找到一種方法來停止這樣做,因為不幸的是,您無法在托管代碼中捕獲該異常。

那可能是由於您在某些地方使用try catch塊

請嘗試以下步驟

1-轉到Visual Studio IDE

2-選擇調試選項

3-點擊例外

4-檢查拋出選項,以遵循“公共語言運行時異常”和本機Win 32異常

5-首先在調試模式下運行代碼。

6-檢查您是否有例外。

這可能至少解決了您的問題,您將在調試模式下獲得異常。

兩分錢在這里:

最近,我在winforms應用程序中遇到一個問題,我會收到異常“對象引用未設置為對象實例”。 這僅在發布模式下發生,而不在調試模式下發生。

我能夠在有限的調試下作為發行版運行程序,並且可以看到所有變量。 他們都沒有任何問題。

無論如何,我實際上只是將Visual Studio從15.7.1版本升級到15.7.3,問題就消失了。

發行版和調試版之間的內存布局將有所不同。 堆棧的布局也可能不同。 如果您有一段無法管理的代碼浪費內存,那么它將產生隨機影響。

您仍然可以從VS逐步調試Release版本。 請先嘗試。

如果托管代碼和非托管代碼的混合由於某種原因而變得棘手,則可以嘗試將WinDbg與SOS和SOSEX擴展一起使用。 請參閱我的回答了解所需的基本步驟-並檢查您是否也在為Release版本生成PDB符號。

我認為最好先隔離測試非托管代碼。

如果成功,則可能是非托管代碼與托管代碼或托管代碼本身集成的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM