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]
相关推荐
lcreek1 天前
Linux信号机制详解:阻塞信号集与未决信号集
linux·操作系统·系统编程
shandianchengzi1 天前
【记录】Tailscale|部署 Tailscale 到 linux 主机或 Docker 上
linux·运维·docker·tailscale
John Song1 天前
Linux机器怎么查看进程内存占用情况
linux·运维·chrome
sichuanwuyi1 天前
Wydevops工具的价值分析
linux·微服务·架构·kubernetes·jenkins
持戒波罗蜜1 天前
ubuntu20解决intel wifi 驱动问题
linux·驱动开发·嵌入式硬件·ubuntu
不做无法实现的梦~1 天前
使用ros2来跑通mid360的驱动包
linux·嵌入式硬件·机器人·自动驾驶
csdn_aspnet1 天前
C 语言的优雅回归:从零手造数据结构
c语言·数据结构
点云SLAM1 天前
C++内存泄漏检测之Windows 专用工具(CRT Debug、Dr.Memory)和Linux 专业工具(ASan 、heaptrack)
linux·c++·windows·asan·dr.memory·c++内存泄漏检测·c++内存管理
肉肉心很软1 天前
使用onlyoffice实现文件预览编辑 + Docker一键部署流程
运维·docker·容器
浅念-1 天前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法