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.
This commit is contained in:
Victor Stinner 2020-03-20 08:23:26 +01:00 committed by GitHub
parent a36adfa6bb
commit 7bf069b611
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 7 deletions

View File

@ -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,

View File

@ -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.

View File

@ -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():