我想SIGSEGV
在程序退出之前在日志中捕获并打印回溯。这是为了在稍后的时间点分析崩溃。我正在开发一个在多个平台上运行的软件。在 x86 平台上,我可以使用 glibcbacktrace()
函数轻松完成此操作。但同样不适用于 MIPS 和 ARC 平台。我能够打印 MIPS 架构的回溯,如此处所述
我也想为ARC 平台做类似的事情。如果有人可以提供一些关于我在哪里可以获得类似详细信息的数据点,那将是非常有帮助的。
编辑:
经过一番研究,我发现在函数调用的 ARC 平台中,堆栈不是一次分配的,而是部分分配的。(如果我错了,请纠正我。我通过对象转储并弄清楚了这一点。)所以我觉得在这种情况下,与 MIPS 相比,很难进行二进制代码解析。
另一种方法是在 C 中编写一些内联汇编并获取堆栈指针、帧指针和分支链接寄存器内容(闪烁),然后尝试使用堆栈和帧大小以及每帧中的闪烁值来展开堆栈。但我无法找到框架大小。
这是获取 FP、SP、BLINK 的示例代码。
int func2(int func2_arg)
{
unsigned long *stack2_addr;
unsigned long *frame2_addr;
unsigned long *blink2_addr;
printf("\nFunc : %s\n",__FUNCTION__);
__asm__ __volatile__ ("st sp,[sp,4]");
printf("Stack pointer: %d\n",stack2_addr);
__asm__ __volatile__ ("st blink,[sp,12]");
printf("Blink: %d \n",blink2_addr);
__asm__ __volatile__ ("st fp,[sp,8]");
printf("Frame pointer2: %d, %d\n",frame2_addr,*frame2_addr);
return 0;
}
是的,这不是好的编码!我做了很多假设。但对我来说,只要它在我的板上工作就很好。:)
任何帮助将不胜感激。这是关于 ARC gcc 的另一个参考资料。