| import os, struct, signal | |
| from typing import Any, Dict | |
| import lldb | |
| from lldb.plugins.scripted_process import ScriptedProcess | |
| from lldb.plugins.scripted_process import ScriptedThread | |
| class InvalidScriptedProcess(ScriptedProcess): | |
| def __init__(self, exe_ctx: lldb.SBExecutionContext, args: lldb.SBStructuredData): | |
| super().__init__(exe_ctx, args) | |
| self.threads[0] = InvalidScriptedThread(self, None) | |
| def read_memory_at_address( | |
| self, addr: int, size: int, error: lldb.SBError | |
| ) -> lldb.SBData: | |
| error.SetErrorString("This is an invalid scripted process!") | |
| return lldb.SBData() | |
| def get_loaded_images(self): | |
| return self.loaded_images | |
| def get_process_id(self) -> int: | |
| return 666 | |
| def should_stop(self) -> bool: | |
| return True | |
| def is_alive(self) -> bool: | |
| return True | |
| def get_scripted_thread_plugin(self): | |
| return InvalidScriptedThread.__module__ + "." + InvalidScriptedThread.__name__ | |
| class InvalidScriptedThread(ScriptedThread): | |
| def __init__(self, process, args): | |
| super().__init__(process, args) | |
| def get_thread_id(self) -> int: | |
| return 0x19 | |
| def get_name(self) -> str: | |
| return InvalidScriptedThread.__name__ + ".thread-1" | |
| def get_state(self) -> int: | |
| return lldb.eStateInvalid | |
| def get_stop_reason(self) -> Dict[str, Any]: | |
| return {"type": lldb.eStopReasonSignal, "data": {"signal": signal.SIGTRAP}} | |
| def get_register_context(self) -> str: | |
| return None | |
| def __lldb_init_module(debugger, dict): | |
| if not "SKIP_SCRIPTED_PROCESS_LAUNCH" in os.environ: | |
| debugger.HandleCommand( | |
| "process launch -C %s.%s" % (__name__, InvalidScriptedProcess.__name__) | |
| ) | |
| else: | |
| print( | |
| "Name of the class that will manage the scripted process: '%s.%s'" | |
| % (__name__, InvalidScriptedProcess.__name__) | |
| ) |