blob: a4af12c492c1eff5b3c38cf0cecdd5692fb8b42f [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- ThreadGDBRemote.cpp -------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10
11#include "ThreadGDBRemote.h"
12
Jason Molenda3dc4f442013-10-18 05:55:24 +000013#include "lldb/Breakpoint/Watchpoint.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014#include "lldb/Core/ArchSpec.h"
15#include "lldb/Core/DataExtractor.h"
Jim Ingham0f16e732011-02-08 05:20:59 +000016#include "lldb/Core/State.h"
Jason Molenda3dc4f442013-10-18 05:55:24 +000017#include "lldb/Core/StreamString.h"
18#include "lldb/Target/Platform.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019#include "lldb/Target/Process.h"
20#include "lldb/Target/RegisterContext.h"
Greg Claytonf4b47e12010-08-04 01:40:35 +000021#include "lldb/Target/StopInfo.h"
Jason Molenda2fd83352014-02-05 05:44:54 +000022#include "lldb/Target/SystemRuntime.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000023#include "lldb/Target/Target.h"
Zachary Turner93749ab2015-03-03 21:51:25 +000024#include "lldb/Target/UnixSignals.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000025#include "lldb/Target/Unwind.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000026
Chris Lattner30fdc8d2010-06-08 16:52:24 +000027#include "ProcessGDBRemote.h"
28#include "ProcessGDBRemoteLog.h"
Greg Claytonc982c762010-07-09 20:39:50 +000029#include "Utility/StringExtractorGDBRemote.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030
31using namespace lldb;
32using namespace lldb_private;
Tamas Berghammerdb264a62015-03-31 09:52:22 +000033using namespace lldb_private::process_gdb_remote;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000034
35//----------------------------------------------------------------------
36// Thread Registers
37//----------------------------------------------------------------------
38
Jim Ingham4f465cf2012-10-10 18:32:14 +000039ThreadGDBRemote::ThreadGDBRemote (Process &process, lldb::tid_t tid) :
40 Thread(process, tid),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000041 m_thread_name (),
42 m_dispatch_queue_name (),
Greg Clayton0b90be12015-06-23 21:27:50 +000043 m_thread_dispatch_qaddr (LLDB_INVALID_ADDRESS),
Jason Molenda77f89352016-01-12 07:09:16 +000044 m_dispatch_queue_t (LLDB_INVALID_ADDRESS),
45 m_queue_kind (eQueueKindUnknown),
46 m_queue_serial_number (LLDB_INVALID_QUEUE_ID),
47 m_associated_with_libdispatch_queue (eLazyBoolCalculate)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000048{
Greg Clayton0b90be12015-06-23 21:27:50 +000049 ProcessGDBRemoteLog::LogIf(GDBR_LOG_THREAD, "%p: ThreadGDBRemote::ThreadGDBRemote (pid = %i, tid = 0x%4.4x)",
Greg Clayton1ac04c32012-02-21 00:09:25 +000050 this,
Jim Ingham4f465cf2012-10-10 18:32:14 +000051 process.GetID(),
Greg Clayton1ac04c32012-02-21 00:09:25 +000052 GetID());
Chris Lattner30fdc8d2010-06-08 16:52:24 +000053}
54
55ThreadGDBRemote::~ThreadGDBRemote ()
56{
Greg Clayton1ac04c32012-02-21 00:09:25 +000057 ProcessSP process_sp(GetProcess());
58 ProcessGDBRemoteLog::LogIf(GDBR_LOG_THREAD, "%p: ThreadGDBRemote::~ThreadGDBRemote (pid = %i, tid = 0x%4.4x)",
59 this,
60 process_sp ? process_sp->GetID() : LLDB_INVALID_PROCESS_ID,
61 GetID());
Jim Ingham773d9812010-11-18 02:47:07 +000062 DestroyThread();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000063}
64
Chris Lattner30fdc8d2010-06-08 16:52:24 +000065const char *
66ThreadGDBRemote::GetName ()
67{
68 if (m_thread_name.empty())
69 return NULL;
70 return m_thread_name.c_str();
71}
72
Greg Clayton0b90be12015-06-23 21:27:50 +000073void
74ThreadGDBRemote::ClearQueueInfo ()
75{
76 m_dispatch_queue_name.clear();
77 m_queue_kind = eQueueKindUnknown;
Jason Molenda77f89352016-01-12 07:09:16 +000078 m_queue_serial_number = 0;
79 m_dispatch_queue_t = LLDB_INVALID_ADDRESS;
80 m_associated_with_libdispatch_queue = eLazyBoolCalculate;
Greg Clayton0b90be12015-06-23 21:27:50 +000081}
82
83void
Jason Molenda77f89352016-01-12 07:09:16 +000084ThreadGDBRemote::SetQueueInfo (std::string &&queue_name, QueueKind queue_kind, uint64_t queue_serial, addr_t dispatch_queue_t, LazyBool associated_with_libdispatch_queue)
Greg Clayton0b90be12015-06-23 21:27:50 +000085{
86 m_dispatch_queue_name = queue_name;
87 m_queue_kind = queue_kind;
Jason Molenda77f89352016-01-12 07:09:16 +000088 m_queue_serial_number = queue_serial;
89 m_dispatch_queue_t = dispatch_queue_t;
90 m_associated_with_libdispatch_queue = associated_with_libdispatch_queue;
Greg Clayton0b90be12015-06-23 21:27:50 +000091}
92
Chris Lattner30fdc8d2010-06-08 16:52:24 +000093
94const char *
95ThreadGDBRemote::GetQueueName ()
96{
Greg Clayton0b90be12015-06-23 21:27:50 +000097 // If our cached queue info is valid, then someone called ThreadGDBRemote::SetQueueInfo(...)
98 // with valid information that was gleaned from the stop reply packet. In this case we trust
99 // that the info is valid in m_dispatch_queue_name without refetching it
100 if (CachedQueueInfoIsValid())
101 {
102 if (m_dispatch_queue_name.empty())
103 return nullptr;
104 else
105 return m_dispatch_queue_name.c_str();
106 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000107 // Always re-fetch the dispatch queue name since it can change
Greg Clayton1ac04c32012-02-21 00:09:25 +0000108
Jason Molenda77f89352016-01-12 07:09:16 +0000109 if (m_associated_with_libdispatch_queue == eLazyBoolNo)
110 return nullptr;
111
112 if (m_thread_dispatch_qaddr != 0 && m_thread_dispatch_qaddr != LLDB_INVALID_ADDRESS)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000113 {
114 ProcessSP process_sp (GetProcess());
115 if (process_sp)
116 {
Jason Molenda2fd83352014-02-05 05:44:54 +0000117 SystemRuntime *runtime = process_sp->GetSystemRuntime ();
118 if (runtime)
Jason Molenda2fd83352014-02-05 05:44:54 +0000119 m_dispatch_queue_name = runtime->GetQueueNameFromThreadQAddress (m_thread_dispatch_qaddr);
Greg Clayton0b90be12015-06-23 21:27:50 +0000120 else
121 m_dispatch_queue_name.clear();
122
123 if (!m_dispatch_queue_name.empty())
Jason Molenda3dc4f442013-10-18 05:55:24 +0000124 return m_dispatch_queue_name.c_str();
Greg Clayton1ac04c32012-02-21 00:09:25 +0000125 }
126 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000127 return NULL;
128}
129
Jason Molenda77f89352016-01-12 07:09:16 +0000130QueueKind
131ThreadGDBRemote::GetQueueKind ()
132{
133 // If our cached queue info is valid, then someone called ThreadGDBRemote::SetQueueInfo(...)
134 // with valid information that was gleaned from the stop reply packet. In this case we trust
135 // that the info is valid in m_dispatch_queue_name without refetching it
136 if (CachedQueueInfoIsValid())
137 {
138 return m_queue_kind;
139 }
140
141 if (m_associated_with_libdispatch_queue == eLazyBoolNo)
142 return eQueueKindUnknown;
143
144 if (m_thread_dispatch_qaddr != 0 && m_thread_dispatch_qaddr != LLDB_INVALID_ADDRESS)
145 {
146 ProcessSP process_sp (GetProcess());
147 if (process_sp)
148 {
149 SystemRuntime *runtime = process_sp->GetSystemRuntime ();
150 if (runtime)
151 m_queue_kind = runtime->GetQueueKind (m_thread_dispatch_qaddr);
152 return m_queue_kind;
153 }
154 }
155 return eQueueKindUnknown;
156}
157
158
Jason Molenda3dc4f442013-10-18 05:55:24 +0000159queue_id_t
160ThreadGDBRemote::GetQueueID ()
161{
Greg Clayton0b90be12015-06-23 21:27:50 +0000162 // If our cached queue info is valid, then someone called ThreadGDBRemote::SetQueueInfo(...)
163 // with valid information that was gleaned from the stop reply packet. In this case we trust
164 // that the info is valid in m_dispatch_queue_name without refetching it
165 if (CachedQueueInfoIsValid())
Jason Molenda77f89352016-01-12 07:09:16 +0000166 return m_queue_serial_number;
Greg Clayton0b90be12015-06-23 21:27:50 +0000167
Jason Molenda77f89352016-01-12 07:09:16 +0000168 if (m_associated_with_libdispatch_queue == eLazyBoolNo)
169 return LLDB_INVALID_QUEUE_ID;
170
171 if (m_thread_dispatch_qaddr != 0 && m_thread_dispatch_qaddr != LLDB_INVALID_ADDRESS)
Jason Molenda3dc4f442013-10-18 05:55:24 +0000172 {
173 ProcessSP process_sp (GetProcess());
174 if (process_sp)
175 {
Jason Molenda2fd83352014-02-05 05:44:54 +0000176 SystemRuntime *runtime = process_sp->GetSystemRuntime ();
177 if (runtime)
Jason Molenda3dc4f442013-10-18 05:55:24 +0000178 {
Jason Molenda2fd83352014-02-05 05:44:54 +0000179 return runtime->GetQueueIDFromThreadQAddress (m_thread_dispatch_qaddr);
Jason Molenda3dc4f442013-10-18 05:55:24 +0000180 }
181 }
182 }
183 return LLDB_INVALID_QUEUE_ID;
184}
185
Jason Molendab9ffa982014-04-25 00:01:15 +0000186QueueSP
187ThreadGDBRemote::GetQueue ()
188{
189 queue_id_t queue_id = GetQueueID();
190 QueueSP queue;
191 if (queue_id != LLDB_INVALID_QUEUE_ID)
192 {
193 ProcessSP process_sp (GetProcess());
194 if (process_sp)
195 {
196 queue = process_sp->GetQueueList().FindQueueByID (queue_id);
197 }
198 }
199 return queue;
200}
201
Jason Molendaaac16e02014-03-13 02:54:54 +0000202addr_t
203ThreadGDBRemote::GetQueueLibdispatchQueueAddress ()
204{
Jason Molenda77f89352016-01-12 07:09:16 +0000205 if (m_dispatch_queue_t == LLDB_INVALID_ADDRESS)
Jason Molendaaac16e02014-03-13 02:54:54 +0000206 {
Jason Molenda77f89352016-01-12 07:09:16 +0000207 if (m_thread_dispatch_qaddr != 0 && m_thread_dispatch_qaddr != LLDB_INVALID_ADDRESS)
Jason Molendaaac16e02014-03-13 02:54:54 +0000208 {
Jason Molenda77f89352016-01-12 07:09:16 +0000209 ProcessSP process_sp (GetProcess());
210 if (process_sp)
Jason Molendaaac16e02014-03-13 02:54:54 +0000211 {
Jason Molenda77f89352016-01-12 07:09:16 +0000212 SystemRuntime *runtime = process_sp->GetSystemRuntime ();
213 if (runtime)
214 {
215 m_dispatch_queue_t = runtime->GetLibdispatchQueueAddressFromThreadQAddress (m_thread_dispatch_qaddr);
216 }
Jason Molendaaac16e02014-03-13 02:54:54 +0000217 }
218 }
219 }
Jason Molenda77f89352016-01-12 07:09:16 +0000220 return m_dispatch_queue_t;
221}
222
223void
224ThreadGDBRemote::SetQueueLibdispatchQueueAddress (lldb::addr_t dispatch_queue_t)
225{
226 m_dispatch_queue_t = dispatch_queue_t;
227}
228
229bool
230ThreadGDBRemote::ThreadHasQueueInformation () const
231{
232 if (m_thread_dispatch_qaddr != 0
233 && m_thread_dispatch_qaddr != LLDB_INVALID_ADDRESS
234 && m_dispatch_queue_t != LLDB_INVALID_ADDRESS
235 && m_queue_kind != eQueueKindUnknown
236 && m_queue_serial_number != 0)
237 {
238 return true;
239 }
240 return false;
241}
242
243LazyBool
244ThreadGDBRemote::GetAssociatedWithLibdispatchQueue ()
245{
246 return m_associated_with_libdispatch_queue;
247}
248
249void
250ThreadGDBRemote::SetAssociatedWithLibdispatchQueue (LazyBool associated_with_libdispatch_queue)
251{
252 m_associated_with_libdispatch_queue = associated_with_libdispatch_queue;
Jason Molendaaac16e02014-03-13 02:54:54 +0000253}
254
Jason Molenda705b1802014-06-13 02:37:02 +0000255StructuredData::ObjectSP
256ThreadGDBRemote::FetchThreadExtendedInfo ()
257{
258 StructuredData::ObjectSP object_sp;
259 const lldb::user_id_t tid = GetProtocolID();
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000260 Log *log(GetLogIfAnyCategoriesSet (GDBR_LOG_THREAD));
Jason Molenda705b1802014-06-13 02:37:02 +0000261 if (log)
262 log->Printf ("Fetching extended information for thread %4.4" PRIx64, tid);
263 ProcessSP process_sp (GetProcess());
264 if (process_sp)
265 {
266 ProcessGDBRemote *gdb_process = static_cast<ProcessGDBRemote *>(process_sp.get());
267 object_sp = gdb_process->GetExtendedInfoForThread (tid);
268 }
269 return object_sp;
270}
271
Greg Clayton160c9d82013-05-01 21:54:04 +0000272void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000273ThreadGDBRemote::WillResume (StateType resume_state)
274{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000275 int signo = GetResumeSignal();
Greg Clayton160c9d82013-05-01 21:54:04 +0000276 const lldb::user_id_t tid = GetProtocolID();
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000277 Log *log(GetLogIfAnyCategoriesSet (GDBR_LOG_THREAD));
Jim Ingham0f16e732011-02-08 05:20:59 +0000278 if (log)
Greg Clayton160c9d82013-05-01 21:54:04 +0000279 log->Printf ("Resuming thread: %4.4" PRIx64 " with state: %s.", tid, StateAsCString(resume_state));
Greg Claytonf4b47e12010-08-04 01:40:35 +0000280
Greg Clayton1ac04c32012-02-21 00:09:25 +0000281 ProcessSP process_sp (GetProcess());
282 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000283 {
Greg Clayton1ac04c32012-02-21 00:09:25 +0000284 ProcessGDBRemote *gdb_process = static_cast<ProcessGDBRemote *>(process_sp.get());
285 switch (resume_state)
286 {
287 case eStateSuspended:
288 case eStateStopped:
289 // Don't append anything for threads that should stay stopped.
290 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000291
Greg Clayton1ac04c32012-02-21 00:09:25 +0000292 case eStateRunning:
Chaoren Lin98d0a4b2015-07-14 01:09:28 +0000293 if (gdb_process->GetUnixSignals()->SignalIsValid(signo))
Greg Clayton160c9d82013-05-01 21:54:04 +0000294 gdb_process->m_continue_C_tids.push_back(std::make_pair(tid, signo));
Greg Clayton1ac04c32012-02-21 00:09:25 +0000295 else
Greg Clayton160c9d82013-05-01 21:54:04 +0000296 gdb_process->m_continue_c_tids.push_back(tid);
Greg Clayton1ac04c32012-02-21 00:09:25 +0000297 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000298
Greg Clayton1ac04c32012-02-21 00:09:25 +0000299 case eStateStepping:
Chaoren Lin98d0a4b2015-07-14 01:09:28 +0000300 if (gdb_process->GetUnixSignals()->SignalIsValid(signo))
Greg Clayton160c9d82013-05-01 21:54:04 +0000301 gdb_process->m_continue_S_tids.push_back(std::make_pair(tid, signo));
Greg Clayton1ac04c32012-02-21 00:09:25 +0000302 else
Greg Clayton160c9d82013-05-01 21:54:04 +0000303 gdb_process->m_continue_s_tids.push_back(tid);
Greg Clayton1ac04c32012-02-21 00:09:25 +0000304 break;
Greg Claytonc982c762010-07-09 20:39:50 +0000305
Greg Clayton1ac04c32012-02-21 00:09:25 +0000306 default:
307 break;
308 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000309 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000310}
311
312void
313ThreadGDBRemote::RefreshStateAfterStop()
314{
Greg Clayton3e06bd92011-01-09 21:07:35 +0000315 // Invalidate all registers in our register context. We don't set "force" to
316 // true because the stop reply packet might have had some register values
317 // that were expedited and these will already be copied into the register
318 // context by the time this function gets called. The GDBRemoteRegisterContext
319 // class has been made smart enough to detect when it needs to invalidate
320 // which registers are valid by putting hooks in the register read and
321 // register supply functions where they check the process stop ID and do
322 // the right thing.
323 const bool force = false;
324 GetRegisterContext()->InvalidateIfNeeded (force);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000325}
326
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000327bool
328ThreadGDBRemote::ThreadIDIsValid (lldb::tid_t thread)
329{
330 return thread != 0;
331}
332
333void
334ThreadGDBRemote::Dump(Log *log, uint32_t index)
335{
336}
337
338
339bool
340ThreadGDBRemote::ShouldStop (bool &step_more)
341{
342 return true;
343}
Greg Clayton5ccbd292011-01-06 22:15:06 +0000344lldb::RegisterContextSP
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000345ThreadGDBRemote::GetRegisterContext ()
346{
347 if (m_reg_context_sp.get() == NULL)
Greg Clayton5ccbd292011-01-06 22:15:06 +0000348 m_reg_context_sp = CreateRegisterContextForFrame (NULL);
349 return m_reg_context_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000350}
351
Greg Clayton5ccbd292011-01-06 22:15:06 +0000352lldb::RegisterContextSP
Jason Molendab57e4a12013-11-04 09:33:30 +0000353ThreadGDBRemote::CreateRegisterContextForFrame (StackFrame *frame)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000354{
Greg Clayton5ccbd292011-01-06 22:15:06 +0000355 lldb::RegisterContextSP reg_ctx_sp;
Greg Clayton5ccbd292011-01-06 22:15:06 +0000356 uint32_t concrete_frame_idx = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000357
358 if (frame)
Greg Clayton5ccbd292011-01-06 22:15:06 +0000359 concrete_frame_idx = frame->GetConcreteFrameIndex ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000360
Greg Clayton1ac04c32012-02-21 00:09:25 +0000361
Greg Clayton5ccbd292011-01-06 22:15:06 +0000362 if (concrete_frame_idx == 0)
Greg Clayton1ac04c32012-02-21 00:09:25 +0000363 {
364 ProcessSP process_sp (GetProcess());
365 if (process_sp)
366 {
367 ProcessGDBRemote *gdb_process = static_cast<ProcessGDBRemote *>(process_sp.get());
Hafiz Abid Qadeer9a78cdf2013-08-29 09:09:45 +0000368 // read_all_registers_at_once will be true if 'p' packet is not supported.
Sean Callananb1de1142013-09-04 23:24:15 +0000369 bool read_all_registers_at_once = !gdb_process->GetGDBRemote().GetpPacketSupported (GetID());
Greg Clayton1ac04c32012-02-21 00:09:25 +0000370 reg_ctx_sp.reset (new GDBRemoteRegisterContext (*this, concrete_frame_idx, gdb_process->m_register_info, read_all_registers_at_once));
371 }
372 }
Greg Claytonb3ae8762013-04-12 20:07:46 +0000373 else
374 {
375 Unwind *unwinder = GetUnwinder ();
376 if (unwinder)
377 reg_ctx_sp = unwinder->CreateRegisterContextForFrame (frame);
378 }
Greg Clayton5ccbd292011-01-06 22:15:06 +0000379 return reg_ctx_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000380}
381
Greg Claytone576ab22011-02-15 00:19:15 +0000382bool
Greg Clayton3e06bd92011-01-09 21:07:35 +0000383ThreadGDBRemote::PrivateSetRegisterValue (uint32_t reg, StringExtractor &response)
384{
385 GDBRemoteRegisterContext *gdb_reg_ctx = static_cast<GDBRemoteRegisterContext *>(GetRegisterContext ().get());
386 assert (gdb_reg_ctx);
Greg Claytone576ab22011-02-15 00:19:15 +0000387 return gdb_reg_ctx->PrivateSetRegisterValue (reg, response);
Greg Clayton3e06bd92011-01-09 21:07:35 +0000388}
389
Greg Clayton6e0ff1a2013-05-09 01:55:29 +0000390bool
Jason Molenda545304d2015-12-18 00:45:35 +0000391ThreadGDBRemote::PrivateSetRegisterValue (uint32_t reg, uint64_t regval)
392{
393 GDBRemoteRegisterContext *gdb_reg_ctx = static_cast<GDBRemoteRegisterContext *>(GetRegisterContext ().get());
394 assert (gdb_reg_ctx);
395 return gdb_reg_ctx->PrivateSetRegisterValue (reg, regval);
396}
397
398bool
Greg Clayton6e0ff1a2013-05-09 01:55:29 +0000399ThreadGDBRemote::CalculateStopInfo ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000400{
Greg Clayton1ac04c32012-02-21 00:09:25 +0000401 ProcessSP process_sp (GetProcess());
402 if (process_sp)
Greg Clayton358cf1e2015-06-25 21:46:34 +0000403 return static_cast<ProcessGDBRemote *>(process_sp.get())->CalculateThreadStopInfo(this);
Greg Clayton6e0ff1a2013-05-09 01:55:29 +0000404 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000405}
406
407