This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: patch for info threads problem with target arm-elf (PR 1199).
On Fri, Jul 25, 2003 at 09:26:22PM -0400, Andrew Cagney wrote:
> >On Fri, Jul 25, 2003 at 05:26:12PM -0700, Michael Snyder wrote:
> >
> >>Andrea Michelotti wrote:
> >>
> >
> >>>-----------------------
> >>>Andrea Michelotti
> >>>HW/SW Co-Design Manager
> >>>IPITEC (ATMEL)
> >
> >>
> >>
> >>I think it can be approved. Do you have an FSF copyright assignment?
> >
> >
> >I'd want to ping Andrew about this first before scattering NULL pointer
> >checks - Andrew, does "there is always a frame" include when the
> >inferior does not exist yet?
>
> Kind of :-) If the inferior doesn't exist, GDB should never get to find
> out the answer. See get_current_frame and all those error() checks.
>
> >Also, I think a better solution to this actual crash is for info
> >threads to bail out early if we don't have an inferior. Probably
> >target_has_registers ().
>
> Yes, looking at the start of info_threads_command:
>
> > static void
> >info_threads_command (char *arg, int from_tty)
> >{
> > struct thread_info *tp;
> > ptid_t current_ptid;
> > struct frame_info *cur_frame;
> > int saved_frame_level = frame_relative_level (deprecated_selected_frame);
> > int counter;
> > char *extra_info;
> >
> > /* Avoid coredumps which would happen if we tried to access a NULL
> > deprecated_selected_frame. */
> > if (!target_has_stack)
> > error ("No stack.");
>
> The references to:
>
> deprecated_selected_frame
>
> should have set off alarm bells!
>
> A quick fix would be to call get_selected_frame() (and delete that error
> check).
Note the access to deprecated_selected_frame above the check :) OK,
this isn't the thorough fix, but how's this look? Andrea, does this
work with Eclipse in place of your patch?
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer
2003-07-25 Daniel Jacobowitz <drow@mvista.com>
* thread.c (info_threads_command): Use get_selected_frame ().
Check that there is at least one non-sentinel frame.
Index: thread.c
===================================================================
RCS file: /cvs/src/src/gdb/thread.c,v
retrieving revision 1.31
diff -u -p -r1.31 thread.c
--- thread.c 5 May 2003 00:27:08 -0000 1.31
+++ thread.c 26 Jul 2003 01:47:08 -0000
@@ -417,14 +417,14 @@ info_threads_command (char *arg, int fro
struct thread_info *tp;
ptid_t current_ptid;
struct frame_info *cur_frame;
- int saved_frame_level = frame_relative_level (deprecated_selected_frame);
+ int saved_frame_level = frame_relative_level (get_selected_frame ());
int counter;
char *extra_info;
- /* Avoid coredumps which would happen if we tried to access a NULL
- deprecated_selected_frame. */
- if (!target_has_stack)
- error ("No stack.");
+ /* Check that there really is a frame. This happens when a simulator
+ is connected but not loaded or running, for instance. */
+ if (saved_frame_level < 0)
+ error ("No frame.");
prune_threads ();
target_find_new_threads ();
@@ -448,10 +448,7 @@ info_threads_command (char *arg, int fro
puts_filtered (" ");
switch_to_thread (tp->ptid);
- if (deprecated_selected_frame)
- print_stack_frame (deprecated_selected_frame, -1, 0);
- else
- printf_filtered ("[No stack.]\n");
+ print_stack_frame (get_selected_frame (), -1, 0);
}
switch_to_thread (current_ptid);
@@ -463,12 +460,12 @@ info_threads_command (char *arg, int fro
* of the stack (leaf frame).
*/
counter = saved_frame_level;
- cur_frame = find_relative_frame (deprecated_selected_frame, &counter);
+ cur_frame = find_relative_frame (get_selected_frame (), &counter);
if (counter != 0)
{
/* Ooops, can't restore, tell user where we are. */
warning ("Couldn't restore frame in current thread, at frame 0");
- print_stack_frame (deprecated_selected_frame, -1, 0);
+ print_stack_frame (get_selected_frame (), -1, 0);
}
else
{