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
23namespace lldb_private {
24
25class HostProcess;
26class HostThread;
27class ProcessLaunchInfo;
28class ProcessAttachInfo;
29
30class ProcessWindowsData {
31public:
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
48class ProcessDebugger {
49
50public:
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
65protected:
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
96protected:
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

source code of lldb/source/Plugins/Process/Windows/Common/ProcessDebugger.h