| import lldb |
| |
| |
| class Resolver: |
| got_files = 0 |
| func_list = [] |
| |
| def __init__(self, bkpt, extra_args, dict): |
| self.bkpt = bkpt |
| self.extra_args = extra_args |
| |
| Resolver.func_list = [] |
| Resolver.got_files = 0 |
| |
| def __callback__(self, sym_ctx): |
| print("Resolver callback called") |
| sym_name = "not_a_real_function_name" |
| sym_item = self.extra_args.GetValueForKey("symbol") |
| if sym_item.IsValid(): |
| sym_name = sym_item.GetStringValue(1000) |
| else: |
| print("Didn't have a value for key 'symbol'") |
| |
| if sym_ctx.compile_unit.IsValid(): |
| Resolver.got_files = 1 |
| else: |
| Resolver.got_files = 2 |
| |
| if sym_ctx.function.IsValid(): |
| Resolver.got_files = 3 |
| func_name = sym_ctx.function.GetName() |
| Resolver.func_list.append(func_name) |
| if sym_name == func_name: |
| self.bkpt.AddLocation(sym_ctx.function.GetStartAddress()) |
| return |
| |
| if sym_ctx.module.IsValid(): |
| print(f"Looking for {sym_name}") |
| sym = sym_ctx.module.FindSymbol(sym_name, lldb.eSymbolTypeCode) |
| if sym.IsValid(): |
| print(f"Adding location at {sym.GetStartAddress()} to {self.bkpt}") |
| self.bkpt.AddLocation(sym.GetStartAddress()) |
| print(f"After addition: {self.bkpt}") |
| else: |
| print("Didn't find it, however...") |
| |
| print(f"GotFiles: {Resolver.got_files}") |
| for func in Resolver.func_list: |
| print(f"Function: func") |
| |
| def get_short_help(self): |
| return "I am a python breakpoint resolver" |
| |
| |
| class ResolverModuleDepth(Resolver): |
| def __get_depth__(self): |
| return lldb.eSearchDepthModule |
| |
| def __callback__(self, sym_ctx): |
| print(f"About to call the Resolver callback for {self.bkpt}") |
| Resolver.__callback__(self, sym_ctx) |
| print("Called the callback for ResolverModuleDepth") |
| |
| |
| class ResolverCUDepth(Resolver): |
| def __get_depth__(self): |
| return lldb.eSearchDepthCompUnit |
| |
| def __callback__(self, sym_ctx): |
| Resolver.__callback__(self, sym_ctx) |
| |
| |
| class ResolverFuncDepth(Resolver): |
| def __get_depth__(self): |
| return lldb.eSearchDepthFunction |
| |
| def __callback__(self, sym_ctx): |
| Resolver.__callback__(self, sym_ctx) |
| |
| |
| class ResolverBadDepth(Resolver): |
| def __get_depth__(self): |
| return lldb.kLastSearchDepthKind + 1 |
| |
| def __callback__(self, sym_ctx): |
| Resolver.__callback__(self, sym_ctx) |