xref: /llvm-project/lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py (revision f732157a9d067e4d300905c831a964222e0eadee)
1a758c9f7SMed Ismail Bennaniimport os, struct, signal
2a758c9f7SMed Ismail Bennani
3a758c9f7SMed Ismail Bennanifrom typing import Any, Dict
4a758c9f7SMed Ismail Bennani
5a758c9f7SMed Ismail Bennaniimport lldb
6a758c9f7SMed Ismail Bennanifrom lldb.plugins.scripted_process import ScriptedProcess
7a758c9f7SMed Ismail Bennanifrom lldb.plugins.scripted_process import ScriptedThread
8a758c9f7SMed Ismail Bennani
92238dcc3SJonas Devlieghere
10b3a835e1SMed Ismail Bennaniclass DummyStopHook:
11*f732157aSMed Ismail Bennani    def __init__(self, target, args):
12b3a835e1SMed Ismail Bennani        self.target = target
13b3a835e1SMed Ismail Bennani        self.args = args
14b3a835e1SMed Ismail Bennani
15b3a835e1SMed Ismail Bennani    def handle_stop(self, exe_ctx, stream):
16b3a835e1SMed Ismail Bennani        print("My DummyStopHook triggered. Printing args: \n%s" % self.args)
17b3a835e1SMed Ismail Bennani        sp = exe_ctx.process.GetScriptedImplementation()
18b3a835e1SMed Ismail Bennani        sp.handled_stop = True
19b3a835e1SMed Ismail Bennani
20a758c9f7SMed Ismail Bennaniclass DummyScriptedProcess(ScriptedProcess):
21f190ec68SMed Ismail Bennani    memory = None
22f190ec68SMed Ismail Bennani
23bb4ccc66SMed Ismail Bennani    def __init__(self, exe_ctx: lldb.SBExecutionContext, args: lldb.SBStructuredData):
24bb4ccc66SMed Ismail Bennani        super().__init__(exe_ctx, args)
25c3ca2c6bSMed Ismail Bennani        self.threads[0] = DummyScriptedThread(self, None)
26f190ec68SMed Ismail Bennani        self.memory = {}
27f190ec68SMed Ismail Bennani        addr = 0x500000000
28a3d4f739SMed Ismail Bennani        debugger = self.target.GetDebugger()
29a3d4f739SMed Ismail Bennani        index = debugger.GetIndexOfTarget(self.target)
30f190ec68SMed Ismail Bennani        self.memory[addr] = "Hello, target " + str(index)
31b3a835e1SMed Ismail Bennani        self.handled_stop = False
32f190ec68SMed Ismail Bennani
332238dcc3SJonas Devlieghere    def read_memory_at_address(
342238dcc3SJonas Devlieghere        self, addr: int, size: int, error: lldb.SBError
352238dcc3SJonas Devlieghere    ) -> lldb.SBData:
36a758c9f7SMed Ismail Bennani        data = lldb.SBData().CreateDataFromCString(
372238dcc3SJonas Devlieghere            self.target.GetByteOrder(), self.target.GetCodeByteSize(), self.memory[addr]
382238dcc3SJonas Devlieghere        )
397e01924eSMed Ismail Bennani
40a758c9f7SMed Ismail Bennani        return data
41a758c9f7SMed Ismail Bennani
42f190ec68SMed Ismail Bennani    def write_memory_at_address(self, addr, data, error):
43f190ec68SMed Ismail Bennani        self.memory[addr] = data.GetString(error, 0)
44f190ec68SMed Ismail Bennani        return len(self.memory[addr]) + 1
45f190ec68SMed Ismail Bennani
46a758c9f7SMed Ismail Bennani    def get_loaded_images(self):
47a758c9f7SMed Ismail Bennani        return self.loaded_images
48a758c9f7SMed Ismail Bennani
49a758c9f7SMed Ismail Bennani    def get_process_id(self) -> int:
50a758c9f7SMed Ismail Bennani        return 42
51a758c9f7SMed Ismail Bennani
52a758c9f7SMed Ismail Bennani    def should_stop(self) -> bool:
53a758c9f7SMed Ismail Bennani        return True
54a758c9f7SMed Ismail Bennani
55a758c9f7SMed Ismail Bennani    def is_alive(self) -> bool:
56a758c9f7SMed Ismail Bennani        return True
57a758c9f7SMed Ismail Bennani
58a758c9f7SMed Ismail Bennani    def get_scripted_thread_plugin(self):
59a758c9f7SMed Ismail Bennani        return DummyScriptedThread.__module__ + "." + DummyScriptedThread.__name__
60a758c9f7SMed Ismail Bennani
61c1928033SMed Ismail Bennani    def my_super_secret_method(self):
622238dcc3SJonas Devlieghere        if hasattr(self, "my_super_secret_member"):
63c1928033SMed Ismail Bennani            return self.my_super_secret_member
64c1928033SMed Ismail Bennani        else:
65c1928033SMed Ismail Bennani            return None
66c1928033SMed Ismail Bennani
67a758c9f7SMed Ismail Bennani
68a758c9f7SMed Ismail Bennaniclass DummyScriptedThread(ScriptedThread):
69738621d0SMed Ismail Bennani    def __init__(self, process, args):
70738621d0SMed Ismail Bennani        super().__init__(process, args)
712238dcc3SJonas Devlieghere        self.frames.append({"pc": 0x0100001B00})
72a758c9f7SMed Ismail Bennani
73a758c9f7SMed Ismail Bennani    def get_thread_id(self) -> int:
74a758c9f7SMed Ismail Bennani        return 0x19
75a758c9f7SMed Ismail Bennani
76a758c9f7SMed Ismail Bennani    def get_name(self) -> str:
77a758c9f7SMed Ismail Bennani        return DummyScriptedThread.__name__ + ".thread-1"
78a758c9f7SMed Ismail Bennani
79a758c9f7SMed Ismail Bennani    def get_state(self) -> int:
80a758c9f7SMed Ismail Bennani        return lldb.eStateStopped
81a758c9f7SMed Ismail Bennani
82a758c9f7SMed Ismail Bennani    def get_stop_reason(self) -> Dict[str, Any]:
838f407b8eSMed Ismail Bennani        return {"type": lldb.eStopReasonTrace, "data": {}}
84a758c9f7SMed Ismail Bennani
85a758c9f7SMed Ismail Bennani    def get_register_context(self) -> str:
86a758c9f7SMed Ismail Bennani        return struct.pack(
872238dcc3SJonas Devlieghere            "21Q",
882238dcc3SJonas Devlieghere            1,
892238dcc3SJonas Devlieghere            2,
902238dcc3SJonas Devlieghere            3,
912238dcc3SJonas Devlieghere            4,
922238dcc3SJonas Devlieghere            5,
932238dcc3SJonas Devlieghere            6,
942238dcc3SJonas Devlieghere            7,
952238dcc3SJonas Devlieghere            8,
962238dcc3SJonas Devlieghere            9,
972238dcc3SJonas Devlieghere            10,
982238dcc3SJonas Devlieghere            11,
992238dcc3SJonas Devlieghere            12,
1002238dcc3SJonas Devlieghere            13,
1012238dcc3SJonas Devlieghere            14,
1022238dcc3SJonas Devlieghere            15,
1032238dcc3SJonas Devlieghere            16,
1042238dcc3SJonas Devlieghere            17,
1052238dcc3SJonas Devlieghere            18,
1062238dcc3SJonas Devlieghere            19,
1072238dcc3SJonas Devlieghere            20,
1082238dcc3SJonas Devlieghere            21,
1092238dcc3SJonas Devlieghere        )
110a758c9f7SMed Ismail Bennani
111a758c9f7SMed Ismail Bennani
112a758c9f7SMed Ismail Bennanidef __lldb_init_module(debugger, dict):
113b3a835e1SMed Ismail Bennani    # This is used when loading the script in an interactive debug session to
114b3a835e1SMed Ismail Bennani    # automatically, register the stop-hook and launch the scripted process.
1152238dcc3SJonas Devlieghere    if not "SKIP_SCRIPTED_PROCESS_LAUNCH" in os.environ:
116a758c9f7SMed Ismail Bennani        debugger.HandleCommand(
117b3a835e1SMed Ismail Bennani            "target stop-hook add -k first -v 1 -k second -v 2 -P %s.%s"
118b3a835e1SMed Ismail Bennani            % (__name__, DummyStopHook.__name__)
119b3a835e1SMed Ismail Bennani        )
120b3a835e1SMed Ismail Bennani        debugger.HandleCommand(
1212238dcc3SJonas Devlieghere            "process launch -C %s.%s" % (__name__, DummyScriptedProcess.__name__)
1222238dcc3SJonas Devlieghere        )
123a758c9f7SMed Ismail Bennani    else:
1242238dcc3SJonas Devlieghere        print(
1252238dcc3SJonas Devlieghere            "Name of the class that will manage the scripted process: '%s.%s'"
1262238dcc3SJonas Devlieghere            % (__name__, DummyScriptedProcess.__name__)
1272238dcc3SJonas Devlieghere        )
128b3a835e1SMed Ismail Bennani        print(
129b3a835e1SMed Ismail Bennani            "Name of the class that will manage the stop-hook: '%s.%s'"
130b3a835e1SMed Ismail Bennani            % (__name__, DummyStopHook.__name__)
131b3a835e1SMed Ismail Bennani        )
132