簡體   English   中英

當c#程序崩潰怎么知道為什么?

[英]when c# program crash how to know why?

我的程序經常由於某種原因崩潰。 在這種情況下,我確實看到帶有“關閉”按鈕的 Windows 消息。 每次發生這樣的事情,我真的很想知道發生了什么。

感謝社區,我已經知道如何“處理”某些情況,我在程序的開頭添加了這樣的代碼:

    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

        TaskScheduler.UnobservedTaskException +=
        (object sender, UnobservedTaskExceptionEventArgs excArgs) =>
        {
            Log.Push(LogItemType.Error, "Exception occured. Task terminated! + " + excArgs.Exception);
            excArgs.SetObserved();
        };

    .....

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine("Error: CurrentDomain_UnhandledException entered.");
        string message = (e.ExceptionObject as Exception).Message;
        Console.WriteLine(message);
        System.Diagnostics.Trace.WriteLine(message, "Unhandled UI Exception");
        Log.Push(LogItemType.Error, message);
    }

有時這會有所幫助。 但有時程序只是崩潰而沒有消息。 我還可以做些什么? 每次程序崩潰我都想知道為什么。

upd Windows 日志包含我需要的幾乎所有東西,除了最重要的東西 - 堆棧跟蹤

Faulting application name: MBClient.exe, version: 1.0.0.0, time stamp: 0x50a5da1d
Faulting module name: ntdll.dll, version: 6.1.7601.17725, time stamp: 0x4ec4aa8e
Exception code: 0xc0000374
Fault offset: 0x00000000000c40f2
Faulting process id: 0x10f8
Faulting application start time: 0x01cdc3c2041e2607
Faulting application path: C:\Oleg\bin\mbclient\MBClient.exe
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: 810c805d-2fc3-11e2-bfb5-2c768a509157

異常代碼 0xc0000374 表示您正面臨堆損壞

此類錯誤的最常見原因是以下兩個:

  • 有故障的 RAM 模塊
  • 緩沖區溢出,當一個線程嘗試讀取某些內容而另一個線程同時刪除了數據時。 據我所知,這不應該發生在托管代碼中。

如果您無法在開發環境中調試應用程序,您可能必須使用Windows 調試工具來找出問題所在。

您可以嘗試使用 WER - Microsoft 的 Windows 錯誤報告。 它在每個系統上都是默認的。 因此,例如,您可以進行自動轉儲而不是窗口彈出消息。
組策略編輯器中有許多設置。 請參閱以下鏈接http://msdn.microsoft.com/en-us/library/windows/desktop/bb787181(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/ windows/桌面/bb513638%28v=vs.85%29.aspx

我知道這是一個老問題,但我在谷歌搜索異常代碼 0xc0000374 后來到這里。

有一個可用於 MS Visual C++ 2013 Redistributable 包的更新,它修復了 MS Visual C++ 2013 Redistributable 包中的堆損壞錯誤。

注意:此更新(在撰寫本文時)未通過 Windows 更新分發。 注意 2:顯然,如果您使用的是使用 MS VC++ 2013 編譯的庫(如我的情況:MySQL ODBC 連接器 5.3.x),此更新只會有幫助

更新鏈接:https: //support.microsoft.com/en-us/help/3138367/update-for-visual-c-2013-and-visual-c-redistributable-package

以及將我指向此更新的來源: https ://bugs.mysql.com/bug.php?id=86054

就我而言:

我使用非托管內存。 因此,重現此錯誤的最簡單方法是:

var DataPtr = Marshal.AllocHGlobal(1000 * sizeof(int));//asign a pointer for 1000 integers
Marshal.FreeHGlobal(ptr);
Marshal.FreeHGlobal(ptr);

如果你試試這個,你會得到:

The program '[12579] MyDemo.exe' has exited with code -1073740940 (0xc0000374).

因此,如果您使用這樣的代碼 [Alloc\Free],您可能已經復制了一些指向已釋放內存的指針,然后在它已經釋放之后再釋放它。

希望這對某人有幫助!

我能夠使用WinDbg Preview獲得 CLR 調用堆棧。

  1. 安裝並啟動 WinDbg 預覽版
  2. 通過文件菜單,啟動應用程序可執行文件(如果應用程序沒有立即啟動,可能需要單擊 WinDbg 中的“開始”按鈕)
  3. 在應用程序中執行一些會觸發 ntdll.dll 崩潰的操作
  4. (可選)如果您有 .pdb 文件可用,請在 WinDbg 命令行中輸入.symfix <path to folder containing pdb files>
  5. 在 WinDbg 命令行中輸入clrstack (也可以使用dumpstack獲得更詳細的視圖)。

您現在應該在 WinDbg output window 中看到完整的 CLR 調用堆棧,它應該可以指示您的代碼的哪一部分導致了 ntdll.dll 崩潰。

在此處輸入圖像描述

只需在您認為可能崩潰的代碼“危險”部分使用try catch

暫無
暫無

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

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