c1a747c109
[A test I wrote stumbled on a libthread_db issue related to thread event breakpoints. See glibc PR17705: [nptl_db: stale thread create/death events if debugger detaches] https://sourceware.org/bugzilla/show_bug.cgi?id=17705 This patch avoids that whole issue by making GDB stop using thread event breakpoints in the first place, which is good for other reasons as well, anyway.] Before PTRACE_EVENT_CLONE (Linux 2.6), the only way to learn about new threads in the inferior (to attach to them) or to learn about thread exit was to coordinate with the inferior's glibc/runtime, using libthread_db. That works by putting a breakpoint at a magic address which is called when a new thread is spawned, or when a thread is about to exit. When that breakpoint is hit, all threads are stopped, and then GDB coordinates with libthread_db to read data structures out of the inferior to learn about what happened. Then the breakpoint is single-stepped, and then all threads are re-resumed. This isn't very efficient (stops all threads) and is more fragile (inferior's thread list in memory may be corrupt; libthread_db bugs, etc.) than ideal. When the kernel supports PTRACE_EVENT_CLONE (which we already make use of), there's really no need to use libthread_db's event reporting mechanism to learn about new LWPs. And if the kernel supports that, then we learn about LWP exits through regular WIFEXITED wait statuses, so no need for the death event breakpoint either. GDBserver has been likewise skipping the thread_db events for a long while: https://sourceware.org/ml/gdb-patches/2007-10/msg00547.html There's one user-visible difference: we'll no longer print about threads being created and exiting while the program is running, like: [Thread 0x7ffff7dbb700 (LWP 30670) exited] [New Thread 0x7ffff7db3700 (LWP 30671)] [Thread 0x7ffff7dd3700 (LWP 30667) exited] [New Thread 0x7ffff7dab700 (LWP 30672)] [Thread 0x7ffff7db3700 (LWP 30671) exited] [Thread 0x7ffff7dcb700 (LWP 30668) exited] This is exactly the same behavior as when debugging against remote targets / gdbserver. I actually think that's a good thing (and as such have listed this in the local/remote parity wiki page a while ago), as the printing slows down the inferior. It's also a distraction to keep bothering the user about short-lived threads that she won't be able to interact with anyway. Instead, the user (and frontend) will be informed about new threads that currently exist in the program when the program next stops: (gdb) c ... * ctrl-c * [New Thread 0x7ffff7963700 (LWP 7797)] [New Thread 0x7ffff796b700 (LWP 7796)] Program received signal SIGINT, Interrupt. [Switching to Thread 0x7ffff796b700 (LWP 7796)] clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:81 81 testq %rax,%rax (gdb) info threads A couple of tests had assumptions on GDB thread numbers that no longer hold. Tested on x86_64 Fedora 20. gdb/ 2014-01-09 Pedro Alves <palves@redhat.com> Skip enabling event reporting if the kernel supports PTRACE_EVENT_CLONE. * linux-thread-db.c: Include "nat/linux-ptrace.h". (thread_db_use_events): New function. (try_thread_db_load_1): Check thread_db_use_events before enabling event reporting. (update_thread_state): New function. (attach_thread): Use it. Check thread_db_use_events before enabling event reporting. (thread_db_detach): Check thread_db_use_events before disabling event reporting. (find_new_threads_callback): Check thread_db_use_events before enabling event reporting. Update the thread's state if not using libthread_db events. gdb/testsuite/ 2014-01-09 Pedro Alves <palves@redhat.com> * gdb.threads/fork-thread-pending.exp: Switch to the main thread instead of to thread 2. * gdb.threads/signal-command-multiple-signals-pending.c (main): Add barrier around each pthread_create call instead of around all calls. * gdb.threads/signal-command-multiple-signals-pending.exp (test): Set a break on thread_function and have the child threads hit it one at at a time.
161 lines
5.4 KiB
Text
161 lines
5.4 KiB
Text
2014-01-09 Pedro Alves <palves@redhat.com>
|
||
|
||
Skip enabling event reporting if the kernel supports
|
||
PTRACE_EVENT_CLONE.
|
||
* linux-thread-db.c: Include "nat/linux-ptrace.h".
|
||
(thread_db_use_events): New function.
|
||
(try_thread_db_load_1): Check thread_db_use_events before enabling
|
||
event reporting.
|
||
(update_thread_state): New function.
|
||
(attach_thread): Use it. Check thread_db_use_events before
|
||
enabling event reporting.
|
||
(thread_db_detach): Check thread_db_use_events before disabling
|
||
event reporting.
|
||
(find_new_threads_callback): Check thread_db_use_events before
|
||
enabling event reporting. Update the thread's state if not using
|
||
libthread_db events.
|
||
|
||
2015-01-09 Pedro Alves <palves@redhat.com>
|
||
|
||
* linux-nat.c (lin_lwp_attach_lwp): Assert that the lwp id we're
|
||
about to wait for is > 0.
|
||
* linux-thread-db.c (find_new_threads_callback): Ignore thread if
|
||
the kernel thread ID is -1.
|
||
|
||
2015-01-09 Pedro Alves <palves@redhat.com>
|
||
|
||
* linux-nat.c (attach_proc_task_lwp_callback): New function.
|
||
(linux_nat_attach): Use linux_proc_attach_tgid_threads.
|
||
(wait_lwp, linux_nat_filter_event): If not set yet, set the lwp's
|
||
ptrace option flags.
|
||
* linux-nat.h (struct lwp_info) <must_set_ptrace_flags>: New
|
||
field.
|
||
* nat/linux-procfs.c: Include <dirent.h>.
|
||
(linux_proc_get_int): New parameter "warn". Handle it.
|
||
(linux_proc_get_tgid): Adjust.
|
||
(linux_proc_get_tracerpid): Rename to ...
|
||
(linux_proc_get_tracerpid_nowarn): ... this.
|
||
(linux_proc_pid_get_state): New function, factored out from
|
||
(linux_proc_pid_has_state): ... this. Add new parameter "warn"
|
||
and handle it.
|
||
(linux_proc_pid_is_gone): New function.
|
||
(linux_proc_pid_is_stopped): Adjust.
|
||
(linux_proc_pid_is_zombie_maybe_warn)
|
||
(linux_proc_pid_is_zombie_nowarn): New functions.
|
||
(linux_proc_pid_is_zombie): Use
|
||
linux_proc_pid_is_zombie_maybe_warn.
|
||
(linux_proc_attach_tgid_threads): New function.
|
||
* nat/linux-procfs.h (linux_proc_get_tgid): Update comment.
|
||
(linux_proc_get_tracerpid): Rename to ...
|
||
(linux_proc_get_tracerpid_nowarn): ... this, and update comment.
|
||
(linux_proc_pid_is_gone): New declaration.
|
||
(linux_proc_pid_is_zombie): Update comment.
|
||
(linux_proc_pid_is_zombie_nowarn): New declaration.
|
||
(linux_proc_attach_lwp_func): New typedef.
|
||
(linux_proc_attach_tgid_threads): New declaration.
|
||
* nat/linux-ptrace.c (linux_ptrace_attach_fail_reason): Adjust to
|
||
use nowarn functions.
|
||
(linux_ptrace_attach_fail_reason_string): Move here from
|
||
gdbserver/linux-low.c and rename.
|
||
(ptrace_supports_feature): If the current ptrace options are not
|
||
known yet, check them now, instead of asserting.
|
||
* nat/linux-ptrace.h (linux_ptrace_attach_fail_reason_string):
|
||
Declare.
|
||
|
||
2015-01-09 Pedro Alves <palves@redhat.com>
|
||
|
||
* linux-thread-db.c (thread_db_find_new_threads_silently)
|
||
(try_thread_db_load_1, try_thread_db_load, thread_db_load_search)
|
||
(find_new_threads_once): Print debug output on gdb_stdlog.
|
||
|
||
2015-01-09 Chen Gang <gang.chen.5i5j@gmail.com>
|
||
Pedro Alves <palves@redhat.com>
|
||
|
||
* compile/compile.c: Include "gdb_wait.h".
|
||
(do_rmdir): Check return value, and free 'zap'.
|
||
|
||
2015-01-08 Pedro Alves <palves@redhat.com>
|
||
Yao Qi <yao@codesourcery.com>
|
||
|
||
* dwarf2loc.c (indirect_pieced_value): Don't call
|
||
gdb_sign_extend. Call extract_signed_integer instead.
|
||
* utils.c (gdb_sign_extend): Remove.
|
||
* utils.h (gdb_sign_extend): Remove declaration.
|
||
|
||
2015-01-07 Pierre Muller <muller@sourceware.org>
|
||
|
||
PR symtab/17811
|
||
* stabsread.c (define_symbol): Set language for C++ special symbols.
|
||
|
||
2015-01-07 Patrick Palka <patrick@parcs.ath.cx>
|
||
|
||
* inflow.c (initial_gdb_ttystate): Tweak comment.
|
||
|
||
2015-01-07 Joel Brobecker <brobecker@adacore.com>
|
||
|
||
* inflow.c (set_initial_gdb_ttystate): Add empty line after
|
||
comment documenting function.
|
||
|
||
2015-01-07 Patrick Palka <patrick@parcs.ath.cx>
|
||
|
||
* terminal.h (set_initial_gdb_ttystate): Declare.
|
||
* inflow.c (initial_gdb_ttystate): New static variable.
|
||
(set_initial_gdb_ttystate): New setter.
|
||
(child_terminal_init_with_pgrp): Copy initial_gdb_ttystate
|
||
instead of our current terminal state.
|
||
* top.c (gdb_init): Call set_initial_gdb_ttystate.
|
||
|
||
2015-01-07 Joel Brobecker <brobecker@adacore.com>
|
||
|
||
* guile/scm-type.c (tyscm_array_1): Add comment.
|
||
* python/py-type.c (typy_array_1): Add comment.
|
||
|
||
2015-01-06 Joel Brobecker <brobecker@adacore.com>
|
||
|
||
* guile/scm-type.c (tyscm_array_1): Do not raise out-of-range
|
||
error if N2 is equal to N1 - 1.
|
||
|
||
2015-01-06 Joel Brobecker <brobecker@adacore.com>
|
||
|
||
* python/py-type.c (typy_array_1): Do not raise negative-length
|
||
exception if N2 is equal to N1 - 1.
|
||
|
||
2015-01-03 Doug Evans <xdje42@gmail.com>
|
||
|
||
* c-exp.y: Whitespace cleanup.
|
||
(classify_inner_name): Remove extra ;.
|
||
|
||
2015-01-02 Maciej W. Rozycki <macro@codesourcery.com>
|
||
|
||
* mips-tdep.c (mips32_scan_prologue): Keep the extracted stack
|
||
offset signed.
|
||
|
||
2015-01-02 Doug Evans <dje@google.com>
|
||
|
||
* dwarf2read.c (setup_type_unit_groups): Remove outdated comment.
|
||
|
||
2015-01-02 Doug Evans <dje@google.com>
|
||
|
||
* symtab.h (struct symbol): Fix typo in comment.
|
||
|
||
2015-01-01 Joel Brobecker <brobecker@adacore.com>
|
||
|
||
Update year range in copyright notice of all files.
|
||
|
||
2015-01-01 Joel Brobecker <brobecker@adacore.com>
|
||
|
||
* top.c (print_gdb_version): Update copyright year to 2015.
|
||
|
||
2015-01-01 Joel Brobecker <brobecker@adacore.com>
|
||
|
||
* config/djgpp/fnchange.lst: Add entry for gdb/ChangeLog-2014.
|
||
|
||
For older changes see ChangeLog-2014.
|
||
|
||
Local Variables:
|
||
mode: change-log
|
||
left-margin: 8
|
||
fill-column: 74
|
||
version-control: never
|
||
coding: utf-8
|
||
End:
|