diff options
-rw-r--r-- | gdb/NEWS | 4 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 8 | ||||
-rw-r--r-- | gdb/gdbthread.h | 11 | ||||
-rw-r--r-- | gdb/inferior.c | 2 | ||||
-rw-r--r-- | gdb/thread.c | 38 |
5 files changed, 63 insertions, 0 deletions
@@ -60,6 +60,10 @@ exit You can now exit GDB by using the new command "exit", in addition to the existing "quit" command. +set debug threads on|off +show debug threads + Print additional debug messages about thread creation and deletion. + * Changed commands maint packet diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 0c517b4..2d34141 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -3899,6 +3899,14 @@ Display current libthread_db search path. @itemx show debug libthread-db Turns on or off display of @code{libthread_db}-related events. Use @code{1} to enable, @code{0} to disable. + +@kindex set debug threads +@kindex show debug threads +@cindex debugging @code{threads} +@item set debug threads @r{[}on@r{|}off@r{]} +@itemx show debug threads +When @samp{on} @value{GDBN} will print additional messages when +threads are created and deleted. @end table @node Forks diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h index e229a5f..66c525b 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h @@ -38,6 +38,16 @@ struct symtab; struct inferior; struct process_stratum_target; +/* When true, print debug messages related to GDB thread creation and + deletion. */ + +extern bool debug_threads; + +/* Print a "threads" debug statement. */ + +#define threads_debug_printf(fmt, ...) \ + debug_prefixed_printf_cond (debug_threads, "threads", fmt, ##__VA_ARGS__) + /* Frontend view of the thread state. Possible extensions: stepping, finishing, until(ling),... @@ -235,6 +245,7 @@ class thread_info : public refcounted_object, { public: explicit thread_info (inferior *inf, ptid_t ptid); + ~thread_info (); bool deletable () const; diff --git a/gdb/inferior.c b/gdb/inferior.c index 40ab3e7..72b7c61 100644 --- a/gdb/inferior.c +++ b/gdb/inferior.c @@ -179,6 +179,8 @@ inferior::clear_thread_list (bool silent) { thread_list.clear_and_dispose ([=] (thread_info *thr) { + threads_debug_printf ("deleting thread %s, silent = %d", + thr->ptid.to_string ().c_str (), silent); set_thread_exited (thr, silent); if (thr->deletable ()) delete thr; diff --git a/gdb/thread.c b/gdb/thread.c index 6c792ec..ebaed1c 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -49,6 +49,19 @@ #include "inline-frame.h" #include "stack.h" +/* See gdbthread.h. */ + +bool debug_threads = false; + +/* Implement 'show debug threads'. */ + +static void +show_debug_threads (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + fprintf_filtered (file, _("Thread debugging is \"%s\".\n"), value); +} + /* Definition of struct thread_info exported to gdbthread.h. */ /* Prototypes for local functions. */ @@ -234,6 +247,9 @@ new_thread (struct inferior *inf, ptid_t ptid) { thread_info *tp = new thread_info (inf, ptid); + threads_debug_printf ("creating a new thread object, inferior %d, ptid %s", + inf->num, ptid.to_string ().c_str ()); + inf->thread_list.push_back (*tp); /* A thread with this ptid should not exist in the map yet. */ @@ -251,6 +267,10 @@ add_thread_silent (process_stratum_target *targ, ptid_t ptid) inferior *inf = find_inferior_ptid (targ, ptid); + threads_debug_printf ("add thread to inferior %d, ptid %s, target %s", + inf->num, ptid.to_string ().c_str (), + targ->shortname ()); + /* We may have an old thread with the same id in the thread list. If we do, it must be dead, otherwise we wouldn't be adding a new thread with the same id. The OS is reusing this id --- delete @@ -302,6 +322,13 @@ thread_info::thread_info (struct inferior *inf_, ptid_t ptid_) /* See gdbthread.h. */ +thread_info::~thread_info () +{ + threads_debug_printf ("thread %s", this->ptid.to_string ().c_str ()); +} + +/* See gdbthread.h. */ + bool thread_info::deletable () const { @@ -434,6 +461,9 @@ delete_thread_1 (thread_info *thr, bool silent) { gdb_assert (thr != nullptr); + threads_debug_printf ("deleting thread %s, silent = %d", + thr->ptid.to_string ().c_str (), silent); + set_thread_exited (thr, silent); if (!thr->deletable ()) @@ -2192,6 +2222,14 @@ Show printing of thread events (such as thread start and exit)."), NULL, show_print_thread_events, &setprintlist, &showprintlist); + add_setshow_boolean_cmd ("threads", class_maintenance, &debug_threads, _("\ +Set thread debugging."), _("\ +Show thread debugging."), _("\ +When on messages about thread creation and deletion are printed."), + nullptr, + show_debug_threads, + &setdebuglist, &showdebuglist); + create_internalvar_type_lazy ("_thread", &thread_funcs, NULL); create_internalvar_type_lazy ("_gthread", >hread_funcs, NULL); } |