Linux上跑服務器如果遇到程序崩潰是一件很苦惱的事情, 再碰到重現很難的BUG, 估計只能通過傳統的排查方法進行.
在編寫本文前, 筆者使用過諸如libunwind等庫進行錯誤時堆棧打印, 但是其本身由于需要引用第三方庫, 使用還是稍微麻煩.
經過Google后, 居然找到一篇好文, 其通過捕獲SIGSEGV信號, 并迫使程序進入gdb調試階段, 利用gdb強大的調試功能可以進行各種錯誤跟蹤, 此法已與Windows下程序崩潰后彈出VC調試幾乎接近.
我在此文基礎上, 擴展了其通用性及便利性
1. 使用gdb的 -ex參數, 在掛接程序后, 執行bt指令打出程序堆棧
2. 將信息重定向到自定義的文件,在多進程都需要進行后臺輸出時帶來更大的靈活性, 同時也解決了gdb只能在前臺調試的問題
代碼如下
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
void dump(int signo)
{
char buf[1024];
char cmd[1024];
FILE *fh;
snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid());
if(!(fh = fopen(buf, "r")))
exit(0);
if(!fgets(buf, sizeof(buf), fh))
exit(0);
fclose(fh);
if(buf[strlen(buf) - 1] == '/n')
buf[strlen(buf) - 1] = '/0';
snprintf(cmd, sizeof(cmd), "gdb %s %d -ex=bt > ./a.txt", buf, getpid());
system(cmd);
exit(0);
}
在服務器開啟時,添加 signal(SIGSEGV, &dump ); 進行信號處理掛接即可
引用: http://blog.csdn.net/kakaka2011/article/details/6597857 作者: kakaka2011