【发布时间】:2012-10-11 10:13:01
【问题描述】:
我想在程序退出之前捕获SIGSEGV 并在日志中打印回溯。这是为了在稍后的时间点分析崩溃。我正在开发一个在多个平台上运行的软件。在 x86 平台上,我可以使用 glibc backtrace() 函数轻松完成此操作。但同样不适用于 MIPS 和 ARC 平台。我可以按照here
我也想为ARC platform 做类似的事情。如果有人可以提供一些数据点来说明我在哪里可以获得类似的详细信息,那将是非常有帮助的。
编辑:
经过一番研究,我发现在 ARC 平台中进行函数调用,堆栈不是一次分配的,而是部分分配的。 (如果我错了,请纠正我。我检查了对象转储并弄清楚了这一点。)所以我觉得在这种情况下,与 MIPS 相比,进行二进制代码解析会很困难。
另一种方法是编写一些inline assembly in 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;
}
是的,这不是好的编码!我做了很多假设。但对我来说,只要它在我的板上工作就很好。 :)
任何帮助将不胜感激。 Here 是 ARC gcc 的另一个参考。
【问题讨论】:
标签: c linux-kernel stack-trace signal-handling arc-architecture