Hi,

        I have a program in attachment. 
        When I compiled and run on pc, I got the following when I break at 
CrawlStack() in gdb.

        #0  CrawlStack (jb=0x7ffff464, first=0x2ab0ca01" 
\211?=\001???s\005?\213\034$?S?????\201??w\020") at test.c:12
        #1  0x080485b9 in Log (first=0x2ab0ca01         
"\211?=\001???s\005?\213\034$?S?????\201??w\020") at test.c:29
        #2  0x080485d6 in StackHook (signum=10, info=0x7ffff540, mystry=0x7ffff5c0)    
 
at test.c:37
        #3  <signal handler called>
        #4  0x2ab0ca01 in __kill () from /lib/i686/libc.so.6
        #5  0x0804865b in d () at test.c:59
        #6  0x080486c7 in main () at test.c:74
        #7  0x2aafa507 in __libc_start_main (main=0x8048660 <main>, argc=1, 
ubp_av=0x7ffffa54, init=0x80483a0 <_init>,  fini=0x8048710 <_fini>, 
rtld_fini=0x2aab8c14 <_dl_fini>, stack_end=0x7ffffa4c) at. 
./sysdeps/generic/libc-start.c:129

        However, when I compiled and run on arm board, the trace can only up the 
<signal handler called>. Is this a bug? Or how can I obtain the remaing stack 
trace? Thx.

Jacky
#include <signal.h>
#include <stdio.h>
#include <setjmp.h>

static void CrawlStack(jmp_buf jb, char* first)
{
	int i;
	unsigned long *bp=(unsigned long *)(jb[0].__jmpbuf[19]);
}

static void
Log(char *first)
{
  jmp_buf jb;
  setjmp(jb);
  CrawlStack(jb, first);
}

static void StackHook(
int signum,
siginfo_t *info,
void *mystry)
{
	Log(((char**)mystry)[19]);
}

void c(int i)
{
	sleep(1);
}

void *b(char *str, int i)
{
	sleep(2);
	c(i);
	return (void *)0x1111;
}

void d(void)
{

	while(1)
	{
		sleep(2);
		b("hello", 1);
		kill(getpid(), SIGUSR1);
	}
}

void main()
{
                    struct sigaction action;
                    sigset_t mset;

                    sigemptyset(&mset);
                    action.sa_handler = NULL;
                    action.sa_sigaction = StackHook;
                    action.sa_mask  = mset;
                    action.sa_flags = SA_RESTART | SA_SIGINFO;
                    sigaction(SIGUSR1, &action, NULL);
	d();
}

Reply via email to