博客归档
打印程序自身的backtrace
原文略有修改。
实战:
当然,在实战中,在程序中故意插入函数没有什么意义。很多时候我们并不知道程序问题在哪,尤其是面对资源极度缺乏的嵌入式设备时。
下面这个例子也很典型。
因此,在实作中,我们还需要了解如何捕获SIGSEGV信号(segmentation fault),并调用相应的callback函数。
捕获SIGSEGV信号(Segmentation fault)
See also:
backtrace(3) – Linux manual page
#include "execinfo .h" int backtrace(void **buffer, int size); /* retrieve backtrace */ char **backtrace_symbols(void *const *buffer, int size); /* put in a buffer */ void backtrace_symbols_fd(void *const *buffer, int size, int fd); /* put in a file */
——————————————————————————————————————————
From: http://ganzhi.blogspot.com/2008/07/cbacktrace.html
最近调试C++程序时,经常碰到GDB无法使用的情况。似乎使用GDB之后,程序的很多并行相关的Bug都体现不出来了。在这种时候,我们可以通过下面的程序打印出自身的backtrace来。
/* * Application: Print the backtrace from * Manual: Embed and Compile with -rdynamic option. * e.g. gcc -rdynamic -o test test.c */ #ifdef DEBUG #include <stdio.h> #include <execinfo.h> #define bt_array_size 100 void print_backtrace() { int i; void *bt_array[bt_array_size]; int bt_size; char** bt_symbols; printf("########## Backtrace ##########\n"); bt_size = backtrace(bt_array, sizeof(bt_array) / sizeof(void *)); printf("Number of elements in backtrace: %d\n", bt_size); if (bt_size > 0) { bt_symbols = backtrace_symbols(bt_array, bt_size); if (bt_symbols) for (i = bt_size - 1; i >= 0; --i) printf("%s\n", (char*) bt_symbols[i]); } printf("###############################\n"); exit(0); // Exit program. Necessary when Capturing signal. // Or the program will enter infinite-callback state. } #endif
上述代码会打印出一些16进制的偏移量,这时我们可以用如下命令来获得对应的源代码行:
addr2line -e ./test_deque 0x40c794
另外,我们可以用下面的命令来使得linux生成core dump,这样GDB就又能工作了。
ulimit -c unlimited
捕获SIGSEGV信号(Segmentation fault)
See also:
Static:
加入
#include <signal.h> int main() { signal(SIGSEGV, &callback); }
问题解决。
Dynamic:
寻找小强——数据传输故障调查实例
太长了,而且萨苏的博客应该会非常稳定,不会出现“你所访问的文章已经被移除”“该地址不存在”如此之类的情况,就不全文迁移了。这篇文章是08年的时候看,当时没仔细看。今天翻出来发现,倒是一篇非常好的critical issue素材。
————————————————————————————————————————
此部分用于搜索引擎站内搜索:
萨苏,数据传输故障,数据包,服务器缓冲,pool,分布式,
————————————————————————————————————————
寻找小强——数据传输故障调查实例(一)
http://blog.sina.com.cn/s/blog_476745f60100a2am.html
寻找小强——数据传输故障调查实例(二)
http://blog.sina.com.cn/s/blog_476745f60100a2b8.html
寻找小强——数据传输故障调查实例(三)
http://blog.sina.com.cn/s/blog_476745f60100a2rd.html
寻找小强——数据传输故障调查实例(四)
http://blog.sina.com.cn/s/blog_476745f60100a4fv.html
寻找小强——数据传输故障调查实例(五)