bpo-40019: Skip test_gdb if Python was optimized (GH-19081)
test_gdb now skips tests if it detects that gdb failed to read debug
information because the Python binary is optimized.
(cherry picked from commit 7bf069b611
)
Co-authored-by: Victor Stinner <vstinner@python.org>
This commit is contained in:
parent
fb6e04b5f1
commit
4ced9a7611
|
@ -230,6 +230,15 @@ class DebuggerTests(unittest.TestCase):
|
|||
" because the Program Counter is"
|
||||
" not present")
|
||||
|
||||
# bpo-40019: Skip the test if gdb failed to read debug information
|
||||
# because the Python binary is optimized.
|
||||
for pattern in (
|
||||
'(frame information optimized out)',
|
||||
'Unable to read information on python frame',
|
||||
):
|
||||
if pattern in out:
|
||||
raise unittest.SkipTest(f"{pattern!r} found in gdb output")
|
||||
|
||||
return out
|
||||
|
||||
def get_gdb_repr(self, source,
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
test_gdb now skips tests if it detects that gdb failed to read debug
|
||||
information because the Python binary is optimized.
|
|
@ -99,6 +99,8 @@ hexdigits = "0123456789abcdef"
|
|||
|
||||
ENCODING = locale.getpreferredencoding()
|
||||
|
||||
FRAME_INFO_OPTIMIZED_OUT = '(frame information optimized out)'
|
||||
UNABLE_READ_INFO_PYTHON_FRAME = 'Unable to read information on python frame'
|
||||
EVALFRAME = '_PyEval_EvalFrameDefault'
|
||||
|
||||
class NullPyObjectPtr(RuntimeError):
|
||||
|
@ -918,7 +920,7 @@ class PyFrameObjectPtr(PyObjectPtr):
|
|||
def filename(self):
|
||||
'''Get the path of the current Python source file, as a string'''
|
||||
if self.is_optimized_out():
|
||||
return '(frame information optimized out)'
|
||||
return FRAME_INFO_OPTIMIZED_OUT
|
||||
return self.co_filename.proxyval(set())
|
||||
|
||||
def current_line_num(self):
|
||||
|
@ -949,7 +951,7 @@ class PyFrameObjectPtr(PyObjectPtr):
|
|||
'''Get the text of the current source line as a string, with a trailing
|
||||
newline character'''
|
||||
if self.is_optimized_out():
|
||||
return '(frame information optimized out)'
|
||||
return FRAME_INFO_OPTIMIZED_OUT
|
||||
|
||||
lineno = self.current_line_num()
|
||||
if lineno is None:
|
||||
|
@ -970,7 +972,7 @@ class PyFrameObjectPtr(PyObjectPtr):
|
|||
|
||||
def write_repr(self, out, visited):
|
||||
if self.is_optimized_out():
|
||||
out.write('(frame information optimized out)')
|
||||
out.write(FRAME_INFO_OPTIMIZED_OUT)
|
||||
return
|
||||
lineno = self.current_line_num()
|
||||
lineno = str(lineno) if lineno is not None else "?"
|
||||
|
@ -993,7 +995,7 @@ class PyFrameObjectPtr(PyObjectPtr):
|
|||
|
||||
def print_traceback(self):
|
||||
if self.is_optimized_out():
|
||||
sys.stdout.write(' (frame information optimized out)\n')
|
||||
sys.stdout.write(' %s\n' % FRAME_INFO_OPTIMIZED_OUT)
|
||||
return
|
||||
visited = set()
|
||||
lineno = self.current_line_num()
|
||||
|
@ -1744,7 +1746,7 @@ class PyList(gdb.Command):
|
|||
|
||||
pyop = frame.get_pyop()
|
||||
if not pyop or pyop.is_optimized_out():
|
||||
print('Unable to read information on python frame')
|
||||
print(UNABLE_READ_INFO_PYTHON_FRAME)
|
||||
return
|
||||
|
||||
filename = pyop.filename()
|
||||
|
@ -1904,7 +1906,7 @@ class PyPrint(gdb.Command):
|
|||
|
||||
pyop_frame = frame.get_pyop()
|
||||
if not pyop_frame:
|
||||
print('Unable to read information on python frame')
|
||||
print(UNABLE_READ_INFO_PYTHON_FRAME)
|
||||
return
|
||||
|
||||
pyop_var, scope = pyop_frame.get_var_by_name(name)
|
||||
|
@ -1938,7 +1940,7 @@ class PyLocals(gdb.Command):
|
|||
|
||||
pyop_frame = frame.get_pyop()
|
||||
if not pyop_frame:
|
||||
print('Unable to read information on python frame')
|
||||
print(UNABLE_READ_INFO_PYTHON_FRAME)
|
||||
return
|
||||
|
||||
for pyop_name, pyop_value in pyop_frame.iter_locals():
|
||||
|
|
Loading…
Reference in New Issue