我有一个相当大的项目,最近刚开始在退出时崩溃。我不是最好的 C# 编码员,但一切通常都按预期工作。然而,在这种情况下,当我关闭我的控制台应用程序时,它崩溃了,但没有被 MSVC 调试器捕获。
1) 当我在 Release 中构建并运行它时,它通常总是在我退出时崩溃。
2) 当我在 Debug 中构建并运行它时,它似乎只有 3-5 次中的 1 次在退出时崩溃。
虽然它没有正确退出,但我确实设法得到了错误,但不幸的是,退出代码与我在网上找到的任何内容都不匹配。
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.");
}
最佳答案
// Wait and make sure it has exited
Thread.Sleep(5000);
这就是问题陈述。你正在调用 SetConsoleCtrlHandler()在您的代码中调用您的 Handler 方法。 Windows 要求控制处理程序能够响应并且不会花太长时间从回调中返回。 CTRL_CLOSE_EVENT 的超时时间恰好 5 秒,这解释了为什么它有时会起作用。如果花费的时间更长,则 Windows 会终止该过程。
您需要以不同方式实现 TerminateProcess。杀死一个进程是相当随意的,你最好不要这样做。或者启动另一个守卫进程。不过我不能打电话。
关于调试器未捕获到 C# 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7340469/