diff options
Diffstat (limited to 'gdb/testsuite/gdb.python/py-recurse-unwind.py')
-rw-r--r-- | gdb/testsuite/gdb.python/py-recurse-unwind.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.python/py-recurse-unwind.py b/gdb/testsuite/gdb.python/py-recurse-unwind.py new file mode 100644 index 00000000000..1da7aca9339 --- /dev/null +++ b/gdb/testsuite/gdb.python/py-recurse-unwind.py @@ -0,0 +1,68 @@ +# Copyright (C) 2016 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/>. + +# This unwinder never does any unwinding. It'll (pretend to) "sniff" +# the frame and ultimately return None, indicating that actual unwinding +# should be performed by some other unwinder. +# +# But, prior to returning None, it will attempt to obtain the value +# associated with a symbol via a call to gdb.parse_and_eval(). In +# the course of doing this evaluation, GDB will potentially access +# some frames, leading to the possibility of a recursive invocation of +# this unwinder. If that should happen, code contained herein detects +# that and prints a message which will cause some of the associated +# tests to FAIL. + +import gdb +from gdb.unwinder import Unwinder + +class TestUnwinder(Unwinder): + + count = 0 + + @classmethod + def reset_count (cls): + cls.count = 0 + + @classmethod + def inc_count (cls): + cls.count += 1 + + def __init__(self): + Unwinder.__init__(self, "test unwinder") + self.recurse_level = 0 + + def __call__(self, pending_frame): + + + if self.recurse_level > 0: + gdb.write("TestUnwinder: Recursion detected - returning early.\n") + return None + + self.recurse_level += 1 + TestUnwinder.inc_count() + + try: + val = gdb.parse_and_eval("undefined_symbol") + + except Exception as arg: + pass + + self.recurse_level -= 1 + + return None + +gdb.unwinder.register_unwinder(None, TestUnwinder(), True) +gdb.write("Python script imported\n") |