1

1)我的守护进程有问题。它不时崩溃,没有核心愚蠢的一代。系统是FreeBSD。之前总是.core生成。似乎这是某种其他类型的错误或其他发生的事情,并且它没有核心退出。无论如何,我想知道这一点并修复!

2) 如何在 freebsd 上检查必须 100% 确定生成内核?此处:当进程出现分段错误时,如何在 Linux 中生成核心转储?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) run like./attach 和它的开始,但我什么也做不了。这是正确的?我需要在守护进程崩溃之前等待而不是写入generate-core-file以获得核心?

generate-core-file4)如果守护进程在没有 SEGFAIL 或其他异常的情况下退出,核心是否会由命令生成?

谢谢和对不起我的英语。很难用非母语写一些重要的信息。你必须明白...

4

2 回答 2

1

3b)您需要运行./attach 1234其中 1234 是正在运行的进程的 PID(该 PID 将是$1脚本的参数,将传递给 gdb)

或者只是不要打扰那个附加脚本(它非常没有意义)并运行gdb server 1234然后键入命令cont并等待它崩溃。

如果它在连接 gdb 时崩溃,为什么需要核心文件?核心文件的好处是使用调试器来检查它,但如果它在调试器内部崩溃然后直接调试它,你不需要核心文件!所以忘记 generate-core-file ,当它崩溃时直接检查进程。

于 2012-05-17T15:50:45.627 回答
1

如果您的进程由于 ulimit 问题而没有核心,请编写一个小型 shell 脚本,在运行您的进程之前设置 ulimit:

#! /bin/sh
ulimit -c unlimited
/path/to/my/program > program.out 2>&1
echo $? >> program.out

这使您可以从程序中捕获标准输出和标准错误,并将程序返回状态捕获到 program.out。您必须注意这个文件的大小,如果它填满了它所在的文件系统,可能会导致其他问题。

不过,这并不是你没有得到核心的原因。如果您的程序是为调试而编译的并遇到了 assert(),它将退出而不进行核芯。您的程序在退出之前是否打印任何内容或记录任何内容?

于 2012-05-23T04:40:23.267 回答