强制应用程序进行核心转储和退出的正确方法是什么?

时间:2011-04-13 11:08:38

标签: c++ c core signals

我刚刚遇到一些使用kill系统调用向应用程序发送SIGSEGV信号的代码。这背后的理由是,这将迫使应用程序进行核心转储和退出。这对我来说似乎是错的,这是正常的做法吗?

5 个答案:

答案 0 :(得分:8)

如果您希望生成核心转储,SIGQUIT是发送到程序的正确信号。 kill是发送信号的正确命令行程序(当然命名不佳,因为并非所有信号都会杀死程序)。

请注意,您不应向程序发送随机信号,并非所有信号都会产生核心转储。其中许多将由程序本身处理,消耗,忽略或诱导其他处理。因此发送SIGSEGV是错误的。


海湾合作委员会表示: http://www.gnu.org/s/libc/manual/html_node/Termination-Signals.html

POSIX / Unix说: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html

答案 1 :(得分:6)

是。 kill有点名不副实 - 它可以发送任何信号。 kill有许多用途,不会导致进程被杀死!

答案 2 :(得分:3)

如果你想让一个应用程序转储它是另一个程序的核心,几乎唯一的方法是通过一个信号。 SEGV对此没问题。或者,您可以将调试器挂接到程序并冻结它并查看它的寄存器等,而不会将其删除。

如果要从应用程序中转储核心,可以使用更好的方法,例如通过assert()。

所以,不,将SEGV发送给程序并不是特别错误。您也可以发送SIGILL等非法指令或除零信号。一切都很好。

答案 3 :(得分:3)

在Unix / Linux中执行此操作的方法是调用abort(),它将SIGABORT发送到当前进程。另一个选项是raise(),您可以在其中指定要发送到当前进程的信号。

答案 4 :(得分:0)

Richard Stevens(UNIX环境中的高级编程)写道:

  

核心的生成是大多数Unix的实现功能。它不是POSIX.1的一部分。

他列出了12个信号,其默认操作是以核心终止(ANSI:SIGABRT,SIGFPE,SIGILL,SIGSEGV,POSIX:SIGQUIT,其他:SIGBUS,SIGEMT,SIGIOT,SIGSYS,SIGTRAP,SIGXCPU,SIGXFSZ),全部它们是可覆盖的(两个不可覆盖的信号是SIGKILL和SIGSTOP)。

我从未见过如何生成不使用默认信号处理程序的核心。

因此,如果您的目标是生成核心并停止,那么最好是选择一个默认处理程序完成工作的信号(SIGSEGV完成工作),如果您正在使用它,则重置信号的默认处理程序然后使用杀死。