Linux c/c++编程--知识点(7)backtrace

本文介绍了一种在Linux环境下打印当前函数调用栈的方法,通过使用execinfo.h库中的backtrace函数,可以获取到调用流程的详细信息。文章提供了一个示例代码,展示了如何在函数中调用print_trace来打印调用栈,并通过gcc编译器的-g和-rdynamic选项确保可执行文件包含调试信息。

文章原文:linux打印当前函数调用栈backtrace

返回知识列表:


 

/**********************************************
 * a demo for backtrace to print the calling flow.
 * Author: Ricardo.Yu
 * Date: 2020=08-25
 **********************************************/

#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>

#define BT_MAX_TRACE 100

void print_trace (const char* func_name)
{
    void *array[BT_MAX_TRACE];
    size_t size = 0, i = 0;
    char **strings = NULL;

    printf("backtrace for %s start.\n", func_name);
    size = backtrace (array, BT_MAX_TRACE);
    strings = backtrace_symbols (array, size);
    
    if( NULL == strings){
        printf("backtrace_sysmbols is null.\n");
        return;
    }

    printf ("Obtained %zd stack frames.\n", size);

    for (i = 0; i < size; i++){
        printf ("%s\n", strings[i]);
    }
    
    free (strings); //glibc 中标准例子。
    strings = NULL;
}


void dummy_function (void)
{
    print_trace (__func__);
}

void test1()
{
    dummy_function();
}

void test2()
{
    test1();
}

int main (void)
{
    test2();
    return 0;
}

编译成可执行文件,执行即可看出效果:gcc -g -rdynamic -o backtrace backtrace.c    编译的时候要带debug 信息,否则打印出来的只有地址,也就没什么意义了。

# ./bt
Obtained 7 stack frames.
./bt(print_trace+0x1f) [0x80487b3]
./bt(dummy_function+0xb) [0x8048822]
./bt(test1+0xb) [0x804882f]
./bt(test2+0xb) [0x804883c]
./bt(main+0xb) [0x8048849]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0x17fbd6]
./bt() [0x8048701]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ricardo于

你的鼓励将是牛马的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值