1 //===-- 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 13 #include "lldb/Core/ArchSpec.h" 14 #include "lldb/Core/DataExtractor.h" 15 #include "lldb/Core/StreamString.h" 16 #include "lldb/Core/State.h" 17 #include "lldb/Target/Process.h" 18 #include "lldb/Target/RegisterContext.h" 19 #include "lldb/Target/StopInfo.h" 20 #include "lldb/Target/Target.h" 21 #include "lldb/Target/Unwind.h" 22 #include "lldb/Breakpoint/WatchpointLocation.h" 23 24 #include "ProcessGDBRemote.h" 25 #include "ProcessGDBRemoteLog.h" 26 #include "Plugins/Process/Utility/UnwindLLDB.h" 27 #include "Utility/StringExtractorGDBRemote.h" 28 29 #if defined(__APPLE__) 30 #include "UnwindMacOSXFrameBackchain.h" 31 #endif 32 33 using namespace lldb; 34 using namespace lldb_private; 35 36 //---------------------------------------------------------------------- 37 // Thread Registers 38 //---------------------------------------------------------------------- 39 40 ThreadGDBRemote::ThreadGDBRemote (ProcessGDBRemote &process, lldb::tid_t tid) : 41 Thread(process, tid), 42 m_thread_name (), 43 m_dispatch_queue_name (), 44 m_thread_dispatch_qaddr (LLDB_INVALID_ADDRESS) 45 { 46 ProcessGDBRemoteLog::LogIf(GDBR_LOG_THREAD, "%p: ThreadGDBRemote::ThreadGDBRemote (pid = %i, tid = 0x%4.4x)", this, m_process.GetID(), GetID()); 47 } 48 49 ThreadGDBRemote::~ThreadGDBRemote () 50 { 51 ProcessGDBRemoteLog::LogIf(GDBR_LOG_THREAD, "%p: ThreadGDBRemote::~ThreadGDBRemote (pid = %i, tid = 0x%4.4x)", this, m_process.GetID(), GetID()); 52 DestroyThread(); 53 } 54 55 56 const char * 57 ThreadGDBRemote::GetInfo () 58 { 59 return NULL; 60 } 61 62 63 const char * 64 ThreadGDBRemote::GetName () 65 { 66 if (m_thread_name.empty()) 67 return NULL; 68 return m_thread_name.c_str(); 69 } 70 71 72 const char * 73 ThreadGDBRemote::GetQueueName () 74 { 75 // Always re-fetch the dispatch queue name since it can change 76 if (m_thread_dispatch_qaddr != 0 || m_thread_dispatch_qaddr != LLDB_INVALID_ADDRESS) 77 return GetGDBProcess().GetDispatchQueueNameForThread (m_thread_dispatch_qaddr, m_dispatch_queue_name); 78 return NULL; 79 } 80 81 bool 82 ThreadGDBRemote::WillResume (StateType resume_state) 83 { 84 ClearStackFrames(); 85 // Call the Thread::WillResume first. If we stop at a signal, the stop info 86 // class for signal will set the resume signal that we need below. The signal 87 // stuff obeys the Process::UnixSignal defaults. 88 Thread::WillResume(resume_state); 89 90 int signo = GetResumeSignal(); 91 lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP)); 92 if (log) 93 log->Printf ("Resuming thread: %4.4x with state: %s.", GetID(), StateAsCString(resume_state)); 94 95 ProcessGDBRemote &process = GetGDBProcess(); 96 switch (resume_state) 97 { 98 case eStateSuspended: 99 case eStateStopped: 100 // Don't append anything for threads that should stay stopped. 101 break; 102 103 case eStateRunning: 104 if (m_process.GetUnixSignals().SignalIsValid (signo)) 105 process.m_continue_C_tids.push_back(std::make_pair(GetID(), signo)); 106 else 107 process.m_continue_c_tids.push_back(GetID()); 108 break; 109 110 case eStateStepping: 111 if (m_process.GetUnixSignals().SignalIsValid (signo)) 112 process.m_continue_S_tids.push_back(std::make_pair(GetID(), signo)); 113 else 114 process.m_continue_s_tids.push_back(GetID()); 115 break; 116 117 default: 118 break; 119 } 120 return true; 121 } 122 123 void 124 ThreadGDBRemote::RefreshStateAfterStop() 125 { 126 // Invalidate all registers in our register context. We don't set "force" to 127 // true because the stop reply packet might have had some register values 128 // that were expedited and these will already be copied into the register 129 // context by the time this function gets called. The GDBRemoteRegisterContext 130 // class has been made smart enough to detect when it needs to invalidate 131 // which registers are valid by putting hooks in the register read and 132 // register supply functions where they check the process stop ID and do 133 // the right thing. 134 const bool force = false; 135 GetRegisterContext()->InvalidateIfNeeded (force); 136 } 137 138 Unwind * 139 ThreadGDBRemote::GetUnwinder () 140 { 141 if (m_unwinder_ap.get() == NULL) 142 { 143 const ArchSpec target_arch (GetProcess().GetTarget().GetArchitecture ()); 144 const llvm::Triple::ArchType machine = target_arch.GetMachine(); 145 switch (machine) 146 { 147 case llvm::Triple::x86_64: 148 case llvm::Triple::x86: 149 case llvm::Triple::arm: 150 case llvm::Triple::thumb: 151 m_unwinder_ap.reset (new UnwindLLDB (*this)); 152 break; 153 154 default: 155 #if defined(__APPLE__) 156 m_unwinder_ap.reset (new UnwindMacOSXFrameBackchain (*this)); 157 #endif 158 break; 159 } 160 } 161 return m_unwinder_ap.get(); 162 } 163 164 void 165 ThreadGDBRemote::ClearStackFrames () 166 { 167 Unwind *unwinder = GetUnwinder (); 168 if (unwinder) 169 unwinder->Clear(); 170 Thread::ClearStackFrames(); 171 } 172 173 174 bool 175 ThreadGDBRemote::ThreadIDIsValid (lldb::tid_t thread) 176 { 177 return thread != 0; 178 } 179 180 void 181 ThreadGDBRemote::Dump(Log *log, uint32_t index) 182 { 183 } 184 185 186 bool 187 ThreadGDBRemote::ShouldStop (bool &step_more) 188 { 189 return true; 190 } 191 lldb::RegisterContextSP 192 ThreadGDBRemote::GetRegisterContext () 193 { 194 if (m_reg_context_sp.get() == NULL) 195 m_reg_context_sp = CreateRegisterContextForFrame (NULL); 196 return m_reg_context_sp; 197 } 198 199 lldb::RegisterContextSP 200 ThreadGDBRemote::CreateRegisterContextForFrame (StackFrame *frame) 201 { 202 lldb::RegisterContextSP reg_ctx_sp; 203 const bool read_all_registers_at_once = false; 204 uint32_t concrete_frame_idx = 0; 205 206 if (frame) 207 concrete_frame_idx = frame->GetConcreteFrameIndex (); 208 209 if (concrete_frame_idx == 0) 210 reg_ctx_sp.reset (new GDBRemoteRegisterContext (*this, concrete_frame_idx, GetGDBProcess().m_register_info, read_all_registers_at_once)); 211 else if (m_unwinder_ap.get()) 212 reg_ctx_sp = m_unwinder_ap->CreateRegisterContextForFrame (frame); 213 return reg_ctx_sp; 214 } 215 216 bool 217 ThreadGDBRemote::PrivateSetRegisterValue (uint32_t reg, StringExtractor &response) 218 { 219 GDBRemoteRegisterContext *gdb_reg_ctx = static_cast<GDBRemoteRegisterContext *>(GetRegisterContext ().get()); 220 assert (gdb_reg_ctx); 221 return gdb_reg_ctx->PrivateSetRegisterValue (reg, response); 222 } 223 224 bool 225 ThreadGDBRemote::SaveFrameZeroState (RegisterCheckpoint &checkpoint) 226 { 227 lldb::StackFrameSP frame_sp(GetStackFrameAtIndex (0)); 228 if (frame_sp) 229 { 230 checkpoint.SetStackID(frame_sp->GetStackID()); 231 return frame_sp->GetRegisterContext()->ReadAllRegisterValues (checkpoint.GetData()); 232 } 233 return false; 234 } 235 236 bool 237 ThreadGDBRemote::RestoreSaveFrameZero (const RegisterCheckpoint &checkpoint) 238 { 239 lldb::StackFrameSP frame_sp(GetStackFrameAtIndex (0)); 240 if (frame_sp) 241 { 242 bool ret = frame_sp->GetRegisterContext()->WriteAllRegisterValues (checkpoint.GetData()); 243 frame_sp->GetRegisterContext()->InvalidateIfNeeded(true); 244 ClearStackFrames(); 245 return ret; 246 } 247 return false; 248 } 249 250 lldb::StopInfoSP 251 ThreadGDBRemote::GetPrivateStopReason () 252 { 253 const uint32_t process_stop_id = GetProcess().GetStopID(); 254 if (m_thread_stop_reason_stop_id != process_stop_id || 255 (m_actual_stop_info_sp && !m_actual_stop_info_sp->IsValid())) 256 { 257 // If GetGDBProcess().SetThreadStopInfo() doesn't find a stop reason 258 // for this thread, then m_actual_stop_info_sp will not ever contain 259 // a valid stop reason and the "m_actual_stop_info_sp->IsValid() == false" 260 // check will never be able to tell us if we have the correct stop info 261 // for this thread and we will continually send qThreadStopInfo packets 262 // down to the remote GDB server, so we need to keep our own notion 263 // of the stop ID that m_actual_stop_info_sp is valid for (even if it 264 // contains nothing). We use m_thread_stop_reason_stop_id for this below. 265 m_thread_stop_reason_stop_id = process_stop_id; 266 m_actual_stop_info_sp.reset(); 267 268 StringExtractorGDBRemote stop_packet; 269 ProcessGDBRemote &gdb_process = GetGDBProcess(); 270 if (gdb_process.GetGDBRemote().GetThreadStopInfo(GetID(), stop_packet)) 271 gdb_process.SetThreadStopInfo (stop_packet); 272 } 273 return m_actual_stop_info_sp; 274 } 275 276 277