1)我的守护进程有问题。它不时崩溃而没有核心愚蠢的一代。系统是FreeBSD。始终生成.core
之前。似乎这是一些其他类型的错误或其他发生的事情以及没有核心的退出。无论如何,我想知道这个并修复!
2)如何检查freebsd核心必须100%确定生成?
在这里:How to generate a core dump in Linux when a process gets a segmentation fault?
说ulimit -c unlimited
但是Command not found
3)似乎要捕获我需要使用GDB附加到进程的错误/崩溃?怎么做?还在stackoverflow上搜索并成立: gdb attach to a process without stop但请注意我确实做得很好:
a)我将名为attach
的文件赋予其执行权并添加以下行:
echo "cont" > attach.gdb
gdb server $1 -x attach.gdb
rm attach.gdb
b)像./attach
一样运行
它开始了,但我什么也做不了。这是正确的?我需要在守护进程崩溃之前等待而不是写generate-core-file
来获取核心?
4)如果守护进程退出而没有SEGFAIL或其他异常,是否会由命令generate-core-file
生成核心?
答案 0 :(得分:1)
3b)你需要运行./attach 1234
,其中1234是正在运行的进程的PID(该PID将是脚本的$1
参数,将被传递给gdb)
或者只是不要理会那个附加脚本(这是毫无意义的)并运行gdb server 1234
然后键入命令cont
并等待它崩溃。
如果在连接gdb时崩溃,为什么需要核心文件?核心文件的好处是使用调试器来检查它,但如果它在调试器内崩溃然后只是直接调试它,你就不需要核心文件了!所以忘掉generate-core-file,当它崩溃时直接检查进程。
答案 1 :(得分:1)
如果您的进程由于ulimit问题而没有核心,请编写一个小的shell脚本,在运行您的进程之前设置ulimit:
#! /bin/sh
ulimit -c unlimited
/path/to/my/program > program.out 2>&1
echo $? >> program.out
这使您可以从程序中捕获stdout和stderr,并将程序返回状态捕获到program.out中。你必须要看这个文件的大小,如果它填满了它所驻留的文件系统,可能会导致其他不良。
但这并不是因为这就是为什么你没有获得核心的原因。如果您的程序是为了调试而编译的并且命中了一个assert(),它将退出而不进行核化。您的程序在退出之前是否打印任何内容或记录任何内容?