【问题标题】:Determine if program crashed [duplicate]确定程序是否崩溃[重复]
【发布时间】:2023-03-18 18:55:01
【问题描述】:

可能重复:
Detecting process crash in .NET

我正在编写一个 C# 程序,它必须确定另一个 C++ 游戏程序(我们称之为 Foobar)是否崩溃。 当 FooBar 程序崩溃时,它会使用 MessageBox 通知用户崩溃,如果您确定程序关闭窗口。 所以我想我可以确定如果该消息框打开/激活,程序是否崩溃。问题我不知道该怎么做。 或者如果您有其他更好的解决方案,请与我分享。

编辑: 我无法编辑 C++ 程序,而且它总是有可能崩溃。我只需要知道是不是这样。

【问题讨论】:

  • 我认为你真正的问题是“为什么 Foobar 崩溃”,而不是“我如何检测崩溃”
  • 可以修改C++程序吗?您需要处理“崩溃”和“关闭”之间的区别吗?如果您只监视进程列表怎么办?如果该进程消失,那么它要么崩溃,要么被关闭。
  • 假设您实际上是指“崩溃”,您有几个问题需要解决: 1) 您将如何收到崩溃通知? 2)你想知道关于崩溃的什么? 3)您将如何应对崩溃?这是“1)”的一个可能建议:support.microsoft.com/kb/310490
  • 如果您只是在寻找消息框,请尝试FindWindow。不过,我同意还有很多比这更好的方法。

标签: c# c++ crash window messagebox


【解决方案1】:

Detecting process crash in .NET 的重复。

心跳可能是要走的路,但还有另一条路。

当进程崩溃时,Windows 首先检查您的系统上是否配置了即时调试器。如果是这样,您可以让该调试器在它崩溃之前将其自身附加到进程。通常,您会使用此功能在进程崩溃时生成内存转储。无论您附加什么调试器,都可以知道崩溃进程的 PID 和名称。您可以利用现有调试工具(例如 ADPlus)的功能,也可以编写自己的程序并告诉 Windows 这是您的即时调试器,应该在进程崩溃时运行。我相信您可以专门为任何进程名称设置 JIT 调试器。

http://msdn.microsoft.com/en-us/library/5hs4b7a6(v=VS.80).aspx

我认为,如果您将 HKLM\Software\Microsoft\Windows NT\Current Version\AeDebug\Debugger 注册表项设置为 '"DirectoryOfYourProgram\YourProgram.exe" -p %ld' YourProgram.exe 需要传入的 PID使用 -p 标志,您的程序将在进程崩溃时被调用并传递正确的 PID。

【讨论】:

  • 如果它是重复的,你应该把你的答案放在那个问题上,而不是这个问题上,因为这个问题应该被关闭。
  • 我必须知道程序是否在运行时崩溃,所以用参数启动我的程序不是 sln :( 顺便说一下,我的应用程序是 .NET,我需要观看的应用程序是 C++跨度>
  • 我们将您的 .NET 应用程序称为 Baz。 FooBar 和 YourProgram.exe 同上。你可以编写一个中间程序让 Baz 知道 FooBar 崩溃了。您可以对 YourProgram.exe 进行编程,以便在 FooBar 崩溃时简单地向 Baz 发送消息。您只需对 Baz 进行编程即可收听该消息。 Baz 可以一直运行,但是当 FooBar 通过 YourProgram.exe 崩溃时会收到通知。
  • 没问题。这正是我现在正在做的事情。
【解决方案2】:

如果您可以访问这两个应用程序的代码,则可以设置从 c++ 应用程序到 c# 应用程序的心跳消息,并在心跳停止时执行任何操作。对于通讯,您需要命名管道或类似的东西。或者,您的 c++ 可以定期写入文件,您的 c# 可以使用文件监控检测更新。

【讨论】:

  • 即使应用程序崩溃,某些线程可能会继续工作,发出错误的心跳。试试这个public void RunMe() { Task.Factory.StartNew(() => { while (true) { Thread.Sleep(1000); Console.WriteLine(DateTime.Now.ToString()); } } ); object x = null; x.ToString(); }
  • @L.B 这是许多心跳实现需要克服的问题。发送心跳的机制也需要检查它是否应该发送。
  • 这绝对是个好主意,尽管我没有 c++ 应用程序的源代码。
  • 如果没有源代码,您可能应该尝试上述 mrranstrom 的解决方案,并附加一个 JIT 调试器。
  • @Surfbutler 我可以将 JIT 调试器附加到 C++ 程序吗?
猜你喜欢
  • 2013-11-26
  • 1970-01-01
  • 2023-03-21
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 2018-03-16
相关资源
最近更新 更多