我有一个进程的核心转储文件可能有文件描述符泄漏(它打开文件和套接字,但显然有时会忘记关闭其中一些).有没有办法在崩溃之前找出进程打开了哪些文件和套接字?我无法轻易重现崩溃,因此分析核心文件似乎是获取bug的唯一方法.
如果您有一个核心文件,并且您已使用debuging选项(-g)编译该程序,则可以查看核心被转储的位置:
$ gcc -g -o something something.c $ ./something Segmentation fault (core dumped) $ gdb something core
你可以用它来做一些验尸后的调试.一些gdb命令:br打印堆栈,fr跳转到给定的堆栈帧(参见br的输出).
现在,如果你想查看在分段错误时打开哪些文件,只需处理SIGSEGV信号,在处理程序中,只需转储/ proc/PID/fd目录的内容(即使用system('ls -l/proc)/PID/fs')或execv).
有了这些信息,您可以轻松找到导致崩溃的原因,打开哪些文件以及是否连接了崩溃和文件描述符泄漏.