1 | //===-- ProcessDebugger.h ---------------------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef liblldb_ProcessDebugger_h_ |
10 | #define liblldb_ProcessDebugger_h_ |
11 | |
12 | #include "lldb/Host/windows/windows.h" |
13 | |
14 | #include "lldb/Utility/Status.h" |
15 | #include "lldb/lldb-forward.h" |
16 | #include "lldb/lldb-types.h" |
17 | #include "llvm/Support/Mutex.h" |
18 | |
19 | #include "ForwardDecl.h" |
20 | #include <map> |
21 | #include <set> |
22 | |
23 | namespace lldb_private { |
24 | |
25 | class HostProcess; |
26 | class HostThread; |
27 | class ProcessLaunchInfo; |
28 | class ProcessAttachInfo; |
29 | |
30 | class ProcessWindowsData { |
31 | public: |
32 | ProcessWindowsData(bool stop_at_entry) : m_stop_at_entry(stop_at_entry) { |
33 | m_initial_stop_event = ::CreateEvent(nullptr, TRUE, FALSE, nullptr); |
34 | } |
35 | |
36 | ~ProcessWindowsData() { ::CloseHandle(m_initial_stop_event); } |
37 | |
38 | Status m_launch_error; |
39 | DebuggerThreadSP m_debugger; |
40 | // StopInfoSP m_pending_stop_info; |
41 | HANDLE m_initial_stop_event = nullptr; |
42 | bool m_initial_stop_received = false; |
43 | bool m_stop_at_entry; |
44 | std::map<lldb::tid_t, lldb::ThreadSP> m_new_threads; |
45 | std::set<lldb::tid_t> m_exited_threads; |
46 | }; |
47 | |
48 | class ProcessDebugger { |
49 | |
50 | public: |
51 | virtual ~ProcessDebugger(); |
52 | |
53 | virtual void OnExitProcess(uint32_t exit_code); |
54 | virtual void OnDebuggerConnected(lldb::addr_t image_base); |
55 | virtual ExceptionResult OnDebugException(bool first_chance, |
56 | const ExceptionRecord &record); |
57 | virtual void OnCreateThread(const HostThread &thread); |
58 | virtual void OnExitThread(lldb::tid_t thread_id, uint32_t exit_code); |
59 | virtual void OnLoadDll(const ModuleSpec &module_spec, |
60 | lldb::addr_t module_addr); |
61 | virtual void OnUnloadDll(lldb::addr_t module_addr); |
62 | virtual void OnDebugString(const std::string &string); |
63 | virtual void OnDebuggerError(const Status &error, uint32_t type); |
64 | |
65 | protected: |
66 | Status DetachProcess(); |
67 | |
68 | Status LaunchProcess(ProcessLaunchInfo &launch_info, |
69 | DebugDelegateSP delegate); |
70 | |
71 | Status AttachProcess(lldb::pid_t pid, const ProcessAttachInfo &attach_info, |
72 | DebugDelegateSP delegate); |
73 | |
74 | Status DestroyProcess(lldb::StateType process_state); |
75 | |
76 | Status HaltProcess(bool &caused_stop); |
77 | |
78 | Status GetMemoryRegionInfo(lldb::addr_t load_addr, |
79 | MemoryRegionInfo &range_info); |
80 | |
81 | Status ReadMemory(lldb::addr_t addr, void *buf, size_t size, |
82 | size_t &bytes_read); |
83 | |
84 | Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size, |
85 | size_t &bytes_written); |
86 | |
87 | Status AllocateMemory(size_t size, uint32_t permissions, lldb::addr_t &addr); |
88 | |
89 | Status DeallocateMemory(lldb::addr_t addr); |
90 | |
91 | lldb::pid_t GetDebuggedProcessId() const; |
92 | |
93 | Status WaitForDebuggerConnection(DebuggerThreadSP debugger, |
94 | HostProcess &process); |
95 | |
96 | protected: |
97 | llvm::sys::Mutex m_mutex; |
98 | std::unique_ptr<ProcessWindowsData> m_session_data; |
99 | }; |
100 | |
101 | } // namespace lldb_private |
102 | |
103 | #endif // #ifndef liblldb_ProcessDebugger_h_ |
104 | |