检测程序终止(C,Windows)

won*_*rer 8 c windows termination process

我有一个程序,必须在完成之前执行某些任务.问题是有时程序崩溃时会出现异常(如无法访问数据库等).现在,有没有办法检测异常终止并在它死之前执行一些代码?

谢谢.

代码表示赞赏.

cig*_*man 9

1. Win32

Win32 API包含一种通过SetUnhandledExceptionFilter函数执行此操作的方法,如下所示:

LONG myFunc(LPEXCEPTION_POINTERS p)
{
     printf("Exception!!!\n");     
     return EXCEPTION_EXECUTE_HANDLER;
}

int main()
{
     SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)&myFunc);    
     // generate an exception !
     int x = 0;
     int y = 1/x;
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

2. POSIX/Linux

我通常通过signal()函数执行此操作,然后适当地处理SIGSEGV信号.您还可以处理SIGTERM信号和SIGINT,但不能处理SIGKILL(按设计).您可以使用strace()来获取回溯以查看导致信号的原因.

  • 另外,关于你关于TerminateProcess()的评论...简单的答案是你的进程调用TerminateProcess()后你不能做任何事情.不要过去,不要收200美元.您的流程现在退出.期.结束. (4认同)

b w*_*b w 5

有一些关于通过挂钩NT Internals来防止最终进程尝试的sysinternals论坛主题,但你真正想要的是监视器或对等进程(合理的方法)或某种拦截灾难性事件的方法(非常冒险).

编辑:有理由说他们为什么会这么做,但是有可能拦截或阻止企图杀死你的进程.我知道你只是在退出之前试图清理,但是一旦有人发布了一个无法立即杀死的进程,就会有人要求立即杀死它的方法,等等.无论如何,要走这条路,看看上面链接的线程,并搜索你在那里找到的一些关键字更多.钩子或过滤器NtTerminateProcess等我们在这里谈论内核代码,设备驱动程序,防病毒,安全,恶意软件,rootkit的东西.在这方面需要帮助的一些书是Windows NT/2000 Native API,未记载的Windows 2000秘密:程序员的手册,Rootkit:颠覆Windows内核,当然还有Windows®Internals:第五版.这些东西对于编码来说并不是太难,但是要做得恰到好处,并且你可能会引入意想不到的副作用.

也许Application Recovery和Restart Functions可能有用吗?受Vista和Server 2008及更高版本支持.

ApplicationRecoveryCallback回调函数应用程序定义的回调函数,用于在应用程序遇到未处理的异常或无响应时保存数据和应用程序状态信息.

在使用SetUnhandledExceptionFilter时,MSDN Social讨论建议为了使这项工作可靠,在内存中修补该方法是确保调用过滤器的唯一方法.建议改为使用__try/__换行.无论如何,在文章"SetUnhandledExceptionFilter"和VC8中有一些示例代码和关于过滤对SetUnhandledExceptionFilter的调用的讨论.

另外,有关AddVectoredExceptionHandler的一些示例代码,请参阅The Awesome Factor 重新访问的Windows SEH.