【问题标题】: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中所说的那样