Share the "multi_line" helper among all testcases

gdb/testsuite/ChangeLog:

	* gdb.ada/complete.exp: Remove "multi_line".
	* gdb.ada/info_exc.exp: Remove "multi_line".
	* gdb.ada/packed_tagged.exp: Remove "multi_line".
	* gdb.ada/ptype_field.exp: Remove "multi_line".
	* gdb.ada/sym_print_name.exp: Remove "multi_line".
	* gdb.ada/tagged.exp: Remove "multi_line".
	* gdb.btrace/buffer-size.exp: Replace [join [list ...]] with
	[multi_line ...]
	* gdb.btrace/delta.exp: Likewise.
	* gdb.btrace/exception.exp: Likewise.
	* gdb.btrace/function_call_history.exp: Likewise.
	* gdb.btrace/instruction_history.exp: Likewise.
	* gdb.btrace/nohist.exp: Likewise.
	* gdb.btrace/record_goto.exp: Likewise.
	* gdb.btrace/segv.exp: Likewise.
	* gdb.btrace/stepi.exp: Likewise.
	* gdb.btrace/tailcall.exp: Likewise.
	* gdb.btrace/unknown_functions.exp: Likewise.
	* gdb.dwarf2/dw2-undefined-ret-addr.exp: Likewise.
	* lib/gdb.exp: Add the "multi_line" helper.
This commit is contained in:
Pierre-Marie de Rodat 2015-03-10 09:51:27 +01:00
parent 5445da1b76
commit 3c724c8ca9
20 changed files with 130 additions and 161 deletions

View File

@ -1,3 +1,26 @@
2015-04-01 Pierre-Marie de Rodat <derodat@adacore.com>
* gdb.ada/complete.exp: Remove "multi_line".
* gdb.ada/info_exc.exp: Remove "multi_line".
* gdb.ada/packed_tagged.exp: Remove "multi_line".
* gdb.ada/ptype_field.exp: Remove "multi_line".
* gdb.ada/sym_print_name.exp: Remove "multi_line".
* gdb.ada/tagged.exp: Remove "multi_line".
* gdb.btrace/buffer-size.exp: Replace [join [list ...]] with
[multi_line ...]
* gdb.btrace/delta.exp: Likewise.
* gdb.btrace/exception.exp: Likewise.
* gdb.btrace/function_call_history.exp: Likewise.
* gdb.btrace/instruction_history.exp: Likewise.
* gdb.btrace/nohist.exp: Likewise.
* gdb.btrace/record_goto.exp: Likewise.
* gdb.btrace/segv.exp: Likewise.
* gdb.btrace/stepi.exp: Likewise.
* gdb.btrace/tailcall.exp: Likewise.
* gdb.btrace/unknown_functions.exp: Likewise.
* gdb.dwarf2/dw2-undefined-ret-addr.exp: Likewise.
* lib/gdb.exp: Add the "multi_line" helper.
2015-04-01 Pedro Alves <palves@redhat.com>
* gdb.threads/tid-reuse.c: New file.

View File

@ -44,16 +44,6 @@ proc test_gdb_no_completion { expr } {
gdb_test_no_output "complete p $expr"
}
# A convenience function that joins all the arguments together,
# with a regexp that matches zero-or-more end of lines in between
# each argument. This function is ideal to write the expected output
# of a GDB command that generates more than a couple of lines, as
# this allows us to write each line as a separate string, which is
# easier to read by a human being.
proc multi_line { args } {
return [join $args "\[\r\n\]*"]
}
# Try a global variable, only one match should be found:
test_gdb_complete "my_glob" \

View File

@ -21,17 +21,6 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" }
return -1
}
# A convenience function that joins all the arguments together,
# with a regexp that matches zero-or-more end of lines in between
# each argument. This function is ideal to write the expected output
# of a GDB command that generates more than a couple of lines, as
# this allows us to write each line as a separate string, which is
# easier to read by a human being.
proc multi_line { args } {
return [join $args "\[\r\n\]*"]
}
clean_restart ${testfile}
if ![runto_main] then {

View File

@ -21,17 +21,6 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" }
return -1
}
# A convenience function that joins all the arguments together,
# with a regexp that matches zero-or-more end of lines in between
# each argument. This function is ideal to write the expected output
# of a GDB command that generates more than a couple of lines, as
# this allows us to write each line as a separate string, which is
# easier to read by a human being.
proc multi_line { args } {
return [join $args "\[\r\n\]*"]
}
clean_restart ${testfile}
set bp_location [gdb_get_line_number "STOP" ${testdir}/comp_bug.adb]

View File

@ -21,17 +21,6 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug additional
return -1
}
# A convenience function that joins all the arguments together,
# with a regexp that matches zero-or-more end of lines in between
# each argument. This function is ideal to write the expected output
# of a GDB command that generates more than a couple of lines, as
# this allows us to write each line as a separate string, which is
# easier to read by a human being.
proc multi_line { args } {
return [join $args "\[\r\n\]*"]
}
clean_restart ${testfile}
set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]

View File

@ -21,17 +21,6 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" }
return -1
}
# A convenience function that joins all the arguments together,
# with a regexp that matches zero-or-more end of lines in between
# each argument. This function is ideal to write the expected output
# of a GDB command that generates more than a couple of lines, as
# this allows us to write each line as a separate string, which is
# easier to read by a human being.
proc multi_line { args } {
return [join $args "\[\r\n\]*"]
}
clean_restart ${testfile}
set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]

View File

@ -21,17 +21,6 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" }
return -1
}
# A convenience function that joins all the arguments together,
# with a regexp that matches zero-or-more end of lines in between
# each argument. This function is ideal to write the expected output
# of a GDB command that generates more than a couple of lines, as
# this allows us to write each line as a separate string, which is
# easier to read by a human being.
proc multi_line { args } {
return [join $args "\[\r\n\]*"]
}
clean_restart ${testfile}
set bp_location [gdb_get_line_number "START" ${testdir}/foo.adb]

View File

@ -35,12 +35,12 @@ gdb_test "show record btrace bts buffer-size" "The record/replay bts buffer size
gdb_test_no_output "record btrace bts"
gdb_test "show record btrace bts buffer-size" "The record/replay bts buffer size is 1\.\r" "bts buffer size while recording"
gdb_test "info record" [join [list \
gdb_test "info record" [multi_line \
"Active record target: record-btrace" \
"Recording format: Branch Trace Store\." \
"Buffer size: 4kB\." \
"Recorded 0 instructions in 0 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
] "\r\n"] "info record with small bts buffer"
] "info record with small bts buffer"
gdb_test "record stop" ".*" "stop recording with small bts buffer"
gdb_test_no_output "set record btrace bts buffer-size 0"
@ -48,10 +48,10 @@ gdb_test "show record btrace bts buffer-size" "The record/replay bts buffer size
gdb_test_no_output "record btrace bts"
gdb_test "show record btrace bts buffer-size" "The record/replay bts buffer size is unlimited\.\r" "unlimited bts buffer size while recording"
gdb_test "info record" [join [list \
gdb_test "info record" [multi_line \
"Active record target: record-btrace" \
"Recording format: Branch Trace Store\." \
"Buffer size: .*\." \
"Recorded 0 instructions in 0 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
] "\r\n"] "info record with unlimited bts buffer"
] "info record with unlimited bts buffer"
gdb_test "record stop" ".*" "stop recording with unlimited bts buffer"

View File

@ -37,11 +37,11 @@ gdb_test_no_output "record btrace"
# we start without trace
with_test_prefix "no trace" {
gdb_test "info record" [join [list \
gdb_test "info record" [multi_line \
"Active record target: record-btrace" \
"Recording format: .*" \
"Recorded 0 instructions in 0 functions \\\(0 gaps\\\) for .*" \
] "\r\n"]
]
gdb_test "record instruction-history" "No trace\."
gdb_test "record function-call-history" "No trace\."
}
@ -50,11 +50,11 @@ with_test_prefix "no trace" {
gdb_test "stepi"
proc check_trace {} {
gdb_test "info record" [join [list \
gdb_test "info record" [multi_line \
"Active record target: record-btrace" \
"Recording format: .*" \
"Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \
] "\r\n"]
]
gdb_test "record instruction-history /f 1" \
"1\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov *\\\$0x0,%eax\r"
gdb_test "record function-call-history /c 1" "1\tmain"
@ -71,17 +71,17 @@ with_test_prefix "twice" {
# check that we can reverse-stepi that instruction
gdb_test "reverse-stepi"
gdb_test "info record" [join [list \
gdb_test "info record" [multi_line \
"Active record target: record-btrace" \
"Recording format: .*" \
"Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \
"Replay in progress\. At instruction 1\." \
] "\r\n"] "reverse-stepi"
] "reverse-stepi"
# and back
gdb_test "stepi"
gdb_test "info record" [join [list \
gdb_test "info record" [multi_line \
"Active record target: record-btrace" \
"Recording format: .*" \
"Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \
] "\r\n"] "and back"
] "and back"

View File

@ -48,25 +48,25 @@ gdb_continue_to_breakpoint "cont to bp.2" ".*$srcfile:$bp_2\r\n.*"
# show the flat branch trace
send_gdb "record function-call-history 1\n"
gdb_expect_list "flat" "\r\n$gdb_prompt $" [list \
[join [list \
[multi_line \
"1\tmain\\(\\)" \
"2\ttest\\(\\)" \
"3\tfoo\\(\\)" \
"4\tbar\\(\\)" \
"5\tbad\\(\\)\r" \
] "\r\n"] \
] \
"" \
"\[0-9\]*\ttest\\(\\)"]
# show the branch trace with calls indented
send_gdb "record function-call-history /c 1\n"
gdb_expect_list "indented" "\r\n$gdb_prompt $" [list \
[join [list \
[multi_line \
"1\tmain\\(\\)" \
"2\t test\\(\\)" \
"3\t foo\\(\\)" \
"4\t bar\\(\\)" \
"5\t bad\\(\\)\r" \
] "\r\n"] \
] \
"" \
"\[0-9\]*\t test\\(\\)"]

View File

@ -38,7 +38,7 @@ gdb_breakpoint $bp_location
gdb_continue_to_breakpoint "cont to $bp_location" ".*$testfile.c:$bp_location.*"
proc rec_fun_all {} {
gdb_test "record function-call-history 1" [join [list \
gdb_test "record function-call-history 1" [multi_line \
"1\tmain" \
"2\tinc" \
"3\tmain" \
@ -59,7 +59,7 @@ proc rec_fun_all {} {
"18\tinc" \
"19\tmain" \
"20\tinc" \
"21\tmain"] "\r\n"]
"21\tmain"]
}
# show function call history with unlimited size, we expect to see all 21 entries
@ -72,7 +72,7 @@ with_test_prefix "size 21" rec_fun_all
# show first 15 entries
gdb_test_no_output "set record function-call-history-size 15"
gdb_test "record function-call-history 1" [join [list \
gdb_test "record function-call-history 1" [multi_line \
"1\tmain" \
"2\tinc" \
"3\tmain" \
@ -87,16 +87,16 @@ gdb_test "record function-call-history 1" [join [list \
"12\tinc" \
"13\tmain" \
"14\tinc" \
"15\tmain"] "\r\n"] "forward - 1"
"15\tmain"] "forward - 1"
# show last 6 entries
gdb_test "record function-call-history +" [join [list \
gdb_test "record function-call-history +" [multi_line \
"16\tinc" \
"17\tmain" \
"18\tinc" \
"19\tmain" \
"20\tinc" \
"21\tmain"] "\r\n"] "forward - 2"
"21\tmain"] "forward - 2"
# moving further should not work
gdb_test "record function-call-history +" "At the end of the branch trace record\\." "forward - 3"
@ -105,7 +105,7 @@ gdb_test "record function-call-history +" "At the end of the branch trace record
gdb_test "record function-call-history +" "At the end of the branch trace record\\." "forward - 4"
# moving back showing the latest 15 function calls
gdb_test "record function-call-history -" [join [list \
gdb_test "record function-call-history -" [multi_line \
"7\tmain" \
"8\tinc" \
"9\tmain" \
@ -120,16 +120,16 @@ gdb_test "record function-call-history -" [join [list \
"18\tinc" \
"19\tmain" \
"20\tinc" \
"21\tmain"] "\r\n"] "backward - 1"
"21\tmain"] "backward - 1"
# moving further back shows the 6 first function calls
gdb_test "record function-call-history -" [join [list \
gdb_test "record function-call-history -" [multi_line \
"1\tmain" \
"2\tinc" \
"3\tmain" \
"4\tinc" \
"5\tmain" \
"6\tinc"] "\r\n"] "backward - 2"
"6\tinc"] "backward - 2"
# moving further back shouldn't work
gdb_test "record function-call-history -" "At the start of the branch trace record\\." "backward - 3"
@ -141,7 +141,7 @@ gdb_test "record function-call-history -" "At the start of the branch trace reco
gdb_test_no_output "set filename-display basename"
# moving forward again, but this time with file and line number, expected to see the first 15 entries
gdb_test "record function-call-history /l +" [join [list \
gdb_test "record function-call-history /l +" [multi_line \
"\[0-9\]*\tmain\tat $srcfile:40,41" \
"\[0-9\]*\tinc\tat $srcfile:22,24" \
"\[0-9\]*\tmain\tat $srcfile:40,41" \
@ -157,30 +157,30 @@ gdb_test "record function-call-history /l +" [join [list \
"\[0-9\]*\tmain\tat $srcfile:40,41" \
"\[0-9\]*\tinc\tat $srcfile:22,24" \
"\[0-9\]*\tmain\tat $srcfile:40,41" \
] "\r\n"] "forward /l - 1"
] "forward /l - 1"
# moving forward and expect to see the latest 6 entries
gdb_test "record function-call-history /l +" [join [list \
gdb_test "record function-call-history /l +" [multi_line \
"\[0-9\]*\tinc\tat $srcfile:22,24" \
"\[0-9\]*\tmain\tat $srcfile:40,41" \
"\[0-9\]*\tinc\tat $srcfile:22,24" \
"\[0-9\]*\tmain\tat $srcfile:40,41" \
"\[0-9\]*\tinc\tat $srcfile:22,24" \
"\[0-9\]*\tmain\tat $srcfile:40,43" \
] "\r\n"] "forward /l - 2"
] "forward /l - 2"
# moving further forward shouldn't work
gdb_test "record function-call-history /l +" "At the end of the branch trace record\\." "forward /l - 3"
gdb_test "record function-call-history /l" "At the end of the branch trace record\\." "forward /l - 4"
set expected_range [join [list \
set expected_range [multi_line \
"4\tinc" \
"5\tmain" \
"6\tinc" \
"7\tmain" \
"8\tinc" \
"9\tmain" \
"10\tinc"] "\r\n"]
"10\tinc"]
# show functions in instruction range
gdb_test "record function-call-history 4,10" $expected_range
@ -196,7 +196,7 @@ gdb_continue_to_breakpoint "cont to $bp_location" ".*$testfile.c:$bp_location.*"
# at this point we expect to have main, fib, ..., fib, main, where fib occurs 9 times,
# so we limit the output to only show the latest 11 function calls
gdb_test_no_output "set record function-call-history-size 11"
gdb_test "record function-call-history" [join [list \
gdb_test "record function-call-history" [multi_line \
"21\tmain" \
"22\tfib" \
"23\tfib" \
@ -207,10 +207,10 @@ gdb_test "record function-call-history" [join [list \
"28\tfib" \
"29\tfib" \
"30\tfib" \
"31\tmain"] "\r\n"] "recursive"
"31\tmain"] "recursive"
# show indented function call history for fib
gdb_test "record function-call-history /c 21, +11" [join [list \
gdb_test "record function-call-history /c 21, +11" [multi_line \
"21\tmain" \
"22\t fib" \
"23\t fib" \
@ -222,7 +222,7 @@ gdb_test "record function-call-history /c 21, +11" [join [list \
"29\t fib" \
"30\t fib" \
"31\tmain" \
] "\r\n"] "indented"
] "indented"
# make sure we can handle incomplete trace with respect to indentation
if ![runto_main] {
@ -245,11 +245,11 @@ gdb_breakpoint $bp_location
gdb_continue_to_breakpoint "cont to bp.2" ".*$testfile.c:$bp_location\r\n.*"
# let's look at the trace. we expect to see the tail of the above listing.
gdb_test "record function-call-history /c" [join [list \
gdb_test "record function-call-history /c" [multi_line \
"1\t fib" \
"2\t fib" \
"3\t fib" \
"4\t fib" \
"5\t fib" \
"6\tmain" \
] "\r\n"] "indented tail"
] "indented tail"

View File

@ -65,37 +65,37 @@ if { $traced != 11 } {
}
# test that we see the expected instructions
gdb_test "record instruction-history 3,7" [join [list \
gdb_test "record instruction-history 3,7" [multi_line \
"3\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \
"4\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax" \
"5\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \
"6\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \
"7\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" \
] "\r\n"]
]
gdb_test "record instruction-history /f 3,+5" [join [list \
gdb_test "record instruction-history /f 3,+5" [multi_line \
"3\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \
"4\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec %eax" \
"5\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \
"6\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \
"7\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" \
] "\r\n"]
]
gdb_test "record instruction-history /p 7,-5" [join [list \
gdb_test "record instruction-history /p 7,-5" [multi_line \
"3\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \
"4\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax" \
"5\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \
"6\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \
"7\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" \
] "\r\n"]
]
gdb_test "record instruction-history /pf 3,7" [join [list \
gdb_test "record instruction-history /pf 3,7" [multi_line \
"3\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \
"4\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec %eax" \
"5\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \
"6\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax" \
"7\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r" \
] "\r\n"]
]
gdb_test "record instruction-history 3,3" "3\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r"

View File

@ -31,11 +31,11 @@ if ![runto_main] {
}
proc check_not_replaying {} {
gdb_test "info record" [join [list \
gdb_test "info record" [multi_line \
"Active record target: record-btrace" \
"Recording format: .*" \
"Recorded 0 instructions in 0 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
] "\r\n"]
]
}
gdb_test_no_output "record btrace"

View File

@ -58,7 +58,7 @@ gdb_test_no_output "record btrace"
gdb_test "next"
# start by listing all functions
gdb_test "record function-call-history /ci 1, +20" [join [list \
gdb_test "record function-call-history /ci 1, +20" [multi_line \
"1\tmain\tinst 1,1" \
"2\t fun4\tinst 2,4" \
"3\t fun1\tinst 5,8" \
@ -75,118 +75,118 @@ gdb_test "record function-call-history /ci 1, +20" [join [list \
"14\t fun2\tinst 35,36" \
"15\t fun3\tinst 37,38" \
"16\t fun4\tinst 39,40" \
] "\r\n"]
]
# let's see if we can go back in history
gdb_test "record goto 19" ".*fun4 \\(\\) at record_goto.c:43.*"
# the function call history should start at the new location
gdb_test "record function-call-history /ci" [join [list \
gdb_test "record function-call-history /ci" [multi_line \
"8\t fun4\tinst 19,19" \
"9\t fun3\tinst 20,22" \
"10\t fun1\tinst 23,26" \
] "\r\n"] "function-call-history from 19 forwards"
] "function-call-history from 19 forwards"
# the instruction history should start at the new location
gdb_test "record instruction-history" [join [list \
gdb_test "record instruction-history" [multi_line \
"19.*" \
"20.*" \
"21.*" \
] "\r\n"] "instruction-history from 19 forwards"
] "instruction-history from 19 forwards"
# let's go to another place in the history
gdb_test "record goto 27" ".*fun3 \\(\\) at record_goto.c:35.*"
# check the back trace at that location
gdb_test "backtrace" [join [list \
gdb_test "backtrace" [multi_line \
"#0.*fun3.*at record_goto.c:35.*" \
"#1.*fun4.*at record_goto.c:43.*" \
"#2.*main.*at record_goto.c:49.*" \
"Backtrace stopped: not enough registers or memory available to unwind further" \
] "\r\n"]
]
# walk the backtrace
gdb_test "up" ".*fun4.*at record_goto.c:43.*" "up to fun4"
gdb_test "up" ".*main.*at record_goto.c:49.*" "up to main"
# the function call history should start at the new location
gdb_test "record function-call-history /ci -" [join [list \
gdb_test "record function-call-history /ci -" [multi_line \
"9\t fun3\tinst 20,22" \
"10\t fun1\tinst 23,26" \
"11\t fun3\tinst 27,27" \
] "\r\n"] "function-call-history from 27 backwards"
] "function-call-history from 27 backwards"
# the instruction history should start at the new location
gdb_test "record instruction-history -" [join [list \
gdb_test "record instruction-history -" [multi_line \
"25.*" \
"26.*" \
"27.*" \
] "\r\n"] "instruction-history from 27 backwards"
] "instruction-history from 27 backwards"
# test that we can go to the begin of the trace
gdb_test "record goto begin" ".*main \\(\\) at record_goto.c:49.*"
# check that we're filling up the context correctly
gdb_test "record function-call-history /ci -" [join [list \
gdb_test "record function-call-history /ci -" [multi_line \
"1\tmain\tinst 1,1" \
"2\t fun4\tinst 2,4" \
"3\t fun1\tinst 5,8" \
] "\r\n"] "function-call-history from begin backwards"
] "function-call-history from begin backwards"
# check that we're filling up the context correctly
gdb_test "record instruction-history -" [join [list \
gdb_test "record instruction-history -" [multi_line \
"1.*" \
"2.*" \
"3.*" \
] "\r\n"] "instruction-history from begin backwards"
] "instruction-history from begin backwards"
# we should get the exact same history from the first instruction
gdb_test "record goto 2" ".*fun4 \\(\\) at record_goto.c:40.*"
# check that we're filling up the context correctly
gdb_test "record function-call-history /ci -" [join [list \
gdb_test "record function-call-history /ci -" [multi_line \
"1\tmain\tinst 1,1" \
"2\t fun4\tinst 2,4" \
"3\t fun1\tinst 5,8\r" \
] "\r\n"] "function-call-history from 2 backwards"
] "function-call-history from 2 backwards"
# check that we're filling up the context correctly
gdb_test "record instruction-history -" [join [list \
gdb_test "record instruction-history -" [multi_line \
"1.*" \
"2.*" \
"3.*" \
] "\r\n"] "instruction-history from 2 backwards"
] "instruction-history from 2 backwards"
# check that we can go to the end of the trace
gdb_test "record goto end" ".*main \\(\\) at record_goto.c:50.*"
# check that we're filling up the context correctly
gdb_test "record function-call-history /ci" [join [list \
gdb_test "record function-call-history /ci" [multi_line \
"14\t fun2\tinst 35,36" \
"15\t fun3\tinst 37,38" \
"16\t fun4\tinst 39,40" \
] "\r\n"] "function-call-history from end forwards"
] "function-call-history from end forwards"
# check that we're filling up the context correctly
gdb_test "record instruction-history" [join [list \
gdb_test "record instruction-history" [multi_line \
"38.*" \
"39.*" \
"40.*\r" \
] "\r\n"] "instruction-history from end forwards"
] "instruction-history from end forwards"
# we should get the exact same history from the second to last instruction
gdb_test "record goto 39" ".*fun4 \\(\\) at record_goto.c:44.*"
# check that we're filling up the context correctly
gdb_test "record function-call-history /ci" [join [list \
gdb_test "record function-call-history /ci" [multi_line \
"14\t fun2\tinst 35,36" \
"15\t fun3\tinst 37,38" \
"16\t fun4\tinst 39,40\r" \
] "\r\n"] "function-call-history from 39 forwards"
] "function-call-history from 39 forwards"
# check that we're filling up the context correctly
gdb_test "record instruction-history" [join [list \
gdb_test "record instruction-history" [multi_line \
"38.*" \
"39.*" \
"40.*\r" \
] "\r\n"] "instruction-history from 39 forwards"
] "instruction-history from 39 forwards"

View File

@ -31,10 +31,10 @@ if ![runto_main] {
# trace the test code
gdb_test_no_output "record btrace"
gdb_test "continue" [join [list \
gdb_test "continue" [multi_line \
"Program received signal SIGSEGV, Segmentation fault\." \
"0x0* in \\\?\\\? \\\(\\\)" \
] "\r\n"] "cont to segv"
] "cont to segv"
# we cannot do any high-level stepping
gdb_test "reverse-finish" "Cannot find bounds of current function"

View File

@ -47,12 +47,12 @@ if ![runto_main] {
}
proc check_replay_at { insn } {
gdb_test "info record" [join [list \
gdb_test "info record" [multi_line \
"Active record target: record-btrace" \
".*" \
"Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for .*" \
"Replay in progress\. At instruction $insn\." \
] "\r\n"]
]
}
# trace the call to the test function
@ -72,11 +72,11 @@ with_test_prefix "stepi to 40" { check_replay_at 40 }
# with the next step, we stop replaying
gdb_test "stepi" ".*main\.3.*"
gdb_test "info record" [join [list \
gdb_test "info record" [multi_line \
"Active record target: record-btrace" \
".*" \
"Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
] "\r\n"] "stepi to live"
] "stepi to live"
# let's try nexti
gdb_test "reverse-nexti" ".*main\.2.*"
@ -88,11 +88,11 @@ with_test_prefix "reverse-nexti - 1" { check_replay_at 1 }
# but we can step back again
gdb_test "nexti" ".*main\.3.*" "next, 1.5"
gdb_test "info record" [join [list \
gdb_test "info record" [multi_line \
"Active record target: record-btrace" \
".*" \
"Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
] "\r\n"] "nexti back"
] "nexti back"
# let's step from a goto position somewhere in the middle
gdb_test "record goto 22" ".*fun3\.2.*"

View File

@ -56,31 +56,31 @@ gdb_test_no_output "record btrace"
gdb_test "next 2"
# show the flat branch trace
gdb_test "record function-call-history 1" [join [list \
gdb_test "record function-call-history 1" [multi_line \
"1\tmain" \
"2\tfoo" \
"3\tbar" \
"4\tmain" \
] "\r\n"] "flat"
] "flat"
# show the branch trace with calls indented
gdb_test "record function-call-history /c 1" [join [list \
gdb_test "record function-call-history /c 1" [multi_line \
"1\tmain" \
"2\t foo" \
"3\t bar" \
"4\tmain" \
] "\r\n"] "indented"
] "indented"
# go into bar
gdb_test "record goto 4" ".*bar \\(\\) at .*tailcall.c:24\r\n.*"
# check the backtrace
gdb_test "backtrace" [join [list \
gdb_test "backtrace" [multi_line \
"#0.*bar \\(\\) at tailcall.c:24" \
"#1.*foo \\(\\) at tailcall.c:29" \
"#2.*main \\(\\) at tailcall.c:37" \
"Backtrace stopped: not enough registers or memory available to unwind further" \
] "\r\n"]
]
# walk the backtrace
gdb_test "up" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" "up to foo"

View File

@ -40,7 +40,7 @@ gdb_test_no_output "record btrace"
gdb_continue_to_breakpoint "cont to test" ".*test.*"
# show the flat branch trace
gdb_test "record function-call-history 1" [join [list \
gdb_test "record function-call-history 1" [multi_line \
"1\ttest" \
"2\t\\\?\\\?" \
"3\t\\\?\\\?" \
@ -48,10 +48,10 @@ gdb_test "record function-call-history 1" [join [list \
"5\ttest" \
"6\tmain" \
"7\ttest" \
] "\r\n"] "flat"
] "flat"
# show the branch trace with calls indented
gdb_test "record function-call-history /c 1" [join [list \
gdb_test "record function-call-history /c 1" [multi_line \
"1\t test" \
"2\t \\\?\\\?" \
"3\t \\\?\\\?" \
@ -59,4 +59,4 @@ gdb_test "record function-call-history /c 1" [join [list \
"5\t test" \
"6\tmain" \
"7\t test" \
] "\r\n"] "indented"
] "indented"

View File

@ -46,7 +46,7 @@ gdb_test "up" \
# "info frame" unwinds the PC for "saved ... = ". Make sure that
# doesn't cause an error, and shows "<not saved>".
gdb_test "info frame" [join [list \
gdb_test "info frame" [multi_line \
"Stack level 0, frame at $hex\:" \
" rip = $hex in stop_frame \\(dw2-undefined-ret-addr\\.c:22\\); saved rip = <not saved>" \
" Outermost frame: outermost" \
@ -55,4 +55,4 @@ gdb_test "info frame" [join [list \
" Locals at $hex, Previous frame's sp is $hex" \
" Saved registers\:" \
" rbp at $hex.*" \
] "\r\n"]
]

View File

@ -5119,5 +5119,16 @@ proc capture_command_output { command prefix } {
return $output_string
}
# A convenience function that joins all the arguments together, with a
# regexp that matches exactly one end of line in between each argument.
# This function is ideal to write the expected output of a GDB command
# that generates more than a couple of lines, as this allows us to write
# each line as a separate string, which is easier to read by a human
# being.
proc multi_line { args } {
return [join $args "\r\n"]
}
# Always load compatibility stuff.
load_lib future.exp