xref: /llvm-project/lldb/examples/python/templates/operating_system.py (revision 59f4267c8e0625c6583327be2db1608930f2d796)
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