[英]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.