【问题标题】:How to get backtrace without core file?如何在没有核心文件的情况下获得回溯?
【发布时间】:2015-03-05 09:25:58
【问题描述】:

如果没有生成核心转储(由于任何可能的原因)。我想知道回溯(指令的执行顺序)。我该怎么做?

因为 /proc/pid/maps 存储进程的内存映射。 linux中是否有存储进程的用户空间或内核空间的文件?(可能是我用错了词来表达)

我的意思是按地址顺序执行指令的所有地址。

【问题讨论】:

标签: debugging memory linux-kernel


【解决方案1】:

查看当前进程的内核堆栈是什么样的:

sudo cat /proc/PID/stack

如果您想查看进程的用户堆栈,并且可以在它仍在运行时访问它(即使它卡在等待系统调用返回),运行gdb 并使用它的附加到它PID。然后使用backtrace 命令。如果程序是用调试符号编译的,这将提供更多信息。

【讨论】:

    【解决方案2】:

    如果您想在 Linux 内核中打印回溯,请使用 dump_stack()

    如果您想在用户级 C 代码中打印回溯,请实现类似这样的内容

    #include <stdlib.h>
    #include <stdio.h>
    #include <execinfo.h>
    #define BACKTRACE_SIZ 64
    
    void show_backtrace (void)
    {
        void    *array[BACKTRACE_SIZ];
        size_t   size, i;
        char   **strings;
    
        size = backtrace(array, BACKTRACE_SIZ);
        strings = backtrace_symbols(array, size);
    
        for (i = 0; i < size; i++) {
            printf("%p : %s\n", array[i], strings[i]);
        }
    
        free(strings);  // malloced by backtrace_symbols
    }
    

    然后用-funwind-tables标志编译代码并用-rdynamic链接

    正如http://www.stlinux.com/devel/debug/backtrace中所说的那样

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      相关资源
      最近更新 更多