xref: /llvm-project/lldb/source/Plugins/Process/Windows/Common/ProcessDebugger.h (revision 5fbcf677347e38718461496d9e9e184a7a30c3fb)
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:
ProcessWindowsData(bool stop_at_entry)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 
~ProcessWindowsData()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