mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
gdb
* thread.c (print_thread_info): Make a ui-out table in CLI mode. gdb/testsuite * gdb.threads/execl.exp: Update. * gdb.threads/linux-dp.exp: Update. * gdb.threads/manythreads.exp: Update. * gdb.threads/tls.exp: Update.
This commit is contained in:
parent
c91a930cb7
commit
a7658b96f6
@ -1,3 +1,7 @@
|
|||||||
|
2010-12-21 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
|
* thread.c (print_thread_info): Make a ui-out table in CLI mode.
|
||||||
|
|
||||||
2010-12-20 Yao Qi <yao@codesourcery.com>
|
2010-12-20 Yao Qi <yao@codesourcery.com>
|
||||||
|
|
||||||
* arm-tdep.c (arm_register_reggroup_p): New.
|
* arm-tdep.c (arm_register_reggroup_p): New.
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
2010-12-21 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
|
* gdb.threads/execl.exp: Update.
|
||||||
|
* gdb.threads/linux-dp.exp: Update.
|
||||||
|
* gdb.threads/manythreads.exp: Update.
|
||||||
|
* gdb.threads/tls.exp: Update.
|
||||||
|
|
||||||
2010-12-15 Jan Kratochvil <jan.kratochvil@redhat.com>
|
2010-12-15 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
* gdb.cp/nextoverthrow.cc (dummy): Return int 0.
|
* gdb.cp/nextoverthrow.cc (dummy): Return int 0.
|
||||||
|
@ -46,7 +46,7 @@ gdb_test "b [gdb_get_line_number "breakpoint here"]" \
|
|||||||
|
|
||||||
gdb_test "continue" ".*breakpoint here.*" "continue to exec"
|
gdb_test "continue" ".*breakpoint here.*" "continue to exec"
|
||||||
|
|
||||||
gdb_test "info threads" ".*3 Thread.*2 Thread.*1 Thread.*" "info threads before exec"
|
gdb_test "info threads" ".*3 *Thread.*2 *Thread.*1 *Thread.*" "info threads before exec"
|
||||||
|
|
||||||
# When continuing from this point we'll hit the breakpoint in main()
|
# When continuing from this point we'll hit the breakpoint in main()
|
||||||
# again, this time in the exec'd process.
|
# again, this time in the exec'd process.
|
||||||
|
@ -70,7 +70,10 @@ for {set i 0} {$i < 5} {incr i} {
|
|||||||
-re "info threads\r\n" {
|
-re "info threads\r\n" {
|
||||||
exp_continue
|
exp_continue
|
||||||
}
|
}
|
||||||
-re "^. +(\[0-9\]+ Thread \[-0-9a-fx\]+) \[^\n\]*\n" {
|
-re "^ *Id.*Frame *\[\r\n\]+" {
|
||||||
|
exp_continue
|
||||||
|
}
|
||||||
|
-re "^. +(\[0-9\]+ *Thread \[-0-9a-fx\]+) \[^\n\]*\n" {
|
||||||
verbose -log "found thread $expect_out(1,string)" 2
|
verbose -log "found thread $expect_out(1,string)" 2
|
||||||
lappend threads_before $expect_out(1,string)
|
lappend threads_before $expect_out(1,string)
|
||||||
exp_continue
|
exp_continue
|
||||||
@ -136,7 +139,10 @@ for {set i 0} {$i < 5} {incr i} {
|
|||||||
-re "info threads\r\n" {
|
-re "info threads\r\n" {
|
||||||
exp_continue
|
exp_continue
|
||||||
}
|
}
|
||||||
-re "^. +(\[0-9\]+ Thread \[-0-9a-fx\]+) \[^\n\]*\n" {
|
-re "^ *Id.*Frame *\[\r\n\]+" {
|
||||||
|
exp_continue
|
||||||
|
}
|
||||||
|
-re "^. +(\[0-9\]+ *Thread \[-0-9a-fx\]+) \[^\n\]*\n" {
|
||||||
set name $expect_out(1,string)
|
set name $expect_out(1,string)
|
||||||
for {set j 0} {$j != [llength $threads_before] } {incr j} {
|
for {set j 0} {$j != [llength $threads_before] } {incr j} {
|
||||||
if {$name == [lindex $threads_before $j]} {
|
if {$name == [lindex $threads_before $j]} {
|
||||||
@ -177,12 +183,12 @@ set nthreads 6
|
|||||||
# Run until there are some threads.
|
# Run until there are some threads.
|
||||||
gdb_breakpoint [gdb_get_line_number "linuxthreads.exp: info threads 2"]
|
gdb_breakpoint [gdb_get_line_number "linuxthreads.exp: info threads 2"]
|
||||||
gdb_continue_to_breakpoint "main thread's sleep"
|
gdb_continue_to_breakpoint "main thread's sleep"
|
||||||
set info_threads_ptn ""
|
set info_threads_ptn ".*"
|
||||||
for {set i $nthreads} {$i > 0} {incr i -1} {
|
for {set i $nthreads} {$i > 0} {incr i -1} {
|
||||||
append info_threads_ptn "$i Thread .*"
|
append info_threads_ptn "$i *Thread .*"
|
||||||
}
|
}
|
||||||
append info_threads_ptn "\[\r\n\]+$gdb_prompt $"
|
append info_threads_ptn "\[\r\n\]+$gdb_prompt $"
|
||||||
set info_threads_manager_ptn "[expr $nthreads + 1] Thread .*$info_threads_ptn"
|
set info_threads_manager_ptn "[expr $nthreads + 1] *Thread .*$info_threads_ptn"
|
||||||
|
|
||||||
gdb_test_multiple "info threads" "info threads 2" {
|
gdb_test_multiple "info threads" "info threads 2" {
|
||||||
-re "$info_threads_manager_ptn" {
|
-re "$info_threads_manager_ptn" {
|
||||||
@ -245,7 +251,7 @@ set only_five 1
|
|||||||
for {set i 0} {$only_five > 0 && $i < 10} {incr i} {
|
for {set i 0} {$only_five > 0 && $i < 10} {incr i} {
|
||||||
gdb_continue_to_breakpoint "thread 5's print, pass: $i"
|
gdb_continue_to_breakpoint "thread 5's print, pass: $i"
|
||||||
gdb_test_multiple "info threads" "" {
|
gdb_test_multiple "info threads" "" {
|
||||||
-re "\\* 5 Thread .* print_philosopher .*\r\n$gdb_prompt $" {
|
-re "\[*\] 5 *Thread .* +print_philosopher .*\r\n$gdb_prompt $" {
|
||||||
# Okay this time.
|
# Okay this time.
|
||||||
}
|
}
|
||||||
-re ".*$gdb_prompt $" {
|
-re ".*$gdb_prompt $" {
|
||||||
|
@ -82,7 +82,7 @@ gdb_test_multiple "" "stop threads 1" {
|
|||||||
set cmd "info threads"
|
set cmd "info threads"
|
||||||
set ok 0
|
set ok 0
|
||||||
gdb_test_multiple $cmd $cmd {
|
gdb_test_multiple $cmd $cmd {
|
||||||
-re " 1 Thread " {
|
-re " 1 *Thread " {
|
||||||
set ok 1
|
set ok 1
|
||||||
exp_continue
|
exp_continue
|
||||||
}
|
}
|
||||||
|
@ -214,7 +214,7 @@ gdb_test "continue" ".*Breakpoint 3.*still alive.*" "continue to synch point"
|
|||||||
set no_of_threads 0
|
set no_of_threads 0
|
||||||
send_gdb "info thread\n"
|
send_gdb "info thread\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re "^info thread\[ \t\r\n\]+(\[0-9\]+) Thread.*$gdb_prompt $" {
|
-re "^info thread\[ \t\r\n\]+ *Id .*Frame\[ \t\r\n\]|(\[0-9\]+) *Thread.*$gdb_prompt $" {
|
||||||
set no_of_threads $expect_out(1,string)
|
set no_of_threads $expect_out(1,string)
|
||||||
pass "get number of threads"
|
pass "get number of threads"
|
||||||
}
|
}
|
||||||
@ -262,10 +262,10 @@ gdb_test "continue" ".*Breakpoint 4.*before exit.*" "threads exited"
|
|||||||
|
|
||||||
send_gdb "info thread\n"
|
send_gdb "info thread\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re ".* 1 Thread.*2 Thread.*$gdb_prompt $" {
|
-re ".* 1 *Thread.*2 *Thread.*$gdb_prompt $" {
|
||||||
fail "Too many threads left at end"
|
fail "Too many threads left at end"
|
||||||
}
|
}
|
||||||
-re ".*\\\* 1 Thread.*main.*$gdb_prompt $" {
|
-re ".*\\\* 1 *Thread.*main.*$gdb_prompt $" {
|
||||||
pass "Expect only base thread at end"
|
pass "Expect only base thread at end"
|
||||||
}
|
}
|
||||||
-re ".*No stack.*$gdb_prompt $" {
|
-re ".*No stack.*$gdb_prompt $" {
|
||||||
|
65
gdb/thread.c
65
gdb/thread.c
@ -778,7 +778,49 @@ print_thread_info (struct ui_out *uiout, int requested_thread, int pid)
|
|||||||
/* We'll be switching threads temporarily. */
|
/* We'll be switching threads temporarily. */
|
||||||
old_chain = make_cleanup_restore_current_thread ();
|
old_chain = make_cleanup_restore_current_thread ();
|
||||||
|
|
||||||
make_cleanup_ui_out_list_begin_end (uiout, "threads");
|
/* For backward compatibility, we make a list for MI. A table is
|
||||||
|
preferable for the CLI, though, because it shows table
|
||||||
|
headers. */
|
||||||
|
if (ui_out_is_mi_like_p (uiout))
|
||||||
|
make_cleanup_ui_out_list_begin_end (uiout, "threads");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int n_threads = 0;
|
||||||
|
|
||||||
|
for (tp = thread_list; tp; tp = tp->next)
|
||||||
|
{
|
||||||
|
if (requested_thread != -1 && tp->num != requested_thread)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (pid != -1 && PIDGET (tp->ptid) != pid)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (tp->state_ == THREAD_EXITED)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
++n_threads;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n_threads == 0)
|
||||||
|
{
|
||||||
|
if (requested_thread == -1)
|
||||||
|
ui_out_message (uiout, 0, _("No threads.\n"));
|
||||||
|
else
|
||||||
|
ui_out_message (uiout, 0, _("No thread %d.\n"), requested_thread);
|
||||||
|
do_cleanups (old_chain);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
make_cleanup_ui_out_table_begin_end (uiout, 5, n_threads, "threads");
|
||||||
|
|
||||||
|
ui_out_table_header (uiout, 1, ui_left, "current", "");
|
||||||
|
ui_out_table_header (uiout, 4, ui_left, "id", "Id");
|
||||||
|
ui_out_table_header (uiout, 17, ui_left, "target-id", "Target Id");
|
||||||
|
ui_out_table_header (uiout, 1, ui_noalign, "details", "");
|
||||||
|
ui_out_table_header (uiout, 1, ui_left, "frame", "Frame");
|
||||||
|
ui_out_table_body (uiout);
|
||||||
|
}
|
||||||
|
|
||||||
for (tp = thread_list; tp; tp = tp->next)
|
for (tp = thread_list; tp; tp = tp->next)
|
||||||
{
|
{
|
||||||
struct cleanup *chain2;
|
struct cleanup *chain2;
|
||||||
@ -802,13 +844,23 @@ print_thread_info (struct ui_out *uiout, int requested_thread, int pid)
|
|||||||
|
|
||||||
chain2 = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
|
chain2 = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
|
||||||
|
|
||||||
if (ptid_equal (tp->ptid, current_ptid))
|
if (ui_out_is_mi_like_p (uiout))
|
||||||
ui_out_text (uiout, "* ");
|
{
|
||||||
|
/* Compatibility. */
|
||||||
|
if (ptid_equal (tp->ptid, current_ptid))
|
||||||
|
ui_out_text (uiout, "* ");
|
||||||
|
else
|
||||||
|
ui_out_text (uiout, " ");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
ui_out_text (uiout, " ");
|
{
|
||||||
|
if (ptid_equal (tp->ptid, current_ptid))
|
||||||
|
ui_out_field_string (uiout, "current", "*");
|
||||||
|
else
|
||||||
|
ui_out_field_skip (uiout, "current");
|
||||||
|
}
|
||||||
|
|
||||||
ui_out_field_int (uiout, "id", tp->num);
|
ui_out_field_int (uiout, "id", tp->num);
|
||||||
ui_out_text (uiout, " ");
|
|
||||||
ui_out_field_string (uiout, "target-id", target_pid_to_str (tp->ptid));
|
ui_out_field_string (uiout, "target-id", target_pid_to_str (tp->ptid));
|
||||||
|
|
||||||
extra_info = target_extra_thread_info (tp);
|
extra_info = target_extra_thread_info (tp);
|
||||||
@ -818,7 +870,8 @@ print_thread_info (struct ui_out *uiout, int requested_thread, int pid)
|
|||||||
ui_out_field_string (uiout, "details", extra_info);
|
ui_out_field_string (uiout, "details", extra_info);
|
||||||
ui_out_text (uiout, ")");
|
ui_out_text (uiout, ")");
|
||||||
}
|
}
|
||||||
ui_out_text (uiout, " ");
|
else if (! ui_out_is_mi_like_p (uiout))
|
||||||
|
ui_out_field_skip (uiout, "details");
|
||||||
|
|
||||||
if (tp->state_ == THREAD_RUNNING)
|
if (tp->state_ == THREAD_RUNNING)
|
||||||
ui_out_text (uiout, "(running)\n");
|
ui_out_text (uiout, "(running)\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user