[git commit] init: add a segv debugging aid, disabled by default

Abdoulaye Walsimou Gaye awg at embtoolkit.org
Mon Jan 30 12:11:01 UTC 2012


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<vda.linux at googlemail.com>
> ---
>   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


More information about the busybox mailing list