backtrace

作者: 欧阳_z | 来源:发表于2020-06-21 22:36 被阅读0次

    glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈。
    $ grep backtrace /usr/include/execinfo.h

    1、在应用程序中,打印函数的调用关系

    #include <stdio.h>
    #include <stdlib.h>
    #include <execinfo.h>
    
    void print_stack(void)
    {
        void *array[30];
        size_t i, size;
        char **strings;
    
        size = backtrace(array, sizeof(array)/sizeof(array[0]) );
        strings = backtrace_symbols(array, size);
        for (i = 0; i < size; i++)
        {
            printf("[%s][%d] %s\n", __func__, __LINE__, strings[i]);
        }
        free(strings);
    }
    
    void fun(void)
    {
        print_stack();
    }
    
    void task(void)
    {
        fun();
    }
    
    int main(int argc, char **argv)
    {
        task();
    }
    

    先打印出地址,再通过addr2line转换为函数名:

    gcc test.c -g
    ./a.out > a.log
    awk '{cmd="addr2line "substr($3,2,length($3)-2)" -e a.out -f -C -s |head -1"; system(cmd);}' a.log
    

    可以看到调用关系打印如下:
    print_stack
    fun
    task
    main
    ??
    _start

    `

    相关文章

      网友评论

          本文标题:backtrace

          本文链接:https://www.haomeiwen.com/subject/cgeytktx.html