| ############################################################################ |
| # tools/pynuttx/nxgdb/__init__.py |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. The |
| # ASF licenses this file to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance with the |
| # License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations |
| # under the License. |
| # |
| ############################################################################ |
| |
| import importlib |
| import traceback |
| from os import path |
| |
| import gdb |
| |
| if __name__ == "__main__": |
| import sys |
| |
| gdb.write("Use nuttx/tools/pynuttx/gdbinit.py instead") |
| sys.exit(1) |
| |
| here = path.dirname(path.abspath(__file__)) |
| |
| |
| def register_commands(event): |
| if getattr(register_commands, "registered", False): |
| return |
| |
| register_commands.registered = True |
| |
| gdb.write(f"Registering NuttX GDB commands from {here}\n") |
| gdb.execute("set pagination off") |
| gdb.write("set pagination off\n") |
| gdb.execute("set python print-stack full") |
| gdb.write("set python print-stack full\n") |
| gdb.execute('handle SIGUSR1 "nostop" "pass" "noprint"') |
| gdb.write('"handle SIGUSR1 "nostop" "pass" "noprint"\n') |
| |
| def init_gdb_commands(m: str): |
| try: |
| module = importlib.import_module(f"{__package__}.{m}") |
| except Exception as e: |
| gdb.write(f"\x1b[31;1mIgnore module: {m}, error: {e}\n\x1b[m") |
| traceback.print_exc() |
| return |
| |
| for c in module.__dict__.values(): |
| if isinstance(c, type) and issubclass(c, gdb.Command): |
| try: |
| c() |
| except Exception as e: |
| gdb.write(f"\x1b[31;1mIgnore command: {c}, e: {e}\n\x1b[m") |
| |
| # import utils module |
| utils = importlib.import_module(f"{__package__}.utils") |
| modules = utils.gather_modules(here) |
| |
| # Register prefix commands firstly |
| init_gdb_commands("prefix") |
| modules.remove("prefix") |
| modules.remove("__init__") |
| |
| # Register all other modules |
| for m in modules: |
| init_gdb_commands(m) |
| |
| utils.check_version() |
| |
| |
| if len(gdb.objfiles()) == 0: |
| gdb.write("No objectfile, defer to register NuttX commands.\n") |
| gdb.events.new_objfile.connect(register_commands) |
| else: |
| register_commands(None) |