backtrace

2020-06-21  本文已影响0人  欧阳_z

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

`

上一篇下一篇

猜你喜欢

热点阅读