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