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