【发布时间】:2011-03-14 19:41:30
【问题描述】:
目前,我捕获了 SIGSEGV,给自己发送了一封电子邮件,然后 abort() 以便我可以获取核心文件并调试我的程序。 (如果我没有捕捉到,我就不可能不知道我的特定程序出现了段错误。我的程序运行在与我自己的服务器不同的服务器上。)
是否有任何其他信号我应该捕获以进行调试或出于我应该知道的原因?
【问题讨论】:
-
你绝对不应该抓到 SIGSEGV。
目前,我捕获了 SIGSEGV,给自己发送了一封电子邮件,然后 abort() 以便我可以获取核心文件并调试我的程序。 (如果我没有捕捉到,我就不可能不知道我的特定程序出现了段错误。我的程序运行在与我自己的服务器不同的服务器上。)
是否有任何其他信号我应该捕获以进行调试或出于我应该知道的原因?
【问题讨论】:
是什么让您认为 SEGV 没有已经严重损坏您的程序内存,以至于发送电子邮件的尝试不会失败?
您应该遵循责任分工的做法,并从一个完全不同的计划中监控您的计划。
只需有一个(非常简单,因此失败的可能性要小得多)程序来检查以确保您的主程序仍在运行,如果没有,则向您发送该电子邮件。您甚至可以进行纵深防御并运行两个检查器,这两个检查器都检查主程序并相互检查。
如果你像我一样偏执,你甚至可以在不同的机器上运行它们:-)
【讨论】:
好吧,如果您的程序附加到控制台,您可能希望捕获 SIGINT 以转储/刷新您保留的任何缓冲区/日志。
【讨论】:
您可能不应该捕获 SIGSEGV / SIGBUS 等。
您应该做的是编写一个包装程序,该程序将检测子进程是否从信号中退出,并识别问题,然后该进程可以执行任何所需的操作。
如果它是一个服务器进程,你可能还想在它意外失败时重新启动。
【讨论】: