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

8

我刚刚看到一些代码使用kill系统调用向应用程序发送SIGSEGV信号。这样做的原理是强制应用程序生成核心转储并退出。我觉得这种做法很不妥当,这是正常的做法吗?


看一下这个:http://unix.stackexchange.com/questions/11185/dump-process-core-without-killing-the-process/11191#11191 - Johan
5个回答

13

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


+1但是提供一个参考会更有帮助……POSIX关于核心转储实际上说了什么? - Potatoswatter
好的。第二个文档标记为“A”,表示中止并可能生成核心文件。 - edA-qa mort-ora-y
不幸的是,应用程序可能已经安装了一个SIGQUIT信号处理程序,阻止了默认行为。在这种情况下,您将不再获得核心转储。那么,只有在这种情况下,您才会考虑尝试滥用其他信号之一来生成默认的核心转储(如SIGSEGV、SIGILL等)? - Aconcagua

6

是的。 kill 名称有些不准确 - 它可以发送任何信号。使用 kill 的方法有很多,其中许多并不会导致进程被终止!


4
+1:kill -1 命令通常用于发送 SIGHUP 信号,传统上会导致支持此功能的程序重新加载它们的配置文件(例如 sendmail、init 等)。 - Andy Finkenstadt
SIGQUIT 是获取核心转储的信号。 - edA-qa mort-ora-y

3
如果您想让一个应用程序在另一个程序中转储其核心,几乎唯一的方法是通过信号。对于这个任务,SEGV 是可以接受的。或者,您可以将调试器连接到该程序并冻结它,查看它的寄存器等内容而不杀死该程序。
如果您想从应用程序内部转储核心,有更好的方法可以做到,比如使用 assert() 。
因此,向程序发送 SEGV 并不特别错误。您还可以发送诸如 SIGILL(非法指令)或除零信号等其他信号。这都没问题。

1
不,这不好。这些信号都有特定的含义,程序对它们的响应也不同。它们不会全部终止程序,也不会全部产生核心转储。 - edA-qa mort-ora-y

3
在Unix/Linux中实现此操作的方法是调用abort()函数,该函数会向当前进程发送SIGABORT信号。另一种选择是使用raise()函数,您可以指定要发送给当前进程的信号。

+1 是为了 raiseabort,当目标是自己时,这两个函数更加有意义。 - R.. GitHub STOP HELPING ICE

1

Richard Stevens(《UNIX环境高级编程》)写道:

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

他列出了12个信号,其默认操作是以核心终止(ANSI:SIGABRT、SIGFPE、SIGILL、SIGSEGV,POSIX:SIGQUIT,其他:SIGBUS、SIGEMT、SIGIOT、SIGSYS、SIGTRAP、SIGXCPU、SIGXFSZ),所有这些信号都可以被覆盖(唯二不能被覆盖的信号是SIGKILL和SIGSTOP)。

我从未见过一种生成核心的方法,它不是使用默认信号处理程序。

因此,如果您的目标是生成核心并停止,最好选择一个默认处理程序执行该任务的信号(SIGSEGV执行该任务),如果正在使用该信号,则重置该信号的默认处理程序,然后使用kill。


Emacs有一种在没有信号处理程序的情况下生成核心文件的方法。它在程序的构建过程中用于保存已加载elisp的新emacs二进制文件,但这是一种可怕的黑客行为... - R.. GitHub STOP HELPING ICE
@R.. 上次我检查时,Emacs的方法是通过了解可执行文件和核心文件格式来单独编写核心文件。 - AProgrammer
是的,这就是它的作用。XEmacs采用了更加合理的方法——将所有elisp代码/数据分配到它自己管理的堆中(在“.data”部分),将其保存到磁盘上,然后在运行时使用mmapMAP_FIXED将其映射回其“堆”之上。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接