This is the mail archive of the gdb-prs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug threads/19422] in non-stop mode, gdb does not print thread which stops


https://sourceware.org/bugzilla/show_bug.cgi?id=19422

--- Comment #10 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Pedro Alves <palves@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f303dbd60d9c7984832446eeb9d4e4d89703c615

commit f303dbd60d9c7984832446eeb9d4e4d89703c615
Author: Pedro Alves <palves@redhat.com>
Date:   Mon Jan 18 15:15:18 2016 +0000

    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  <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.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]