1ec456ba9SMed Ismail Bennanifrom abc import abstractmethod 2ec456ba9SMed Ismail Bennani 3ec456ba9SMed Ismail Bennaniimport lldb 4ec456ba9SMed Ismail Bennaniimport struct 5ec456ba9SMed Ismail Bennani 6ec456ba9SMed Ismail Bennanifrom lldb.plugins.scripted_process import ScriptedThread 7ec456ba9SMed Ismail Bennani 8ec456ba9SMed Ismail Bennani 9ec456ba9SMed Ismail Bennaniclass OperatingSystem(ScriptedThread): 10ec456ba9SMed Ismail Bennani """ 11ec456ba9SMed Ismail Bennani Class that provides data for an instance of a LLDB 'OperatingSystemPython' plug-in class. 12ec456ba9SMed Ismail Bennani 13*59f4267cSMed Ismail Bennani .. code-block:: python 14*59f4267cSMed Ismail Bennani 15ec456ba9SMed Ismail Bennani thread_info = { 16ec456ba9SMed Ismail Bennani "tid": tid, 17ec456ba9SMed Ismail Bennani "name": "four", 18ec456ba9SMed Ismail Bennani "queue": "queue4", 19ec456ba9SMed Ismail Bennani "state": "stopped", 20ec456ba9SMed Ismail Bennani "stop_reason": "none", 21ec456ba9SMed Ismail Bennani "core" : 2 22ec456ba9SMed Ismail Bennani } 23ec456ba9SMed Ismail Bennani 24ec456ba9SMed Ismail Bennani - tid : thread ID (mandatory) 25ec456ba9SMed Ismail Bennani - name : thread name (optional key/value pair) 26ec456ba9SMed Ismail Bennani - queue : thread dispatch queue name (optional key/value pair) 27ec456ba9SMed Ismail Bennani - state : thread state (mandatory, set to 'stopped' for now) 28ec456ba9SMed Ismail Bennani - core : the index of the core (lldb) thread that this OS Thread should shadow 29ec456ba9SMed Ismail Bennani - stop_reason : thread stop reason. (mandatory, usually set to 'none') 30ec456ba9SMed Ismail Bennani Possible values include: 31ec456ba9SMed Ismail Bennani - 'breakpoint': thread is stopped at a breakpoint 32ec456ba9SMed Ismail Bennani - 'none': thread is stopped because the process is stopped 33ec456ba9SMed Ismail Bennani - 'trace': thread is stopped after single stepping 34ec456ba9SMed Ismail Bennani The usual value for this while threads are in memory is 'none' 35ec456ba9SMed Ismail Bennani - register_data_addr : the address of the register data in memory (optional key/value pair) 36ec456ba9SMed Ismail Bennani Specifying this key/value pair for a thread will avoid a call to get_register_data() 37ec456ba9SMed Ismail Bennani and can be used when your registers are in a thread context structure that is contiguous 38ec456ba9SMed Ismail Bennani in memory. Don't specify this if your register layout in memory doesn't match the layout 39ec456ba9SMed Ismail Bennani described by the dictionary returned from a call to the get_register_info() method. 40ec456ba9SMed Ismail Bennani """ 41ec456ba9SMed Ismail Bennani 42ec456ba9SMed Ismail Bennani def __init__(self, process): 43ec456ba9SMed Ismail Bennani """Initialization needs a valid lldb.SBProcess object. This plug-in 44ec456ba9SMed Ismail Bennani will get created after a live process is valid and has stopped for the 45ec456ba9SMed Ismail Bennani first time. 46ec456ba9SMed Ismail Bennani 47ec456ba9SMed Ismail Bennani Args: 48ec456ba9SMed Ismail Bennani process (lldb.SBProcess): The process owning this thread. 49ec456ba9SMed Ismail Bennani """ 50ec456ba9SMed Ismail Bennani self.registers = None 51ec456ba9SMed Ismail Bennani super().__init__(process, None) 52ec456ba9SMed Ismail Bennani self.registers = self.register_info 53ec456ba9SMed Ismail Bennani self.threads = [] 54ec456ba9SMed Ismail Bennani 55ec456ba9SMed Ismail Bennani def create_thread(self, tid, context): 56ec456ba9SMed Ismail Bennani """Lazily create an operating system thread using a thread information 57ec456ba9SMed Ismail Bennani dictionary and an optional operating system thread context address. 58ec456ba9SMed Ismail Bennani This method is called manually, using the SBAPI 59ec456ba9SMed Ismail Bennani `lldb.SBProcess.CreateOSPluginThread` affordance. 60ec456ba9SMed Ismail Bennani 61ec456ba9SMed Ismail Bennani Args: 62ec456ba9SMed Ismail Bennani tid (int): Thread ID to get `thread_info` dictionary for. 63ec456ba9SMed Ismail Bennani context (int): Address of the operating system thread struct. 64ec456ba9SMed Ismail Bennani 65ec456ba9SMed Ismail Bennani Returns: 66ec456ba9SMed Ismail Bennani Dict: The `thread_info` dictionary containing the various information 67ec456ba9SMed Ismail Bennani for lldb to create a Thread object and add it to the process thread list. 68ec456ba9SMed Ismail Bennani """ 69ec456ba9SMed Ismail Bennani return None 70ec456ba9SMed Ismail Bennani 71ec456ba9SMed Ismail Bennani @abstractmethod 72ec456ba9SMed Ismail Bennani def get_thread_info(self): 73ec456ba9SMed Ismail Bennani """Get the list of operating system threads. This method gets called 74ec456ba9SMed Ismail Bennani automatically every time the process stops and it needs to update its 75ec456ba9SMed Ismail Bennani thread list. 76ec456ba9SMed Ismail Bennani 77ec456ba9SMed Ismail Bennani Returns: 78ec456ba9SMed Ismail Bennani List[thread_info]: A list of `os_thread` dictionaries 79ec456ba9SMed Ismail Bennani containing at least for each entry, the thread id, it's name, 80ec456ba9SMed Ismail Bennani queue, state, stop reason. It can also contain a 81ec456ba9SMed Ismail Bennani `register_data_addr`. The list can be empty. 82ec456ba9SMed Ismail Bennani """ 83ec456ba9SMed Ismail Bennani pass 84ec456ba9SMed Ismail Bennani 85ec456ba9SMed Ismail Bennani @abstractmethod 86ec456ba9SMed Ismail Bennani def get_register_data(self, tid): 87ec456ba9SMed Ismail Bennani """Get the operating system thread register context for given a thread 88ec456ba9SMed Ismail Bennani id. This method is called when unwinding the stack of one of the 89ec456ba9SMed Ismail Bennani operating system threads. 90ec456ba9SMed Ismail Bennani 91ec456ba9SMed Ismail Bennani Args: 92ec456ba9SMed Ismail Bennani tid (int): Thread ID to get register context for. 93ec456ba9SMed Ismail Bennani 94ec456ba9SMed Ismail Bennani Returns: 95ec456ba9SMed Ismail Bennani str: A byte representing all register's value. 96ec456ba9SMed Ismail Bennani """ 97ec456ba9SMed Ismail Bennani pass 98ec456ba9SMed Ismail Bennani 99ec456ba9SMed Ismail Bennani def get_register_context(self): 100ec456ba9SMed Ismail Bennani pass 101ec456ba9SMed Ismail Bennani 102ec456ba9SMed Ismail Bennani def get_stop_reason(self): 103ec456ba9SMed Ismail Bennani pass 104