Linux C语言函数调用栈打印

代码

c 复制代码
//main.c
extern void func_a();

int main (int argc, char *argv[])
{
    func_a();
    return 0;
}
c 复制代码
//a.c
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>

void print_trace (void){
    void *array[10];
    size_t size;
    char **strings;
    size_t i;
    
    size = backtrace(array, 10);
    strings = backtrace_symbols(array, size);
    if (NULL == strings){
        perror("backtrace_synbols failed:");
    }
    else{
        printf ("Obtained %zd stack frames.\n", size);
        for (i = 0; i < size; i++)
            printf ("%s\n", strings[i]);
        free (strings);
        strings = NULL;
    }
}

extern void func_b();

void func_a(){
    func_b();
}
c 复制代码
//b.c
extern void print_trace (void);

void func_c(){
    print_trace();
}
void func_b(){
    func_c();
}

编译

bash 复制代码
gcc -c a.c -fpic
gcc -c b.c -fpic
gcc -shared a.o -o liba.so
gcc -shared b.o -o libb.so
gcc main.c -L ./ -la -lb -o test

运行

bash 复制代码
export LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH
./test

结果

bash 复制代码
./test
Obtained 8 stack frames.
/data1/liuxiaolian5/work/backtraceTest/liba.so(print_trace+0x19) [0x7fc23225317e]
/data1/liuxiaolian5/work/backtraceTest/libb.so(func_c+0x9) [0x7fc23224e11e]
/data1/liuxiaolian5/work/backtraceTest/libb.so(func_b+0xe) [0x7fc23224e12f]
/data1/liuxiaolian5/work/backtraceTest/liba.so(func_a+0xe) [0x7fc232253225]
./test() [0x40113b]
/usr/lib64/libc.so.6(+0x2d210) [0x7fc232069210]
/usr/lib64/libc.so.6(__libc_start_main+0x7c) [0x7fc2320692bc]
./test() [0x401065]
相关推荐
平行云PVT6 小时前
数字孪生信创云渲染技术解析:从混合信创到全国产化架构
linux·unity·云原生·ue5·图形渲染·webgl·gpu算力
无敌昊哥战神6 小时前
【LeetCode 257】二叉树的所有路径(回溯法/深度优先遍历)- Python/C/C++详细题解
c语言·c++·python·leetcode·深度优先
xdscode7 小时前
Linux云服务器安装openclaw,并对接飞书通道
linux·服务器·飞书·openclaw
Percep_gan7 小时前
Linux中安装Redis,很详细
linux·运维·redis
七七powerful7 小时前
运维养龙虾--AI 驱动的架构图革命:draw.io MCP 让运维画图效率提升 10 倍,使用codebuddy实战
运维·人工智能·draw.io
枕书7 小时前
实战记录:如何使用 Docker 一键部署长亭 PandaWiki 智能知识库
运维·docker·容器
2401_877274248 小时前
从匿名管道到 Master-Slave 进程池:Linux 进程间通信深度实践
linux·服务器·c++
m0_488633328 小时前
C语言中枚举类型变量的定义、赋值及使用方法全解析
c语言·枚举类型·实例分析·变量定义·赋值使用
老鱼说AI8 小时前
大规模并发处理器程序设计(PMPP)讲解(CUDA架构):第四期:计算架构与调度
c语言·深度学习·算法·架构·cuda
feng_you_ying_li8 小时前
linux之用户的权限详解(4)
linux·运维·服务器