mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-03 04:12:10 +08:00
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:
parent
5445da1b76
commit
3c724c8ca9
@ -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>
|
2015-04-01 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
* gdb.threads/tid-reuse.c: New file.
|
* gdb.threads/tid-reuse.c: New file.
|
||||||
|
@ -44,16 +44,6 @@ proc test_gdb_no_completion { expr } {
|
|||||||
gdb_test_no_output "complete p $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:
|
# Try a global variable, only one match should be found:
|
||||||
|
|
||||||
test_gdb_complete "my_glob" \
|
test_gdb_complete "my_glob" \
|
||||||
|
@ -21,17 +21,6 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" }
|
|||||||
return -1
|
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}
|
clean_restart ${testfile}
|
||||||
|
|
||||||
if ![runto_main] then {
|
if ![runto_main] then {
|
||||||
|
@ -21,17 +21,6 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" }
|
|||||||
return -1
|
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}
|
clean_restart ${testfile}
|
||||||
|
|
||||||
set bp_location [gdb_get_line_number "STOP" ${testdir}/comp_bug.adb]
|
set bp_location [gdb_get_line_number "STOP" ${testdir}/comp_bug.adb]
|
||||||
|
@ -21,17 +21,6 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug additional
|
|||||||
return -1
|
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}
|
clean_restart ${testfile}
|
||||||
|
|
||||||
set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
|
set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
|
||||||
|
@ -21,17 +21,6 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" }
|
|||||||
return -1
|
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}
|
clean_restart ${testfile}
|
||||||
|
|
||||||
set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
|
set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
|
||||||
|
@ -21,17 +21,6 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" }
|
|||||||
return -1
|
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}
|
clean_restart ${testfile}
|
||||||
|
|
||||||
set bp_location [gdb_get_line_number "START" ${testdir}/foo.adb]
|
set bp_location [gdb_get_line_number "START" ${testdir}/foo.adb]
|
||||||
|
@ -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_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 "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" \
|
"Active record target: record-btrace" \
|
||||||
"Recording format: Branch Trace Store\." \
|
"Recording format: Branch Trace Store\." \
|
||||||
"Buffer size: 4kB\." \
|
"Buffer size: 4kB\." \
|
||||||
"Recorded 0 instructions in 0 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
|
"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 "record stop" ".*" "stop recording with small bts buffer"
|
||||||
|
|
||||||
gdb_test_no_output "set record btrace bts buffer-size 0"
|
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_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 "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" \
|
"Active record target: record-btrace" \
|
||||||
"Recording format: Branch Trace Store\." \
|
"Recording format: Branch Trace Store\." \
|
||||||
"Buffer size: .*\." \
|
"Buffer size: .*\." \
|
||||||
"Recorded 0 instructions in 0 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
|
"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"
|
gdb_test "record stop" ".*" "stop recording with unlimited bts buffer"
|
||||||
|
@ -37,11 +37,11 @@ gdb_test_no_output "record btrace"
|
|||||||
|
|
||||||
# we start without trace
|
# we start without trace
|
||||||
with_test_prefix "no trace" {
|
with_test_prefix "no trace" {
|
||||||
gdb_test "info record" [join [list \
|
gdb_test "info record" [multi_line \
|
||||||
"Active record target: record-btrace" \
|
"Active record target: record-btrace" \
|
||||||
"Recording format: .*" \
|
"Recording format: .*" \
|
||||||
"Recorded 0 instructions in 0 functions \\\(0 gaps\\\) for .*" \
|
"Recorded 0 instructions in 0 functions \\\(0 gaps\\\) for .*" \
|
||||||
] "\r\n"]
|
]
|
||||||
gdb_test "record instruction-history" "No trace\."
|
gdb_test "record instruction-history" "No trace\."
|
||||||
gdb_test "record function-call-history" "No trace\."
|
gdb_test "record function-call-history" "No trace\."
|
||||||
}
|
}
|
||||||
@ -50,11 +50,11 @@ with_test_prefix "no trace" {
|
|||||||
gdb_test "stepi"
|
gdb_test "stepi"
|
||||||
|
|
||||||
proc check_trace {} {
|
proc check_trace {} {
|
||||||
gdb_test "info record" [join [list \
|
gdb_test "info record" [multi_line \
|
||||||
"Active record target: record-btrace" \
|
"Active record target: record-btrace" \
|
||||||
"Recording format: .*" \
|
"Recording format: .*" \
|
||||||
"Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \
|
"Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \
|
||||||
] "\r\n"]
|
]
|
||||||
gdb_test "record instruction-history /f 1" \
|
gdb_test "record instruction-history /f 1" \
|
||||||
"1\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov *\\\$0x0,%eax\r"
|
"1\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tmov *\\\$0x0,%eax\r"
|
||||||
gdb_test "record function-call-history /c 1" "1\tmain"
|
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
|
# check that we can reverse-stepi that instruction
|
||||||
gdb_test "reverse-stepi"
|
gdb_test "reverse-stepi"
|
||||||
gdb_test "info record" [join [list \
|
gdb_test "info record" [multi_line \
|
||||||
"Active record target: record-btrace" \
|
"Active record target: record-btrace" \
|
||||||
"Recording format: .*" \
|
"Recording format: .*" \
|
||||||
"Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \
|
"Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \
|
||||||
"Replay in progress\. At instruction 1\." \
|
"Replay in progress\. At instruction 1\." \
|
||||||
] "\r\n"] "reverse-stepi"
|
] "reverse-stepi"
|
||||||
|
|
||||||
# and back
|
# and back
|
||||||
gdb_test "stepi"
|
gdb_test "stepi"
|
||||||
gdb_test "info record" [join [list \
|
gdb_test "info record" [multi_line \
|
||||||
"Active record target: record-btrace" \
|
"Active record target: record-btrace" \
|
||||||
"Recording format: .*" \
|
"Recording format: .*" \
|
||||||
"Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \
|
"Recorded 1 instructions in 1 functions \\\(0 gaps\\\) for .*" \
|
||||||
] "\r\n"] "and back"
|
] "and back"
|
||||||
|
@ -48,25 +48,25 @@ gdb_continue_to_breakpoint "cont to bp.2" ".*$srcfile:$bp_2\r\n.*"
|
|||||||
# show the flat branch trace
|
# show the flat branch trace
|
||||||
send_gdb "record function-call-history 1\n"
|
send_gdb "record function-call-history 1\n"
|
||||||
gdb_expect_list "flat" "\r\n$gdb_prompt $" [list \
|
gdb_expect_list "flat" "\r\n$gdb_prompt $" [list \
|
||||||
[join [list \
|
[multi_line \
|
||||||
"1\tmain\\(\\)" \
|
"1\tmain\\(\\)" \
|
||||||
"2\ttest\\(\\)" \
|
"2\ttest\\(\\)" \
|
||||||
"3\tfoo\\(\\)" \
|
"3\tfoo\\(\\)" \
|
||||||
"4\tbar\\(\\)" \
|
"4\tbar\\(\\)" \
|
||||||
"5\tbad\\(\\)\r" \
|
"5\tbad\\(\\)\r" \
|
||||||
] "\r\n"] \
|
] \
|
||||||
"" \
|
"" \
|
||||||
"\[0-9\]*\ttest\\(\\)"]
|
"\[0-9\]*\ttest\\(\\)"]
|
||||||
|
|
||||||
# show the branch trace with calls indented
|
# show the branch trace with calls indented
|
||||||
send_gdb "record function-call-history /c 1\n"
|
send_gdb "record function-call-history /c 1\n"
|
||||||
gdb_expect_list "indented" "\r\n$gdb_prompt $" [list \
|
gdb_expect_list "indented" "\r\n$gdb_prompt $" [list \
|
||||||
[join [list \
|
[multi_line \
|
||||||
"1\tmain\\(\\)" \
|
"1\tmain\\(\\)" \
|
||||||
"2\t test\\(\\)" \
|
"2\t test\\(\\)" \
|
||||||
"3\t foo\\(\\)" \
|
"3\t foo\\(\\)" \
|
||||||
"4\t bar\\(\\)" \
|
"4\t bar\\(\\)" \
|
||||||
"5\t bad\\(\\)\r" \
|
"5\t bad\\(\\)\r" \
|
||||||
] "\r\n"] \
|
] \
|
||||||
"" \
|
"" \
|
||||||
"\[0-9\]*\t test\\(\\)"]
|
"\[0-9\]*\t test\\(\\)"]
|
||||||
|
@ -38,7 +38,7 @@ gdb_breakpoint $bp_location
|
|||||||
gdb_continue_to_breakpoint "cont to $bp_location" ".*$testfile.c:$bp_location.*"
|
gdb_continue_to_breakpoint "cont to $bp_location" ".*$testfile.c:$bp_location.*"
|
||||||
|
|
||||||
proc rec_fun_all {} {
|
proc rec_fun_all {} {
|
||||||
gdb_test "record function-call-history 1" [join [list \
|
gdb_test "record function-call-history 1" [multi_line \
|
||||||
"1\tmain" \
|
"1\tmain" \
|
||||||
"2\tinc" \
|
"2\tinc" \
|
||||||
"3\tmain" \
|
"3\tmain" \
|
||||||
@ -59,7 +59,7 @@ proc rec_fun_all {} {
|
|||||||
"18\tinc" \
|
"18\tinc" \
|
||||||
"19\tmain" \
|
"19\tmain" \
|
||||||
"20\tinc" \
|
"20\tinc" \
|
||||||
"21\tmain"] "\r\n"]
|
"21\tmain"]
|
||||||
}
|
}
|
||||||
|
|
||||||
# show function call history with unlimited size, we expect to see all 21 entries
|
# 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
|
# show first 15 entries
|
||||||
gdb_test_no_output "set record function-call-history-size 15"
|
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" \
|
"1\tmain" \
|
||||||
"2\tinc" \
|
"2\tinc" \
|
||||||
"3\tmain" \
|
"3\tmain" \
|
||||||
@ -87,16 +87,16 @@ gdb_test "record function-call-history 1" [join [list \
|
|||||||
"12\tinc" \
|
"12\tinc" \
|
||||||
"13\tmain" \
|
"13\tmain" \
|
||||||
"14\tinc" \
|
"14\tinc" \
|
||||||
"15\tmain"] "\r\n"] "forward - 1"
|
"15\tmain"] "forward - 1"
|
||||||
|
|
||||||
# show last 6 entries
|
# show last 6 entries
|
||||||
gdb_test "record function-call-history +" [join [list \
|
gdb_test "record function-call-history +" [multi_line \
|
||||||
"16\tinc" \
|
"16\tinc" \
|
||||||
"17\tmain" \
|
"17\tmain" \
|
||||||
"18\tinc" \
|
"18\tinc" \
|
||||||
"19\tmain" \
|
"19\tmain" \
|
||||||
"20\tinc" \
|
"20\tinc" \
|
||||||
"21\tmain"] "\r\n"] "forward - 2"
|
"21\tmain"] "forward - 2"
|
||||||
|
|
||||||
# moving further should not work
|
# moving further should not work
|
||||||
gdb_test "record function-call-history +" "At the end of the branch trace record\\." "forward - 3"
|
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"
|
gdb_test "record function-call-history +" "At the end of the branch trace record\\." "forward - 4"
|
||||||
|
|
||||||
# moving back showing the latest 15 function calls
|
# 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" \
|
"7\tmain" \
|
||||||
"8\tinc" \
|
"8\tinc" \
|
||||||
"9\tmain" \
|
"9\tmain" \
|
||||||
@ -120,16 +120,16 @@ gdb_test "record function-call-history -" [join [list \
|
|||||||
"18\tinc" \
|
"18\tinc" \
|
||||||
"19\tmain" \
|
"19\tmain" \
|
||||||
"20\tinc" \
|
"20\tinc" \
|
||||||
"21\tmain"] "\r\n"] "backward - 1"
|
"21\tmain"] "backward - 1"
|
||||||
|
|
||||||
# moving further back shows the 6 first function calls
|
# 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" \
|
"1\tmain" \
|
||||||
"2\tinc" \
|
"2\tinc" \
|
||||||
"3\tmain" \
|
"3\tmain" \
|
||||||
"4\tinc" \
|
"4\tinc" \
|
||||||
"5\tmain" \
|
"5\tmain" \
|
||||||
"6\tinc"] "\r\n"] "backward - 2"
|
"6\tinc"] "backward - 2"
|
||||||
|
|
||||||
# moving further back shouldn't work
|
# moving further back shouldn't work
|
||||||
gdb_test "record function-call-history -" "At the start of the branch trace record\\." "backward - 3"
|
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"
|
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
|
# 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\]*\tmain\tat $srcfile:40,41" \
|
||||||
"\[0-9\]*\tinc\tat $srcfile:22,24" \
|
"\[0-9\]*\tinc\tat $srcfile:22,24" \
|
||||||
"\[0-9\]*\tmain\tat $srcfile:40,41" \
|
"\[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\]*\tmain\tat $srcfile:40,41" \
|
||||||
"\[0-9\]*\tinc\tat $srcfile:22,24" \
|
"\[0-9\]*\tinc\tat $srcfile:22,24" \
|
||||||
"\[0-9\]*\tmain\tat $srcfile:40,41" \
|
"\[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
|
# 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\]*\tinc\tat $srcfile:22,24" \
|
||||||
"\[0-9\]*\tmain\tat $srcfile:40,41" \
|
"\[0-9\]*\tmain\tat $srcfile:40,41" \
|
||||||
"\[0-9\]*\tinc\tat $srcfile:22,24" \
|
"\[0-9\]*\tinc\tat $srcfile:22,24" \
|
||||||
"\[0-9\]*\tmain\tat $srcfile:40,41" \
|
"\[0-9\]*\tmain\tat $srcfile:40,41" \
|
||||||
"\[0-9\]*\tinc\tat $srcfile:22,24" \
|
"\[0-9\]*\tinc\tat $srcfile:22,24" \
|
||||||
"\[0-9\]*\tmain\tat $srcfile:40,43" \
|
"\[0-9\]*\tmain\tat $srcfile:40,43" \
|
||||||
] "\r\n"] "forward /l - 2"
|
] "forward /l - 2"
|
||||||
|
|
||||||
# moving further forward shouldn't work
|
# 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 - 3"
|
||||||
gdb_test "record function-call-history /l" "At the end of the branch trace record\\." "forward /l - 4"
|
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" \
|
"4\tinc" \
|
||||||
"5\tmain" \
|
"5\tmain" \
|
||||||
"6\tinc" \
|
"6\tinc" \
|
||||||
"7\tmain" \
|
"7\tmain" \
|
||||||
"8\tinc" \
|
"8\tinc" \
|
||||||
"9\tmain" \
|
"9\tmain" \
|
||||||
"10\tinc"] "\r\n"]
|
"10\tinc"]
|
||||||
|
|
||||||
# show functions in instruction range
|
# show functions in instruction range
|
||||||
gdb_test "record function-call-history 4,10" $expected_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,
|
# 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
|
# 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_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" \
|
"21\tmain" \
|
||||||
"22\tfib" \
|
"22\tfib" \
|
||||||
"23\tfib" \
|
"23\tfib" \
|
||||||
@ -207,10 +207,10 @@ gdb_test "record function-call-history" [join [list \
|
|||||||
"28\tfib" \
|
"28\tfib" \
|
||||||
"29\tfib" \
|
"29\tfib" \
|
||||||
"30\tfib" \
|
"30\tfib" \
|
||||||
"31\tmain"] "\r\n"] "recursive"
|
"31\tmain"] "recursive"
|
||||||
|
|
||||||
# show indented function call history for fib
|
# 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" \
|
"21\tmain" \
|
||||||
"22\t fib" \
|
"22\t fib" \
|
||||||
"23\t fib" \
|
"23\t fib" \
|
||||||
@ -222,7 +222,7 @@ gdb_test "record function-call-history /c 21, +11" [join [list \
|
|||||||
"29\t fib" \
|
"29\t fib" \
|
||||||
"30\t fib" \
|
"30\t fib" \
|
||||||
"31\tmain" \
|
"31\tmain" \
|
||||||
] "\r\n"] "indented"
|
] "indented"
|
||||||
|
|
||||||
# make sure we can handle incomplete trace with respect to indentation
|
# make sure we can handle incomplete trace with respect to indentation
|
||||||
if ![runto_main] {
|
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.*"
|
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.
|
# 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" \
|
"1\t fib" \
|
||||||
"2\t fib" \
|
"2\t fib" \
|
||||||
"3\t fib" \
|
"3\t fib" \
|
||||||
"4\t fib" \
|
"4\t fib" \
|
||||||
"5\t fib" \
|
"5\t fib" \
|
||||||
"6\tmain" \
|
"6\tmain" \
|
||||||
] "\r\n"] "indented tail"
|
] "indented tail"
|
||||||
|
@ -65,37 +65,37 @@ if { $traced != 11 } {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# test that we see the expected instructions
|
# 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\]+>" \
|
"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" \
|
"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\]+>" \
|
"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" \
|
"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" \
|
"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\]+>" \
|
"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" \
|
"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\]+>" \
|
"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" \
|
"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" \
|
"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\]+>" \
|
"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" \
|
"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\]+>" \
|
"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" \
|
"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" \
|
"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\]+>" \
|
"3\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \
|
||||||
"4\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec %eax" \
|
"4\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec %eax" \
|
||||||
"5\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>" \
|
"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" \
|
"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" \
|
"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"
|
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"
|
||||||
|
|
||||||
|
@ -31,11 +31,11 @@ if ![runto_main] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
proc check_not_replaying {} {
|
proc check_not_replaying {} {
|
||||||
gdb_test "info record" [join [list \
|
gdb_test "info record" [multi_line \
|
||||||
"Active record target: record-btrace" \
|
"Active record target: record-btrace" \
|
||||||
"Recording format: .*" \
|
"Recording format: .*" \
|
||||||
"Recorded 0 instructions in 0 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
|
"Recorded 0 instructions in 0 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
|
||||||
] "\r\n"]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
gdb_test_no_output "record btrace"
|
gdb_test_no_output "record btrace"
|
||||||
|
@ -58,7 +58,7 @@ gdb_test_no_output "record btrace"
|
|||||||
gdb_test "next"
|
gdb_test "next"
|
||||||
|
|
||||||
# start by listing all functions
|
# 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" \
|
"1\tmain\tinst 1,1" \
|
||||||
"2\t fun4\tinst 2,4" \
|
"2\t fun4\tinst 2,4" \
|
||||||
"3\t fun1\tinst 5,8" \
|
"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" \
|
"14\t fun2\tinst 35,36" \
|
||||||
"15\t fun3\tinst 37,38" \
|
"15\t fun3\tinst 37,38" \
|
||||||
"16\t fun4\tinst 39,40" \
|
"16\t fun4\tinst 39,40" \
|
||||||
] "\r\n"]
|
]
|
||||||
|
|
||||||
# let's see if we can go back in history
|
# let's see if we can go back in history
|
||||||
gdb_test "record goto 19" ".*fun4 \\(\\) at record_goto.c:43.*"
|
gdb_test "record goto 19" ".*fun4 \\(\\) at record_goto.c:43.*"
|
||||||
|
|
||||||
# the function call history should start at the new location
|
# 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" \
|
"8\t fun4\tinst 19,19" \
|
||||||
"9\t fun3\tinst 20,22" \
|
"9\t fun3\tinst 20,22" \
|
||||||
"10\t fun1\tinst 23,26" \
|
"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
|
# the instruction history should start at the new location
|
||||||
gdb_test "record instruction-history" [join [list \
|
gdb_test "record instruction-history" [multi_line \
|
||||||
"19.*" \
|
"19.*" \
|
||||||
"20.*" \
|
"20.*" \
|
||||||
"21.*" \
|
"21.*" \
|
||||||
] "\r\n"] "instruction-history from 19 forwards"
|
] "instruction-history from 19 forwards"
|
||||||
|
|
||||||
# let's go to another place in the history
|
# let's go to another place in the history
|
||||||
gdb_test "record goto 27" ".*fun3 \\(\\) at record_goto.c:35.*"
|
gdb_test "record goto 27" ".*fun3 \\(\\) at record_goto.c:35.*"
|
||||||
|
|
||||||
# check the back trace at that location
|
# check the back trace at that location
|
||||||
gdb_test "backtrace" [join [list \
|
gdb_test "backtrace" [multi_line \
|
||||||
"#0.*fun3.*at record_goto.c:35.*" \
|
"#0.*fun3.*at record_goto.c:35.*" \
|
||||||
"#1.*fun4.*at record_goto.c:43.*" \
|
"#1.*fun4.*at record_goto.c:43.*" \
|
||||||
"#2.*main.*at record_goto.c:49.*" \
|
"#2.*main.*at record_goto.c:49.*" \
|
||||||
"Backtrace stopped: not enough registers or memory available to unwind further" \
|
"Backtrace stopped: not enough registers or memory available to unwind further" \
|
||||||
] "\r\n"]
|
]
|
||||||
|
|
||||||
# walk the backtrace
|
# walk the backtrace
|
||||||
gdb_test "up" ".*fun4.*at record_goto.c:43.*" "up to fun4"
|
gdb_test "up" ".*fun4.*at record_goto.c:43.*" "up to fun4"
|
||||||
gdb_test "up" ".*main.*at record_goto.c:49.*" "up to main"
|
gdb_test "up" ".*main.*at record_goto.c:49.*" "up to main"
|
||||||
|
|
||||||
# the function call history should start at the new location
|
# 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" \
|
"9\t fun3\tinst 20,22" \
|
||||||
"10\t fun1\tinst 23,26" \
|
"10\t fun1\tinst 23,26" \
|
||||||
"11\t fun3\tinst 27,27" \
|
"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
|
# the instruction history should start at the new location
|
||||||
gdb_test "record instruction-history -" [join [list \
|
gdb_test "record instruction-history -" [multi_line \
|
||||||
"25.*" \
|
"25.*" \
|
||||||
"26.*" \
|
"26.*" \
|
||||||
"27.*" \
|
"27.*" \
|
||||||
] "\r\n"] "instruction-history from 27 backwards"
|
] "instruction-history from 27 backwards"
|
||||||
|
|
||||||
# test that we can go to the begin of the trace
|
# test that we can go to the begin of the trace
|
||||||
gdb_test "record goto begin" ".*main \\(\\) at record_goto.c:49.*"
|
gdb_test "record goto begin" ".*main \\(\\) at record_goto.c:49.*"
|
||||||
|
|
||||||
# check that we're filling up the context correctly
|
# 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" \
|
"1\tmain\tinst 1,1" \
|
||||||
"2\t fun4\tinst 2,4" \
|
"2\t fun4\tinst 2,4" \
|
||||||
"3\t fun1\tinst 5,8" \
|
"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
|
# check that we're filling up the context correctly
|
||||||
gdb_test "record instruction-history -" [join [list \
|
gdb_test "record instruction-history -" [multi_line \
|
||||||
"1.*" \
|
"1.*" \
|
||||||
"2.*" \
|
"2.*" \
|
||||||
"3.*" \
|
"3.*" \
|
||||||
] "\r\n"] "instruction-history from begin backwards"
|
] "instruction-history from begin backwards"
|
||||||
|
|
||||||
# we should get the exact same history from the first instruction
|
# we should get the exact same history from the first instruction
|
||||||
gdb_test "record goto 2" ".*fun4 \\(\\) at record_goto.c:40.*"
|
gdb_test "record goto 2" ".*fun4 \\(\\) at record_goto.c:40.*"
|
||||||
|
|
||||||
# check that we're filling up the context correctly
|
# 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" \
|
"1\tmain\tinst 1,1" \
|
||||||
"2\t fun4\tinst 2,4" \
|
"2\t fun4\tinst 2,4" \
|
||||||
"3\t fun1\tinst 5,8\r" \
|
"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
|
# check that we're filling up the context correctly
|
||||||
gdb_test "record instruction-history -" [join [list \
|
gdb_test "record instruction-history -" [multi_line \
|
||||||
"1.*" \
|
"1.*" \
|
||||||
"2.*" \
|
"2.*" \
|
||||||
"3.*" \
|
"3.*" \
|
||||||
] "\r\n"] "instruction-history from 2 backwards"
|
] "instruction-history from 2 backwards"
|
||||||
|
|
||||||
# check that we can go to the end of the trace
|
# check that we can go to the end of the trace
|
||||||
gdb_test "record goto end" ".*main \\(\\) at record_goto.c:50.*"
|
gdb_test "record goto end" ".*main \\(\\) at record_goto.c:50.*"
|
||||||
|
|
||||||
# check that we're filling up the context correctly
|
# 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" \
|
"14\t fun2\tinst 35,36" \
|
||||||
"15\t fun3\tinst 37,38" \
|
"15\t fun3\tinst 37,38" \
|
||||||
"16\t fun4\tinst 39,40" \
|
"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
|
# check that we're filling up the context correctly
|
||||||
gdb_test "record instruction-history" [join [list \
|
gdb_test "record instruction-history" [multi_line \
|
||||||
"38.*" \
|
"38.*" \
|
||||||
"39.*" \
|
"39.*" \
|
||||||
"40.*\r" \
|
"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
|
# we should get the exact same history from the second to last instruction
|
||||||
gdb_test "record goto 39" ".*fun4 \\(\\) at record_goto.c:44.*"
|
gdb_test "record goto 39" ".*fun4 \\(\\) at record_goto.c:44.*"
|
||||||
|
|
||||||
# check that we're filling up the context correctly
|
# 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" \
|
"14\t fun2\tinst 35,36" \
|
||||||
"15\t fun3\tinst 37,38" \
|
"15\t fun3\tinst 37,38" \
|
||||||
"16\t fun4\tinst 39,40\r" \
|
"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
|
# check that we're filling up the context correctly
|
||||||
gdb_test "record instruction-history" [join [list \
|
gdb_test "record instruction-history" [multi_line \
|
||||||
"38.*" \
|
"38.*" \
|
||||||
"39.*" \
|
"39.*" \
|
||||||
"40.*\r" \
|
"40.*\r" \
|
||||||
] "\r\n"] "instruction-history from 39 forwards"
|
] "instruction-history from 39 forwards"
|
||||||
|
@ -31,10 +31,10 @@ if ![runto_main] {
|
|||||||
|
|
||||||
# trace the test code
|
# trace the test code
|
||||||
gdb_test_no_output "record btrace"
|
gdb_test_no_output "record btrace"
|
||||||
gdb_test "continue" [join [list \
|
gdb_test "continue" [multi_line \
|
||||||
"Program received signal SIGSEGV, Segmentation fault\." \
|
"Program received signal SIGSEGV, Segmentation fault\." \
|
||||||
"0x0* in \\\?\\\? \\\(\\\)" \
|
"0x0* in \\\?\\\? \\\(\\\)" \
|
||||||
] "\r\n"] "cont to segv"
|
] "cont to segv"
|
||||||
|
|
||||||
# we cannot do any high-level stepping
|
# we cannot do any high-level stepping
|
||||||
gdb_test "reverse-finish" "Cannot find bounds of current function"
|
gdb_test "reverse-finish" "Cannot find bounds of current function"
|
||||||
|
@ -47,12 +47,12 @@ if ![runto_main] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
proc check_replay_at { insn } {
|
proc check_replay_at { insn } {
|
||||||
gdb_test "info record" [join [list \
|
gdb_test "info record" [multi_line \
|
||||||
"Active record target: record-btrace" \
|
"Active record target: record-btrace" \
|
||||||
".*" \
|
".*" \
|
||||||
"Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for .*" \
|
"Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for .*" \
|
||||||
"Replay in progress\. At instruction $insn\." \
|
"Replay in progress\. At instruction $insn\." \
|
||||||
] "\r\n"]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
# trace the call to the test function
|
# 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
|
# with the next step, we stop replaying
|
||||||
gdb_test "stepi" ".*main\.3.*"
|
gdb_test "stepi" ".*main\.3.*"
|
||||||
gdb_test "info record" [join [list \
|
gdb_test "info record" [multi_line \
|
||||||
"Active record target: record-btrace" \
|
"Active record target: record-btrace" \
|
||||||
".*" \
|
".*" \
|
||||||
"Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
|
"Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
|
||||||
] "\r\n"] "stepi to live"
|
] "stepi to live"
|
||||||
|
|
||||||
# let's try nexti
|
# let's try nexti
|
||||||
gdb_test "reverse-nexti" ".*main\.2.*"
|
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
|
# but we can step back again
|
||||||
gdb_test "nexti" ".*main\.3.*" "next, 1.5"
|
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" \
|
"Active record target: record-btrace" \
|
||||||
".*" \
|
".*" \
|
||||||
"Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
|
"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
|
# let's step from a goto position somewhere in the middle
|
||||||
gdb_test "record goto 22" ".*fun3\.2.*"
|
gdb_test "record goto 22" ".*fun3\.2.*"
|
||||||
|
@ -56,31 +56,31 @@ gdb_test_no_output "record btrace"
|
|||||||
gdb_test "next 2"
|
gdb_test "next 2"
|
||||||
|
|
||||||
# show the flat branch trace
|
# 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" \
|
"1\tmain" \
|
||||||
"2\tfoo" \
|
"2\tfoo" \
|
||||||
"3\tbar" \
|
"3\tbar" \
|
||||||
"4\tmain" \
|
"4\tmain" \
|
||||||
] "\r\n"] "flat"
|
] "flat"
|
||||||
|
|
||||||
# show the branch trace with calls indented
|
# 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" \
|
"1\tmain" \
|
||||||
"2\t foo" \
|
"2\t foo" \
|
||||||
"3\t bar" \
|
"3\t bar" \
|
||||||
"4\tmain" \
|
"4\tmain" \
|
||||||
] "\r\n"] "indented"
|
] "indented"
|
||||||
|
|
||||||
# go into bar
|
# go into bar
|
||||||
gdb_test "record goto 4" ".*bar \\(\\) at .*tailcall.c:24\r\n.*"
|
gdb_test "record goto 4" ".*bar \\(\\) at .*tailcall.c:24\r\n.*"
|
||||||
|
|
||||||
# check the backtrace
|
# check the backtrace
|
||||||
gdb_test "backtrace" [join [list \
|
gdb_test "backtrace" [multi_line \
|
||||||
"#0.*bar \\(\\) at tailcall.c:24" \
|
"#0.*bar \\(\\) at tailcall.c:24" \
|
||||||
"#1.*foo \\(\\) at tailcall.c:29" \
|
"#1.*foo \\(\\) at tailcall.c:29" \
|
||||||
"#2.*main \\(\\) at tailcall.c:37" \
|
"#2.*main \\(\\) at tailcall.c:37" \
|
||||||
"Backtrace stopped: not enough registers or memory available to unwind further" \
|
"Backtrace stopped: not enough registers or memory available to unwind further" \
|
||||||
] "\r\n"]
|
]
|
||||||
|
|
||||||
# walk the backtrace
|
# walk the backtrace
|
||||||
gdb_test "up" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" "up to foo"
|
gdb_test "up" "#1\[^\r\n\]*foo \\(\\) at tailcall.c:29\r\n.*" "up to foo"
|
||||||
|
@ -40,7 +40,7 @@ gdb_test_no_output "record btrace"
|
|||||||
gdb_continue_to_breakpoint "cont to test" ".*test.*"
|
gdb_continue_to_breakpoint "cont to test" ".*test.*"
|
||||||
|
|
||||||
# show the flat branch trace
|
# 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" \
|
"1\ttest" \
|
||||||
"2\t\\\?\\\?" \
|
"2\t\\\?\\\?" \
|
||||||
"3\t\\\?\\\?" \
|
"3\t\\\?\\\?" \
|
||||||
@ -48,10 +48,10 @@ gdb_test "record function-call-history 1" [join [list \
|
|||||||
"5\ttest" \
|
"5\ttest" \
|
||||||
"6\tmain" \
|
"6\tmain" \
|
||||||
"7\ttest" \
|
"7\ttest" \
|
||||||
] "\r\n"] "flat"
|
] "flat"
|
||||||
|
|
||||||
# show the branch trace with calls indented
|
# 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" \
|
"1\t test" \
|
||||||
"2\t \\\?\\\?" \
|
"2\t \\\?\\\?" \
|
||||||
"3\t \\\?\\\?" \
|
"3\t \\\?\\\?" \
|
||||||
@ -59,4 +59,4 @@ gdb_test "record function-call-history /c 1" [join [list \
|
|||||||
"5\t test" \
|
"5\t test" \
|
||||||
"6\tmain" \
|
"6\tmain" \
|
||||||
"7\t test" \
|
"7\t test" \
|
||||||
] "\r\n"] "indented"
|
] "indented"
|
||||||
|
@ -46,7 +46,7 @@ gdb_test "up" \
|
|||||||
|
|
||||||
# "info frame" unwinds the PC for "saved ... = ". Make sure that
|
# "info frame" unwinds the PC for "saved ... = ". Make sure that
|
||||||
# doesn't cause an error, and shows "<not saved>".
|
# 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\:" \
|
"Stack level 0, frame at $hex\:" \
|
||||||
" rip = $hex in stop_frame \\(dw2-undefined-ret-addr\\.c:22\\); saved rip = <not saved>" \
|
" rip = $hex in stop_frame \\(dw2-undefined-ret-addr\\.c:22\\); saved rip = <not saved>" \
|
||||||
" Outermost frame: outermost" \
|
" Outermost frame: outermost" \
|
||||||
@ -55,4 +55,4 @@ gdb_test "info frame" [join [list \
|
|||||||
" Locals at $hex, Previous frame's sp is $hex" \
|
" Locals at $hex, Previous frame's sp is $hex" \
|
||||||
" Saved registers\:" \
|
" Saved registers\:" \
|
||||||
" rbp at $hex.*" \
|
" rbp at $hex.*" \
|
||||||
] "\r\n"]
|
]
|
||||||
|
@ -5119,5 +5119,16 @@ proc capture_command_output { command prefix } {
|
|||||||
return $output_string
|
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.
|
# Always load compatibility stuff.
|
||||||
load_lib future.exp
|
load_lib future.exp
|
||||||
|
Loading…
Reference in New Issue
Block a user