【问题标题】:Is it possible for a process to catch an unhandled exception of another process on windows?一个进程是否有可能在 Windows 上捕获另一个进程的未处理异常?
【发布时间】:2010-03-05 10:03:22
【问题描述】:

一个进程是否有可能捕获系统上另一个进程的未处理异常?

如果可能,在什么情况下可能?例如,如果第二个进程不是由第一个进程启动,是否可能?

我主要是在寻找有关本机 c++ 的答案。

【问题讨论】:

    标签: c++ windows exception


    【解决方案1】:

    Native(AKA 标准)C++ 没有真正的多进程概念,也无法捕获跨进程边界抛出的异常。并且没有办法跨越这些边界抛出异常。

    【讨论】:

      【解决方案2】:

      Windows 异常:结构化异常处理 (SEH) 是每个线程的。进程中的另一个线程可能能够操纵目标线程的堆栈以插入自己的处理程序,但这很难做到(尤其是在 x86 上缺乏一致的调用约定的情况下)。另一个进程可以将一个 dll 和线程注入到一个进程中来执行此操作。这很难做到正确,尤其是在没有与目标进程的细节(调用什么函数以及如何调用)紧密耦合的情况下。

      重新考虑调试器可以做到这一点,因此 Win32 调试器 API 必须具有此功能。一个进程可以调试同一会话中的其他进程(具有较低或相等的完整性级别),或者如果用户具有“调试进程”特权的任何进程。

      【讨论】:

      • 但在调试器的情况下,可能由于注入了编译器生成的调试代码以与调试器通信,被调试的代码以某种方式发生了变化
      • @uray:不,幸好这没有发生。当您附加调试器时,调试突然消失的问题真的很难。虽然它确实改变了时间,但让调试多线程竞赛变得困难。
      【解决方案3】:

      是的。 Matt Pietrek explains how。向下滚动到“VectoredExceptionHandling 是一种查看所有异常的干净、易于扩展的方式”部分。还有示例代码。

      【讨论】:

      • 听起来不错,在实践中很少奏效。你捕获了你不应该捕获的异常。就像具有 catch 处理程序的 C++ 异常一样。 Vista 的 AddVectoredContinueHandler 工作得更好,但如果程序执行任何托管代码,它仍然会中毒。只要你无论如何都要注入一个 DLL,SetUnhandledExceptionFilter() 是更好的捕鼠器。
      • 只是回答问题如果和如何这是可能的。 “继续处理程序”不会捕获它们。我同意你的观点,你可能不应该抓住他们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      相关资源
      最近更新 更多