diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index fa21333b97..b075eb3b30 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2017-09-21 Kevin Buettner + + * linux-low.c (handle_extended_wait): Call thread_db_notice_clone(). + * linux-low.h (thread_db_notice_clone): Declare. + * thread-db.c (thread_db_notice_clone): New function. + 2017-09-21 Pedro Alves * server.c (gdb_read_memory, handle_status, process_serial_event) diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 1bc8f381bc..a3f9ab9bbc 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -656,6 +656,8 @@ handle_extended_wait (struct lwp_info **orig_event_lwp, int wstat) new_lwp->status_pending = status; } + thread_db_notice_clone (get_thread_process (event_thr), ptid); + /* Don't report the event. */ return 1; } diff --git a/gdb/gdbserver/linux-low.h b/gdb/gdbserver/linux-low.h index 91061447cc..be27c9229c 100644 --- a/gdb/gdbserver/linux-low.h +++ b/gdb/gdbserver/linux-low.h @@ -410,4 +410,10 @@ int thread_db_get_tls_address (struct thread_info *thread, CORE_ADDR offset, CORE_ADDR load_module, CORE_ADDR *address); int thread_db_look_up_one_symbol (const char *name, CORE_ADDR *addrp); +/* Called from linux-low.c when a clone event is detected. Upon entry, + both the clone and the parent should be stopped. This function does + whatever is required have the clone under thread_db's control. */ + +void thread_db_notice_clone (struct process_info *proc, ptid_t lwp); + extern int have_ptrace_getregset; diff --git a/gdb/gdbserver/thread-db.c b/gdb/gdbserver/thread-db.c index 9b867b8785..3d57f318b6 100644 --- a/gdb/gdbserver/thread-db.c +++ b/gdb/gdbserver/thread-db.c @@ -851,3 +851,19 @@ thread_db_handle_monitor_command (char *mon) /* Tell server.c to perform default processing. */ return 0; } + +/* See linux-low.h. */ + +void +thread_db_notice_clone (struct process_info *proc, ptid_t ptid) +{ + struct thread_db *thread_db = proc->priv->thread_db; + + /* If the thread layer isn't initialized, return. It may just + be that the program uses clone, but does not use libthread_db. */ + if (thread_db == NULL || !thread_db->all_symbols_looked_up) + return; + + if (!find_one_thread (ptid)) + warning ("Cannot find thread after clone.\n"); +}