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

问题描述 投票:0回答:5

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

c++ c signals coredump
5个回答
13
投票

如果您希望生成核心转储,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


6
投票

是的。

kill
这个名字有点错误——它可以发送任何信号。
kill
有很多用途,但根本不会导致进程被终止!


3
投票

如果您想从另一个程序转储应用程序的核心,几乎唯一的方法就是通过信号。 SEGV 就适合这个。或者,您可以将调试器连接到程序并冻结它并查看它的寄存器等,而无需杀死它。

如果您想从应用程序内转储核心,有更好的方法可以做到这一点,例如通过assert()。

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


3
投票

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


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。

© www.soinside.com 2019 - 2024. All rights reserved.