当c#程序崩溃时怎么知道原因?

时间:2012-11-16 08:09:04

标签: c#

我的程序经常因某种原因而崩溃。在这种情况下,我确实看到带有“关闭”按钮的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日志几乎包含了我需要的一切,除了最重要的事情 - stacktrace

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

4 个答案:

答案 0 :(得分:3)

异常代码0xc0000374表示您正面临堆损坏

造成这种错误的最常见原因是这两个:

  • 错误的RAM模块
  • 缓冲区溢出,当一个线程尝试读取某个内容而另一个线程同时删除了数据时。据我所知,这不应该发生在托管代码中。

如果无法在开发环境中调试应用程序,可能必须让Windows Debugging Tools找出错误。

答案 1 :(得分:0)

只需在您认为可能崩溃的代码的“冒险”部分使用try catch即可。

答案 2 :(得分:0)

您可以尝试使用WER - 微软Windows错误报告。默认情况下,每个系统都是如此。所以例如您可以执行自动转储而不是Windows弹出消息 组策略编辑器中有许多设置。 请参阅以下链接 http://msdn.microsoft.com/en-us/library/windows/desktop/bb787181(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/bb513638%28v=vs.85%29.aspx

答案 3 :(得分:0)

我知道这是一个老问题,但是我在查询了异常代码0xc0000374之后来到了这里。

MS Visual C ++ 2013可再发行组件包中有可用的更新,该更新修复了MS Visual C ++ 2013可再发行组件包中的堆损坏错误。

注意:(在撰写本文时)此更新尚未通过Windows Update分发。 注意2:显然,此更新仅在使用通过MS VC ++ 2013编译的库时才有用(例如,在我的情况下:MySQL ODBC Connector 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