2011-03-14 84 views
1

目前,我抓住SIGSEGV,发送自己的电子邮件,然后放弃(),以便我可以得到一个核心文件并调试我的程序。 (如果我没有捕捉到,将不会有我不知道我的特定程序会被忽略的情况。我的程序在我自己的服务器上运行。)推荐信号来捕捉?

是否还有其他信号可以捕获调试还是因为我应该知道的原因?

+0

你绝对不应该赶上SIGSEGV。 – JeremyP 2011-03-14 10:43:39

回答

3

是什么让你认为SEGV已经不是已经损坏你的程序内存太多了,以致试图发送电子邮件不会失败壮观?

您应该遵循责任分工的实践,并从完全不同的程序中监控您的程序。

只要有一个(非常简单所以它不太可能会失败)程序,检查,以确保您的主要程序仍在运行,如果没有,您发送该电子邮件。你甚至可以做深度防守并运行两个检查器,两者都检查主程序和对方。

如果你是偏执狂和我一样,你甚至可以在不同的机器上运行他们:-)

+0

好,因为使用signal.h中不能保证正常工作,这个怎么样:1)从我的程序2.删除signal.h中)把作为的setrlimit在我的程序的第一行,所以我可以得到一个核心3)使用通过一个cronjob执行的shell脚本,检查核心文件和发邮件给我,如果有 – 2011-03-14 10:48:17

+0

我认为,在Linux上,SIGSEGV除非有人已经采取具体行动,以阻止发生,它会自动给你一个核心转储。如果是这样,下次程序启动时,它可以检查其工作目录中的核心,然后发送电子邮件。这一点,我认为是这样的最崩溃记者OS X上运行 – JeremyP 2011-03-14 10:51:13

+0

@JeremyP:SIGSEGV转储核心,但核心是默认的Linux发行版禁用的,所以你不得不使用了setrlimit修改软限制(假设硬限制不零或者你需要root权限)。 – 2011-03-14 10:56:48

0

好吧,如果你的程序连接到控制台,您可能想赶上SIGINT转储/刷新所有缓冲区/记录你的预扣。

0

你可能不应该赶上SIGSEGV/SIGBUS等

你应该做的,而不是,是编写一个包装程序,它会检测是否从信号子进程退出,并找出问题,那么该进程能继续下去采取任何必要的行动。

如果它是一个服务器进程,你可能还需要重新启动,如果它意外失败。