Hi uclibc list, I am trying to generate a call stack trace using backtrace() API which is part of libubacktrace. The idea is to catch a SIGSEGV signal and call backtrace() to print all the address values and compare the obtained addresses from objdump -D of executable. Attached is a simplified version of the application. Following is the output seen on ARMv7a platform with buildroot cross-toolchain (gcc- 4.6.3, uClibc-0.9.33.2, binutis-2.21.1).
To compile the application: ${CROSS_COMPILE}gcc -o crash_test -O0 -funwind-tables -rdynamic crash_test.c ARMv7a# ./crash_test Trying to access NULL pointer! SIGSEGV Handler! Got Backtrace Size=2 0x00008724 0x000087c4 ARMv7a# The above function call trace is only that of the signal hander (print_back_trace, sigsegv_handler) and does not show the entire call stack for the function where program crashed (print_back_trace, sigsegv_handler, func2, main). On x86 host same program shows a deeper function call trace right up to the main function and even beyond: x86-RHEL5-host$./crash_test Trying to access NULL pointer! SIGSEGV Handler! Got Backtrace Size=7 0x00400939 0x004009ab 0x30930302f0 0x004009d3 0x00400a7b 0x309301d994 0x00400889 x86-RHEL5-host$ Can someone please comment on what is going wrong. Any special flags that need to be used while compiling/linking the program. /Thanks
#include <termios.h> #include <unistd.h> #include <stdlib.h> #include <pthread.h> #include <signal.h> #include <stdio.h> #include <string.h> void print_back_trace() { void *array[32]; int index, size; size = backtrace (array, 32); printf("Got Backtrace Size=%d\n", size); for (index = 0; index < size; index++) { printf ("0x%08lx\n", (unsigned long) array[index]); } } static void sigsegv_handler (int sig, siginfo_t * info, void *v) { printf("SIGSEGV Handler!\n"); print_back_trace(); exit (0); } void func2() { int val; unsigned int *ptr; ptr = 0; printf("Trying to access NULL pointer!\n"); val = *ptr; printf ("Read 0x%x from %p\n", val, ptr); } void func1() { int val; char buf[256]; val = 100; printf("\nTrying to construct invalid buffer!\n"); snprintf(buf, sizeof (buf), "%s", val); printf("The content of buf: %s\n", buf); } int main() { struct sigaction sig_act; int rc; sig_act.sa_sigaction = sigsegv_handler; rc = sigaction (SIGSEGV, &sig_act, 0); func2(); return 0; }
_______________________________________________ uClibc mailing list uClibc@uclibc.org http://lists.busybox.net/mailman/listinfo/uclibc