diff options
author | Andrew Burgess <aburgess@redhat.com> | 2022-08-16 16:48:01 +0100 |
---|---|---|
committer | Andrew Burgess <aburgess@redhat.com> | 2022-08-24 14:44:20 +0100 |
commit | 70175292616118bad315296ba6180f375326bb6c (patch) | |
tree | d8d27502ccae432ab24e068dc659f864546e7089 /gdb/testsuite/gdb.base/maint-print-frame-id.exp | |
parent | 42bd5254fb5f52f045796e1d9cce07102881d3b1 (diff) | |
download | gdb-70175292616118bad315296ba6180f375326bb6c.zip gdb-70175292616118bad315296ba6180f375326bb6c.tar.gz gdb-70175292616118bad315296ba6180f375326bb6c.tar.bz2 |
gdb: new 'maint print frame-id' command
When debugging a certain class of GDB bug, I often end up wanting to
know what GDB thinks the frame-id is in a particular frame. It's
not too hard to pull this from some debug output, but I thought it
might be nice if there was a maintenance command that could tell us.
This commit adds 'maint print frame-id' which prints the frame-id of
the currently selected frame. You can also pass a frame level number
to find the frame-id for a specific frame.
There's a new test too.
Diffstat (limited to 'gdb/testsuite/gdb.base/maint-print-frame-id.exp')
-rw-r--r-- | gdb/testsuite/gdb.base/maint-print-frame-id.exp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/maint-print-frame-id.exp b/gdb/testsuite/gdb.base/maint-print-frame-id.exp new file mode 100644 index 0000000..395927a --- /dev/null +++ b/gdb/testsuite/gdb.base/maint-print-frame-id.exp @@ -0,0 +1,68 @@ +# Copyright 2022 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/>. + +# Test the 'maint print frame-id' command. + +standard_testfile + +if {[prepare_for_testing "failed to prepare" $testfile \ + $srcfile {debug}]} { + return -1 +} + +if ![runto_main] then { + return -1 +} + +gdb_breakpoint foo +gdb_continue_to_breakpoint "run to foo" + +proc get_frame_id { level } { + set id "**unknown**" + + gdb_test_multiple "maint print frame-id ${level}" "" { + -re "^maint print frame-id\[^\r\n\]+\r\n" { + exp_continue + } + + -wrap -re "^frame-id for frame #\[0-9\]+: (\[^\r\n\]+)" { + set id $expect_out(1,string) + pass $gdb_test_name + } + } + + return $id +} + +# Get the frame-id for each frame using the frame level. +array set ids {} +with_test_prefix "get id by level" { + for { set i 0 } { $i < 4 } { incr i } { + set ids($i) [get_frame_id $i] + } +} + +# Now get the frame-id of the currently selected frame, and check it +# matches the frame-id we got earlier. Then move up the stack, +# selecting a new frame. +for { set i 0 } { $i < 4 } { incr i } { + with_test_prefix "frame $i is current" { + set id [get_frame_id ""] + gdb_assert { [string equal $id $ids($i)] } \ + "check frame-id matches" + } + gdb_test "up" ".*" \ + "move up from frame $i" +} |