【发布时间】:2011-09-27 12:28:17
【问题描述】:
我正在为 FreeBSD 上的服务器编写错误处理代码。对于极其严重的错误,我想通过立即终止来避免数据损坏。这很简单,exit(3)。在我退出之前,我输出了引导我到达那里的相关变量。但是,理想情况下,此终止将伴随.core,以便我可以全面调查是什么让我陷入了这种灾难性(并且可能难以重现)状态。
我怎样才能强迫这种情况发生?
【问题讨论】:
我正在为 FreeBSD 上的服务器编写错误处理代码。对于极其严重的错误,我想通过立即终止来避免数据损坏。这很简单,exit(3)。在我退出之前,我输出了引导我到达那里的相关变量。但是,理想情况下,此终止将伴随.core,以便我可以全面调查是什么让我陷入了这种灾难性(并且可能难以重现)状态。
我怎样才能强迫这种情况发生?
【问题讨论】:
kill -QUIT process_id 将导致正在运行的进程中进行核心转储(假设资源限制允许)。
或查看man 3 abort 导致程序自行转储。
新增:在交互式 shell 中,可以使用退出键中止正在运行的程序,通常是 Ctrl+\,发送 SIGQUIT 就像更常见的 Ctrl+C 发送 SIGINT 一样。这与kill -QUIT… 相同,如果您在控制终端上,则更容易输入。如果您的默认退出键不同,请参阅 man 1 stty。
【讨论】:
abort(3) 似乎没问题,但从这里的一些测试来看,在检查结果.core 时,我似乎无法访问任何符号。我可以得到很好的回溯,但是如果我尝试打印我的任何变量,它们都找不到。这是abort(3) 所期望的还是我在做一些愚蠢的事情? gcc -g -O0 test.c -o test 然后./test 然后gdb ./test test.core
where 回溯中选择一个框架来为变量名提供范围。见sourceware.org/gdb/current/onlinedocs/gdb/…
This帮了我!
kill -11 总是为我工作。 11 是 SIGSEGV(无效的内存引用)
【讨论】:
您可能还想看看 gcore(1) (http://man.freebsd.org/gcore)。
【讨论】:
在 sles12.. 下面的代码对我有用:
kill -11
之前的建议没有做任何事情。
【讨论】:
你也可以试试kill -BUS <pid>
这对我有用(尽管在 ubuntu 20.04 上)
【讨论】: