Articles of backtrace

有没有办法从Linux发行版二进制转储堆栈跟踪线号?

当我的c ++ linux应用程序崩溃时,我有要求堆栈跟踪。 我成功地使用backtrace()和backtrace_symbols()来做到这一点。 现在,另外我想获得崩溃的行号。 它是如何做到的?

有没有图书馆电话addr2line?

我需要从C ++程序中获取addr2line(从追溯函数调用的文件和行)提供的信息。 是否有类似于addr2line的库调用? 编辑:我在一个Linux环境中工作。 我知道我可以直接调用addr2line,并且我知道我可以在我的程序中使用addr2line的源代码 (这也是GPL许可的)。 但是我想调用一个库函数,如果它存在的话,是更干净的。 编辑:我将使用binutils的bfd,就像addr2line一样。 bfd是什么意思呢?

如何在C中手动迭代堆栈帧?

在处理应用程序中的信号时,我可以在debugging器中正确地看到回溯。但是回溯系统调用不能正确显示堆栈帧。gdb如何存储堆栈帧以及回溯系统调用如何转储它们?

任何移植uclibc可用的backtrace?

我们在ARM 9上运行uclibc linux。问题是uclibc不支持回溯。 发生核心转储时,我无法获取调用堆栈。 有没有人有一个很好的解决scheme? 例如,现有的uclibc回溯移植,或者在发生核心转储时抓取调用堆栈的好方法(uclibc + ARM + Linux)?

如何展开堆栈以获取指定堆栈指针(SP)的回溯?

我正在为Android编写(仅限ARM),但我相信通用Linux的原理也是一样的。 我试图从信号处理程序捕获堆栈跟踪,以便我的应用程序崩溃时可以logging它。 这就是我使用<unwind.h> 。 初始化: struct sigaction signalhandlerDescriptor; memset(&signalhandlerDescriptor, 0, sizeof(signalhandlerDescriptor)); signalhandlerDescriptor.sa_flags = SA_SIGINFO; signalhandlerDescriptor._u._sa_sigaction = signalHandler; sigaction(SIGSEGV, &signalhandlerDescriptor, 0); 代码本身: struct BacktraceState { void** current; void** end; void* pc; }; inline _Unwind_Reason_Code unwindCallback(struct _Unwind_Context* context, void* arg) { BacktraceState* state = static_cast<BacktraceState*>(arg); state->pc = (void*)_Unwind_GetIP(context); if (state->pc) { if (state->current == state->end) return _URC_END_OF_STACK; […]