[英]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 表示您正面臨堆損壞。
此類錯誤的最常見原因是以下兩個:
如果您無法在開發環境中調試應用程序,您可能必須使用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 調用堆棧。
.symfix <path to folder containing pdb files>
clrstack
(也可以使用dumpstack
獲得更詳細的視圖)。您現在應該在 WinDbg output window 中看到完整的 CLR 調用堆棧,它應該可以指示您的代碼的哪一部分導致了 ntdll.dll 崩潰。
只需在您認為可能崩潰的代碼“危險”部分使用try catch 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.