I want to catch SIGSEGV and print back trace in logs before my program exits. This is for analyzing an accident at a later point in time. I am working on software that runs on multiple platforms. On the x86 platform, I can do this easily using the glibc backtrace () function. But the same is not available for MIPS and ARC platforms. I can print backtrace for MIPS architecture as described here
I want to do something similar for the ARC platform . It would be very helpful if someone could point out some data points where I can get similar data.
"Change"
After some research, I realized that in the ARC platform, to call a function, the stack is not allocated immediately, but allocated in parts. (Correct me if I am wrong. I went through the dump of the object and figured it out.) Thus, I feel that in this case it will be difficult to parse the binary code, not MIPS.
Another approach would be to write assembly code in C and get a pointer to the stack, a pointer to a frame, and a branch link (blink), and then try to expand the stack using the stack and frame size, and the print value in each frame. But I can not find the size of the frame.
Here is a sample code to get 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; }
Yes, this is bad coding! I made a lot of assumptions. But for me this is normal, since it works on my board. :)
Any help would be greatly appreciated. Here is another link to ARC gcc.