1# Copyright (C) 2021-2023 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16import gdb 17from gdb.unwinder import Unwinder 18 19 20class FrameId(object): 21 def __init__(self, sp, pc): 22 self._sp = sp 23 self._pc = pc 24 25 @property 26 def sp(self): 27 return self._sp 28 29 @property 30 def pc(self): 31 return self._pc 32 33 34class TestUnwinder(Unwinder): 35 def __init__(self): 36 Unwinder.__init__(self, "show level") 37 38 def __call__(self, pending_frame): 39 pc_desc = pending_frame.architecture().registers().find("pc") 40 pc = pending_frame.read_register(pc_desc) 41 42 block = gdb.block_for_pc(int(pc)) 43 if block is None: 44 return None 45 func = block.function 46 if func is None: 47 return None 48 49 print("Func %s, Level %d" % (str(func), pending_frame.level())) 50 51 # This unwinder never claims any frames. 52 return None 53 54 55gdb.unwinder.register_unwinder(None, TestUnwinder(), True) 56