Fix PR threads/19422 - show which thread caused stop
authorPedro Alves <palves@redhat.com>
Mon, 18 Jan 2016 15:15:18 +0000 (15:15 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 18 Jan 2016 15:15:18 +0000 (15:15 +0000)
This commit changes GDB like this:

 - Program received signal SIGINT, Interrupt.
 + Thread 1 "main" received signal SIGINT, Interrupt.

 - Breakpoint 1 at 0x40087a: file threads.c, line 87.
 + Thread 3 "bar" hit Breakpoint 1 at 0x40087a: file threads.c, line 87.

 ... once the program goes multi-threaded.  Until GDB sees a second
thread spawn, the output is still the same as before, per the
discussion back in 2012:

  https://www.sourceware.org/ml/gdb/2012-11/msg00010.html

This helps non-stop mode, where you can't easily tell which thread hit
a breakpoint or received a signal:

 (gdb) info threads
   Id   Target Id         Frame
 * 1    Thread 0x7ffff7fc1740 (LWP 19362) "main" (running)
   2    Thread 0x7ffff7fc0700 (LWP 19366) "foo" (running)
   3    Thread 0x7ffff77bf700 (LWP 19367) "bar" (running)
 (gdb)
 Program received signal SIGUSR1, User defined signal 1.
 0x0000003616a09237 in pthread_join (threadid=140737353877248, thread_return=0x7fffffffd5b8) at pthread_join.c:92
 92          lll_wait_tid (pd->tid);
 (gdb) b threads.c:87
 Breakpoint 1 at 0x40087a: file threads.c, line 87.
 (gdb)
 Breakpoint 1, thread_function1 (arg=0x1) at threads.c:87
 87              usleep (1);  /* Loop increment.  */

The best the user can do is run "info threads" and try to figure
things out.

It actually also affects all-stop mode, in case of "handle SIG print
nostop":

...
  Program received signal SIGUSR1, User defined signal 1.

  Program received signal SIGUSR1, User defined signal 1.

  Program received signal SIGUSR1, User defined signal 1.

  Program received signal SIGUSR1, User defined signal 1.
...

The above doesn't give any clue that these were different threads
getting the SIGUSR1 signal.

I initially thought of lowercasing "breakpoint" in

  "Thread 3 hit Breakpoint 1"

but then after trying it I realized that leaving "Breakpoint"
uppercase helps the eye quickly find the relevant information.  It's
also easier to implement not showing anything about threads until the
program goes multi-threaded this way.

Here's a larger example session in non-stop mode:

  (gdb) c -a&
  Continuing.
  (gdb) interrupt -a
  (gdb)
  Thread 1 "main" stopped.
  0x0000003616a09237 in pthread_join (threadid=140737353877248, thread_return=0x7fffffffd5b8) at pthread_join.c:92
  92          lll_wait_tid (pd->tid);

  Thread 2 "foo" stopped.
  0x0000003615ebc6ed in nanosleep () at ../sysdeps/unix/syscall-template.S:81
  81      T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)

  Thread 3 "bar" stopped.
  0x0000003615ebc6ed in nanosleep () at ../sysdeps/unix/syscall-template.S:81
  81      T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
  b threads.c:87
  Breakpoint 4 at 0x40087a: file threads.c, line 87.
  (gdb) b threads.c:67
  Breakpoint 5 at 0x400811: file threads.c, line 67.
  (gdb) c -a&
  Continuing.
  (gdb)
  Thread 3 "bar" hit Breakpoint 4, thread_function1 (arg=0x1) at threads.c:87
  87              usleep (1);  /* Loop increment.  */

  Thread 2 "foo" hit Breakpoint 5, thread_function0 (arg=0x0) at threads.c:68
  68              (*myp) ++;
  info threads
    Id   Target Id         Frame
  * 1  Thread 0x7ffff7fc1740 (LWP 31957) "main" (running)
    2  Thread 0x7ffff7fc0700 (LWP 31961) "foo" thread_function0 (arg=0x0) at threads.c:68
    3  Thread 0x7ffff77bf700 (LWP 31962) "bar" thread_function1 (arg=0x1) at threads.c:87
  (gdb) shell kill -SIGINT 31957
  (gdb)
  Thread 1 "main" received signal SIGINT, Interrupt.
  0x0000003616a09237 in pthread_join (threadid=140737353877248, thread_return=0x7fffffffd5b8) at pthread_join.c:92
  92          lll_wait_tid (pd->tid);
  info threads
    Id   Target Id         Frame
  * 1  Thread 0x7ffff7fc1740 (LWP 31957) "main" 0x0000003616a09237 in pthread_join (threadid=140737353877248, thread_return=0x7fffffffd5b8) at pthread_join.c:92
    2  Thread 0x7ffff7fc0700 (LWP 31961) "foo" thread_function0 (arg=0x0) at threads.c:68
    3  Thread 0x7ffff77bf700 (LWP 31962) "bar" thread_function1 (arg=0x1) at threads.c:87
  (gdb) t 2
  [Switching to thread 2, Thread 0x7ffff7fc0700 (LWP 31961)]
  #0  thread_function0 (arg=0x0) at threads.c:68
  68              (*myp) ++;
  (gdb) catch syscall
  Catchpoint 6 (any syscall)
  (gdb) c&
  Continuing.
  (gdb)
  Thread 2 "foo" hit Catchpoint 6 (call to syscall nanosleep), 0x0000003615ebc6ed in nanosleep () at ../sysdeps/unix/syscall-template.S:81
  81      T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)

I'll work on documentation next if this looks agreeable.

This patch applies on top of the star wildcards thread IDs series:

  https://sourceware.org/ml/gdb-patches/2016-01/msg00291.html

For convenience, I've pushed this to the
users/palves/show-which-thread-caused-stop branch.

gdb/doc/ChangeLog:
2016-01-18  Pedro Alves  <palves@redhat.com>

* gdb.texinfo (Threads): Mention that GDB displays the ID and name
of the thread that hit a breakpoint or received a signal.

gdb/ChangeLog:
2016-01-18  Pedro Alves  <palves@redhat.com>

* NEWS: Mention that GDB now displays the ID and name of the
thread that hit a breakpoint or received a signal.
* break-catch-sig.c (signal_catchpoint_print_it): Use
maybe_print_thread_hit_breakpoint.
* break-catch-syscall.c (print_it_catch_syscall): Likewise.
* break-catch-throw.c (print_it_exception_catchpoint): Likewise.
* breakpoint.c (maybe_print_thread_hit_breakpoint): New function.
(print_it_catch_fork, print_it_catch_vfork, print_it_catch_solib)
(print_it_catch_exec, print_it_ranged_breakpoint)
(print_it_watchpoint, print_it_masked_watchpoint, bkpt_print_it):
Use maybe_print_thread_hit_breakpoint.
* breakpoint.h (maybe_print_thread_hit_breakpoint): Declare.
* gdbthread.h (show_thread_that_caused_stop): Declare.
* infrun.c (print_signal_received_reason): Print which thread
received signal.
* thread.c (show_thread_that_caused_stop): New function.

gdb/testsuite/ChangeLog:
2016-01-18  Pedro Alves  <palves@redhat.com>

* gdb.base/async-shell.exp: Adjust expected output.
* gdb.base/dprintf-non-stop.exp: Adjust expected output.
* gdb.base/siginfo-thread.exp: Adjust expected output.
* gdb.base/watchpoint-hw-hit-once.exp: Adjust expected output.
* gdb.java/jnpe.exp: Adjust expected output.
* gdb.threads/clone-new-thread-event.exp: Adjust expected output.
* gdb.threads/continue-pending-status.exp: Adjust expected output.
* gdb.threads/leader-exit.exp: Adjust expected output.
* gdb.threads/manythreads.exp: Adjust expected output.
* gdb.threads/pthreads.exp: Adjust expected output.
* gdb.threads/schedlock.exp: Adjust expected output.
* gdb.threads/siginfo-threads.exp: Adjust expected output.
* gdb.threads/signal-command-multiple-signals-pending.exp: Adjust
expected output.
* gdb.threads/signal-delivered-right-thread.exp: Adjust expected
output.
* gdb.threads/sigthread.exp: Adjust expected output.
* gdb.threads/watchpoint-fork.exp: Adjust expected output.

29 files changed:
gdb/ChangeLog
gdb/NEWS
gdb/break-catch-sig.c
gdb/break-catch-syscall.c
gdb/break-catch-throw.c
gdb/breakpoint.c
gdb/breakpoint.h
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/gdbthread.h
gdb/infrun.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/async-shell.exp
gdb/testsuite/gdb.base/dprintf-non-stop.exp
gdb/testsuite/gdb.base/siginfo-thread.exp
gdb/testsuite/gdb.base/watchpoint-hw-hit-once.exp
gdb/testsuite/gdb.java/jnpe.exp
gdb/testsuite/gdb.threads/clone-new-thread-event.exp
gdb/testsuite/gdb.threads/continue-pending-status.exp
gdb/testsuite/gdb.threads/leader-exit.exp
gdb/testsuite/gdb.threads/manythreads.exp
gdb/testsuite/gdb.threads/pthreads.exp
gdb/testsuite/gdb.threads/schedlock.exp
gdb/testsuite/gdb.threads/siginfo-threads.exp
gdb/testsuite/gdb.threads/signal-command-multiple-signals-pending.exp
gdb/testsuite/gdb.threads/signal-delivered-right-thread.exp
gdb/testsuite/gdb.threads/sigthread.exp
gdb/testsuite/gdb.threads/watchpoint-fork.exp
gdb/thread.c

index 160310973dd0a0210caa6c21bc28d39114e38eb9..8fe13814f54fb951b19dbab8a34ebcd5fd096e10 100644 (file)
@@ -1,3 +1,22 @@
+2016-01-18  Pedro Alves  <palves@redhat.com>
+
+       * NEWS: Mention that GDB now displays the ID and name of the
+       thread that hit a breakpoint or received a signal.
+       * break-catch-sig.c (signal_catchpoint_print_it): Use
+       maybe_print_thread_hit_breakpoint.
+       * break-catch-syscall.c (print_it_catch_syscall): Likewise.
+       * break-catch-throw.c (print_it_exception_catchpoint): Likewise.
+       * breakpoint.c (maybe_print_thread_hit_breakpoint): New function.
+       (print_it_catch_fork, print_it_catch_vfork, print_it_catch_solib)
+       (print_it_catch_exec, print_it_ranged_breakpoint)
+       (print_it_watchpoint, print_it_masked_watchpoint, bkpt_print_it):
+       Use maybe_print_thread_hit_breakpoint.
+       * breakpoint.h (maybe_print_thread_hit_breakpoint): Declare.
+       * gdbthread.h (show_thread_that_caused_stop): Declare.
+       * infrun.c (print_signal_received_reason): Print which thread
+       received signal.
+       * thread.c (show_thread_that_caused_stop): New function.
+
 2016-01-18  Gary Benson  <gbenson@redhat.com>
 
        * nat/linux-namespaces.c (do_fork): New function.
index 9d3a47ccb30d1c222ba1a235e04d93b907f4b418..f4ba65dfa9d6de04ef5fae98c34341587585f619 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
 * The new convenience variable $_inferior holds the number of the
   current inferior.
 
+* GDB now displays the ID and name of the thread that hit a breakpoint
+  or received a signal, if your program is multi-threaded.  For
+  example:
+
+   Thread 3 "bar" hit Breakpoint 1 at 0x40087a: file program.c, line 20.
+   Thread 1 "main" received signal SIGINT, Interrupt.
+
 * Record btrace now supports non-stop mode.
 
 * Support for tracepoints on aarch64-linux was added in GDBserver.
index b993990de66db9f6f4e39c96ae21d96b11f2d3e3..dcfae42489d6f172ec1af9dd80907227d2b99f98 100644 (file)
@@ -220,14 +220,16 @@ signal_catchpoint_print_it (bpstat bs)
   ptid_t ptid;
   struct target_waitstatus last;
   const char *signal_name;
+  struct ui_out *uiout = current_uiout;
 
   get_last_target_status (&ptid, &last);
 
   signal_name = signal_to_name_or_int (last.value.sig);
 
   annotate_catchpoint (b->number);
+  maybe_print_thread_hit_breakpoint (uiout);
 
-  printf_filtered (_("\nCatchpoint %d (signal %s), "), b->number, signal_name);
+  printf_filtered (_("Catchpoint %d (signal %s), "), b->number, signal_name);
 
   return PRINT_SRC_AND_LOC;
 }
index 8ad7f2c36d2e033fb5d93324a3ebe2cba0cafb1f..dbebddaae437e2edfa9a607402d3ccb4649662fb 100644 (file)
@@ -254,11 +254,12 @@ print_it_catch_syscall (bpstat bs)
   get_syscall_by_number (gdbarch, last.value.syscall_number, &s);
 
   annotate_catchpoint (b->number);
+  maybe_print_thread_hit_breakpoint (uiout);
 
   if (b->disposition == disp_del)
-    ui_out_text (uiout, "\nTemporary catchpoint ");
+    ui_out_text (uiout, "Temporary catchpoint ");
   else
-    ui_out_text (uiout, "\nCatchpoint ");
+    ui_out_text (uiout, "Catchpoint ");
   if (ui_out_is_mi_like_p (uiout))
     {
       ui_out_field_string (uiout, "reason",
index 96d7b724a1acf527d923804796fa53ae50fb7c2d..3a482058476ea569e681fef67ff57666397be417 100644 (file)
@@ -264,6 +264,7 @@ print_it_exception_catchpoint (bpstat bs)
   enum exception_event_kind kind = classify_exception_breakpoint (b);
 
   annotate_catchpoint (b->number);
+  maybe_print_thread_hit_breakpoint (uiout);
 
   bp_temp = b->disposition == disp_del;
   ui_out_text (uiout, 
index 72da4ef7aa9a3ae1f1188c173ba00a7652237bc5..83d39799defe6b8a308754e7bad72b65f81d1038 100644 (file)
@@ -4790,6 +4790,37 @@ watchpoint_value_print (struct value *val, struct ui_file *stream)
     }
 }
 
+/* Print the "Thread ID hit" part of "Thread ID hit Breakpoint N" if
+   debugging multiple threads.  */
+
+void
+maybe_print_thread_hit_breakpoint (struct ui_out *uiout)
+{
+  if (ui_out_is_mi_like_p (uiout))
+    return;
+
+  ui_out_text (uiout, "\n");
+
+  if (show_thread_that_caused_stop ())
+    {
+      const char *name;
+      struct thread_info *thr = inferior_thread ();
+
+      ui_out_text (uiout, "Thread ");
+      ui_out_field_fmt (uiout, "thread-id", "%s", print_thread_id (thr));
+
+      name = thr->name != NULL ? thr->name : target_thread_name (thr);
+      if (name != NULL)
+       {
+         ui_out_text (uiout, " \"");
+         ui_out_field_fmt (uiout, "name", "%s", name);
+         ui_out_text (uiout, "\"");
+       }
+
+      ui_out_text (uiout, " hit ");
+    }
+}
+
 /* Generic routine for printing messages indicating why we
    stopped.  The behavior of this function depends on the value
    'print_it' in the bpstat structure.  Under some circumstances we
@@ -8093,10 +8124,11 @@ print_it_catch_fork (bpstat bs)
   struct fork_catchpoint *c = (struct fork_catchpoint *) bs->breakpoint_at;
 
   annotate_catchpoint (b->number);
+  maybe_print_thread_hit_breakpoint (uiout);
   if (b->disposition == disp_del)
-    ui_out_text (uiout, "\nTemporary catchpoint ");
+    ui_out_text (uiout, "Temporary catchpoint ");
   else
-    ui_out_text (uiout, "\nCatchpoint ");
+    ui_out_text (uiout, "Catchpoint ");
   if (ui_out_is_mi_like_p (uiout))
     {
       ui_out_field_string (uiout, "reason",
@@ -8210,10 +8242,11 @@ print_it_catch_vfork (bpstat bs)
   struct fork_catchpoint *c = (struct fork_catchpoint *) b;
 
   annotate_catchpoint (b->number);
+  maybe_print_thread_hit_breakpoint (uiout);
   if (b->disposition == disp_del)
-    ui_out_text (uiout, "\nTemporary catchpoint ");
+    ui_out_text (uiout, "Temporary catchpoint ");
   else
-    ui_out_text (uiout, "\nCatchpoint ");
+    ui_out_text (uiout, "Catchpoint ");
   if (ui_out_is_mi_like_p (uiout))
     {
       ui_out_field_string (uiout, "reason",
@@ -8406,10 +8439,11 @@ print_it_catch_solib (bpstat bs)
   struct ui_out *uiout = current_uiout;
 
   annotate_catchpoint (b->number);
+  maybe_print_thread_hit_breakpoint (uiout);
   if (b->disposition == disp_del)
-    ui_out_text (uiout, "\nTemporary catchpoint ");
+    ui_out_text (uiout, "Temporary catchpoint ");
   else
-    ui_out_text (uiout, "\nCatchpoint ");
+    ui_out_text (uiout, "Catchpoint ");
   ui_out_field_int (uiout, "bkptno", b->number);
   ui_out_text (uiout, "\n");
   if (ui_out_is_mi_like_p (uiout))
@@ -8675,10 +8709,11 @@ print_it_catch_exec (bpstat bs)
   struct exec_catchpoint *c = (struct exec_catchpoint *) b;
 
   annotate_catchpoint (b->number);
+  maybe_print_thread_hit_breakpoint (uiout);
   if (b->disposition == disp_del)
-    ui_out_text (uiout, "\nTemporary catchpoint ");
+    ui_out_text (uiout, "Temporary catchpoint ");
   else
-    ui_out_text (uiout, "\nCatchpoint ");
+    ui_out_text (uiout, "Catchpoint ");
   if (ui_out_is_mi_like_p (uiout))
     {
       ui_out_field_string (uiout, "reason",
@@ -10207,10 +10242,13 @@ print_it_ranged_breakpoint (bpstat bs)
   gdb_assert (bl && bl->next == NULL);
 
   annotate_breakpoint (b->number);
+
+  maybe_print_thread_hit_breakpoint (uiout);
+
   if (b->disposition == disp_del)
-    ui_out_text (uiout, "\nTemporary ranged breakpoint ");
+    ui_out_text (uiout, "Temporary ranged breakpoint ");
   else
-    ui_out_text (uiout, "\nRanged breakpoint ");
+    ui_out_text (uiout, "Ranged breakpoint ");
   if (ui_out_is_mi_like_p (uiout))
     {
       ui_out_field_string (uiout, "reason",
@@ -10719,11 +10757,13 @@ print_it_watchpoint (bpstat bs)
   stb = mem_fileopen ();
   old_chain = make_cleanup_ui_file_delete (stb);
 
+  annotate_watchpoint (b->number);
+  maybe_print_thread_hit_breakpoint (uiout);
+
   switch (b->type)
     {
     case bp_watchpoint:
     case bp_hardware_watchpoint:
-      annotate_watchpoint (b->number);
       if (ui_out_is_mi_like_p (uiout))
        ui_out_field_string
          (uiout, "reason",
@@ -10758,7 +10798,6 @@ print_it_watchpoint (bpstat bs)
     case bp_access_watchpoint:
       if (bs->old_val != NULL)
        {
-         annotate_watchpoint (b->number);
          if (ui_out_is_mi_like_p (uiout))
            ui_out_field_string
              (uiout, "reason",
@@ -10935,10 +10974,12 @@ print_it_masked_watchpoint (bpstat bs)
   /* Masked watchpoints have only one location.  */
   gdb_assert (b->loc && b->loc->next == NULL);
 
+  annotate_watchpoint (b->number);
+  maybe_print_thread_hit_breakpoint (uiout);
+
   switch (b->type)
     {
     case bp_hardware_watchpoint:
-      annotate_watchpoint (b->number);
       if (ui_out_is_mi_like_p (uiout))
        ui_out_field_string
          (uiout, "reason",
@@ -13120,10 +13161,12 @@ bkpt_print_it (bpstat bs)
                                   bl->address,
                                   b->number, 1);
   annotate_breakpoint (b->number);
+  maybe_print_thread_hit_breakpoint (uiout);
+
   if (bp_temp)
-    ui_out_text (uiout, "\nTemporary breakpoint ");
+    ui_out_text (uiout, "Temporary breakpoint ");
   else
-    ui_out_text (uiout, "\nBreakpoint ");
+    ui_out_text (uiout, "Breakpoint ");
   if (ui_out_is_mi_like_p (uiout))
     {
       ui_out_field_string (uiout, "reason",
index e76bdab83c322f8eb46fceeefcab63682a9c277b..68710e6a1f0dd8ab6fed60c9250b8a954bae0b16 100644 (file)
@@ -1622,4 +1622,8 @@ extern void breakpoint_free_objfile (struct objfile *objfile);
 
 extern char *ep_parse_optional_if_clause (char **arg);
 
+/* Print the "Thread ID hit" part of "Thread ID hit Breakpoint N" to
+   UIOUT iff debugging multiple threads.  */
+extern void maybe_print_thread_hit_breakpoint (struct ui_out *uiout);
+
 #endif /* !defined (BREAKPOINT_H) */
index db280b960d091c06b1697de6a07ef176bde92028..59a8e0acabd407c8c950b342484ecc92f1bce0a6 100644 (file)
@@ -1,3 +1,8 @@
+2016-01-18  Pedro Alves  <palves@redhat.com>
+
+       * gdb.texinfo (Threads): Mention that GDB displays the ID and name
+       of the thread that hit a breakpoint or received a signal.
+
 2016-01-15  Pedro Alves  <palves@redhat.com>
 
        * gdb.texinfo (Threads) <thread ID lists>: Document star ranges.
index a08a196409dad0e044b282652a660d0615485650..f996c8d1915be8a181bafbb4c3572e6e6d5cc0f4 100644 (file)
@@ -2964,6 +2964,20 @@ useful in writing breakpoint conditional expressions, command scripts,
 and so forth.  @xref{Convenience Vars,, Convenience Variables}, for
 general information on convenience variables.
 
+If @value{GDBN} detects the program is multi-threaded, it augments the
+usual message about stopping at a breakpoint with the ID and name of
+the thread that hit the breakpoint.
+
+@smallexample
+Thread 2 "client" hit Breakpoint 1, send_message () at client.c:68
+@end smallexample
+
+Likewise when the program receives a signal:
+
+@smallexample
+Thread 1 "main" received signal SIGINT, Interrupt.
+@end smallexample
+
 @table @code
 @kindex info threads
 @item info threads @r{[}@var{thread-id-list}@r{]}
index 37c2837b20530f58cf24077be54fac32b8edb946..bdd2bb0d49a038d3a77e60e53d525416700f255d 100644 (file)
@@ -630,6 +630,11 @@ extern void thread_cancel_execution_command (struct thread_info *thr);
    executing).  */
 extern void validate_registers_access (void);
 
+/* Returns whether to show which thread hit the breakpoint, received a
+   signal, etc. and ended up causing a user-visible stop.  This is
+   true iff we ever detected multiple threads.  */
+extern int show_thread_that_caused_stop (void);
+
 extern struct thread_info *thread_list;
 
 #endif /* GDBTHREAD_H */
index 64c729e9275ce5fb4441d0f2fcad13575bb209e7..33981d27bb66d78564d5609f196ccafd916f564b 100644 (file)
@@ -7896,21 +7896,35 @@ print_exited_reason (struct ui_out *uiout, int exitstatus)
 void
 print_signal_received_reason (struct ui_out *uiout, enum gdb_signal siggnal)
 {
+  struct thread_info *thr = inferior_thread ();
+
   annotate_signal ();
 
-  if (siggnal == GDB_SIGNAL_0 && !ui_out_is_mi_like_p (uiout))
+  if (ui_out_is_mi_like_p (uiout))
+    ;
+  else if (show_thread_that_caused_stop ())
     {
-      struct thread_info *t = inferior_thread ();
+      const char *name;
 
-      ui_out_text (uiout, "\n[");
-      ui_out_field_string (uiout, "thread-name",
-                          target_pid_to_str (t->ptid));
-      ui_out_field_fmt (uiout, "thread-id", "] #%s", print_thread_id (t));
-      ui_out_text (uiout, " stopped");
+      ui_out_text (uiout, "\nThread ");
+      ui_out_field_fmt (uiout, "thread-id", "%s", print_thread_id (thr));
+
+      name = thr->name != NULL ? thr->name : target_thread_name (thr);
+      if (name != NULL)
+       {
+         ui_out_text (uiout, " \"");
+         ui_out_field_fmt (uiout, "name", "%s", name);
+         ui_out_text (uiout, "\"");
+       }
     }
+  else
+    ui_out_text (uiout, "\nProgram");
+
+  if (siggnal == GDB_SIGNAL_0 && !ui_out_is_mi_like_p (uiout))
+    ui_out_text (uiout, " stopped");
   else
     {
-      ui_out_text (uiout, "\nProgram received signal ");
+      ui_out_text (uiout, " received signal ");
       annotate_signal_name ();
       if (ui_out_is_mi_like_p (uiout))
        ui_out_field_string
index 08a699dd542b9d8731b2afce3c390127f4f572bf..627db4694c5ccf508721045bd1ecf615071898ab 100644 (file)
@@ -1,3 +1,24 @@
+2016-01-18  Pedro Alves  <palves@redhat.com>
+
+       * gdb.base/async-shell.exp: Adjust expected output.
+       * gdb.base/dprintf-non-stop.exp: Adjust expected output.
+       * gdb.base/siginfo-thread.exp: Adjust expected output.
+       * gdb.base/watchpoint-hw-hit-once.exp: Adjust expected output.
+       * gdb.java/jnpe.exp: Adjust expected output.
+       * gdb.threads/clone-new-thread-event.exp: Adjust expected output.
+       * gdb.threads/continue-pending-status.exp: Adjust expected output.
+       * gdb.threads/leader-exit.exp: Adjust expected output.
+       * gdb.threads/manythreads.exp: Adjust expected output.
+       * gdb.threads/pthreads.exp: Adjust expected output.
+       * gdb.threads/schedlock.exp: Adjust expected output.
+       * gdb.threads/siginfo-threads.exp: Adjust expected output.
+       * gdb.threads/signal-command-multiple-signals-pending.exp: Adjust
+       expected output.
+       * gdb.threads/signal-delivered-right-thread.exp: Adjust expected
+       output.
+       * gdb.threads/sigthread.exp: Adjust expected output.
+       * gdb.threads/watchpoint-fork.exp: Adjust expected output.
+
 2016-01-18  Yao Qi  <yao.qi@linaro.org>
 
        * gdb.guile/scm-section-script.c: Replace @progbits with
index 5f462b2e890ef9cff4d20cc3ca24191e51ed522d..6b887c3cd440e4e900876aa52b3eb888bbfa939c 100644 (file)
@@ -48,7 +48,7 @@ gdb_test_multiple $test $test {
 
 set test "process stopped"
 gdb_test_multiple "" $test {
-    -re "\r\n\\\[process \[0-9\]+\\\] #1 stopped\\\.\r\n" {
+    -re "Program stopped\\\.\r\n" {
        pass $test
     }
 }
index 3c1638e7c728c1eec97a1e5ac5a2bbf873fb7061..1787f6f2ef9f0b650600113245d7ff6774355897 100644 (file)
@@ -64,7 +64,7 @@ gdb_test_multiple $test $test {
 
 set test "inferior stopped"
 gdb_test_multiple "" $test {
-    -re "\r\n\\\[.*\\\] #1 stopped\\\.\r\n" {
+    -re "Program stopped\\\.\r\n" {
        pass $test
     }
 }
index 49908c47dd9eab1497b29208ced3d3e67bcb4f31..9af99ea2249159e348d389d800892048d19ce19a 100644 (file)
@@ -41,7 +41,7 @@ if { ![runto_main] } then {
 }
 
 # Run to the signal.
-gdb_test "continue" ".*Program received signal SIGSEGV.*" "continue to signal"
+gdb_test "continue" "Thread .* received signal SIGSEGV.*" "continue to signal"
 
 # Try to generate a core file, for a later test.
 set gcorefile [standard_output_file $testfile.gcore]
index 5c1be0098cdd64a1d0ed49ac4fb44778a5ddf89c..46d5c6272faca8ebb7f535de1579a16362e5572e 100644 (file)
@@ -31,7 +31,7 @@ gdb_test "rwatch watchee"
 
 gdb_breakpoint [gdb_get_line_number "dummy = 2"]
 
-gdb_test "continue" "Continuing.\r\nHardware read watchpoint \[0-9\]+: watchee\r\n\r\nValue = 0\r\n.*"
+gdb_test "continue" "Continuing.\r\n\r\nHardware read watchpoint \[0-9\]+: watchee\r\n\r\nValue = 0\r\n.*"
 
 # Here should be no repeated notification of the read watchpoint.
 gdb_test "continue" \
index 092d82ab7ecc21d0292da9189cc254276c85dad0..745cdf393b5a579a803e98ce16bc1aafb2bf64e8 100644 (file)
@@ -51,5 +51,5 @@ gdb_test "next" \
 
 set line [gdb_get_line_number "stop point"]
 gdb_breakpoint $line
-gdb_test "continue" "Continuing.\[\r\n\]*success\[\r\n\]*Breakpoint .*:$line\[\r\n\]*.*// stop point\[\r\n\]*" \
+gdb_test "continue" "Continuing.\[\r\n\]*success\[\r\n\]*Thread .* hit Breakpoint .*:$line\[\r\n\]*.*// stop point\[\r\n\]*" \
   "continue to success for next-over-NPE"
index 7b34adc4d5ab8bddc1f60d08da6839760d8661dc..f7ca41ec3fcbbd4285ae65069c080e8f8e0d4c38 100644 (file)
@@ -30,5 +30,5 @@ if { ![runto_main] } {
 }
 
 gdb_test "continue" \
-    "Program received signal SIGUSR1, User defined signal 1.*" \
+    "Thread 2 received signal SIGUSR1, User defined signal 1.*" \
     "catch SIGUSR1"
index 4d0fce7abc57764b0113e2cd82a59178a2065128..086407f706b165d80858f4da379ff9000f293df7 100644 (file)
@@ -116,7 +116,7 @@ for {set i 0} {$i < $attempts} {incr i} {
 
        set msg "caught interrupt"
        gdb_test_multiple "" $msg {
-           -re "Program received signal SIGINT.*$gdb_prompt $" {
+           -re "Thread .* received signal SIGINT.*$gdb_prompt $" {
                pass $msg
            }
        }
index 28592612f825502a694f4b804358422ee27817da..7daea8f2a2c85ac9e9fc31686787fc6af5efe3e5 100644 (file)
@@ -55,7 +55,7 @@ send_gdb "\003"
 
 set test "caught interrupt"
 gdb_test_multiple "" $test {
-    -re "Program received signal SIGINT.*$gdb_prompt $" {
+    -re "Thread .* received signal SIGINT.*$gdb_prompt $" {
        pass $test
     }
 }
index 28d35507def2b87dc46e7a54ebed86db2b4b4a9c..8cc4c5cc9a3550d92eed1bd7bb582243b3d52084 100644 (file)
@@ -70,14 +70,14 @@ proc interrupt_and_wait { message } {
        -re "\\\[\[^\]\]* exited\\\]\r\n" {
            exp_continue
        }
-       -re "Program received signal SIGINT.*$gdb_prompt $" {
+       -re " received signal SIGINT.*$gdb_prompt $" {
            pass "$message"
        }
        -re "$gdb_prompt $" {
            # Note that with this regex order, if GDB emits [New
            # Thread ...] output between "Program received signal" and
-           # the prompt, the "Program received signal" regex won't
-           # match.  That's good, as if we see that happening, it's a
+           # the prompt, the "received signal" regex won't match.
+           # That's good, as if we see that happening, it's a
            # regression.
            #
            # GDB makes sure to notify about signal stops, end of
@@ -92,7 +92,7 @@ proc interrupt_and_wait { message } {
            #  ... more new threads output ...
            #  [New Thread NNN]
            #  [New Thread NNN]
-           #  Program received signal SIGINT, Interrupt.
+           #  Thread NNN received signal SIGINT, Interrupt.
            #  [New Thread NNN]
            #  [New Thread NNN]
            #  ... pages of new threads output ...
index 473053e74cd9d85ca777061bae6b18568dd324de..1fb27cfbc77d665956a94964f3a3c225549d2aee 100644 (file)
@@ -202,7 +202,7 @@ proc check_control_c {} {
     send_gdb "\003"
     set description "Stopped with a ^C"
     gdb_expect {
-       -re "Program received signal SIGINT.*$gdb_prompt $" {
+       -re "Thread .* received signal SIGINT.*$gdb_prompt $" {
            pass $description
        }
        -re "Quit.*$gdb_prompt $" {
index 82326977f474338b7a4c16a78c3b8f6b6e62299c..6fb669818c5dc2e456432ee6d23a9da83749f824 100644 (file)
@@ -69,7 +69,7 @@ proc stop_process { description } {
   # message first, or GDB's signal handler may not be in place.
   after 1000 {send_gdb "\003"}
   gdb_expect {
-    -re "Program received signal SIGINT.*$gdb_prompt $"
+    -re "Thread .* received signal SIGINT.*$gdb_prompt $"
       {
        pass $description
       }
index 9c55b741dacb15349231d93001c644043e552dbe..108d240456f3b362352473e52a2a2e4c42255e7a 100644 (file)
@@ -51,7 +51,7 @@ for {set sigcount 0} {$sigcount < 4} {incr sigcount} {
     set test "catch signal $sigcount"
     set sigusr ""
     gdb_test_multiple "continue" $test {
-       -re "Program received signal SIGUSR(\[12\]), User defined signal \[12\]\\.\r\n.*\r\n$gdb_prompt $" {
+       -re "Thread .* received signal SIGUSR(\[12\]), User defined signal \[12\]\\.\r\n.*\r\n$gdb_prompt $" {
            set sigusr $expect_out(1,string)
            pass $test
        }
index 450e47295eda22c31680202b95655b3f55e12663..43fe779760dc56aa852e56e5724ab279cccbc09f 100644 (file)
@@ -68,9 +68,9 @@ proc test { schedlock } {
        # signal.
 
        gdb_test "thread 3" "Switching to thread 3.*"
-       gdb_test "continue" "Program received signal SIGUSR2.*" "stop with SIGUSR2"
+       gdb_test "continue" "Thread 3 .*received signal SIGUSR2.*" "stop with SIGUSR2"
        gdb_test "thread 2" "Switching to thread 2.*"
-       gdb_test "continue" "Program received signal SIGUSR1.*" "stop with SIGUSR1"
+       gdb_test "continue" "Thread 2 .*received signal SIGUSR1.*" "stop with SIGUSR1"
 
        gdb_test "break handler_sigusr1" "Breakpoint .* at .*$srcfile.*"
        gdb_test "break handler_sigusr2" "Breakpoint .* at .*$srcfile.*"
index d3ce821f33ad2a2b54731f16145114b9a552fe82..b7ce8ef9456048e569c9f0c76cd26bed1aa23071 100644 (file)
@@ -41,7 +41,7 @@ proc test { command } {
 
        gdb_test "handle SIGUSR1 stop print pass"
 
-       gdb_test "continue" "Program received signal SIGUSR1.*" "stop with SIGUSR1"
+       gdb_test "continue" "Thread 2 .*received signal SIGUSR1.*" "stop with SIGUSR1"
 
        set pattern "\\\* 2\[ \t\]+Thread.*"
 
index bf7fa9bdbafe2c1217f3dff5a54f801dbe84eb69..71ef75ac1dc39e94a80738389258b02e7b4ad4a6 100644 (file)
@@ -49,4 +49,4 @@ after 500 {send_gdb "\003"}
 
 # Make sure we do not get an internal error from hitting Control-C
 # while many signals are flying back and forth.
-gdb_test "" "Program received signal SIGINT.*" "stop with control-c"
+gdb_test "" "Thread .* received signal SIGINT.*" "stop with control-c"
index a833c98b4bb253b3aac17d0816dfb1cbc4cf562a..16829825dae5b4ac4cc8c225b7c7d51cfa0560b4 100644 (file)
@@ -75,7 +75,7 @@ proc test {type symbol} {
                "reakpoint \[0-9\]+, marker.*" "breakpoint after the second fork"
            gdb_test "continue" \
                "atchpoint \[0-9\]+: var.*Old value = 2.*New value = 3.*mark_exit \\(\\);" "watchpoint after the second fork"
-           gdb_test "continue" "Continuing\\..*\r\nBreakpoint \[0-9\]+, mark_exit .*" "finish"
+           gdb_test "continue" "Continuing\\..*\r\n(Thread .* hit )?Breakpoint \[0-9\]+, mark_exit .*" "finish"
        }
 
        # threads
@@ -129,7 +129,7 @@ proc test {type symbol} {
                "atchpoint \[0-9\]+: var.*Old value = 5.*New value = 6.*after-fork2-A.*" "watchpoint A after the second fork"
            gdb_test "continue" \
                "atchpoint \[0-9\]+: var.*Old value = 6.*New value = 7.*after-fork2-B.*" "watchpoint B after the second fork"
-           gdb_test "continue" "Continuing\\..*\r\nBreakpoint \[0-9\]+, mark_exit .*" "finish"
+           gdb_test "continue" "Continuing\\..*\r\nThread .* hit Breakpoint \[0-9\]+, mark_exit .*" "finish"
        }
     }
 }
index c7f14674c6865f2a37d981705eca85a1f5c5e6fd..75bfb4771b268df7fafb09efe86608fbc9061ef5 100644 (file)
@@ -1684,6 +1684,14 @@ make_cleanup_restore_current_thread (void)
 
 /* See gdbthread.h.  */
 
+int
+show_thread_that_caused_stop (void)
+{
+  return highest_thread_num > 1;
+}
+
+/* See gdbthread.h.  */
+
 int
 show_inferior_qualified_tids (void)
 {