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();
}