linux系统下,在不gdb调试的情况下,我们如何解决程序崩溃问题呢?首先想到的就是添加log日志信息,其次还有以下几种方法可以帮助我们分析存在的问题:
(一)add2line
程序崩溃时会打出一些崩溃地方的地址空间,可以使用此方法显示崩溃地方对应的函数或者某一行,使用方法如下:
echo "0x63d8a9" | addr2line -e bin/httpd -f : 崩溃查对应代码行
(二)把出错时的堆栈信息打印出来,类似gdb调试中bt功能。
#define BACKTRACE() do { void* array[20]; size_t size; char** strings; size_t i; size = backtrace(array, 20); strings = backtrace_symbols(array, size); for (i=0; i< size; i++) { printf("%s ", strings[i]); } free(strings); } while(0) static void signal_handler(int sig) { switch(sig) { case SIGSEGV: /* segmentation fault */ case SIGFPE: /* erroneous arithmetic operation */ case SIGBUS: /* bus error */ BACKTRACE(); exit(EXIT_FAILURE); break; default: break; } } int main() { signal(SIGSEGV, signal_handler); signal(SIGFPE, signal_handler); signal(SIGBUS, signal_handler); }
参考:
1、http://www.justcodeit.info/