PR gdb/15911: "info threads" changes the default source and line (for "break", "list")
authorPedro Alves <palves@redhat.com>
Tue, 17 Sep 2013 18:26:41 +0000 (18:26 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 17 Sep 2013 18:26:41 +0000 (18:26 +0000)
"info threads" changes the default source for "break" and "list", to
whatever the location of the first/bottom thread in the thread list
is...

 (gdb) b start
 (gdb) c
 ...
 (gdb) list
 *lists "start"*
 (gdb) b 23
 Breakpoint 3 at 0x400614: file test.c, line 23.
 (gdb) info threads
   Id   Target Id         Frame
 * 2    Thread 0x7ffff7fcb700 (LWP 1760) "test" start (arg=0x0) at test.c:23
   1    Thread 0x7ffff7fcc740 (LWP 1748) "test" 0x000000323dc08e60 in pthread_join (threadid=140737353922304, thread_return=0x0) at pthread_join.c:93
 (gdb) b 23
 Breakpoint 4 at 0x323dc08d90: file pthread_join.c, line 23.
                                    ^^^^^^^^^^^^^^^
 (gdb) list
 93          lll_wait_tid (pd->tid);
 94
 95
 96        /* Restore cancellation mode.  */
 97        CANCEL_RESET (oldtype);
 98
 99        /* Remove the handler.  */
 100       pthread_cleanup_pop (0);
 101
 102

The issue is that print_stack_frame always sets the current sal to the
frame's sal.  print_frame_info (which print_stack_frame calls to do
most of the work) also sets the last displayed sal, but only if
print_what isn't LOCATION.  Now the call in question, from within
thread.c:print_thread_info, does pass in LOCATION as print_what, but
print_stack_frame doesn't have the same check print_frame_info has.
We could consider adding it, but setting these globals depending on
print_what isn't very clean, IMO.  What we have is two logically
distinct operations mixed in the same function(s):

  #1 - print frame, in the format specified by {print_what,
    print_level and print_args}.

  #2 - We're displaying a frame to the user, and I want the default
    sal to point here, because the program stopped here, or the user
    did some context-changing command (up, down, etc.).

So I added a new parameter to print_stack_frame & friends for point
#2, and went through all calls in the tree adjusting as necessary.

Tested on x86_64 Fedora 17.

gdb/
2013-09-17  Pedro Alves  <palves@redhat.com>

PR gdb/15911
* ada-tasks.c (task_command_1): Adjust call to print_stack_frame.
* bsd-kvm.c (bsd_kvm_open, bsd_kvm_proc_cmd, bsd_kvm_pcb_cmd):
* corelow.c (core_open):
* frame.h (print_stack_frame, print_frame_info): New
'set_current_sal' parameter.
* infcmd.c (finish_command, kill_command): Adjust call to
print_stack_frame.
* inferior.c (inferior_command): Likewise.
* infrun.c (normal_stop): Likewise.
* linux-fork.c (linux_fork_context): Likewise.
* record-full.c (record_full_goto_entry, record_full_restore):
Likewise.
* remote-mips.c (common_open): Likewise.
* stack.c (print_stack_frame): New 'set_current_sal' parameter.
Use it.
(print_frame_info): New 'set_current_sal' parameter.  Set the last
displayed sal depending on the new paremeter instead of looking at
print_what.
(backtrace_command_1, select_and_print_frame, frame_command)
(current_frame_command, up_command, down_command): Adjust call to
print_stack_frame.
* thread.c (print_thread_info, restore_selected_frame)
(do_captured_thread_select): Adjust call to print_stack_frame.
* tracepoint.c (tfind_1): Likewise.
* mi/mi-cmd-stack.c (mi_cmd_stack_list_frames)
(mi_cmd_stack_info_frame): Likewise.
* mi/mi-interp.c (mi_on_normal_stop): Likewise.
* mi/mi-main.c (mi_cmd_exec_return, mi_cmd_trace_find): Likewise.

gdb/testsuite/
* gdb.threads/info-threads-cur-sal-2.c: New file.
* gdb.threads/info-threads-cur-sal.c: New file.
* gdb.threads/info-threads-cur-sal.exp: New file.

21 files changed:
gdb/ChangeLog
gdb/ada-tasks.c
gdb/bsd-kvm.c
gdb/corelow.c
gdb/frame.h
gdb/infcmd.c
gdb/inferior.c
gdb/infrun.c
gdb/linux-fork.c
gdb/mi/mi-cmd-stack.c
gdb/mi/mi-interp.c
gdb/mi/mi-main.c
gdb/record-full.c
gdb/remote-mips.c
gdb/stack.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.threads/info-threads-cur-sal-2.c [new file with mode: 0644]
gdb/testsuite/gdb.threads/info-threads-cur-sal.c [new file with mode: 0644]
gdb/testsuite/gdb.threads/info-threads-cur-sal.exp [new file with mode: 0644]
gdb/thread.c
gdb/tracepoint.c

index 27d8293648545a8371935b36004de3d890e85469..cf0ff4470e27956eec9a24d3dea02cbdf4f65ccf 100644 (file)
@@ -1,3 +1,35 @@
+2013-09-17  Pedro Alves  <palves@redhat.com>
+
+       PR gdb/15911
+       * ada-tasks.c (task_command_1): Adjust call to print_stack_frame.
+       * bsd-kvm.c (bsd_kvm_open, bsd_kvm_proc_cmd, bsd_kvm_pcb_cmd):
+       * corelow.c (core_open):
+       * frame.h (print_stack_frame, print_frame_info): New
+       'set_current_sal' parameter.
+       * infcmd.c (finish_command, kill_command): Adjust call to
+       print_stack_frame.
+       * inferior.c (inferior_command): Likewise.
+       * infrun.c (normal_stop): Likewise.
+       * linux-fork.c (linux_fork_context): Likewise.
+       * record-full.c (record_full_goto_entry, record_full_restore):
+       Likewise.
+       * remote-mips.c (common_open): Likewise.
+       * stack.c (print_stack_frame): New 'set_current_sal' parameter.
+       Use it.
+       (print_frame_info): New 'set_current_sal' parameter.  Set the last
+       displayed sal depending on the new paremeter instead of looking at
+       print_what.
+       (backtrace_command_1, select_and_print_frame, frame_command)
+       (current_frame_command, up_command, down_command): Adjust call to
+       print_stack_frame.
+       * thread.c (print_thread_info, restore_selected_frame)
+       (do_captured_thread_select): Adjust call to print_stack_frame.
+       * tracepoint.c (tfind_1): Likewise.
+       * mi/mi-cmd-stack.c (mi_cmd_stack_list_frames)
+       (mi_cmd_stack_info_frame): Likewise.
+       * mi/mi-interp.c (mi_on_normal_stop): Likewise.
+       * mi/mi-main.c (mi_cmd_exec_return, mi_cmd_trace_find): Likewise.
+
 2013-09-16  Sergio Durigan Junior  <sergiodj@redhat.com>
 
        * value.c (isvoid_internal_fn): Replace "parameter" with
index 3aa66675a46e28b56be0ac529db8f2ea1ab419a2..dfb6719c09008a6c0c81560a8c038f5d9831326c 100644 (file)
@@ -1311,7 +1311,7 @@ task_command_1 (char *taskno_str, int from_tty, struct inferior *inf)
   printf_filtered (_("[Switching to task %d]\n"), taskno);
   print_stack_frame (get_selected_frame (NULL),
                      frame_relative_level (get_selected_frame (NULL)),
-                    SRC_AND_LOC);
+                    SRC_AND_LOC, 1);
 }
 
 
index b47578b269ca908fbc1b57fb60d521a1e68ebec4..d1e7ca8485179b208b66612fb43f9d919a9fae0d 100644 (file)
@@ -100,7 +100,7 @@ bsd_kvm_open (char *filename, int from_tty)
   target_fetch_registers (get_current_regcache (), -1);
 
   reinit_frame_cache ();
-  print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1);
 }
 
 static void
@@ -286,7 +286,7 @@ bsd_kvm_proc_cmd (char *arg, int fromtty)
   target_fetch_registers (get_current_regcache (), -1);
 
   reinit_frame_cache ();
-  print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1);
 }
 
 #endif
@@ -306,7 +306,7 @@ bsd_kvm_pcb_cmd (char *arg, int fromtty)
   target_fetch_registers (get_current_regcache (), -1);
 
   reinit_frame_cache ();
-  print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1);
 }
 
 static int
index 8371b58b2b9c611a900b7ef46e3e11949be976af..7a5aaabf7c692383dda9fb1a328e6b93dddc34de 100644 (file)
@@ -453,7 +453,7 @@ core_open (char *filename, int from_tty)
 
   /* Now, set up the frame cache, and print the top of stack.  */
   reinit_frame_cache ();
-  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
 }
 
 static void
index 5e2400da37476d540037d4c0e962d7ddaa709387..a5e1629f98419648e831e9b73a602b2e4e166f73 100644 (file)
@@ -660,10 +660,12 @@ extern CORE_ADDR get_pc_function_start (CORE_ADDR);
 extern struct frame_info *find_relative_frame (struct frame_info *, int *);
 
 extern void print_stack_frame (struct frame_info *, int print_level,
-                              enum print_what print_what);
+                              enum print_what print_what,
+                              int set_current_sal);
 
 extern void print_frame_info (struct frame_info *, int print_level,
-                             enum print_what print_what, int args);
+                             enum print_what print_what, int args,
+                             int set_current_sal);
 
 extern struct frame_info *block_innermost_frame (const struct block *);
 
index 154cde25068bb913af6f6ab0300e82c5e727a44f..242aac1158454a07b66b6459c3f44caf62ccddb9 100644 (file)
@@ -1765,7 +1765,7 @@ finish_command (char *arg, int from_tty)
       if (from_tty)
        {
          printf_filtered (_("Run till exit from "));
-         print_stack_frame (get_selected_frame (NULL), 1, LOCATION);
+         print_stack_frame (get_selected_frame (NULL), 1, LOCATION, 0);
        }
 
       proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT, 1);
@@ -1790,7 +1790,7 @@ finish_command (char *arg, int from_tty)
       else
        printf_filtered (_("Run till exit from "));
 
-      print_stack_frame (get_selected_frame (NULL), 1, LOCATION);
+      print_stack_frame (get_selected_frame (NULL), 1, LOCATION, 0);
     }
 
   if (execution_direction == EXEC_REVERSE)
@@ -2334,7 +2334,7 @@ kill_command (char *arg, int from_tty)
       if (target_has_stack)
        {
          printf_filtered (_("In %s,\n"), target_longname);
-         print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
+         print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
        }
     }
   bfd_cache_close_all ();
index d5866e1f20c0e019b3d210e7ee1efbde964e40e3..28a520052ccd98f86639b0e3cb40061b906c0f18 100644 (file)
@@ -739,7 +739,7 @@ inferior_command (char *args, int from_tty)
   else if (inf->pid != 0)
     {
       ui_out_text (current_uiout, "\n");
-      print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
+      print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
     }
 }
 
index 57618ae981f5fdc3f96cf98d7af6f4f200093124..9e4323c72e2c5111ff6597224f856389384f0732 100644 (file)
@@ -6102,7 +6102,7 @@ normal_stop (void)
             LOCATION: Print only location
             SRC_AND_LOC: Print location and source line.  */
          if (do_frame_printing)
-           print_stack_frame (get_selected_frame (NULL), 0, source_flag);
+           print_stack_frame (get_selected_frame (NULL), 0, source_flag, 1);
 
          /* Display the auto-display expressions.  */
          do_displays ();
index 4100cb13f66e2274d52674b2288811b46cca974b..3774a7fdb5fa1f5ce2812a71a27ff16cd5f1a4a8 100644 (file)
@@ -731,7 +731,7 @@ linux_fork_context (struct fork_info *newfp, int from_tty)
   printf_filtered (_("Switching to %s\n"),
                   target_pid_to_str (inferior_ptid));
 
-  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
 }
 
 /* Switch inferior process (checkpoint) context, by checkpoint id.  */
index 7bf9ab82d8800c1a6e1c43e36dd2db54a24efe7c..6101341020fef5b5ea0e7dfe0630fd0c1c770df1 100644 (file)
@@ -159,7 +159,7 @@ mi_cmd_stack_list_frames (char *command, char **argv, int argc)
          QUIT;
          /* Print the location and the address always, even for level 0.
             If args is 0, don't print the arguments.  */
-         print_frame_info (fi, 1, LOC_AND_ADDRESS, 0 /* args */ );
+         print_frame_info (fi, 1, LOC_AND_ADDRESS, 0 /* args */, 0);
        }
     }
 
@@ -691,5 +691,5 @@ mi_cmd_stack_info_frame (char *command, char **argv, int argc)
   if (argc > 0)
     error (_("-stack-info-frame: No arguments allowed"));
 
-  print_frame_info (get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 0);
+  print_frame_info (get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 0, 1);
 }
index 038132f32a91a6f4299596cda9c4bd214a12c2c1..80cc0055a44efb0dd542d6be6913323888e445b0 100644 (file)
@@ -448,7 +448,7 @@ mi_on_normal_stop (struct bpstats *bs, int print_frame)
          get_last_target_status (&last_ptid, &last);
          bpstat_print (bs, last.kind);
 
-         print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC);
+         print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1);
          current_uiout = saved_uiout;
        }
 
index e6e98b6e18a7c9488e5653ecfc1f9b43d34a4e87..e8c4744c64cef0578926d44208403c77099549b6 100644 (file)
@@ -194,7 +194,7 @@ mi_cmd_exec_return (char *command, char **argv, int argc)
 
   /* Because we have called return_command with from_tty = 0, we need
      to print the frame here.  */
-  print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS);
+  print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 1);
 }
 
 void
@@ -2484,7 +2484,7 @@ mi_cmd_trace_find (char *command, char **argv, int argc)
     error (_("Invalid mode '%s'"), mode);
 
   if (has_stack_frames () || get_traceframe_number () >= 0)
-    print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS);
+    print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 1);
 }
 
 void
index 1c4e68bcd23bb762e71be779f85ae29b85e0a8c6..f9af408e8d3b9c9fbaf3ace419b68ca9dfb90d0a 100644 (file)
@@ -2004,7 +2004,7 @@ record_full_goto_entry (struct record_full_entry *p)
 
   registers_changed ();
   reinit_frame_cache ();
-  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
 }
 
 /* The "to_goto_record_begin" target method.  */
@@ -2590,7 +2590,7 @@ record_full_restore (void)
   printf_filtered (_("Restored records from core file %s.\n"),
                   bfd_get_filename (core_bfd));
 
-  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
 }
 
 /* bfdcore_write -- write bytes into a core file section.  */
index 081fbd06aa7ae9907e74926878bc68ae6536fe53..bf6cce5357af7236b11f4002386670466aeb34fb 100644 (file)
@@ -1661,7 +1661,7 @@ seen from the board via TFTP, specify that name as the third parameter.\n"));
   reinit_frame_cache ();
   registers_changed ();
   stop_pc = regcache_read_pc (get_current_regcache ());
-  print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1);
   xfree (serial_port_name);
 
   do_cleanups (cleanup);
index 16a03eb1e3fcbb6037063fe57a88740c9e5c6b2f..cd4ac7a24f69b2078ed7c25a75ebf78e2c06e03f 100644 (file)
@@ -154,7 +154,8 @@ frame_show_address (struct frame_info *frame,
 
 void
 print_stack_frame (struct frame_info *frame, int print_level,
-                  enum print_what print_what)
+                  enum print_what print_what,
+                  int set_current_sal)
 {
   volatile struct gdb_exception e;
 
@@ -166,8 +167,10 @@ print_stack_frame (struct frame_info *frame, int print_level,
     {
       int center = (print_what == SRC_LINE || print_what == SRC_AND_LOC);
 
-      print_frame_info (frame, print_level, print_what, 1 /* print_args */);
-      set_current_sal_from_frame (frame, center);
+      print_frame_info (frame, print_level, print_what, 1 /* print_args */,
+                       set_current_sal);
+      if (set_current_sal)
+       set_current_sal_from_frame (frame, center);
     }
 }
 
@@ -780,7 +783,8 @@ do_gdb_disassembly (struct gdbarch *gdbarch,
 
 void
 print_frame_info (struct frame_info *frame, int print_level,
-                 enum print_what print_what, int print_args)
+                 enum print_what print_what, int print_args,
+                 int set_current_sal)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
   struct symtab_and_line sal;
@@ -905,7 +909,7 @@ print_frame_info (struct frame_info *frame, int print_level,
        do_gdb_disassembly (get_frame_arch (frame), -1, sal.pc, sal.end);
     }
 
-  if (print_what != LOCATION)
+  if (set_current_sal)
     {
       CORE_ADDR pc;
 
@@ -1787,7 +1791,7 @@ backtrace_command_1 (char *count_exp, int show_locals, int no_filters,
             hand, perhaps the code does or could be fixed to make sure
             the frame->prev field gets set to NULL in that case).  */
 
-         print_frame_info (fi, 1, LOCATION, 1);
+         print_frame_info (fi, 1, LOCATION, 1, 0);
          if (show_locals)
            {
              struct frame_id frame_id = get_frame_id (fi);
@@ -2184,7 +2188,7 @@ select_and_print_frame (struct frame_info *frame)
 {
   select_frame (frame);
   if (frame)
-    print_stack_frame (frame, 1, SRC_AND_LOC);
+    print_stack_frame (frame, 1, SRC_AND_LOC, 1);
 }
 \f
 /* Return the symbol-block in which the selected frame is executing.
@@ -2262,7 +2266,7 @@ static void
 frame_command (char *level_exp, int from_tty)
 {
   select_frame_command (level_exp, from_tty);
-  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
 }
 
 /* The XDB Compatibility command to print the current frame.  */
@@ -2270,7 +2274,7 @@ frame_command (char *level_exp, int from_tty)
 static void
 current_frame_command (char *level_exp, int from_tty)
 {
-  print_stack_frame (get_selected_frame (_("No stack.")), 1, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (_("No stack.")), 1, SRC_AND_LOC, 1);
 }
 
 /* Select the frame up one or COUNT_EXP stack levels from the
@@ -2301,7 +2305,7 @@ static void
 up_command (char *count_exp, int from_tty)
 {
   up_silently_base (count_exp);
-  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
 }
 
 /* Select the frame down one or COUNT_EXP stack levels from the previously
@@ -2340,7 +2344,7 @@ static void
 down_command (char *count_exp, int from_tty)
 {
   down_silently_base (count_exp);
-  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
+  print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
 }
 \f
 
index 8d34fb892afc577b25bcb6a51b1ba831829fef2b..446768d818f144097efc2e23755c8ec5a1b7d429 100644 (file)
@@ -1,3 +1,10 @@
+2013-09-17  Pedro Alves  <palves@redhat.com>
+
+       PR gdb/15911
+       * gdb.threads/info-threads-cur-sal-2.c: New file.
+       * gdb.threads/info-threads-cur-sal.c: New file.
+       * gdb.threads/info-threads-cur-sal.exp: New file.
+
 2013-09-17  Yao Qi  <yao@codesourcery.com>
 
        * gdb.base/catch-load.c: Remove the include of "dlfcn.h".
diff --git a/gdb/testsuite/gdb.threads/info-threads-cur-sal-2.c b/gdb/testsuite/gdb.threads/info-threads-cur-sal-2.c
new file mode 100644 (file)
index 0000000..2c29686
--- /dev/null
@@ -0,0 +1,23 @@
+/* Copyright 2013 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <stddef.h>
+
+void *
+start (void *arg)
+{
+  /* "list" should show this line.  */
+  return NULL;
+}
diff --git a/gdb/testsuite/gdb.threads/info-threads-cur-sal.c b/gdb/testsuite/gdb.threads/info-threads-cur-sal.c
new file mode 100644 (file)
index 0000000..8a8c8b9
--- /dev/null
@@ -0,0 +1,33 @@
+/* Copyright 2007-2013 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <pthread.h>
+#include <assert.h>
+#include <unistd.h>
+
+extern void *start (void *arg);
+
+int
+main (void)
+{
+  pthread_t thread;
+  int i;
+
+  i = pthread_create (&thread, NULL, start, NULL);
+  assert (i == 0);
+  pthread_join (thread, NULL);
+
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.threads/info-threads-cur-sal.exp b/gdb/testsuite/gdb.threads/info-threads-cur-sal.exp
new file mode 100644 (file)
index 0000000..f18ae0c
--- /dev/null
@@ -0,0 +1,57 @@
+# Copyright (C) 2013 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+standard_testfile info-threads-cur-sal.c info-threads-cur-sal-2.c
+
+set executable ${testfile}
+
+if {[gdb_compile_pthreads \
+        "${srcdir}/${subdir}/${srcfile} ${srcdir}/${subdir}/${srcfile2}" \
+        "${binfile}" executable {debug}] != "" } {
+    return -1
+}
+
+clean_restart ${executable}
+
+if ![runto_main] {
+    return -1
+}
+
+gdb_breakpoint "start"
+gdb_continue_to_breakpoint "start"
+
+set line [gdb_get_line_number "should show this line" "${srcfile2}"]
+
+gdb_test "list $line" \
+    "\"list\" should show this line.*" \
+    "list before info threads"
+
+# There used to be a bug where "info threads" would set the current
+# SAL to the location of the last thread displayed.
+gdb_test "info threads" \
+    "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*\r\n  1 *Thread \[^\r\n\]* .* \[^\r\n\]*" \
+    "info threads before break"
+
+# Check that "break" is still operating on the same file by default.
+gdb_test "break $line" ".*${srcfile2}.*" "break on line"
+
+gdb_test "info threads" \
+    "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*\r\n  1 *Thread \[^\r\n\]* .* \[^\r\n\]*" \
+    "info threads before list"
+
+# And that so is "list".
+gdb_test "list $line" \
+    "\"list\" should show this line.*" \
+    "list after info threads"
index 52626ff09893c5633629d4a0e0b6b91a850e786a..498e547aad0e1acec363fd2725547eb8c450352c 100644 (file)
@@ -929,7 +929,7 @@ print_thread_info (struct ui_out *uiout, char *requested_threads, int pid)
          print_stack_frame (get_selected_frame (NULL),
                             /* For MI output, print frame level.  */
                             ui_out_is_mi_like_p (uiout),
-                            LOCATION);
+                            LOCATION, 0);
        }
 
       if (ui_out_is_mi_like_p (uiout))
@@ -1082,7 +1082,7 @@ restore_selected_frame (struct frame_id a_frame_id, int frame_level)
       /* For MI, we should probably have a notification about
         current frame change.  But this error is not very
         likely, so don't bother for now.  */
-      print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
+      print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
     }
 }
 
@@ -1467,7 +1467,7 @@ do_captured_thread_select (struct ui_out *uiout, void *tidstr)
   else
     {
       ui_out_text (uiout, "\n");
-      print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
+      print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
     }
 
   /* Since the current thread may have changed, see if there is any
index 7dbe54b27539e5704b26e9278779cc5a7e0fa61d..c086587ca7e3f0bd5056aab004af1b930bcbfab2 100644 (file)
@@ -2444,7 +2444,7 @@ tfind_1 (enum trace_find_type type, int num,
       else
        print_what = SRC_AND_LOC;
 
-      print_stack_frame (get_selected_frame (NULL), 1, print_what);
+      print_stack_frame (get_selected_frame (NULL), 1, print_what, 1);
       do_displays ();
     }
 }