我有了它完成之前执行某些任务的程序。 问题是,有时与例外的程序崩溃(如数据库无法达到,等等)。 现在,有没有什么办法来检测异常终止,它死之前执行一些代码?
谢谢。
代码是表示赞赏。
我有了它完成之前执行某些任务的程序。 问题是,有时与例外的程序崩溃(如数据库无法达到,等等)。 现在,有没有什么办法来检测异常终止,它死之前执行一些代码?
谢谢。
代码是表示赞赏。
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;
}
2. POSIX / Linux的
我通常通过执行此信号()函数,然后适当地处理该SIGSEGV信号。 您也可以处理SIGTERM信号和SIGINT,但不是SIGKILL(设计)。 您可以使用strace的()得到一个回溯,看看是什么原因造成的信号。
还有的Sysinternals论坛主题有关挂钩NT内幕防范结束进程的尝试,但你真正想要的是无论是看门狗或对过程(合理的做法),或拦截灾难性事件的一些方法(很冒险)。
编辑:有原因,他们使这个困难的,但它可以拦截或阻止企图杀死你的进程。 我知道你只是想在退出之前进行清理,但只要有人发布不能立即被杀死的过程,有人会问一个方法立即杀死它,等等。 总之,要走上这条路,看到上面链接线和搜索一些关键字,你发现在那里了。 钩或过滤NtTerminateProcess等。我们正在谈论的内核代码,设备驱动程序,防病毒,安全,恶意软件,rootkit的东西在这里。 有些书在这方面的帮助是在Windows NT / 2000本机API , 无证Windows 2000的秘密:一个程序员的食谱 , 的Rootkits:颠覆Windows内核 ,而且,当然, 的Windows®内幕:第五版 。 这东西是不太难的代码,但相当棘手得到恰到好处的,你可能会引入意想不到的副作用。
也许应用程序恢复和重启功能可以使用? 通过Vista的支持和Server 2008及以上。
ApplicationRecoveryCallback回调函数应用程序定义用于将数据和应用程序状态信息保存在所述应用程序遇到一个未处理的异常或无响应事件回调函数。
在使用SetUnhandledExceptionFilter, MSDN社会讨论,建议,使这项工作可靠,修补方法是在内存中是要确保你的过滤器会被调用的唯一途径。 建议,而不是与__try包/ __除外。 无论如何,有一些示例代码和过滤的讨论,呼吁在文章SetUnhandledExceptionFilter “SetUnhandledExceptionFilter”和VC8 。
此外,请参阅的Windows SEH再访在为AddVectoredExceptionHandler的一些示例代码真棒因素。
这要看你怎么用你的“例外”做的。 如果从程序正常退出处理它们,你可以用你注册的功能退出被调用, atexit()
它不会工作在真正异常终止的情况下,像段错误。
不知道有关Windows,但在POSIX兼容的操作系统,你可以安装信号处理程序,以吸引不同的信号,并做一些事情。 当然,你不能赶上SIGKILL
和SIGSTOP
。
信号API是ANSI C的一部分,因为C89所以大概Windows支持它。 见signal()
的详细信息的系统调用。
如果是Windows的唯一,那么你可以使用SEH( SetUnhandledExceptionFilter ),或VEH( AddVectoredExceptionHandler ,但它仅适用于XP / 2003及以上)
对不起,不是Windows程序员。 但也许
_onexit()
注册一个程序终止时要调用的函数。
http://msdn.microsoft.com/en-us/library/aa298513%28VS.60%29.aspx
首先,虽然这是相当明显的:你永远不能拥有一个完全可靠的解决方案 - 某人总能正好砸在电力电缆终止您的进程。 所以你需要一个妥协,你需要仔细制定出妥协的细节。
一个更强大的解决方案是把相关代码的包装程序。 该包装程序调用你的“真实”的程序,等待其进程终止,然后 - 除非你的“真实”计划明确信号,它已经正常完成 - 运行清理代码。 这对于像测试工具,在测试程序可能崩溃或中止或以其他意想不到的方式死去相当普遍。
这仍然给你如果有人对你的包装功能了TerminateProcess,如果这是你需要担心的事情发生了什么难度。 如果有必要,你可以通过设置它作为Windows服务和使用的操作系统的功能,如果它死重新启动它绕开这个问题。 (这只是改变的东西一点点;有人还可能只是停止该服务。)在这一点上,你可能是在您需要的信号持续性的东西像创建一个文件,成功完成一个点。
几年前我发表在ddj.com约“验尸调试”的文章。
它包括用于窗户和Unix / Linux,以检测异常终止源。 通过我的经验,虽然,使用SetUnhandledExceptionFilter 并不总是叫安装在Windows处理程序。 在许多情况下,它被称为,但我收到的客户不少日志文件不包括已安装的处理器,其中,即访问冲突是原因的报告。
http://www.ddj.com/development-tools/185300443