diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2eba21ac9a..66cd31ef82 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2011-12-20 Pedro Alves + Jan Kratochvil + + * linux-nat.c (add_lwp): Don't call linux_nat_new_thread on the + first LWP. + * amd64-linux-nat.c (update_debug_registers_callback): Instantiate + `lwp->arch_private' if NULL. + (amd64_linux_prepare_to_resume): Do nothing if `lwp->arch_private' + is NULL. + * i386-linux-nat.c (update_debug_registers_callback): Instantiate + `lwp->arch_private' if NULL. + (i386_linux_prepare_to_resume): Do nothing if `lwp->arch_private' + is NULL. + 2011-12-19 Doug Evans * python/py-auto-load.c (info_auto_load_scripts): Pass address of diff --git a/gdb/amd64-linux-nat.c b/gdb/amd64-linux-nat.c index 288160b338..865b9713d8 100644 --- a/gdb/amd64-linux-nat.c +++ b/gdb/amd64-linux-nat.c @@ -343,6 +343,9 @@ amd64_linux_dr_get_status (void) static int update_debug_registers_callback (struct lwp_info *lwp, void *arg) { + if (lwp->arch_private == NULL) + lwp->arch_private = XCNEW (struct arch_lwp_info); + /* The actual update is done later just before resuming the lwp, we just mark that the registers need updating. */ lwp->arch_private->debug_registers_changed = 1; @@ -386,6 +389,12 @@ amd64_linux_prepare_to_resume (struct lwp_info *lwp) { int clear_status = 0; + /* NULL means this is the main thread still going through the shell, + or, no watchpoint has been set yet. In that case, there's + nothing to do. */ + if (lwp->arch_private == NULL) + return; + if (lwp->arch_private->debug_registers_changed) { struct i386_debug_reg_state *state = i386_debug_reg_state (); diff --git a/gdb/i386-linux-nat.c b/gdb/i386-linux-nat.c index 190979b8a6..45279135a2 100644 --- a/gdb/i386-linux-nat.c +++ b/gdb/i386-linux-nat.c @@ -715,6 +715,9 @@ i386_linux_dr_get_status (void) static int update_debug_registers_callback (struct lwp_info *lwp, void *arg) { + if (lwp->arch_private == NULL) + lwp->arch_private = XCNEW (struct arch_lwp_info); + /* The actual update is done later just before resuming the lwp, we just mark that the registers need updating. */ lwp->arch_private->debug_registers_changed = 1; @@ -758,6 +761,12 @@ i386_linux_prepare_to_resume (struct lwp_info *lwp) { int clear_status = 0; + /* NULL means this is the main thread still going through the shell, + or, no watchpoint has been set yet. In that case, there's + nothing to do. */ + if (lwp->arch_private == NULL) + return; + if (lwp->arch_private->debug_registers_changed) { struct i386_debug_reg_state *state = i386_debug_reg_state (); diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 1cbfc44456..e5f7c3e8ee 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -1151,7 +1151,15 @@ add_lwp (ptid_t ptid) lp->next = lwp_list; lwp_list = lp; - if (linux_nat_new_thread != NULL) + /* Let the arch specific bits know about this new thread. Current + clients of this callback take the opportunity to install + watchpoints in the new thread. Don't do this for the first + thread though. If we're spawning a child ("run"), the thread + executes the shell wrapper first, and we shouldn't touch it until + it execs the program we want to debug. For "attach", it'd be + okay to call the callback, but it's not necessary, because + watchpoints can't yet have been inserted into the inferior. */ + if (num_lwps (GET_PID (ptid)) > 1 && linux_nat_new_thread != NULL) linux_nat_new_thread (lp); return lp;