From: Pedro Alves Date: Mon, 18 Jan 2016 15:15:18 +0000 (+0000) Subject: Fix PR threads/19422 - show which thread caused stop X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f303dbd60d9c7984832446eeb9d4e4d89703c615;p=binutils-gdb.git Fix PR threads/19422 - show which thread caused stop 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 * 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 * 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 * 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 160310973dd..8fe13814f54 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,22 @@ +2016-01-18 Pedro Alves + + * 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 * nat/linux-namespaces.c (do_fork): New function. diff --git a/gdb/NEWS b/gdb/NEWS index 9d3a47ccb30..f4ba65dfa9d 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -49,6 +49,13 @@ * 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. diff --git a/gdb/break-catch-sig.c b/gdb/break-catch-sig.c index b993990de66..dcfae42489d 100644 --- a/gdb/break-catch-sig.c +++ b/gdb/break-catch-sig.c @@ -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; } diff --git a/gdb/break-catch-syscall.c b/gdb/break-catch-syscall.c index 8ad7f2c36d2..dbebddaae43 100644 --- a/gdb/break-catch-syscall.c +++ b/gdb/break-catch-syscall.c @@ -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", diff --git a/gdb/break-catch-throw.c b/gdb/break-catch-throw.c index 96d7b724a1a..3a482058476 100644 --- a/gdb/break-catch-throw.c +++ b/gdb/break-catch-throw.c @@ -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, diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 72da4ef7aa9..83d39799def 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -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", diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index e76bdab83c3..68710e6a1f0 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -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) */ diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index db280b960d0..59a8e0acabd 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2016-01-18 Pedro Alves + + * 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 * gdb.texinfo (Threads) : Document star ranges. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index a08a196409d..f996c8d1915 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -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{]} diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h index 37c2837b205..bdd2bb0d49a 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h @@ -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 */ diff --git a/gdb/infrun.c b/gdb/infrun.c index 64c729e9275..33981d27bb6 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -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 diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 08a699dd542..627db4694c5 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,24 @@ +2016-01-18 Pedro Alves + + * 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 * gdb.guile/scm-section-script.c: Replace @progbits with diff --git a/gdb/testsuite/gdb.base/async-shell.exp b/gdb/testsuite/gdb.base/async-shell.exp index 5f462b2e890..6b887c3cd44 100644 --- a/gdb/testsuite/gdb.base/async-shell.exp +++ b/gdb/testsuite/gdb.base/async-shell.exp @@ -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 } } diff --git a/gdb/testsuite/gdb.base/dprintf-non-stop.exp b/gdb/testsuite/gdb.base/dprintf-non-stop.exp index 3c1638e7c72..1787f6f2ef9 100644 --- a/gdb/testsuite/gdb.base/dprintf-non-stop.exp +++ b/gdb/testsuite/gdb.base/dprintf-non-stop.exp @@ -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 } } diff --git a/gdb/testsuite/gdb.base/siginfo-thread.exp b/gdb/testsuite/gdb.base/siginfo-thread.exp index 49908c47dd9..9af99ea2249 100644 --- a/gdb/testsuite/gdb.base/siginfo-thread.exp +++ b/gdb/testsuite/gdb.base/siginfo-thread.exp @@ -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] diff --git a/gdb/testsuite/gdb.base/watchpoint-hw-hit-once.exp b/gdb/testsuite/gdb.base/watchpoint-hw-hit-once.exp index 5c1be0098cd..46d5c6272fa 100644 --- a/gdb/testsuite/gdb.base/watchpoint-hw-hit-once.exp +++ b/gdb/testsuite/gdb.base/watchpoint-hw-hit-once.exp @@ -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" \ diff --git a/gdb/testsuite/gdb.java/jnpe.exp b/gdb/testsuite/gdb.java/jnpe.exp index 092d82ab7ec..745cdf393b5 100644 --- a/gdb/testsuite/gdb.java/jnpe.exp +++ b/gdb/testsuite/gdb.java/jnpe.exp @@ -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" diff --git a/gdb/testsuite/gdb.threads/clone-new-thread-event.exp b/gdb/testsuite/gdb.threads/clone-new-thread-event.exp index 7b34adc4d5a..f7ca41ec3fc 100644 --- a/gdb/testsuite/gdb.threads/clone-new-thread-event.exp +++ b/gdb/testsuite/gdb.threads/clone-new-thread-event.exp @@ -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" diff --git a/gdb/testsuite/gdb.threads/continue-pending-status.exp b/gdb/testsuite/gdb.threads/continue-pending-status.exp index 4d0fce7abc5..086407f706b 100644 --- a/gdb/testsuite/gdb.threads/continue-pending-status.exp +++ b/gdb/testsuite/gdb.threads/continue-pending-status.exp @@ -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 } } diff --git a/gdb/testsuite/gdb.threads/leader-exit.exp b/gdb/testsuite/gdb.threads/leader-exit.exp index 28592612f82..7daea8f2a2c 100644 --- a/gdb/testsuite/gdb.threads/leader-exit.exp +++ b/gdb/testsuite/gdb.threads/leader-exit.exp @@ -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 } } diff --git a/gdb/testsuite/gdb.threads/manythreads.exp b/gdb/testsuite/gdb.threads/manythreads.exp index 28d35507def..8cc4c5cc9a3 100644 --- a/gdb/testsuite/gdb.threads/manythreads.exp +++ b/gdb/testsuite/gdb.threads/manythreads.exp @@ -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 ... diff --git a/gdb/testsuite/gdb.threads/pthreads.exp b/gdb/testsuite/gdb.threads/pthreads.exp index 473053e74cd..1fb27cfbc77 100644 --- a/gdb/testsuite/gdb.threads/pthreads.exp +++ b/gdb/testsuite/gdb.threads/pthreads.exp @@ -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 $" { diff --git a/gdb/testsuite/gdb.threads/schedlock.exp b/gdb/testsuite/gdb.threads/schedlock.exp index 82326977f47..6fb669818c5 100644 --- a/gdb/testsuite/gdb.threads/schedlock.exp +++ b/gdb/testsuite/gdb.threads/schedlock.exp @@ -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 } diff --git a/gdb/testsuite/gdb.threads/siginfo-threads.exp b/gdb/testsuite/gdb.threads/siginfo-threads.exp index 9c55b741dac..108d240456f 100644 --- a/gdb/testsuite/gdb.threads/siginfo-threads.exp +++ b/gdb/testsuite/gdb.threads/siginfo-threads.exp @@ -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 } diff --git a/gdb/testsuite/gdb.threads/signal-command-multiple-signals-pending.exp b/gdb/testsuite/gdb.threads/signal-command-multiple-signals-pending.exp index 450e47295ed..43fe779760d 100644 --- a/gdb/testsuite/gdb.threads/signal-command-multiple-signals-pending.exp +++ b/gdb/testsuite/gdb.threads/signal-command-multiple-signals-pending.exp @@ -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.*" diff --git a/gdb/testsuite/gdb.threads/signal-delivered-right-thread.exp b/gdb/testsuite/gdb.threads/signal-delivered-right-thread.exp index d3ce821f33a..b7ce8ef9456 100644 --- a/gdb/testsuite/gdb.threads/signal-delivered-right-thread.exp +++ b/gdb/testsuite/gdb.threads/signal-delivered-right-thread.exp @@ -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.*" diff --git a/gdb/testsuite/gdb.threads/sigthread.exp b/gdb/testsuite/gdb.threads/sigthread.exp index bf7fa9bdbaf..71ef75ac1dc 100644 --- a/gdb/testsuite/gdb.threads/sigthread.exp +++ b/gdb/testsuite/gdb.threads/sigthread.exp @@ -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" diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork.exp b/gdb/testsuite/gdb.threads/watchpoint-fork.exp index a833c98b4bb..16829825dae 100644 --- a/gdb/testsuite/gdb.threads/watchpoint-fork.exp +++ b/gdb/testsuite/gdb.threads/watchpoint-fork.exp @@ -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" } } } diff --git a/gdb/thread.c b/gdb/thread.c index c7f14674c68..75bfb4771b2 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -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) {