From 6aed2dbcba548376cdc0b98231fb9b174f9ca978 Mon Sep 17 00:00:00 2001 From: Stan Shebs Date: Fri, 18 Jun 2010 17:44:40 +0000 Subject: [PATCH] * thread.c (thread_id_make_value): Make a value representing the current thread. (_initialize_thread): Create $_thread. * gdb.texinfo (Debugging Programs with Multiple Threads): Describe $_thread. * gdb.threads/thread-specific.exp: Add tests of $_thread. --- gdb/ChangeLog | 6 ++++++ gdb/doc/ChangeLog | 5 +++++ gdb/doc/gdb.texinfo | 7 +++++++ gdb/testsuite/ChangeLog | 4 ++++ gdb/testsuite/gdb.threads/thread-specific.exp | 16 +++++++++++++++- gdb/thread.c | 14 ++++++++++++++ 6 files changed, 51 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 15c7c8513e..fd4355322f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2010-06-18 Stan Shebs + + * thread.c (thread_id_make_value): Make a value representing the + current thread. + (_initialize_thread): Create $_thread. + 2010-06-17 Joel Brobecker * dwarf2read.c (psymtabs_addrmap_cleanup): Add empty line after diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 60ae888805..e85334604d 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2010-06-18 Stan Shebs + + * gdb.texinfo (Debugging Programs with Multiple Threads): Describe + $_thread. + 2010-06-18 Hui Zhu * gdb.texinfo: (Process Record and Replay): Add documentation diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 03752b6788..8c1969678b 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -2788,6 +2788,13 @@ As with the @samp{[New @dots{}]} message, the form of the text after @samp{Switching to} depends on your system's conventions for identifying threads. +@vindex $_thread@r{, convenience variable} +The debugger convenience variable @samp{$_thread} contains the number +of the current thread. You may find this useful in writing breakpoint +conditional expressions, command scripts, and so forth. See +@xref{Convenience Vars,, Convenience Variables}, for general +information on convenience variables. + @kindex thread apply @cindex apply command to several threads @item thread apply [@var{threadno}] [@var{all}] @var{command} diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d789a4138b..3b61976f05 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-06-18 Stan Shebs + + * gdb.threads/thread-specific.exp: Add tests of $_thread. + 2010-06-18 Ulrich Weigand * gdb.base/gdb11531.exp: Respect gdb,no_hardware_watchpoints flag. diff --git a/gdb/testsuite/gdb.threads/thread-specific.exp b/gdb/testsuite/gdb.threads/thread-specific.exp index 623d805bd8..662eec3664 100644 --- a/gdb/testsuite/gdb.threads/thread-specific.exp +++ b/gdb/testsuite/gdb.threads/thread-specific.exp @@ -75,6 +75,8 @@ gdb_load ${binfile} gdb_test_no_output "set print sevenbit-strings" gdb_test_no_output "set width 0" +gdb_test {print $_thread} ".* = 0" "thread var when not running" + runto_main gdb_breakpoint [gdb_get_line_number "thread-specific.exp: last thread start"] @@ -88,6 +90,8 @@ if {[llength $threads] == 0} { return 1 } +gdb_test {print $_thread} ".* = [lindex $threads 0]" "thread var in main" + gdb_test_multiple "break $line thread [lindex $threads 0]" \ "breakpoint $line main thread" { -re "Breakpoint (\[0-9\]*) at.* file .*$srcfile, line.*$gdb_prompt $" { @@ -104,9 +108,19 @@ gdb_test_multiple "continue" "continue to thread-specific breakpoint" { -re "Breakpoint $main_breakpoint, .* at .*\r\n$gdb_prompt $" { fail "continue to thread-specific breakpoint (wrong breakpoint)" } - -re "Breakpoint .* at .*\r\n$gdb_prompt $" { + -re "Breakpoint (\[0-9\]*), .* at .*\r\n$gdb_prompt $" { + set this_breakpoint $expect_out(1,string) pass "continue to thread-specific breakpoint" } } +gdb_test_multiple "info breakpoint $this_breakpoint" "info on bp" { + -re ".*stop only in thread (\[0-9\]*).*$gdb_prompt $" { + set this_thread $expect_out(1,string) + pass "found breakpoint for thread number" + } +} + +gdb_test {print $_thread} ".* = $this_thread" "thread var at break" + return 0 diff --git a/gdb/thread.c b/gdb/thread.c index c10d23c9f2..2fdc7f9b32 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -1262,6 +1262,18 @@ update_thread_list (void) target_find_new_threads (); } +/* Return a new value for the selected thread's id. Return a value of 0 if + no thread is selected, or no threads exist. */ + +static struct value * +thread_id_make_value (struct gdbarch *gdbarch, struct internalvar *var) +{ + struct thread_info *tp = find_thread_ptid (inferior_ptid); + + return value_from_longest (builtin_type (gdbarch)->builtin_int, + (tp ? tp->num : 0)); +} + /* Commands with a prefix of `thread'. */ struct cmd_list_element *thread_cmd_list = NULL; @@ -1295,4 +1307,6 @@ Show printing of thread events (such as thread start and exit)."), NULL, NULL, show_print_thread_events, &setprintlist, &showprintlist); + + create_internalvar_type_lazy ("_thread", thread_id_make_value); } -- 2.34.1