调试器未捕获C#Crash

时间:2011-09-07 20:59:52

标签: c# debugging exception crash exit-code

我有一个非常大的项目,刚刚开始在退出时崩溃。我不是最好的C#编码器,但一切都按预期工作。但是,在这种情况下,当我关闭我的控制台应用程序时,它崩溃但没有被MSVC调试器捕获。

1)当我在Release中构建它并运行它时,它一般在我退出时崩溃。

2)当我在Debug中构建并运行它时,它似乎只在3-5次退出时崩溃。

我确实设法得到了错误但是当它没有正确退出时,但遗憾的是退出代码与我在网上找不到的任何东西都匹配。

The program '[11108] MCDaemon.vshost.exe: Managed (v4.0.30319)' has exited with code -1073741510 (0xc000013a).

从我在其他人的问题上看到的,这通常是由非托管代码起作用引起的。有什么办法可以让我真正找出问题不足的大量调试行吗?

修改

从下面的答案中,这是导致退出代码的代码,但我真的没有看到任何问题。

public static Boolean Handler(MyWin32.CtrlTypes CtrlType)
{
    // A switch to handle the event type.
    switch (CtrlType)
    {
        case MyWin32.CtrlTypes.CTRL_C_EVENT:
            Program.TerminateProcess();
            break;
        case MyWin32.CtrlTypes.CTRL_CLOSE_EVENT:
            Program.TerminateProcess();
            break;
    }

    return true;
}

public static void TerminateProcess()
{
    // Stop the Poll Timer from Running
    PollTimer.Stop();

    log.LogMessage("Process is being Shutdown.");
    log.LogMessage("Requesting Process to Stop....");
    SendProcessCmd("stop");

    // Wait and make sure it has exited
    Thread.Sleep(5000);

    if (!myProcess.HasExited)
    {
        log.LogMessage("My Process did not stop on its own, forcing Process to quit.");
        myProcess.Kill();
    }

    log.LogMessage("My Process has been Shutdown.");
}

2 个答案:

答案 0 :(得分:1)

0xC000013A:应用程序因Ctrl + C而终止。

这是因为您关闭了控制台窗口,而应用程序并不期望您这样做,因此Windows会为您终止它。

很抱歉,但我不知道如何在托管代码中捕获控制台窗口关闭事件。

答案 1 :(得分:1)

// Wait and make sure it has exited
Thread.Sleep(5000);

这是问题陈述。您在代码中调整SetConsoleCtrlHandler()以调用Handler方法。 Windows要求控制处理程序响应,并且不需要太长时间才能从回调返回。 CTRL_CLOSE_EVENT的超时完全 5秒,解释了它有时可行的原因。如果需要更长的时间,那么Windows就会拉上进程。

您需要以不同方式实现TerminateProcess。杀死一个进程是相当随意的,你不应该做得更好。或者开始另一个守卫进程。我不能打那个电话。