V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
huangya
V2EX  ›  Linux

Linux 下有简单办法打印应用程序的 backtrace 吗?

  •  
  •   huangya · 2022-08-19 19:37:06 +08:00 · 2394 次点击
    这是一个创建于 846 天前的主题,其中的信息可能已经有所发展或是发生改变。
    应用程序蛮复杂的,并且还带多个动态链接库。现在想打印某个函数调用的 backtrace.有方便的办法吗?
    在内核中可以调用 dump_stack.应用程序呢?搜索了一下,似乎没有很方便的办法。有个初步的想法是故意触发一个 crash,然后获取 coredump, 最后用 gdb 去看 backtrace.还没实践。
    7 条回复    2022-08-21 14:17:50 +08:00
    Ediacaran
        1
    Ediacaran  
       2022-08-19 19:45:57 +08:00 via iPhone   ❤️ 1
    unwind
    0o0O0o0O0o
        2
    0o0O0o0O0o  
       2022-08-19 19:46:29 +08:00
    libunwind
    huangya
        3
    huangya  
    OP
       2022-08-19 19:53:50 +08:00
    @Ediacaran
    @0o0O0o0O0o 感谢两位,我研究一下怎么安装。因为程序是一个嵌入式程序,涉及到怎么放到 buildroot 和交叉编译
    microxiaoxiao
        4
    microxiaoxiao  
       2022-08-19 21:22:26 +08:00 via Android
    我觉得你需要的是 ptrace ,嘻嘻。
    Madcrow
        5
    Madcrow  
       2022-08-19 22:59:17 +08:00
    函数里调用一下:

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

    void print_trace(void) {
    char **strings;
    size_t i, size;
    enum Constexpr { MAX_SIZE = 1024 };
    void *array[MAX_SIZE];
    size = backtrace(array, MAX_SIZE);
    strings = backtrace_symbols(array, size);
    for (i = 0; i < size; i++)
    printf("%s\n", strings[i]);
    puts("");
    free(strings);
    }
    ```
    Inn0Vat10n
        6
    Inn0Vat10n  
       2022-08-19 23:44:07 +08:00
    简单的方式,while true 或者 sleep, gdb/pstack 看
    by73
        7
    by73  
       2022-08-21 14:17:50 +08:00
    如果内核比较新的话,可以考虑用 bpftrace ,但是这玩意编译比较痛苦。。用它依赖的 [uprobe]( https://www.kernel.org/doc/html/latest/trace/uprobetracer.html) 相对来说也可行,不过我没咋研究过😂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4288 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 03:59 · PVG 11:59 · LAX 19:59 · JFK 22:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.