美文网首页
Linux C语言打印函数调用栈

Linux C语言打印函数调用栈

作者: CodingCode | 来源:发表于2023-10-15 03:11 被阅读0次

代码例子:

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

void print_trace()
{
    int MAX_STACK_LEVELS=50;
    void *buffer[MAX_STACK_LEVELS];
    int levels = backtrace(buffer, MAX_STACK_LEVELS);

    int fd = -1;
    if (fd != -1) {
        int i;
        char **strings = backtrace_symbols (buffer, levels);
        if (strings != NULL) {
            for (i = 1; i < levels; i++) {  // start from 1 to skip the print_trace itself
                printf ("%s\n", strings[i]);
            }
            free (strings);
        }

    } else {
        backtrace_symbols_fd(buffer + 1, levels - 1, 2);    // skip the print_trace itself
    }
}

void foo3(void)
{
    print_trace();
}

void foo2(void)
{
    foo3();
}

void foo1(void)
{
    foo2();
}

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

编译运行:

$ gcc -rdynamic test.c
$ ./a.out
./a.out(foo3+0xe)[0x4009f9]
./a.out(foo2+0x9)[0x400a04]
./a.out(foo1+0x9)[0x400a0f]
./a.out(main+0x9)[0x400a1a]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f61a25b6555]
./a.out[0x400809]

注意这里编译一定要带上-rdynamic参数:

       -rdynamic
           Pass the flag -export-dynamic to the ELF linker, on targets that support it. This instructs the linker to add all
           symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of "dlopen" or to
           allow obtaining backtraces from within a program.

因为否则,拿不到函数符号表信息:

$ gcc test.c
$ ./a.out
./a.out[0x400799]
./a.out[0x4007a4]
./a.out[0x4007af]
./a.out[0x4007ba]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7fb2a46af555]
./a.out[0x4005a9]

相关文章

  • [转载]C语言函数调用栈

    原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...

  • Xcode(C/C++)打印调用栈信息

    本文档记录Xcode打印调用栈信息的配置,辅助调试复杂C/C++代码。 1、输出调用栈信息 具体功能由由如下函数实...

  • 3. 栈的操作

    1. 栈的操作-c语言实现2. 栈操作的实现-顺序栈和链栈 3. 栈的实现与遍历4. c语言的函数调用栈5. 两个...

  • 2018-07-30

    一、什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗...

  • 10章 内存: 进程地址空间 / 函数调用栈 & 反汇编 / h

    1 Linux 进程地址空间 布局 2 栈 与 调用惯例 (1) 栈 & 函数调用 机制 进入 funcBody ...

  • CPU上下文切换

    栈空间 用户态函数栈主要用于用户态的函数调用image.png 内核栈Linux 给每个 task 都分配了内核栈...

  • 可以打印栈信息的日志函数,移动混合开发必备!!!

    stack-log 可以打印栈信息的日志函数,移动混合开发必备!!! 简介 断点信息,可以反映函数的调用栈,但是不...

  • 2. 进程栈和线程栈

    Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈 - 木易博客专栏 - CSDN博客 栈的作用:函数调用和多...

  • c语言调用栈

    关键词:C语言 、X86汇编、调用栈、传参顺序、C调用约定 工具:C 编译器、IDA 测试代码1: stack.c...

  • C 报错打印调用栈

网友评论

      本文标题:Linux C语言打印函数调用栈

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