簡體   English   中英

從Windows運行時,C#/ C ++應用程序崩潰,但不是從Visual Studio運行

[英]C# / C++ application crashes when run from Windows, but not from Visual Studio

我正在開發一個調用非托管(C ++)DLL的C#應用​​程序。 我發現某個用戶操作從Windows資源管理器運行時始終導致應用程序崩潰。 但是,從Visual Studio調試器啟動時,不會發生崩潰。 因此,我無法在崩潰時進入代碼並完全調試正在發生的事情。

什么可能導致二進制文件從資源管理器運行時崩潰,但不是從Visual Studio運行? 請注意,我正在使用Release版本; 調試版本在Visual Studio Explorer中都不會崩潰。

(如果它是相關的,我可以說崩潰與操縱C ++ DLL中的malloc分配的數組有關。我通過精心評論代碼塊,重建,從Windows運行以及檢查是否跟蹤它來查找它。發生了崩潰。然而,我已經達到了一個難以在沒有能夠在調試器中正確中斷的情況下繼續進行的程度)。

我只對能夠在Visual Studio中重新創建崩潰感興趣。

當程序在調試中工作但在發布時崩潰時,問題通常是緩沖區溢出,所以你應該尋找類似不正確的緩沖區長度變量。

關於調試時它沒有崩潰的原因,這里有一篇關於調試器副作用的小文章。 正如您所看到的,當調試器啟動程序時,堆可能會有不同的行為。 緩沖區溢出經常發生在堆上,你說它可能發生在malloc-ed緩沖區中,所以這就是原因。

現在,為了使程序在調試時崩潰,唯一的方法可能是在啟動后附加。 如果在DLL項目中設置斷點不起作用,請嘗試使用DLL項目啟動調試,並將可執行文件指定為DLL主機。 如果你不能點擊這樣的斷點,那么你總是可以在匯編代碼中設置斷點,這應該始終有效,但實際上並不實用。

請注意,即使在附加時仍可能發生差異,調試器總是會略微改變目標行為。 雖然只有未定義的行為應該改變。

編輯:我錯過了,但文章說您可以通過設置環境變量_NO_DEBUG_HEAP = 1來禁用調試堆。 這可能是調試問題的最簡單的解決方案(如果有效)。

暫無
暫無

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

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