LLDB mainline
NativeProcessWindows.cpp
Go to the documentation of this file.
1//===-- NativeProcessWindows.cpp ------------------------------------------===//
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
10#include <psapi.h>
11
13#include "NativeThreadWindows.h"
22#include "lldb/Target/Process.h"
23#include "lldb/Utility/State.h"
24#include "llvm/Support/ConvertUTF.h"
25#include "llvm/Support/Errc.h"
26#include "llvm/Support/Error.h"
27#include "llvm/Support/Format.h"
28#include "llvm/Support/Threading.h"
29#include "llvm/Support/raw_ostream.h"
30
31#include "DebuggerThread.h"
32#include "ExceptionRecord.h"
33#include "ProcessWindowsLog.h"
34
35#include <tlhelp32.h>
36
37#pragma warning(disable : 4005)
38#include "winternl.h"
39#include <ntstatus.h>
40
41using namespace lldb;
42using namespace lldb_private;
43using namespace llvm;
44
45namespace lldb_private {
46
48 NativeDelegate &delegate,
49 llvm::Error &E)
51 launch_info.GetPTY().ReleasePrimaryFileDescriptor(),
52 delegate),
53 ProcessDebugger(), m_arch(launch_info.GetArchitecture()) {
54 ErrorAsOutParameter EOut(&E);
55 DebugDelegateSP delegate_sp(new NativeDebugDelegate(*this));
56 E = LaunchProcess(launch_info, delegate_sp).ToError();
57 if (E)
58 return;
59
61}
62
64 NativeDelegate &delegate,
65 llvm::Error &E)
66 : NativeProcessProtocol(pid, terminal_fd, delegate), ProcessDebugger() {
67 ErrorAsOutParameter EOut(&E);
68 DebugDelegateSP delegate_sp(new NativeDebugDelegate(*this));
69 ProcessAttachInfo attach_info;
70 attach_info.SetProcessID(pid);
71 E = AttachProcess(pid, attach_info, delegate_sp).ToError();
72 if (E)
73 return;
74
76
78 if (!Host::GetProcessInfo(pid, info)) {
79 E = createStringError(inconvertibleErrorCode(),
80 "Cannot get process information");
81 return;
82 }
83 m_arch = info.GetArchitecture();
84}
85
89 llvm::sys::ScopedLock lock(m_mutex);
90
91 StateType state = GetState();
92 if (state == eStateStopped || state == eStateCrashed) {
93 LLDB_LOG(log, "process {0} is in state {1}. Resuming...",
94 GetDebuggedProcessId(), state);
95 LLDB_LOG(log, "resuming {0} threads.", m_threads.size());
96
97 bool failed = false;
98 for (uint32_t i = 0; i < m_threads.size(); ++i) {
99 auto thread = static_cast<NativeThreadWindows *>(m_threads[i].get());
100 const ResumeAction *const action =
101 resume_actions.GetActionForThread(thread->GetID(), true);
102 if (action == nullptr)
103 continue;
104
105 switch (action->state) {
106 case eStateRunning:
107 case eStateStepping: {
108 Status result = thread->DoResume(action->state);
109 if (result.Fail()) {
110 failed = true;
111 LLDB_LOG(log,
112 "Trying to resume thread at index {0}, but failed with "
113 "error {1}.",
114 i, result);
115 }
116 break;
117 }
118 case eStateSuspended:
119 case eStateStopped:
120 break;
121
122 default:
124 "NativeProcessWindows::%s (): unexpected state %s specified "
125 "for pid %" PRIu64 ", tid %" PRIu64,
126 __FUNCTION__, StateAsCString(action->state), GetID(),
127 thread->GetID());
128 }
129 }
130
131 if (failed) {
132 error = Status::FromErrorString("NativeProcessWindows::DoResume failed");
133 } else {
135 }
136
137 // Resume the debug loop.
138 ExceptionRecordSP active_exception =
139 m_session_data->m_debugger->GetActiveException().lock();
140 if (active_exception) {
141 // Resume the process and continue processing debug events. Mask the
142 // exception so that from the process's view, there is no indication that
143 // anything happened.
144 m_session_data->m_debugger->ContinueAsyncException(
145 ExceptionResult::MaskException);
146 }
147 } else {
148 LLDB_LOG(log, "error: process {0} is in state {1}. Returning...",
150 }
151
152 return error;
153}
154
157 return static_cast<NativeThreadWindows *>(
159}
160
162 bool caused_stop = false;
163 StateType state = GetState();
164 if (state != eStateStopped)
165 return HaltProcess(caused_stop);
166 return Status();
167}
168
172 StateType state = GetState();
173 if (state != eStateExited && state != eStateDetached) {
175 if (error.Success())
177 else
178 LLDB_LOG(log, "Detaching process error: {0}", error);
179 } else {
181 "error: process {0} in state = {1}, but "
182 "cannot detach it in this state.",
183 GetID(), state);
184 LLDB_LOG(log, "error: {0}", error);
185 }
186 return error;
187}
188
192 "Windows does not support sending signals to processes");
193 return error;
194}
195
197
199 StateType state = GetState();
200 return DestroyProcess(state);
201}
202
203Status NativeProcessWindows::IgnoreSignals(llvm::ArrayRef<int> signals) {
204 return Status();
205}
206
208 MemoryRegionInfo &range_info) {
209 return ProcessDebugger::GetMemoryRegionInfo(load_addr, range_info);
210}
211
213 size_t size, size_t &bytes_read) {
214 return ProcessDebugger::ReadMemory(addr, buf, size, bytes_read);
215}
216
218 size_t size, size_t &bytes_written) {
219 return ProcessDebugger::WriteMemory(addr, buf, size, bytes_written);
220}
221
222llvm::Expected<lldb::addr_t>
223NativeProcessWindows::AllocateMemory(size_t size, uint32_t permissions) {
224 lldb::addr_t addr;
225 Status ST = ProcessDebugger::AllocateMemory(size, permissions, addr);
226 if (ST.Success())
227 return addr;
228 return ST.ToError();
229}
230
233}
234
236
238 StateType state = GetState();
239 switch (state) {
240 case eStateCrashed:
241 case eStateDetached:
242 case eStateExited:
243 case eStateInvalid:
244 case eStateUnloaded:
245 return false;
246 default:
247 return true;
248 }
249}
250
252 lldb::StopReason reason,
253 std::string description) {
254 SetCurrentThreadID(thread.GetID());
255
256 ThreadStopInfo stop_info;
257 stop_info.reason = reason;
258 // No signal support on Windows but required to provide a 'valid' signum.
259 stop_info.signo = SIGTRAP;
260
261 if (reason == StopReason::eStopReasonException) {
262 stop_info.details.exception.type = 0;
263 stop_info.details.exception.data_count = 0;
264 }
265
266 thread.SetStopReason(stop_info, description);
267}
268
270 lldb::StopReason reason,
271 std::string description) {
272 NativeThreadWindows *thread = GetThreadByID(thread_id);
273 if (!thread)
274 return;
275
276 for (uint32_t i = 0; i < m_threads.size(); ++i) {
277 auto t = static_cast<NativeThreadWindows *>(m_threads[i].get());
278 Status error = t->DoStop();
279 if (error.Fail())
280 exit(1);
281 }
282 SetStopReasonForThread(*thread, reason, description);
283}
284
286
287llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
289 // Not available on this target.
290 return llvm::errc::not_supported;
291}
292
293llvm::Expected<llvm::ArrayRef<uint8_t>>
295 static const uint8_t g_aarch64_opcode[] = {0x00, 0x00, 0x3e, 0xd4}; // brk #0xf000
296 static const uint8_t g_thumb_opcode[] = {0xfe, 0xde}; // udf #0xfe
297
298 switch (GetArchitecture().GetMachine()) {
299 case llvm::Triple::aarch64:
300 return llvm::ArrayRef(g_aarch64_opcode);
301
302 case llvm::Triple::arm:
303 case llvm::Triple::thumb:
304 return llvm::ArrayRef(g_thumb_opcode);
305
306 default:
308 }
309}
310
312 // Windows always reports an incremented PC after a breakpoint is hit,
313 // even on ARM.
314 return cantFail(GetSoftwareBreakpointTrapOpcode(0)).size();
315}
316
318 auto it = m_software_breakpoints.find(addr);
319 if (it == m_software_breakpoints.end())
320 return false;
321 return true;
322}
323
325 bool hardware) {
326 if (hardware)
327 return SetHardwareBreakpoint(addr, size);
328 return SetSoftwareBreakpoint(addr, size);
329}
330
332 bool hardware) {
333 if (hardware)
334 return RemoveHardwareBreakpoint(addr);
335 return RemoveSoftwareBreakpoint(addr);
336}
337
340 if (!m_loaded_modules.empty())
341 return Status();
342
343 // Retrieve loaded modules by a Target/Module free implemenation.
344 AutoHandle snapshot(CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetID()));
345 if (snapshot.IsValid()) {
346 MODULEENTRY32W me;
347 me.dwSize = sizeof(MODULEENTRY32W);
348 if (Module32FirstW(snapshot.get(), &me)) {
349 do {
350 std::string path;
351 if (!llvm::convertWideToUTF8(me.szExePath, path))
352 continue;
353
354 FileSpec file_spec(path);
355 FileSystem::Instance().Resolve(file_spec);
356 m_loaded_modules[file_spec] = (addr_t)me.modBaseAddr;
357 } while (Module32Next(snapshot.get(), &me));
358 }
359
360 if (!m_loaded_modules.empty())
361 return Status();
362 }
363
364 error = Status(::GetLastError(), lldb::ErrorType::eErrorTypeWin32);
365 return error;
366}
367
369 FileSpec &file_spec) {
371 if (error.Fail())
372 return error;
373
374 FileSpec module_file_spec(module_path);
375 FileSystem::Instance().Resolve(module_file_spec);
376 for (auto &it : m_loaded_modules) {
377 if (it.first == module_file_spec) {
378 file_spec = it.first;
379 return Status();
380 }
381 }
383 "Module (%s) not found in process %" PRIu64 "!",
384 module_file_spec.GetPath().c_str(), GetID());
385}
386
387Status
388NativeProcessWindows::GetFileLoadAddress(const llvm::StringRef &file_name,
389 lldb::addr_t &load_addr) {
391 if (error.Fail())
392 return error;
393
394 load_addr = LLDB_INVALID_ADDRESS;
395 FileSpec file_spec(file_name);
396 FileSystem::Instance().Resolve(file_spec);
397 for (auto &it : m_loaded_modules) {
398 if (it.first == file_spec) {
399 load_addr = it.second;
400 return Status();
401 }
402 }
404 "Can't get loaded address of file (%s) in process %" PRIu64 "!",
405 file_spec.GetPath().c_str(), GetID());
406}
407
408void NativeProcessWindows::OnExitProcess(uint32_t exit_code) {
410 LLDB_LOG(log, "Process {0} exited with code {1}", GetID(), exit_code);
411
413
414 // No signal involved. It is just an exit event.
415 WaitStatus wait_status(WaitStatus::Exit, exit_code);
416 SetExitStatus(wait_status, true);
417
418 // Notify the native delegate.
419 SetState(eStateExited, true);
420}
421
424 LLDB_LOG(log, "Debugger connected to process {0}. Image base = {1:x}",
425 GetDebuggedProcessId(), image_base);
426
427 // This is the earliest chance we can resolve the process ID and
428 // architecture if we don't know them yet.
431
432 if (GetArchitecture().GetMachine() == llvm::Triple::UnknownArch) {
433 ProcessInstanceInfo process_info;
434 if (!Host::GetProcessInfo(GetDebuggedProcessId(), process_info)) {
435 LLDB_LOG(log, "Cannot get process information during debugger connecting "
436 "to process");
437 return;
438 }
439 SetArchitecture(process_info.GetArchitecture());
440 }
441
442 // The very first one shall always be the main thread.
443 assert(m_threads.empty());
444 m_threads.push_back(std::make_unique<NativeThreadWindows>(
445 *this, m_session_data->m_debugger->GetMainThread()));
446}
447
450 const ExceptionRecord &record) {
452 llvm::sys::ScopedLock lock(m_mutex);
453
454 // Let the debugger establish the internal status.
455 ProcessDebugger::OnDebugException(first_chance, record);
456
457 static bool initial_stop = false;
458 if (!first_chance) {
459 SetState(eStateStopped, false);
460 }
461
462 ExceptionResult result = ExceptionResult::SendToApplication;
463 switch (record.GetExceptionCode()) {
464 case DWORD(STATUS_SINGLE_STEP):
465 case STATUS_WX86_SINGLE_STEP: {
466 uint32_t wp_id = LLDB_INVALID_INDEX32;
467 if (NativeThreadWindows *thread = GetThreadByID(record.GetThreadID())) {
468 NativeRegisterContextWindows &reg_ctx = thread->GetRegisterContext();
469 Status error =
470 reg_ctx.GetWatchpointHitIndex(wp_id, record.GetExceptionAddress());
471 if (error.Fail())
472 LLDB_LOG(log,
473 "received error while checking for watchpoint hits, pid = "
474 "{0}, error = {1}",
475 thread->GetID(), error);
476 if (wp_id != LLDB_INVALID_INDEX32) {
477 addr_t wp_addr = reg_ctx.GetWatchpointAddress(wp_id);
478 addr_t wp_hit_addr = reg_ctx.GetWatchpointHitAddress(wp_id);
479 std::string desc =
480 formatv("{0} {1} {2}", wp_addr, wp_id, wp_hit_addr).str();
481 StopThread(record.GetThreadID(), StopReason::eStopReasonWatchpoint,
482 desc);
483 }
484 }
485 if (wp_id == LLDB_INVALID_INDEX32)
486 StopThread(record.GetThreadID(), StopReason::eStopReasonTrace);
487
488 SetState(eStateStopped, true);
489
490 // Continue the debugger.
491 return ExceptionResult::MaskException;
492 }
493 case DWORD(STATUS_BREAKPOINT):
496 LLDB_LOG(log, "Hit non-loader breakpoint at address {0:x}.",
497 record.GetExceptionAddress());
498
499 StopThread(record.GetThreadID(), StopReason::eStopReasonBreakpoint);
500
501 if (NativeThreadWindows *stop_thread =
502 GetThreadByID(record.GetThreadID())) {
503 auto &register_context = stop_thread->GetRegisterContext();
504 uint32_t breakpoint_size = GetSoftwareBreakpointPCOffset();
505 // The current PC is AFTER the BP opcode, on all architectures.
506 uint64_t pc = register_context.GetPC() - breakpoint_size;
507 register_context.SetPC(pc);
508 }
509
510 SetState(eStateStopped, true);
511 return ExceptionResult::MaskException;
512 }
513
514 if (!initial_stop) {
515 initial_stop = true;
516 LLDB_LOG(log,
517 "Hit loader breakpoint at address {0:x}, setting initial stop "
518 "event.",
519 record.GetExceptionAddress());
520
521 // We are required to report the reason for the first stop after
522 // launching or being attached.
523 if (NativeThreadWindows *thread = GetThreadByID(record.GetThreadID()))
524 SetStopReasonForThread(*thread, StopReason::eStopReasonBreakpoint);
525
526 // Do not notify the native delegate (e.g. llgs) since at this moment
527 // the program hasn't returned from Manager::Launch() and the delegate
528 // might not have an valid native process to operate on.
529 SetState(eStateStopped, false);
530
531 // Hit the initial stop. Continue the application.
532 return ExceptionResult::BreakInDebugger;
533 }
534
535 [[fallthrough]];
536 default:
537 LLDB_LOG(log,
538 "Debugger thread reported exception {0:x} at address {1:x} "
539 "(first_chance={2})",
540 record.GetExceptionCode(), record.GetExceptionAddress(),
541 first_chance);
542
543 {
544 std::string desc;
545 llvm::raw_string_ostream desc_stream(desc);
546 desc_stream << "Exception "
547 << llvm::format_hex(record.GetExceptionCode(), 8)
548 << " encountered at address "
549 << llvm::format_hex(record.GetExceptionAddress(), 8);
550 StopThread(record.GetThreadID(), StopReason::eStopReasonException,
551 desc.c_str());
552
553 SetState(eStateStopped, true);
554 }
555
556 // For non-breakpoints, give the application a chance to handle the
557 // exception first.
558 if (first_chance)
559 result = ExceptionResult::SendToApplication;
560 else
561 result = ExceptionResult::BreakInDebugger;
562 }
563
564 return result;
565}
566
568 llvm::sys::ScopedLock lock(m_mutex);
569
570 auto thread = std::make_unique<NativeThreadWindows>(*this, new_thread);
571 thread->GetRegisterContext().ClearAllHardwareWatchpoints();
572 for (const auto &pair : GetWatchpointMap()) {
573 const NativeWatchpoint &wp = pair.second;
574 thread->SetWatchpoint(wp.m_addr, wp.m_size, wp.m_watch_flags,
575 wp.m_hardware);
576 }
577
578 m_threads.push_back(std::move(thread));
579}
580
582 uint32_t exit_code) {
583 llvm::sys::ScopedLock lock(m_mutex);
584 NativeThreadWindows *thread = GetThreadByID(thread_id);
585 if (!thread)
586 return;
587
588 for (auto t = m_threads.begin(); t != m_threads.end();) {
589 if ((*t)->GetID() == thread_id) {
590 t = m_threads.erase(t);
591 } else {
592 ++t;
593 }
594 }
595}
596
598 lldb::addr_t module_addr) {
599 // Simply invalidate the cached loaded modules.
600 if (!m_loaded_modules.empty())
601 m_loaded_modules.clear();
602}
603
605 if (!m_loaded_modules.empty())
606 m_loaded_modules.clear();
607}
608
609llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
611 ProcessLaunchInfo &launch_info,
612 NativeProcessProtocol::NativeDelegate &native_delegate) {
613 Error E = Error::success();
614 auto process_up = std::unique_ptr<NativeProcessWindows>(
615 new NativeProcessWindows(launch_info, native_delegate, E));
616 if (E)
617 return std::move(E);
618 return std::move(process_up);
619}
620
621llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
624 Error E = Error::success();
625 // Set pty primary fd invalid since it is not available.
626 auto process_up = std::unique_ptr<NativeProcessWindows>(
627 new NativeProcessWindows(pid, -1, native_delegate, E));
628 if (E)
629 return std::move(E);
630 return std::move(process_up);
631}
632} // namespace lldb_private
static llvm::raw_ostream & error(Stream &strm)
#define STATUS_WX86_BREAKPOINT
ExceptionResult
Definition: ForwardDecl.h:16
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
Definition: Log.h:369
llvm::Error Error
bool IsValid() const
Definition: AutoHandle.h:26
HANDLE get() const
Definition: AutoHandle.h:28
lldb::tid_t GetThreadID() const
lldb::addr_t GetExceptionAddress() const
A file utility class.
Definition: FileSpec.h:56
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
Definition: FileSpec.cpp:367
void Resolve(llvm::SmallVectorImpl< char > &path)
Resolve path to make it canonical.
static FileSystem & Instance()
static bool GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &proc_info)
Status SetSoftwareBreakpoint(lldb::addr_t addr, uint32_t size_hint)
virtual const NativeWatchpointList::WatchpointMap & GetWatchpointMap() const
void SetState(lldb::StateType state, bool notify_delegates=true)
NativeThreadProtocol * GetThreadByID(lldb::tid_t tid)
std::vector< std::unique_ptr< NativeThreadProtocol > > m_threads
virtual bool SetExitStatus(WaitStatus status, bool bNotifyStateChange)
Status RemoveSoftwareBreakpoint(lldb::addr_t addr)
virtual Status SetHardwareBreakpoint(lldb::addr_t addr, size_t size)
virtual llvm::Expected< llvm::ArrayRef< uint8_t > > GetSoftwareBreakpointTrapOpcode(size_t size_hint)
virtual Status RemoveHardwareBreakpoint(lldb::addr_t addr)
std::unordered_map< lldb::addr_t, SoftwareBreakpoint > m_software_breakpoints
llvm::Expected< std::unique_ptr< NativeProcessProtocol > > Launch(ProcessLaunchInfo &launch_info, NativeDelegate &native_delegate) override
Launch a process for debugging.
llvm::Expected< std::unique_ptr< NativeProcessProtocol > > Attach(lldb::pid_t pid, NativeDelegate &native_delegate) override
Attach to an existing process.
Status GetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info) override
llvm::Error DeallocateMemory(lldb::addr_t addr) override
Status Resume(const ResumeActionList &resume_actions) override
void OnCreateThread(const HostThread &thread) override
void OnExitProcess(uint32_t exit_code) override
Status GetLoadedModuleFileSpec(const char *module_path, FileSpec &file_spec) override
llvm::Expected< llvm::ArrayRef< uint8_t > > GetSoftwareBreakpointTrapOpcode(size_t size_hint) override
void OnDebuggerConnected(lldb::addr_t image_base) override
Status ReadMemory(lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read) override
NativeProcessWindows(ProcessLaunchInfo &launch_info, NativeDelegate &delegate, llvm::Error &E)
Status SetBreakpoint(lldb::addr_t addr, uint32_t size, bool hardware) override
void SetArchitecture(const ArchSpec &arch_spec)
ExceptionResult OnDebugException(bool first_chance, const ExceptionRecord &record) override
size_t GetSoftwareBreakpointPCOffset() override
Return the offset of the PC relative to the software breakpoint that was hit.
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > GetAuxvData() const override
void OnUnloadDll(lldb::addr_t module_addr) override
Status GetFileLoadAddress(const llvm::StringRef &file_name, lldb::addr_t &load_addr) override
NativeThreadWindows * GetThreadByID(lldb::tid_t thread_id)
Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size, size_t &bytes_written) override
void OnExitThread(lldb::tid_t thread_id, uint32_t exit_code) override
llvm::Expected< lldb::addr_t > AllocateMemory(size_t size, uint32_t permissions) override
Status Signal(int signo) override
Sends a process a UNIX signal signal.
Status RemoveBreakpoint(lldb::addr_t addr, bool hardware=false) override
const ArchSpec & GetArchitecture() const override
void SetStopReasonForThread(NativeThreadWindows &thread, lldb::StopReason reason, std::string description="")
Status Interrupt() override
Tells a process to interrupt all operations as if by a Ctrl-C.
void OnLoadDll(const ModuleSpec &module_spec, lldb::addr_t module_addr) override
bool FindSoftwareBreakpoint(lldb::addr_t addr)
void StopThread(lldb::tid_t thread_id, lldb::StopReason reason, std::string description="")
lldb::addr_t GetSharedLibraryInfoAddress() override
Status IgnoreSignals(llvm::ArrayRef< int > signals) override
std::map< lldb_private::FileSpec, lldb::addr_t > m_loaded_modules
virtual Status GetWatchpointHitIndex(uint32_t &wp_index, lldb::addr_t trap_addr)
virtual lldb::addr_t GetWatchpointAddress(uint32_t wp_index)
virtual lldb::addr_t GetWatchpointHitAddress(uint32_t wp_index)
void SetStopReason(ThreadStopInfo stop_info, std::string description)
Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size, size_t &bytes_written)
Status DestroyProcess(lldb::StateType process_state)
Status LaunchProcess(ProcessLaunchInfo &launch_info, DebugDelegateSP delegate)
Status GetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info)
std::unique_ptr< ProcessWindowsData > m_session_data
Status AllocateMemory(size_t size, uint32_t permissions, lldb::addr_t &addr)
virtual ExceptionResult OnDebugException(bool first_chance, const ExceptionRecord &record)
Status AttachProcess(lldb::pid_t pid, const ProcessAttachInfo &attach_info, DebugDelegateSP delegate)
lldb::pid_t GetDebuggedProcessId() const
Status ReadMemory(lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read)
virtual void OnExitProcess(uint32_t exit_code)
Status HaltProcess(bool &caused_stop)
Status DeallocateMemory(lldb::addr_t addr)
void SetProcessID(lldb::pid_t pid)
Definition: ProcessInfo.h:70
ArchSpec & GetArchitecture()
Definition: ProcessInfo.h:62
const ResumeAction * GetActionForThread(lldb::tid_t tid, bool default_ok) const
Definition: Debug.h:74
An error handling class.
Definition: Status.h:115
llvm::Error ToError() const
FIXME: Replace all uses with takeError() instead.
Definition: Status.cpp:139
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
Definition: Status.cpp:106
static Status FromErrorString(const char *str)
Definition: Status.h:138
bool Fail() const
Test for error condition.
Definition: Status.cpp:270
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
Definition: Status.h:148
bool Success() const
Test for success condition.
Definition: Status.cpp:280
#define LLDB_INVALID_INDEX32
Definition: lldb-defines.h:83
#define LLDB_INVALID_ADDRESS
Definition: lldb-defines.h:82
#define LLDB_INVALID_PROCESS_ID
Definition: lldb-defines.h:89
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
Definition: Log.h:332
std::shared_ptr< ExceptionRecord > ExceptionRecordSP
Definition: ForwardDecl.h:37
const char * StateAsCString(lldb::StateType state)
Converts a StateType to a C string.
Definition: State.cpp:14
std::shared_ptr< IDebugDelegate > DebugDelegateSP
Definition: ForwardDecl.h:35
Definition: SBAddress.h:15
StateType
Process and Thread States.
@ eStateUnloaded
Process is object is valid, but not currently loaded.
@ eStateDetached
Process has been detached and can't be examined.
@ eStateStopped
Process or thread is stopped and can be examined.
@ eStateSuspended
Process or thread is in a suspended state as far as the debugger is concerned while other processes o...
@ eStateRunning
Process or thread is running and can't be examined.
@ eStateExited
Process has exited and can't be examined.
@ eStateStepping
Process or thread is in the process of stepping and can not be examined.
@ eStateCrashed
Process or thread has crashed and can be examined.
@ eErrorTypeWin32
Standard Win32 error codes.
uint64_t pid_t
Definition: lldb-types.h:83
uint64_t addr_t
Definition: lldb-types.h:80
StopReason
Thread stop reasons.
uint64_t tid_t
Definition: lldb-types.h:84
Definition: Debugger.h:54
lldb::StateType state
Definition: Debug.h:23
struct lldb_private::ThreadStopInfo::@11::@12 exception
lldb::StopReason reason
Definition: Debug.h:132
union lldb_private::ThreadStopInfo::@11 details
#define SIGTRAP