• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

GNU Binutils with patches for OS216


Commit MetaInfo

Revisión8629910955a751a93f2f12389ff1f497556cc260 (tree)
Tiempo2017-09-22 03:49:47
AutorKevin Buettner <kevinb@redh...>
CommiterKevin Buettner

Log Message

Add thread_db_notice_clone to gdbserver

While working on a patch for fetching a thread handle in gdbserver, I
ran into a circumstance in which tests in gdb.mi/mi-nsmoribund.exp
would occasionally fail. Over a large enough number of runs, it would
fail roughly 2% of the time.

That thread handle patch caused find_one_thread() to be called on
every stop. find_one_thread() calls td_ta_map_lwp2thr() which, in
turn, can cause ps_get_thread_area() to be called.
ps_get_thread_area() makes a call to ptrace() for getting the thread
area address. If this should happen when the thread is not stopped,
the call to ptrace will return error which in turn propogates back to
find_one_thread(). find_one_thread() calls error() in this instance
which causes the program to die.

This patch causes find_one_thread() to be called upon reciept of a
clone event. Since the clone is stopped, the circumstances described
above cannot occur.

gdb/gdbserver/ChangeLog:

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

Cambiar Resumen

Diferencia incremental

--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,9 @@
1+2017-09-21 Kevin Buettner <kevinb@redhat.com>
2+
3+ * linux-low.c (handle_extended_wait): Call thread_db_notice_clone().
4+ * linux-low.h (thread_db_notice_clone): Declare.
5+ * thread-db.c (thread_db_notice_clone): New function.
6+
17 2017-09-21 Pedro Alves <palves@redhat.com>
28
39 * server.c (gdb_read_memory, handle_status, process_serial_event)
--- 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)
656656 new_lwp->status_pending = status;
657657 }
658658
659+ thread_db_notice_clone (get_thread_process (event_thr), ptid);
660+
659661 /* Don't report the event. */
660662 return 1;
661663 }
--- 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,
410410 CORE_ADDR load_module, CORE_ADDR *address);
411411 int thread_db_look_up_one_symbol (const char *name, CORE_ADDR *addrp);
412412
413+/* Called from linux-low.c when a clone event is detected. Upon entry,
414+ both the clone and the parent should be stopped. This function does
415+ whatever is required have the clone under thread_db's control. */
416+
417+void thread_db_notice_clone (struct process_info *proc, ptid_t lwp);
418+
413419 extern int have_ptrace_getregset;
--- a/gdb/gdbserver/thread-db.c
+++ b/gdb/gdbserver/thread-db.c
@@ -851,3 +851,19 @@ thread_db_handle_monitor_command (char *mon)
851851 /* Tell server.c to perform default processing. */
852852 return 0;
853853 }
854+
855+/* See linux-low.h. */
856+
857+void
858+thread_db_notice_clone (struct process_info *proc, ptid_t ptid)
859+{
860+ struct thread_db *thread_db = proc->priv->thread_db;
861+
862+ /* If the thread layer isn't initialized, return. It may just
863+ be that the program uses clone, but does not use libthread_db. */
864+ if (thread_db == NULL || !thread_db->all_symbols_looked_up)
865+ return;
866+
867+ if (!find_one_thread (ptid))
868+ warning ("Cannot find thread after clone.\n");
869+}