From 50eb60e6bfedbdad2dda30fa5ce7fe3ce83f7748 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 20 Apr 2010 22:32:07 +0000 Subject: Merged revisions 80288 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r80288 | victor.stinner | 2010-04-21 00:28:31 +0200 (mer., 21 avril 2010) | 2 lines Issue #8437: Fix test_gdb failures, patch written by Dave Malcolm ........ --- Lib/test/test_gdb.py | 19 +++++++++++++++++++ Misc/NEWS | 2 ++ Tools/gdb/libpython.py | 30 +++++++++++++++--------------- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index 2f50b88..5b3c3df 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -31,6 +31,19 @@ gdbpy_version, _ = p.communicate() if gdbpy_version == b'': raise unittest.SkipTest("gdb not built with embedded python support") +def gdb_has_frame_select(): + # Does this build of gdb have gdb.Frame.select ? + cmd = "--eval-command=python print(dir(gdb.Frame))" + p = subprocess.Popen(["gdb", "--batch", cmd], + stdout=subprocess.PIPE) + stdout, _ = p.communicate() + m = re.match(br'.*\[(.*)\].*', stdout) + if not m: + raise unittest.SkipTest("Unable to parse output from gdb.Frame.select test") + gdb_frame_dir = m.group(1).split(b', ') + return b"'select'" in gdb_frame_dir + +HAS_PYUP_PYDOWN = gdb_has_frame_select() class DebuggerTests(unittest.TestCase): @@ -554,6 +567,7 @@ class PyListTests(DebuggerTests): bt) class StackNavigationTests(DebuggerTests): + @unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands") def test_pyup_command(self): 'Verify that the "py-up" command works' bt = self.get_stack_trace(script='Lib/test/test_gdb_sample.py', @@ -564,6 +578,7 @@ class StackNavigationTests(DebuggerTests): baz\(a, b, c\) $''') + @unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands") def test_down_at_bottom(self): 'Verify handling of "py-down" at the bottom of the stack' bt = self.get_stack_trace(script='Lib/test/test_gdb_sample.py', @@ -571,6 +586,7 @@ $''') self.assertEndsWith(bt, 'Unable to find a newer python frame\n') + @unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands") def test_up_at_top(self): 'Verify handling of "py-up" at the top of the stack' bt = self.get_stack_trace(script='Lib/test/test_gdb_sample.py', @@ -578,6 +594,7 @@ $''') self.assertEndsWith(bt, 'Unable to find an older python frame\n') + @unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands") def test_up_then_down(self): 'Verify "py-up" followed by "py-down"' bt = self.get_stack_trace(script='Lib/test/test_gdb_sample.py', @@ -613,6 +630,7 @@ class PyPrintTests(DebuggerTests): self.assertMultilineMatches(bt, r".*\nlocal 'args' = \(1, 2, 3\)\n.*") + @unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands") def test_print_after_up(self): bt = self.get_stack_trace(script='Lib/test/test_gdb_sample.py', cmds_after_breakpoint=['py-up', 'py-print c', 'py-print b', 'py-print a']) @@ -638,6 +656,7 @@ class PyLocalsTests(DebuggerTests): self.assertMultilineMatches(bt, r".*\nargs = \(1, 2, 3\)\n.*") + @unittest.skipUnless(HAS_PYUP_PYDOWN, "test requires py-up/py-down commands") def test_locals_after_up(self): bt = self.get_stack_trace(script='Lib/test/test_gdb_sample.py', cmds_after_breakpoint=['py-up', 'py-locals']) diff --git a/Misc/NEWS b/Misc/NEWS index eaf2452..b73ffba 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -318,6 +318,8 @@ C-API Library ------- +- Issue #8437: Fix test_gdb failures, patch written by Dave Malcolm + - Issue #6547: Added the ignore_dangling_symlinks option to shutil.copytree. - Issue #1540112: Now allowing the choice of a copy function in diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index 26b0704..3050c89 100644 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -1133,18 +1133,17 @@ class Frame(object): return index def is_evalframeex(self): - if self._gdbframe.function(): - if self._gdbframe.function().name == 'PyEval_EvalFrameEx': - ''' - I believe we also need to filter on the inline - struct frame_id.inline_depth, only regarding frames with - an inline depth of 0 as actually being this function - - So we reject those with type gdb.INLINE_FRAME - ''' - if self._gdbframe.type() == gdb.NORMAL_FRAME: - # We have a PyEval_EvalFrameEx frame: - return True + if self._gdbframe.name() == 'PyEval_EvalFrameEx': + ''' + I believe we also need to filter on the inline + struct frame_id.inline_depth, only regarding frames with + an inline depth of 0 as actually being this function + + So we reject those with type gdb.INLINE_FRAME + ''' + if self._gdbframe.type() == gdb.NORMAL_FRAME: + # We have a PyEval_EvalFrameEx frame: + return True return False @@ -1294,8 +1293,6 @@ class PyUp(gdb.Command): def invoke(self, args, from_tty): move_in_stack(move_up=True) -PyUp() - class PyDown(gdb.Command): 'Select and print the python stack frame called by this one (if any)' def __init__(self): @@ -1308,7 +1305,10 @@ class PyDown(gdb.Command): def invoke(self, args, from_tty): move_in_stack(move_up=False) -PyDown() +# Not all builds of gdb have gdb.Frame.select +if hasattr(gdb.Frame, 'select'): + PyUp() + PyDown() class PyBacktrace(gdb.Command): 'Display the current python frame and all the frames within its call stack (if any)' -- cgit v0.12