binutils-gdb/gdb/testsuite/gdb.python/py-pending-frame-level.exp
Andrew Burgess d52b800721 gdb/python: add PendingFrame.level and Frame.level methods
Add new methods to the PendingFrame and Frame classes to obtain the
stack frame level for each object.

The use of 'level' as the method name is consistent with the existing
attribute RecordFunctionSegment.level (though this is an attribute
rather than a method).

For Frame/PendingFrame I went with methods as these classes currently
only use methods, including for simple data like architecture, so I
want to be consistent with this interface.

gdb/ChangeLog:

	* NEWS: Mention the two new methods.
	* python/py-frame.c (frapy_level): New function.
	(frame_object_methods): Register 'level' method.
	* python/py-unwind.c (pending_framepy_level): New function.
	(pending_frame_object_methods): Register 'level' method.

gdb/doc/ChangeLog:

	* python.texi (Unwinding Frames in Python): Mention
	PendingFrame.level.
	(Frames In Python): Mention Frame.level.

gdb/testsuite/ChangeLog:

	* gdb.python/py-frame.exp: Add Frame.level tests.
	* gdb.python/py-pending-frame-level.c: New file.
	* gdb.python/py-pending-frame-level.exp: New file.
	* gdb.python/py-pending-frame-level.py: New file.
2021-06-21 16:20:08 +01:00

65 lines
2 KiB
Text

# Copyright (C) 2021 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 gdb.PendingFrame.level method.
load_lib gdb-python.exp
standard_testfile
if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } {
return -1
}
# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }
if ![runto_main] then {
fail "can't run to main"
return 0
}
set pyfile [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py]
gdb_breakpoint [gdb_get_line_number "Break here"]
gdb_continue_to_breakpoint "stop at test breakpoint"
# An initial look at the stack to ensure it is correct.
gdb_test_sequence "bt" "Initial backtrace" {
"\\r\\n#0 \[^\r\n\]* f0 \\(\\) at "
"\\r\\n#1 \[^\r\n\]* f1 \\(\\) at "
"\\r\\n#2 \[^\r\n\]* f2 \\(\\) at "
"\\r\\n#3 \[^\r\n\]* f3 \\(\\) at "
"\\r\\n#4 \[^\r\n\]* main \\(\\) at "
}
# Load the script containing the unwinder.
gdb_test_no_output "source ${pyfile}"\
"import python scripts"
# Now look at the stack again, we should see output from the Python
# unwinder mixed in.
gdb_test_sequence "bt" "Backtrace with extra Python output" {
"Func f0, Level 0"
"Func f1, Level 1"
"\\r\\n#0 \[^\r\n\]* f0 \\(\\) at "
"\\r\\n#1 \[^\r\n\]* f1 \\(\\) at "
"Func f2, Level 2"
"\\r\\n#2 \[^\r\n\]* f2 \\(\\) at "
"Func f3, Level 3"
"\\r\\n#3 \[^\r\n\]* f3 \\(\\) at "
"Func main, Level 4"
"\\r\\n#4 \[^\r\n\]* main \\(\\) at "
}