wasm-micro-runtime/test-tools/dynamic-aot-debug/dynamic_aot_debug.py

105 lines
3.6 KiB
Python
Raw Normal View History

#!/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()