hi, glibc has a backtrace() function. I do not know how portable that is. there is also getcontext() to make that more portable: http://www.delorie.com/gnu/docs/glibc/libc_465.html
Personally i would make that an example how to debug it since debugging this is not a standard case. re, wh Am 30.01.2012 13:11, schrieb Abdoulaye Walsimou Gaye: > On 01/30/2012 12:15 PM, Denys Vlasenko wrote: >> commit: >> http://git.busybox.net/busybox/commit/?id=da2b2da6a708edffcc3b405ab5fd7f3f11af5d33 >> >> branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master >> >> Signed-off-by: Denys Vlasenko<[email protected]> >> --- >> init/init.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 files changed, 51 insertions(+), 0 deletions(-) >> >> diff --git a/init/init.c b/init/init.c >> index c540faa..7248946 100644 >> --- a/init/init.c >> +++ b/init/init.c >> @@ -108,6 +108,8 @@ >> //config: Note that on Linux, init attempts to detect serial >> terminal and >> //config: sets TERM to "vt102" if one is found. >> >> +#define DEBUG_SEGV_HANDLER 0 >> + >> #include "libbb.h" >> #include<syslog.h> >> #include<paths.h> >> @@ -118,6 +120,15 @@ >> #endif >> #include "reboot.h" /* reboot() constants */ >> >> +#if DEBUG_SEGV_HANDLER >> +# undef _GNU_SOURCE >> +# define _GNU_SOURCE 1 >> +# undef __USE_GNU >> +# define __USE_GNU 1 >> +# include<execinfo.h> >> +# include<sys/ucontext.h> >> +#endif >> + >> /* Used only for sanitizing purposes in set_sane_term() below. On >> systems where >> * the baud rate is stored in a separate field, we can safely >> disable them. */ >> #ifndef CBAUD >> @@ -957,6 +968,33 @@ static int check_delayed_sigs(void) >> } >> } >> >> +#if DEBUG_SEGV_HANDLER >> +static >> +void handle_sigsegv(int sig, siginfo_t *info, void *ucontext) >> +{ >> + long ip; >> + ucontext_t *uc; >> + >> + uc = ucontext; >> + ip = uc->uc_mcontext.gregs[REG_EIP]; >> >> > [...] > > Hi Denys, > Are you sure that this part of code is portable? > Last time I looked uc->uc_mcontext data structure was not. > I am working with an ARM gcc-.4.4.5 toolchain currently for instance, > here is how uc_mcontext is defined: > > struct sigcontext { > unsigned long trap_no; > unsigned long error_code; > unsigned long oldmask; > unsigned long arm_r0; > unsigned long arm_r1; > unsigned long arm_r2; > unsigned long arm_r3; > unsigned long arm_r4; > unsigned long arm_r5; > unsigned long arm_r6; > unsigned long arm_r7; > unsigned long arm_r8; > unsigned long arm_r9; > unsigned long arm_r10; > unsigned long arm_fp; > unsigned long arm_ip; > unsigned long arm_sp; > unsigned long arm_lr; > unsigned long arm_pc; > unsigned long arm_cpsr; > unsigned long fault_address; > }; > > typedef struct sigcontext mcontext_t; > > /* Userlevel context. */ > typedef struct ucontext > { > unsigned long uc_flags; > struct ucontext *uc_link; > stack_t uc_stack; > mcontext_t uc_mcontext; > __sigset_t uc_sigmask; > unsigned long uc_regspace[128] __attribute__((__aligned__(8))); > } ucontext_t; > > as you can see, there is no 'gregs' field. > I think this part of your code is specific to x86. > > Best regards, > AWG > _______________________________________________ > busybox mailing list > [email protected] > http://lists.busybox.net/mailman/listinfo/busybox > > _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
