打印程序自身的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

Posted on 2012-04-01, in IT and tagged , . Bookmark the permalink. 留下评论.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 注销 /  更改 )

Google photo

您正在使用您的 Google 账号评论。 注销 /  更改 )

Twitter picture

您正在使用您的 Twitter 账号评论。 注销 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 注销 /  更改 )

Connecting to %s

%d 博主赞过: