强制应用转储并退出的正确方法是什么?

问题描述

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

解决方法

如果您希望产生核心转储,则SIGQUIT是发送到程序的正确信号。
kill
是发送信号的正确命令行程序(它的命名很差,因为并非所有信号都会杀死该程序)。 请注意,您不应向程序发送随机信号,并非所有信号都会产生核心转储。其中许多将由程序本身处理,要么被消耗,忽略,要么引发其他处理。因此发送SIGSEGV是错误的。 GCC表示: http://www.gnu.org/s/libc/manual/html_node/Termination-Signals.html POSIX / Unix说: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html     ,是。
kill
的名称有些错误-它可以发送任何信号。 ѭ0的用途很多,根本不会导致进程被杀死!     ,如果要使应用程序从另一个程序转储它的核心,几乎唯一的方法就是通过信号。 SEGV对此很好。或者,您可以将调试器挂接到程序上并冻结它,并查看其寄存器等,而不会杀死它。 如果要从应用程序中转储核心,则有更好的方法来实现它,例如通过assert()。 因此,不,将SEGV发送到程序并不是特别错误。您也可以发送诸如SIGILL之类的指令用于非法指令,或者除以零信号。一切都很好。     ,在Unix / Linux中做到这一点的方法是调用abort(),它将把SIGABORT发送到当前进程。另一个选项是raise(),您可以在其中指定要发送到当前进程的信号。     ,Richard Stevens(UNIX环境中的_Advanced Programming)写道:   内核的生成是大多数Unix的实现功能。它不是POSIX.1的一部分。 他列出了12个信号,它们的默认操作是终止于一个内核(ANSI:SIGABRT,SIGFPE,SIGILL,SIGSEGV,POSIX:SIGQUIT,其他:SIGBUS,SIGEMT,SIGIOT,SIGSYS,SIGTRAP,SIGXCPU,SIGXFSZ),所有这些信号都可重写(两个不可重写的信号是SIGKILL和SIGSTOP)。 我从未见过一种不使用默认信号处理程序的生成内核的方法。 因此,如果您的目标是生成内核并停止运行,则最好是选择一个其默认处理程序执行此工作的信号(SIGSEGV进行此工作),如果正在使用该信号,请重置该默认处理程序,然后使用kill。