Before:
(gdb) info threads
Id Target Id Frame
3 Thread 0x7ffff77c3700 (LWP 29035) callme () at foo.c:30
2 Thread 0x7ffff7fc4700 (LWP 29034) 0x000000000040087b in child_function_2 (arg=0x0) at foo.c:60
* 1 Thread 0x7ffff7fc5740 (LWP 29030) 0x0000003b37209237 in pthread_join (threadid=
140737353893632, thread_return=0x0) at pthread_join.c:92
After:
(gdb) info threads
Id Target Id Frame
* 1 Thread 0x7ffff7fc5740 (LWP 29030) 0x0000003b37209237 in pthread_join (threadid=
140737353893632, thread_return=0x0) at pthread_join.c:92
2 Thread 0x7ffff7fc4700 (LWP 29034) 0x000000000040087b in child_function_2 (arg=0x0) at foo.c:60
3 Thread 0x7ffff77c3700 (LWP 29035) callme () at foo.c:30
gdb/doc/ChangeLog:
2015-11-24 Pedro Alves <palves@redhat.com>
PR 17539
* gdb.texinfo (Inferiors and Programs): Adjust "maint info
program-spaces" example to ascending order listing.
(Threads): Adjust "info threads" example to ascending order
listing.
(Forks): Adjust "info inferiors" example to ascending order
listing.
gdb/ChangeLog:
2015-11-24 Pedro Alves <palves@redhat.com>
PR 17539
* inferior.c (add_inferior_silent): Append the new inferior to the
end of the list.
* progspace.c (add_program_space): Append the new pspace to the
end of the list.
* thread.c (new_thread): Append the new thread to the end of the
list.
gdb/testsuite/ChangeLog:
2015-11-24 Pedro Alves <palves@redhat.com>
PR 17539
* gdb.base/foll-exec-mode.exp: Adjust to GDB listing inferiors and
threads in ascending order.
* gdb.base/foll-fork.exp: Likewise.
* gdb.base/foll-vfork.exp: Likewise.
* gdb.base/multi-forks.exp: Likewise.
* gdb.mi/mi-nonstop.exp: Likewise.
* gdb.mi/mi-nsintrall.exp: Likewise.
* gdb.multi/base.exp: Likewise.
* gdb.multi/multi-arch.exp: Likewise.
* gdb.python/py-inferior.exp: Likewise.
* gdb.threads/break-while-running.exp: Likewise.
* gdb.threads/execl.exp: Likewise.
* gdb.threads/gcore-thread.exp: Likewise.
* gdb.threads/info-threads-cur-sal.exp: Likewise.
* gdb.threads/kill.exp: Likewise.
* gdb.threads/linux-dp.exp: Likewise.
* gdb.threads/multiple-step-overs.exp: Likewise.
* gdb.threads/next-bp-other-thread.exp: Likewise.
* gdb.threads/step-bg-decr-pc-switch-thread.exp: Likewise.
* gdb.threads/step-over-lands-on-breakpoint.exp: Likewise.
* gdb.threads/step-over-trips-on-watchpoint.exp: Likewise.
* gdb.threads/thread-find.exp: Likewise.
* gdb.threads/tls.exp: Likewise.
* lib/mi-support.exp (mi_reverse_list): Delete.
(mi_check_thread_states): No longer reverse list.
2015-11-24 Pedro Alves <palves@redhat.com>
+ PR 17539
+ * inferior.c (add_inferior_silent): Append the new inferior to the
+ end of the list.
+ * progspace.c (add_program_space): Append the new pspace to the
+ end of the list.
+ * thread.c (new_thread): Append the new thread to the end of the
+ list.
+
+2015-11-24 Pedro Alves <palves@redhat.com>
+
* linux-tdep.c (find_stop_signal): Delete.
(struct linux_corefile_thread_data) <pid>: Remove field.
(linux_corefile_thread_callback): Rename to ...
+2015-11-24 Pedro Alves <palves@redhat.com>
+
+ PR 17539
+ * gdb.texinfo (Inferiors and Programs): Adjust "maint info
+ program-spaces" example to ascending order listing.
+ (Threads): Adjust "info threads" example to ascending order
+ listing.
+ (Forks): Adjust "info inferiors" example to ascending order
+ listing.
+
2015-11-04 Markus Metzger <markus.t.metzger@intel.com>
* gdb.texinfo (Process Record and Replay): Document "record
@smallexample
(@value{GDBP}) maint info program-spaces
Id Executable
+* 1 hello
2 goodbye
Bound inferiors: ID 1 (process 21561)
-* 1 hello
@end smallexample
Here we can see that no inferior is running the program @code{hello},
@smallexample
(@value{GDBP}) info threads
Id Target Id Frame
- 3 process 35 thread 27 0x34e5 in sigpause ()
- 2 process 35 thread 23 0x34e5 in sigpause ()
* 1 process 35 thread 13 main (argc=1, argv=0x7ffffff8)
+ 2 process 35 thread 23 0x34e5 in sigpause ()
+ 3 process 35 thread 27 0x34e5 in sigpause ()
at threadtest.c:68
@end smallexample
Program exited normally.
(@value{GDBP}) info inferiors
Id Description Executable
-* 2 <null> prog2
1 <null> prog1
+* 2 <null> prog2
@end smallexample
@item same
inf->control.stop_soon = NO_STOP_QUIETLY;
inf->num = ++highest_inferior_num;
- inf->next = inferior_list;
- inferior_list = inf;
+
+ if (inferior_list == NULL)
+ inferior_list = inf;
+ else
+ {
+ struct inferior *last;
+
+ for (last = inferior_list; last->next != NULL; last = last->next)
+ ;
+ last->next = inf;
+ }
inf->environment = make_environ ();
init_environ (inf->environment);
program_space_alloc_data (pspace);
- pspace->next = program_spaces;
- program_spaces = pspace;
+ if (program_spaces == NULL)
+ program_spaces = pspace;
+ else
+ {
+ struct program_space *last;
+
+ for (last = program_spaces; last->next != NULL; last = last->next)
+ ;
+ last->next = pspace;
+ }
return pspace;
}
2015-11-24 Pedro Alves <palves@redhat.com>
+ PR 17539
+ * gdb.base/foll-exec-mode.exp: Adjust to GDB listing inferiors and
+ threads in ascending order.
+ * gdb.base/foll-fork.exp: Likewise.
+ * gdb.base/foll-vfork.exp: Likewise.
+ * gdb.base/multi-forks.exp: Likewise.
+ * gdb.mi/mi-nonstop.exp: Likewise.
+ * gdb.mi/mi-nsintrall.exp: Likewise.
+ * gdb.multi/base.exp: Likewise.
+ * gdb.multi/multi-arch.exp: Likewise.
+ * gdb.python/py-inferior.exp: Likewise.
+ * gdb.threads/break-while-running.exp: Likewise.
+ * gdb.threads/execl.exp: Likewise.
+ * gdb.threads/gcore-thread.exp: Likewise.
+ * gdb.threads/info-threads-cur-sal.exp: Likewise.
+ * gdb.threads/kill.exp: Likewise.
+ * gdb.threads/linux-dp.exp: Likewise.
+ * gdb.threads/multiple-step-overs.exp: Likewise.
+ * gdb.threads/next-bp-other-thread.exp: Likewise.
+ * gdb.threads/step-bg-decr-pc-switch-thread.exp: Likewise.
+ * gdb.threads/step-over-lands-on-breakpoint.exp: Likewise.
+ * gdb.threads/step-over-trips-on-watchpoint.exp: Likewise.
+ * gdb.threads/thread-find.exp: Likewise.
+ * gdb.threads/tls.exp: Likewise.
+ * lib/mi-support.exp (mi_reverse_list): Delete.
+ (mi_check_thread_states): No longer reverse list.
+
+2015-11-24 Pedro Alves <palves@redhat.com>
+
* gdb.python/py-inferior.exp: Use with_test_prefix. Consistently
use lowercase.
if {$mode == "same"} {
set expected_re "\\* 1.*process.*"
} else {
- set expected_re "\\* 2.*process.*$testfile2 \r\n 1.*null.*$testfile.*"
+ set expected_re " 1.*null.*$testfile.*\r\n\\* 2.*process.*$testfile2 .*"
}
# Check that the inferior list is correct:
# Follow parent / keep child: two inferiors under debug, the
# parent is the current inferior.
- gdb_test "info inferiors" " 2 .*process.*\\* 1 .*process.*" \
+ gdb_test "info inferiors" "\\* 1 .*process.* 2 .*process.*" \
"info inferiors"
gdb_test "inferior 2" "Switching to inferior 2 .*"
# Follow child / detach parent: the child is under debug and is
# the current inferior. The parent is listed but is not under
# debug.
- gdb_test "info inferiors" "\\* 2 .*process.* 1 .*<null>.*" \
+ gdb_test "info inferiors" " 1 .*<null>.*\\* 2 .*process.*" \
"info inferiors"
} elseif {$who == "child" && $detach == "off"} {
# Follow child / keep parent: two inferiors under debug, the
# child is the current inferior.
- gdb_test "info inferiors" "\\* 2 .*process.* 1 .*process.*" \
+ gdb_test "info inferiors" " 1 .*process.*\\* 2 .*process.*" \
"info inferiors"
gdb_test "inferior 1" "Switching to inferior 1 .*"
}
gdb_test "info inferiors" \
- ".*is vfork child of inferior 1.*is vfork parent of inferior 2" \
+ ".*is vfork parent of inferior 2.*is vfork child of inferior 1" \
"info inferiors shows vfork parent/child relation"
if { $variant == "exec" } {
for {set i 1} {$i <= 15} {incr i} {
gdb_test "continue" "Breakpoint .* main .*exit.*" "Run to exit $i"
- gdb_test "info inferior" " 5 .* 4 .* 3 .* 2 .*" "info inferior $i"
+ gdb_test "info inferior" " 2 .* 3 .* 4 .* 5 .*" "info inferior $i"
gdb_test "inferior $i + 1" "(_dl_sysinfo_int80|fork|__kernel_(v|)syscall).*" \
"inferior $i"
}
gdb_test "continue" "Breakpoint .* main .*exit.*" "Run to exit 16"
-gdb_test "info inferiors" " 5 .* 4 .* 3 .* 2 .*" "info inferior 16"
+gdb_test "info inferior" " 2 .* 3 .* 4 .* 5 .*" "info inferior 16"
gdb_test "inferior 2" " main .*" "restart final"
#
# Test kill inferior
#
-gdb_test_no_output "kill inferior 6" "Kill 6"
-gdb_test "info inferior 6" "<null>.*" "Did kill 6"
-gdb_test_no_output "kill inferior 7" "Kill 7"
-gdb_test "info inferior 7" "<null>.*" "Did kill 7"
-gdb_test_no_output "kill inferior 8" "Kill 8"
-gdb_test "info inferior 8" "<null>.*" "Did kill 8"
-gdb_test_no_output "kill inferior 9" "Kill 9"
-gdb_test "info inferior 9" "<null>.*" "Did kill 9"
-gdb_test_no_output "kill inferior 10" "Kill 10"
-gdb_test "info inferior 10" "<null>.*" "Did kill 10"
-gdb_test_no_output "kill inferior 11" "Kill 11"
-gdb_test "info inferior 11" "<null>.*" "Did kill 11"
-gdb_test_no_output "kill inferior 12" "Kill 12"
-gdb_test "info inferior 12" "<null>.*" "Did kill 12"
-gdb_test_no_output "kill inferior 13" "Kill 13"
-gdb_test "info inferior 13" "<null>.*" "Did kill 13"
-gdb_test_no_output "kill inferior 14" "Kill 14"
-gdb_test "info inferior 14" "<null>.*" "Did kill 14"
-gdb_test_no_output "kill inferior 15" "Kill 15"
-gdb_test "info inferior 15" "<null>.*" "Did kill 15"
-gdb_test_no_output "kill inferior 16" "Kill 16"
-gdb_test "info inferior 16" "<null>.*" "Did kill 16"
+for {set i 6} { $i <= 16} {incr i} {
+ gdb_test_no_output "kill inferior $i" "Kill $i"
+ gdb_test "info inferior $i" "<null>.*" "Did kill $i"
+}
return 0
sleep 1
mi_check_thread_states {"stopped" "stopped" "stopped"} "thread state, stop 4"
-mi_gdb_test "-exec-continue --all" ".*\\*running,thread-id=\"3\"\r\n\\*running,thread-id=\"2\"\r\n\\*running,thread-id=\"1\"" \
+mi_gdb_test "-exec-continue --all" ".*\\*running,thread-id=\"1\"\r\n\\*running,thread-id=\"2\"\r\n\\*running,thread-id=\"3\"" \
"resume all"
mi_expect_stop "breakpoint-hit" "break_at_me" "\[^\n\]*" "non-stop.c" "\[0-9\]*" {"" "disp=\"keep\""} "w0,i2 stop"
# Here we create a response string. Note we don't want \r\n at the end,
# since mi_gdb_test will append this itself.
set running_re ""
-for {set i 6} {$i > 1} {incr i -1} {
+for {set i 1} {$i < 6} {incr i} {
set running_re "$running_re\\*running,thread-id=\"$i\"\r\n"
}
-set running_re "$running_re\\*running,thread-id=\"1\""
+set running_re "$running_re\\*running,thread-id=\"6\""
mi_gdb_test "-exec-continue --all" "\[^\n\]*\r\n$running_re" \
"resume all, no breakpoint"
# Check that we have multiple spaces.
gdb_test "info inferiors" \
- "Executable.*${exec3}.*${exec2}.*${exec1}.*"
+ "Executable.*${exec1}.*${exec2}.*${exec3}.*"
# Test info inferiors with args
set see3 0
gdb_test_multiple "info inferior 2 3" "info inferior 2 3" {
- -re ". 3 \[^\r\n\]*${exec3}" {
- set see3 1
+ -re ". 1 \[^\r\n\]*${exec1}" {
+ set see1 1
exp_continue
}
-re ". 2 \[^\r\n\]*${exec2}" {
set see2 1
exp_continue
}
- -re ". 1 \[^\r\n\]*${exec1}" {
- set see1 1
+ -re ". 3 \[^\r\n\]*${exec3}" {
+ set see3 1
exp_continue
}
-re "$gdb_prompt $" {
set see3 0
gdb_test_multiple "info inferior 1-2" "info inferior 1-2" {
- -re ". 3 \[^\r\n\]*${exec3}" {
- set see3 1
+ -re ". 1 \[^\r\n\]*${exec1}" {
+ set see1 1
exp_continue
}
-re ". 2 \[^\r\n\]*${exec2}" {
set see2 1
exp_continue
}
- -re ". 1 \[^\r\n\]*${exec1}" {
- set see1 1
+ -re ". 3 \[^\r\n\]*${exec3}" {
+ set see3 1
exp_continue
}
-re "$gdb_prompt $" {
# Check we do have two inferiors loaded.
gdb_test "info inferiors" \
- "Executable.*${exec2}.*${exec1}.*"
+ "Executable.*${exec1}.*${exec2}.*"
"check inferior validity 3"
gdb_test_no_output "remove-inferiors 2" "remove-inferiors 3"
- gdb_test "python print (inf_list\[0\].is_valid())" "False" \
+ gdb_test "python print (inf_list\[0\].is_valid())" "True" \
"check inferior validity 4"
- gdb_test "python print (inf_list\[1\].is_valid())" "True" \
+ gdb_test "python print (inf_list\[1\].is_valid())" "False" \
"check inferior validity 5"
}
# without the user explicitly fetching the thread list.
if {$update_thread_list} {
gdb_test "info threads" \
- "\\\(running\\\).*\\\(running\\\).* main .*" \
+ "main .*\\\(running\\\).*\\\(running\\\).*" \
"only main stopped"
}
if {$non_stop == "on"} {
gdb_test "info threads" \
- "\\\(running\\\).* breakpoint_function .* main .*" \
+ "main .* breakpoint_function .*\\\(running\\\)" \
"one thread running"
# Unblock the other thread, which should then trip on the same
}
gdb_test "info threads" \
- " breakpoint_function .* breakpoint_function .* main .*" \
+ " main .* breakpoint_function .* breakpoint_function .*" \
"all threads stopped"
} else {
# This test is not merged with the non-stop one because in
-re "\\\(running\\\).*$gdb_prompt $" {
fail $test
}
- -re "breakpoint_function .* main .*$gdb_prompt $" {
+ -re "main .* breakpoint_function .*$gdb_prompt $" {
pass $test
}
}
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" "1 *Thread.*2 *Thread.*3 *Thread.*" "info threads before exec"
# When continuing from this point we'll hit the breakpoint in main()
# again, this time in the exec'd process.
# mapping various OS's may do? Let's assume that there must
# be at least two threads:
- gdb_test "info threads" ".*${nl} 2 ${horiz}${nl}\\* 1 .*" \
+ gdb_test "info threads" "\\* 1 ${horiz}${nl} 2 ${horiz}.*" \
"corefile contains at least two threads"
# One thread in the corefile should be in the "thread2" function.
# The thread2 thread should be marked as the current thread.
- gdb_test "info threads" ".*${nl}\\* ${horiz} thread2 .*" \
+ gdb_test "info threads" "\\* ${horiz} thread2 .*${nl}" \
"thread2 is current thread in corefile"
}}
# There used to be a bug where "info threads" would set the current
# SAL to the location of the last thread displayed.
gdb_test "info threads" \
- "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*\r\n 1 *Thread \[^\r\n\]* .* \[^\r\n\]*" \
+ [multi_line \
+ "\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*" \
+ " 1 *Thread \[^\r\n\]* .* \[^\r\n\]*" \
+ "\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*"] \
"info threads before break"
# Check that "break" is still operating on the same file by default.
gdb_test "break $line" ".*${srcfile2}.*" "break on line"
gdb_test "info threads" \
- "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*\r\n 1 *Thread \[^\r\n\]* .* \[^\r\n\]*" \
+ [multi_line \
+ "\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*" \
+ " 1 *Thread \[^\r\n\]* .* \[^\r\n\]*" \
+ "\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*"] \
"info threads before list"
# And that so is "list".
gdb_continue_to_breakpoint "break here" ".*break here.*"
if {$threaded} {
- gdb_test "info threads" "6.*5.*4.*3.*2.*1.*" "all threads started"
+ gdb_test "info threads" "1.*2.*3.*4.*5.*6.*" "all threads started"
}
# This kills and ensures no output other than the prompt comes out,
gdb_breakpoint [gdb_get_line_number "linuxthreads.exp: info threads 2"]
gdb_continue_to_breakpoint "main thread's sleep"
set info_threads_ptn ".*"
-for {set i $nthreads} {$i > 0} {incr i -1} {
+for {set i 1} {$i < $nthreads} {incr i} {
append info_threads_ptn "$i *Thread .*"
}
append info_threads_ptn "\[\r\n\]+$gdb_prompt $"
gdb_breakpoint [gdb_get_line_number "set wait-threads breakpoint here"]
gdb_continue_to_breakpoint "run to breakpoint"
- gdb_test "info threads" "3 .* 2 .*\\\* 1.*" "info threads shows all threads"
+ gdb_test "info threads" "\\\* 1 .* 2 .* 3 .*" "info threads shows all threads"
gdb_test_no_output "set scheduler-locking on"
gdb_breakpoint [gdb_get_line_number "set wait-thread breakpoint here"]
gdb_continue_to_breakpoint "run to wait-thread breakpoint"
- gdb_test "info threads" "2 .*\\\* 1.*" "info threads shows all threads"
+ gdb_test "info threads" "\\\* 1 .* 2 .*" "info threads shows all threads"
delete_breakpoints
gdb_breakpoint [gdb_get_line_number "set breakpoint here"]
gdb_continue_to_breakpoint "run to nop breakpoint"
-gdb_test "info threads" "\\\* 2 .* 1.*" "info threads shows all threads"
+gdb_test "info threads" " 1 .*\\\* 2 .*" "info threads shows all threads"
gdb_test "next" "while.*" "next over nop"
gdb_breakpoint [gdb_get_line_number "set wait-thread breakpoint here"]
gdb_continue_to_breakpoint "run to wait-thread breakpoint"
- gdb_test "info threads" "2 .*\\\* 1.*" "info threads shows all threads"
+ gdb_test "info threads" "\\\* 1 .* 2 .*" "info threads shows all threads"
gdb_test_no_output "set scheduler-locking on"
gdb_breakpoint [gdb_get_line_number "set wait-thread breakpoint here"]
gdb_continue_to_breakpoint "run to wait-thread breakpoint"
- gdb_test "info threads" "2 .*\\\* 1.*" "info threads shows all threads"
+ gdb_test "info threads" "\\\* 1 .* 2 .*" "info threads shows all threads"
gdb_test_no_output "set scheduler-locking on"
"name thread 6"
# Collect thread ids, if any.
+
gdb_test_multiple "info threads" "collect thread id" {
- -re ". 6 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_6\" \[^\r\n\]*" {
- set thread6 $expect_out(1,string)
- exp_continue
- }
- -re ". 5 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_5\" \[^\r\n\]*" {
- set thread5 $expect_out(1,string)
- exp_continue
- }
- -re ". 4 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_4\" \[^\r\n\]*" {
- set thread4 $expect_out(1,string)
- exp_continue
- }
- -re ". 3 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_3\" \[^\r\n\]*" {
- set thread3 $expect_out(1,string)
- exp_continue
- }
- -re ". 2 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_2\" \[^\r\n\]*" {
- set thread2 $expect_out(1,string)
- exp_continue
- }
- -re ". 1 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_1\" \[^\r\n\]*" {
- set thread1 $expect_out(1,string)
+ -re ". (\[0-9\]+) \[^\r\n\]*\[Tt\]hread (\[0-9a-fA-Fx\]+)\[^\r\n\]* \"threadname_\[0-9\]+\" \[^\r\n\]*" {
+ set thr_num $expect_out(1,string)
+ set thread$thr_num $expect_out(2,string)
exp_continue
}
-re ".*$gdb_prompt $" {
}
# Collect process ids, if any.
+
gdb_test_multiple "info threads" "collect thread id" {
- -re ". 6 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_6\" \[^\r\n\]*" {
- set process6 $expect_out(1,string)
- exp_continue
- }
- -re ". 5 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_5\" \[^\r\n\]*" {
- set process5 $expect_out(1,string)
- exp_continue
- }
- -re ". 4 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_4\" \[^\r\n\]*" {
- set process4 $expect_out(1,string)
- exp_continue
- }
- -re ". 3 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_3\" \[^\r\n\]*" {
- set process3 $expect_out(1,string)
- exp_continue
- }
- -re ". 2 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_2\" \[^\r\n\]*" {
- set process2 $expect_out(1,string)
- exp_continue
- }
- -re ". 1 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_1\" \[^\r\n\]*" {
- set process1 $expect_out(1,string)
+ -re ". (\[0-9\]+) \[^\r\n\]*\[Pp\]rocess (\[0-9a-fA-Fx\]+)\[^\r\n\]* \"threadname_\[0-9\]+\" \[^\r\n\]*" {
+ set thr_num $expect_out(1,string)
+ set process$thr_num $expect_out(2,string)
exp_continue
}
-re ".*$gdb_prompt $" {
}
# Collect lwp ids, if any.
+
gdb_test_multiple "info threads" "collect thread id" {
- -re ". 6 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_6\" \[^\r\n\]*" {
- set lwp6 $expect_out(1,string)
- exp_continue
- }
- -re ". 5 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_5\" \[^\r\n\]*" {
- set lwp5 $expect_out(1,string)
- exp_continue
- }
- -re ". 4 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_4\" \[^\r\n\]*" {
- set lwp4 $expect_out(1,string)
- exp_continue
- }
- -re ". 3 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_3\" \[^\r\n\]*" {
- set lwp3 $expect_out(1,string)
- exp_continue
- }
- -re ". 2 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_2\" \[^\r\n\]*" {
- set lwp2 $expect_out(1,string)
- exp_continue
- }
- -re ". 1 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_1\" \[^\r\n\]*" {
- set lwp1 $expect_out(1,string)
+ -re ". (\[0-9\]+) \[^\r\n\]*LWP (\[0-9a-fA-Fx\]+)\[^\r\n\]* \"threadname_\[0-9\]+\" \[^\r\n\]*" {
+ set thr_num $expect_out(1,string)
+ set lwp$thr_num $expect_out(2,string)
exp_continue
}
-re ".*$gdb_prompt $" {
# Test regular expression
#
-set see1 0
-set see2 0
-set see3 0
-set see4 0
-set see5 0
-set see6 0
-
+for {set i 1} {$i <= 6} {incr i} {
+ set see$i 0
+}
gdb_test_multiple "thread find threadname_\[345\]" "test regular exp" {
- -re "Thread 6 has name \[^\r\n\]*" {
- set see6 1
- exp_continue
- }
- -re "Thread 5 has name \[^\r\n\]*" {
- set see5 1
- exp_continue
- }
- -re "Thread 4 has name \[^\r\n\]*" {
- set see4 1
- exp_continue
- }
- -re "Thread 3 has name \[^\r\n\]*" {
- set see3 1
- exp_continue
- }
- -re "Thread 2 has name \[^\r\n\]*" {
- set see2 1
- exp_continue
- }
- -re "Thread 1 has name \[^\r\n\]*" {
- set see1 1
+ -re "Thread (\[0-9\]+) has name \[^\r\n\]*" {
+ set thr_num $expect_out(1,string)
+ set see$thr_num 1
exp_continue
}
-re ".*$gdb_prompt $" {
# Test info threads on a subset of threads
#
-set see1 0
-set see2 0
-set see3 0
-set see4 0
-set see5 0
-set see6 0
-
+for {set i 1} {$i <= 6} {incr i} {
+ set see$i 0
+}
gdb_test_multiple "info threads 2 4 6" "info threads 2 4 6" {
- -re ". 6 \[^\r\n\]*\"threadname_6\" \[^\r\n\]*" {
- set see6 1
- exp_continue
- }
- -re ". 5 \[^\r\n\]*\"threadname_5\" \[^\r\n\]*" {
- set see5 1
- exp_continue
- }
- -re ". 4 \[^\r\n\]*\"threadname_4\" \[^\r\n\]*" {
- set see4 1
- exp_continue
- }
- -re ". 3 \[^\r\n\]*\"threadname_3\" \[^\r\n\]*" {
- set see3 1
- exp_continue
- }
- -re ". 2 \[^\r\n\]*\"threadname_2\" \[^\r\n\]*" {
- set see2 1
- exp_continue
- }
- -re ". 1 \[^\r\n\]*\"threadname_1\" \[^\r\n\]*" {
- set see1 1
+ -re ". (\[0-9\]+) \[^\r\n\]*\"threadname_\[0-9\]+\" \[^\r\n\]*" {
+ set thr_num $expect_out(1,string)
+ set see$thr_num 1
exp_continue
}
-re "$gdb_prompt $" {
# Test info threads on a range
#
-set see1 0
-set see2 0
-set see3 0
-set see4 0
-set see5 0
-set see6 0
-
+for {set i 1} {$i <= 6} {incr i} {
+ set see$i 0
+}
gdb_test_multiple "info threads 3-5" "info threads 3-5" {
- -re ". 6 .*\"threadname_6\" \[^\r\n\]*" {
- set see6 1
- exp_continue
- }
- -re ". 5 .*\"threadname_5\" \[^\r\n\]*" {
- set see5 1
- exp_continue
- }
- -re ". 4 .*\"threadname_4\" \[^\r\n\]*" {
- set see4 1
- exp_continue
- }
- -re ". 3 .*\"threadname_3\" \[^\r\n\]*" {
- set see3 1
- exp_continue
- }
- -re ". 2 .*\"threadname_2\" \[^\r\n\]*" {
- set see2 1
- exp_continue
- }
- -re ". 1 .*\"threadname_1\" \[^\r\n\]*" {
- set see1 1
+ -re ". (\[0-9\]+) \[^\r\n\]*\"threadname_\[0-9\]+\" \[^\r\n\]*" {
+ set thr_num $expect_out(1,string)
+ set see$thr_num 1
exp_continue
}
-re "$gdb_prompt $" {
# Test degenerate range
-set see1 0
-set see2 0
-set see3 0
-set see4 0
-set see5 0
-set see6 0
-
+for {set i 1} {$i <= 6} {incr i} {
+ set see$i 0
+}
gdb_test_multiple "info threads 3-3" "info threads 3-3" {
- -re ". 6 .*\"threadname_6\" \[^\r\n\]*" {
- set see6 1
- exp_continue
- }
- -re ". 5 .*\"threadname_5\" \[^\r\n\]*" {
- set see5 1
- exp_continue
- }
- -re ". 4 .*\"threadname_4\" \[^\r\n\]*" {
- set see4 1
- exp_continue
- }
- -re ". 3 .*\"threadname_3\" \[^\r\n\]*" {
- set see3 1
- exp_continue
- }
- -re ". 2 .*\"threadname_2\" \[^\r\n\]*" {
- set see2 1
- exp_continue
- }
- -re ". 1 .*\"threadname_1\" \[^\r\n\]*" {
- set see1 1
+ -re ". (\[0-9\]+) .*\"threadname_\[0-9\]+\" \[^\r\n\]*" {
+ set thr_num $expect_out(1,string)
+ set see$thr_num 1
exp_continue
}
-re ".*$gdb_prompt $" {
set no_of_threads 0
send_gdb "info thread\n"
gdb_expect {
- -re "^info thread\[ \t\r\n\]+ *Id .*Frame\[ \t\r\n\]+(\[0-9\]+) *Thread.*$gdb_prompt $" {
+ -re "^info thread\[ \t\r\n\]+ *Id .*Frame\[ \t\r\n\]+.*(\[0-9\]+) *Thread\[^\r\n\]+\r\n$gdb_prompt $" {
set no_of_threads $expect_out(1,string)
pass "get number of threads"
}
mi_gdb_test "set solib-search-path [file dirname [lindex $args 0]]" "\^done" ""
}
-proc mi_reverse_list { list } {
- if { [llength $list] <= 1 } {
- return $list
- }
- set tail [lrange $list 1 [llength $list]]
- set rtail [mi_reverse_list $tail]
- lappend rtail [lindex $list 0]
- return $rtail
-}
-
-proc mi_check_thread_states { xstates test } {
+proc mi_check_thread_states { states test } {
global expect_out
- set states [mi_reverse_list $xstates]
set pattern ".*\\^done,threads=\\\["
foreach s $states {
set pattern "${pattern}(.*)state=\"$s\""
tp->ptid = ptid;
tp->num = ++highest_thread_num;
- tp->next = thread_list;
- thread_list = tp;
+
+ if (thread_list == NULL)
+ thread_list = tp;
+ else
+ {
+ struct thread_info *last;
+
+ for (last = thread_list; last->next != NULL; last = last->next)
+ ;
+ last->next = tp;
+ }
/* Nothing to follow yet. */
tp->pending_follow.kind = TARGET_WAITKIND_SPURIOUS;