diff options
author | Stan Shebs <shebs@codesourcery.com> | 2010-06-18 17:44:40 +0000 |
---|---|---|
committer | Stan Shebs <shebs@codesourcery.com> | 2010-06-18 17:44:40 +0000 |
commit | 6aed2dbcba548376cdc0b98231fb9b174f9ca978 (patch) | |
tree | 37933482f06cdff97129271eb76c1e8401649ef9 | |
parent | 6508b958ffb3afc176ac6b978e15baafbc85e4ab (diff) | |
download | gdb-6aed2dbcba548376cdc0b98231fb9b174f9ca978.zip gdb-6aed2dbcba548376cdc0b98231fb9b174f9ca978.tar.gz gdb-6aed2dbcba548376cdc0b98231fb9b174f9ca978.tar.bz2 |
* 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.
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/doc/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 7 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.threads/thread-specific.exp | 16 | ||||
-rw-r--r-- | gdb/thread.c | 14 |
6 files changed, 51 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 15c7c85..fd43553 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2010-06-18 Stan Shebs <stan@codesourcery.com> + + * thread.c (thread_id_make_value): Make a value representing the + current thread. + (_initialize_thread): Create $_thread. + 2010-06-17 Joel Brobecker <brobecker@adacore.com> * dwarf2read.c (psymtabs_addrmap_cleanup): Add empty line after diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 60ae888..e853346 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2010-06-18 Stan Shebs <stan@codesourcery.com> + + * gdb.texinfo (Debugging Programs with Multiple Threads): Describe + $_thread. + 2010-06-18 Hui Zhu <teawater@gmail.com> * gdb.texinfo: (Process Record and Replay): Add documentation diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 03752b6..8c19696 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 d789a41..3b61976 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-06-18 Stan Shebs <stan@codesourcery.com> + + * gdb.threads/thread-specific.exp: Add tests of $_thread. + 2010-06-18 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> * 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 623d805..662eec3 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 c10d23c..2fdc7f9 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); } |