博客归档

打印程序自身的backtrace

原文略有修改。

实战:

当然,在实战中,在程序中故意插入函数没有什么意义。很多时候我们并不知道程序问题在哪,尤其是面对资源极度缺乏的嵌入式设备时。

下面这个例子也很典型。

Screenshot-root@ubuntu^% ~

因此,在实作中,我们还需要了解如何捕获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 */

打印C/C++程序的backtrace

——————————————————————————————————————————

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:

signal(2) – Linux man page

Static:

加入

#include <signal.h>
int main()
{
    signal(SIGSEGV, &callback);
}

问题解决。

Screenshot-root@ubuntu^% ~

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

寻找小强——数据传输故障调查实例(五)

http://blog.sina.com.cn/s/blog_476745f60100a4tx.html