| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #!/usr/bin/env python3
- #
- # Copyright (C) 2021 XiaoMi Corporation. All rights reserved.
- # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- #
- import os
- import gdb
- # Get object file path from environment variable or use default value
- path_objs = os.getenv("OBJ_PATH", "~/objects/")
- # Expand user directory symbol (~)
- path_objs = os.path.expanduser(path_objs)
- print(f"Object files will be loaded from: {path_objs} on localhost")
- def add_symbol_with_aot_info(aot_module_info):
- """Add symbol file with AOT information to GDB and list current breakpoints."""
- try:
- text_addr = aot_module_info.get("code")
- file_name = aot_module_info.get("name")
- if not text_addr or not file_name:
- print("Error: 'code' or 'name' missing in AOT module info.")
- return
- # Extract base file name without extension
- file_name_without_extension, _ = os.path.splitext(file_name)
- # Remove directory part if present
- file_name = os.path.basename(file_name_without_extension)
- # Add .obj extension to the file name
- file_name = file_name + ".obj"
- # Construct the path for the symbol file
- path_symfile = os.path.join(path_objs, file_name)
- # Construct the command to add the symbol file
- cmd = f"add-symbol-file {path_symfile} {text_addr}"
- gdb.execute(cmd)
- # Print current breakpoints
- breakpoints = gdb.execute("info breakpoints", to_string=True)
- print("Current breakpoints:", breakpoints)
- except gdb.error as e:
- print(f"GDB error: {e}")
- except Exception as e:
- print(f"Unexpected error: {e}")
- class ReadGDynamicAotModule(gdb.Command):
- """Command to read the g_dynamic_aot_module structure and extract information."""
- def __init__(self):
- super(self.__class__, self).__init__("read_gda", gdb.COMMAND_USER)
- def invoke(self, args, from_tty):
- """Retrieve and process the g_dynamic_aot_module structure."""
- try:
- aot_module = gdb.parse_and_eval("g_dynamic_aot_module")
- aot_module_info = {}
- # Ensure aot_module is a pointer and dereference it
- if aot_module.type.code == gdb.TYPE_CODE_PTR:
- aot_module = aot_module.dereference()
- # Check if it's a structure type
- if aot_module.type.strip_typedefs().code == gdb.TYPE_CODE_STRUCT:
- for field in aot_module.type.fields():
- field_name = field.name
- var = aot_module[field_name]
- if field_name == "name":
- aot_module_info["name"] = var.string()
- elif field_name == "code":
- aot_module_info["code"] = str(var)
- if "name" in aot_module_info and "code" in aot_module_info:
- add_symbol_with_aot_info(aot_module_info)
- else:
- print("Could not find 'name' or 'code' in Aot_module.")
- else:
- print("Aot_module is not of struct type.")
- else:
- print("Aot_module is not a pointer type.")
- except gdb.error as e:
- print(f"An error occurred: {e}")
- def init():
- """Initialize environment and set up debugger."""
- # Register the command to gdb
- ReadGDynamicAotModule()
- # Set a breakpoint at function __enable_dynamic_aot_debug
- breakpoint = gdb.Breakpoint("__enable_dynamic_aot_debug")
- # Attach the self-defined command to the created breakpoint, read_gda means read global dynamic aot info.
- breakpoint.commands = "read_gda"
- init()
|