18#include <llvm/Support/ConvertUTF.h>
20#if defined(__x86_64__) || defined(_M_AMD64)
22#elif defined(__i386__) || defined(_M_IX86)
24#elif defined(__aarch64__) || defined(_M_ARM64)
26#elif defined(__arm__) || defined(_M_ARM)
35 :
Thread(process, thread.GetNativeThread().GetThreadId()),
41 ::SuspendThread(
m_host_thread.GetNativeThread().GetSystemHandle());
48 struct ThreadBasicInformation {
55 ULONG_PTR AffinityMask;
59 using NtQueryInformationThreadFn =
60 LONG(WINAPI *)(
HANDLE ThreadHandle, ULONG ThreadInformationClass,
61 PVOID ThreadInformation, ULONG ThreadInformationLength,
65 L
"Kernel32.dll",
"NtQueryInformationThread"};
66 if (!s_query_information_thread)
68 auto NtQueryInformationThread = *s_query_information_thread;
71 if (!handle || handle == INVALID_HANDLE_VALUE)
74 ThreadBasicInformation info = {};
76 if (NtQueryInformationThread(handle, 0, &info,
sizeof(info),
nullptr) < 0)
78 if (!info.TebBaseAddress)
81 auto dict = std::make_shared<StructuredData::Dictionary>();
82 dict->AddIntegerItem(
"teb_address",
83 reinterpret_cast<uint64_t
>(info.TebBaseAddress));
99 uint32_t concrete_frame_idx = 0;
105 if (concrete_frame_idx == 0) {
107 ArchSpec arch = HostInfo::GetArchitecture();
109 case llvm::Triple::arm:
110 case llvm::Triple::thumb:
111#if defined(__arm__) || defined(_M_ARM)
113 new RegisterContextWindows_arm(*
this, concrete_frame_idx));
115 LLDB_LOG(log,
"debugging foreign targets is currently unsupported");
119 case llvm::Triple::aarch64:
120#if defined(__aarch64__) || defined(_M_ARM64)
122 new RegisterContextWindows_arm64(*
this, concrete_frame_idx));
124 LLDB_LOG(log,
"debugging foreign targets is currently unsupported");
128 case llvm::Triple::x86:
129#if defined(__i386__) || defined(_M_IX86)
131 new RegisterContextWindows_x86(*
this, concrete_frame_idx));
133 LLDB_LOG(log,
"debugging foreign targets is currently unsupported");
137 case llvm::Triple::x86_64:
138#if defined(__x86_64__) || defined(_M_AMD64)
140 new RegisterContextWindows_x64(*
this, concrete_frame_idx));
142 LLDB_LOG(log,
"debugging foreign targets is currently unsupported");
166 if (resume_state == current_state)
172 uint32_t flags_index =
175 uint64_t flags_value =
178 const ArchSpec &arch = process->GetTarget().GetArchitecture();
180 case llvm::Triple::x86:
181 case llvm::Triple::x86_64:
182 flags_value |= 0x100;
184 case llvm::Triple::aarch64:
185 case llvm::Triple::arm:
186 case llvm::Triple::thumb:
187 flags_value |= 0x200000;
190 LLDB_LOG(log,
"single stepping unsupported on this architecture");
197 DWORD previous_suspend_count = 0;
204 previous_suspend_count = ::ResumeThread(thread_handle);
206 if (previous_suspend_count ==
static_cast<DWORD
>(-1))
209 }
while (previous_suspend_count > 1);
218 s_get_thread_description{L
"Kernel32.dll",
"GetThreadDescription"};
219 if (!s_get_thread_description)
221 auto GetThreadDescription = *s_get_thread_description;
224 if (SUCCEEDED(GetThreadDescription(
225 m_host_thread.GetNativeThread().GetSystemHandle(), &pszThreadName))) {
226 LLDB_LOGF(log,
"GetThreadDescription: %ls", pszThreadName);
228 llvm::convertUTF16ToUTF8String(
229 llvm::ArrayRef(
reinterpret_cast<char *
>(pszThreadName),
230 wcslen(pszThreadName) *
sizeof(
wchar_t)),
232 ::LocalFree(pszThreadName);
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOGF(log,...)
An architecture specification class.
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
virtual uint32_t GetConcreteFrameIndex()
Query this frame to find what frame it is in this Thread's StackFrameList, not counting inlined frame...
std::shared_ptr< Object > ObjectSP
void RefreshStateAfterStop() override
bool CalculateStopInfo() override
Ask the thread subclass to set its stop info.
TargetThreadWindows(ProcessWindows &process, const HostThread &thread)
lldb_private::StructuredData::ObjectSP FetchThreadExtendedInfo() override
Exposes this thread's TEB address under the "teb_address" key, so that language runtimes can resolve ...
const char * GetName() override
virtual ~TargetThreadWindows()
lldb::RegisterContextSP GetRegisterContext() override
lldb::RegisterContextSP CreateRegisterContextForFrame(StackFrame *frame) override
void WillResume(lldb::StateType resume_state) override
lldb::RegisterContextSP m_thread_reg_ctx_sp
void SetStopInfo(const lldb::StopInfoSP &stop_info_sp)
virtual void DestroyThread()
virtual Unwind & GetUnwinder()
Thread(Process &process, lldb::tid_t tid, bool use_invalid_index_id=false)
Constructor.
lldb::StateType GetTemporaryResumeState() const
lldb::ProcessSP GetProcess() const
lldb::StopInfoSP m_stop_info_sp
The private stop reason for this thread.
lldb::StateType GetState() const
lldb::RegisterContextSP m_reg_context_sp
The register context for this thread's current register state.
lldb::RegisterContextSP CreateRegisterContextForFrame(StackFrame *frame)
#define LLDB_REGNUM_GENERIC_FLAGS
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.
StateType
Process and Thread States.
@ eStateRunning
Process or thread is running and can't be examined.
@ eStateStepping
Process or thread is in the process of stepping and can not be examined.
@ eErrorTypeWin32
Standard Win32 error codes.
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
@ eRegisterKindGeneric
insn ptr reg, stack ptr reg, etc not specific to any particular target