【发布时间】:2017-01-27 09:51:33
【问题描述】:
我希望能够捕获任何执行 exit()/ExitProcess()/TerminateProcess() 或任何其他此类调用的尝试。
我想过用 atexit() 注册一个处理程序。这适用于正常的程序终止(从 main() 返回)或 exit() 调用(不管调用 exit() 的线程如何),但 ExitProcess() 和 TerminateProcess() 绕过我注册的处理程序。 ExitProcess() documentation 状态:
请注意,从应用程序的主函数返回 在对 ExitProcess 的调用中。
但观察到的行为至少在这方面有所不同。 是否有为进程退出/终止注册处理程序的方法将始终调用(除了对 TerminateProcess() 的外部调用、我的一个线程或 __failfast() 调用引发的未处理异常,我猜这些真的是不可能的去抓)。 有挂钩 ExitProcess() 的肮脏选项,但我宁愿不这样做。
编辑:这很清楚:我对自己的进程感兴趣,而不是监视/控制另一个进程。
【问题讨论】:
-
好吧,
atexit是 Windows (ExitProcess) 不知道或不关心的 C 运行时库。atexit只能处理 C 运行时已知的退出条件。从 Windows 的角度来看,从主函数返回将调用ExitProcess,只是在 C 中运行时有自己的主函数,它设置像argv这样的东西,然后调用 your 主要功能。所以从 that 函数返回不会立即返回到操作系统,而是再次返回到 C 运行时。 -
哦,这就是它起作用的原因(我想这可以用调试器轻松检查)。据我所知,Windows 没有提供具有此功能的 API,但我可能看不到我应该去的地方。
-
我也没有看到任何类似的东西。也许原因是,当您需要在退出时进行清理时,无论如何您都可以控制自己的退出,并且可以自己这样做。您可以添加一个 DLL,它会在进程即将关闭时收到通知:»所有加载的动态链接库 (DLL) 的入口点函数都使用 DLL_PROCESS_DETACH 调用。« 但是除此之外,您似乎无法检测到它。
-
添加一个处理这有点棘手的 DLL,从我看到调用 ExitProcess() 时发生的情况来看。您并不总是控制自己的退出,您可以拥有一个调用 exit() 的第三方库,或者有人可以在您的进程中创建一个远程线程并执行此操作。
-
最后我听说,
atexit应该在调用 ExitProcess 的情况下工作,提供您使用的是 C 运行时的 DLL 版本。 (在 this post 的 cmets 中提到。)您使用的是静态链接运行时吗?