Linux下多线程程序崩溃时如何提取出所有线程的函数调用栈(二)

  在发生段错误的时候,打印函数的调用栈信息是定位问题很好的手段,一般来讲,我们可以捕获SIGSEGV信号,在信号处理函数中将函数调用栈的关系打印出来。gdb调试中的backtrace,简称bt就是这个作用。

第一种方法: glibc提供的backtrace函数编(译的时候,我们需要加上 -rdynamic 选项,否则的话,符号表信息打印不出来)

void do_backtrace()
{
    #define BACKTRACE_SIZ 100
   
    void *array[BACKTRACE_SIZ];
    size_t size, i;
    char **strings;

    size = backtrace(array, BACKTRACE_SIZ);
    strings = backtrace_symbols(array, size);

    for (i = 0; i < size; ++i) {
        printf("%p : %s\n", array[i], strings[i]);
    }

    printf("---------------------------------------------------------\n");
    free(strings);
}

int foo()
{
    do_backtrace();
}
int bar( void )
{
    foo();
    return 0;
}
int boo( void )
{
    bar();
    return 0;
}
int baz( void )
{
    boo();
    return 0;
}
int main( void )
{
    baz();
    return 0;
}

 

第二种方法:还在研究中(用更好的方法得到更多的信息量)

你可能感兴趣的:(GNU,C)