我有一个非常大的项目,刚刚开始在退出时崩溃。我不是最好的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.");
}
答案 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。杀死一个进程是相当随意的,你不应该做得更好。或者开始另一个守卫进程。我不能打那个电话。