[RFC] Infinite backtraces...

Joel Brobecker brobecker@adacore.com
Tue Dec 7 10:07:00 GMT 2004


Hello Randolph,

> 2004-12-05  Randolph Chung  <tausq@debian.org>
> 
> 	* hppa-tdep.c (hppa_stub_Frame_unwind_cache): Stop unwinding if 
> 	unwinding from a frame with pc == 0.
> 	(hppa_stub_frame_this_id): Likewise.
> 	(hppa_stub_frame_prev_register): Only provide real values if the frame
> 	cache is not NULL.

I haven't tested this patch yet, but it looks pretty good, as it is
close to something that I did on my side. Just a question: What happens
if hppa_stub_frame_prev_register() doesn't set anything?

You added "if (info) then hppa_frame_prev ().". Could it ever happen
that info is NULL?

One thing that I'm thinking is that this will no longer stop the
backtrace once your change to hide the stubs goes in (except in
the very unlikely case when we're inside the initial stub). Is it
still worth including this patch under these conditions?

> Index: hppa-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/hppa-tdep.c,v
> retrieving revision 1.185
> diff -u -p -r1.185 hppa-tdep.c
> --- hppa-tdep.c	6 Dec 2004 03:32:26 -0000	1.185
> +++ hppa-tdep.c	6 Dec 2004 07:11:29 -0000
> @@ -2111,10 +2115,13 @@ hppa_stub_frame_unwind_cache (struct fra
>    struct gdbarch *gdbarch = get_frame_arch (next_frame);
>    struct hppa_stub_unwind_cache *info;
>    struct unwind_table_entry *u;
>  
>    if (*this_cache)
>      return *this_cache;
>  
> +  if (frame_pc_unwind (next_frame) == 0)
> +    return NULL;
> +
>    info = FRAME_OBSTACK_ZALLOC (struct hppa_stub_unwind_cache);
>    *this_cache = info;
>    info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
> @@ -2149,7 +2164,11 @@ hppa_stub_frame_this_id (struct frame_in
>  {
>    struct hppa_stub_unwind_cache *info
>      = hppa_stub_frame_unwind_cache (next_frame, this_prologue_cache);
> -  *this_id = frame_id_build (info->base, frame_pc_unwind (next_frame));
> +
> +  if (info)
> +    *this_id = frame_id_build (info->base, frame_pc_unwind (next_frame));
> +  else
> +    *this_id = null_frame_id;
>  }
>  
>  static void
> @@ -2161,8 +2180,11 @@ hppa_stub_frame_prev_register (struct fr
>  {
>    struct hppa_stub_unwind_cache *info
>      = hppa_stub_frame_unwind_cache (next_frame, this_prologue_cache);
> -  hppa_frame_prev_register_helper (next_frame, info->saved_regs, regnum,
> -		                   optimizedp, lvalp, addrp, realnump, valuep);
> +
> +  if (info)
> +    hppa_frame_prev_register_helper (next_frame, info->saved_regs, regnum,
> +				     optimizedp, lvalp, addrp, realnump, 
> +				     valuep);
>  }
>  
>  static const struct frame_unwind hppa_stub_frame_unwind = {

-- 
Joel



More information about the Gdb-patches mailing list