cpp gdb崩溃没有核心& gdb附加到工作进程

时间:2012-05-17 13:39:45

标签: c++ process crash gdb freebsd

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生成核心?

谢谢,抱歉我的英语。很难写出一些非本地语言的重要信息。你必须明白......

2 个答案:

答案 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(),它将退出而不进行核化。您的程序在退出之前是否打印任何内容或记录任何内容?