diff options
author | Bruno Larsen <blarsen@redhat.com> | 2022-11-03 10:17:36 +0100 |
---|---|---|
committer | Bruno Larsen <blarsen@redhat.com> | 2023-01-04 11:21:57 +0100 |
commit | e24d337e219da287535eddc5c9918ac410d124be (patch) | |
tree | b13e90469ebd1690ffeb755eb1ccaab6471d2a60 /gdb/testsuite/gdb.reverse | |
parent | 502c7218da3c486e58d6ce039b36fb4fa62d3a92 (diff) | |
download | gdb-e24d337e219da287535eddc5c9918ac410d124be.zip gdb-e24d337e219da287535eddc5c9918ac410d124be.tar.gz gdb-e24d337e219da287535eddc5c9918ac410d124be.tar.bz2 |
gdb: add 'maintenance print record-instruction' command
While chasing some reverse debugging bugs, I found myself wondering what
was recorded by GDB to undo and redo a certain instruction. This commit
implements a simple way of printing that information.
If there isn't enough history to print the desired instruction (such as
when the user hasn't started recording yet or when they request 2
instructions back but only 1 was recorded), GDB warns the user like so:
(gdb) maint print record-instruction
Not enough recorded history
If there is enough, GDB prints the instruction like so:
(gdb) maint print record-instruction
4 bytes of memory at address 0x00007fffffffd5dc changed from: 01 00 00 00
Register eflags changed: [ IF ]
Register rip changed: (void (*)()) 0x401115 <main+15>
Approved-by: Eli Zaretskii <eliz@gnu.org>
Reviewed-by: Alexandra Hajkova <ahajkova@redhat.com>
Reviewed-by: Lancelot Six <lsix@lancelotsix.com>
Approved-by: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb/testsuite/gdb.reverse')
-rw-r--r-- | gdb/testsuite/gdb.reverse/maint-print-instruction.c | 25 | ||||
-rw-r--r-- | gdb/testsuite/gdb.reverse/maint-print-instruction.exp | 75 |
2 files changed, 100 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.reverse/maint-print-instruction.c b/gdb/testsuite/gdb.reverse/maint-print-instruction.c new file mode 100644 index 0000000..292af6d --- /dev/null +++ b/gdb/testsuite/gdb.reverse/maint-print-instruction.c @@ -0,0 +1,25 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2022-2023 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +int +main () +{ + int x = 0; + x ++; + x --; + return x; +} diff --git a/gdb/testsuite/gdb.reverse/maint-print-instruction.exp b/gdb/testsuite/gdb.reverse/maint-print-instruction.exp new file mode 100644 index 0000000..41b2817 --- /dev/null +++ b/gdb/testsuite/gdb.reverse/maint-print-instruction.exp @@ -0,0 +1,75 @@ +# Copyright 2022-2023 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# This file is part of the GDB testsuite. It tests the functionality of +# the maintenance print record-instruction command, but does not check the +# syntax, only if the command finds or fails to find recorded history. +# This is done by putting the inferior in mulpitle states with and without +# history to be printed, then checking if GDB is able to print an +# instruction or not. +# To identify if GDB has printed an instruction, we can see if some +# change is printed, since any instruction must have at least a change +# to the PC. + +if ![supports_reverse] { + return +} + +standard_testfile + +if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } { + return -1 +} + +proc test_print { has_history level test_name } { + gdb_test_multiple "maint print record-instruction $level" $test_name { + -re -wrap ".*Not enough recorded history.*" { + gdb_assert !$has_history $test_name + } + + -re -wrap ".*changed.*" { + gdb_assert $has_history $test_name + } + } +} + +if { ![runto_main] } { + return 0 +} + +#confirm that GDB doesn't go crazy if recording isn't enabled +test_print false "" "print before starting to record" + +if ![supports_process_record] { + # No point in testing the rest if we can't record anything + return +} + +gdb_test_no_output "record" "turn on process record" + +test_print false "" "print before any instruction" + +gdb_test "stepi 3" ".*" "collecting history" +test_print true "" "print current after executing a bit" +test_print true "-1" "print previous after executing a bit" +test_print false "1" "print following after executing a bit" + +gdb_test "reverse-stepi" ".*" "moving back" +test_print true "" "print current after reversing" +test_print true "-1" "print previous after reversing" +test_print true "1" "print following after reversing" + +test_print false "-10" "trying to print too far back" +test_print false "10" "trying to print too far forward" |