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

Reply via email to