1*30fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===// 2*30fdc8d8SChris Lattner // 3*30fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 4*30fdc8d8SChris Lattner // 5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 7*30fdc8d8SChris Lattner // 8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 9*30fdc8d8SChris Lattner 10*30fdc8d8SChris Lattner #include "SBProcess.h" 11*30fdc8d8SChris Lattner 12*30fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 13*30fdc8d8SChris Lattner #include "lldb/lldb-types.h" 14*30fdc8d8SChris Lattner 15*30fdc8d8SChris Lattner #include "lldb/Core/Args.h" 16*30fdc8d8SChris Lattner #include "lldb/Core/DataBufferHeap.h" 17*30fdc8d8SChris Lattner #include "lldb/Core/DataExtractor.h" 18*30fdc8d8SChris Lattner #include "lldb/Core/State.h" 19*30fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 20*30fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 21*30fdc8d8SChris Lattner #include "lldb/Target/Process.h" 22*30fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 23*30fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 24*30fdc8d8SChris Lattner 25*30fdc8d8SChris Lattner // Project includes 26*30fdc8d8SChris Lattner 27*30fdc8d8SChris Lattner #include "SBBroadcaster.h" 28*30fdc8d8SChris Lattner #include "SBDebugger.h" 29*30fdc8d8SChris Lattner #include "SBCommandReturnObject.h" 30*30fdc8d8SChris Lattner #include "SBEvent.h" 31*30fdc8d8SChris Lattner #include "SBThread.h" 32*30fdc8d8SChris Lattner #include "SBStringList.h" 33*30fdc8d8SChris Lattner 34*30fdc8d8SChris Lattner using namespace lldb; 35*30fdc8d8SChris Lattner using namespace lldb_private; 36*30fdc8d8SChris Lattner 37*30fdc8d8SChris Lattner 38*30fdc8d8SChris Lattner 39*30fdc8d8SChris Lattner SBProcess::SBProcess () : 40*30fdc8d8SChris Lattner m_lldb_object_sp() 41*30fdc8d8SChris Lattner { 42*30fdc8d8SChris Lattner } 43*30fdc8d8SChris Lattner 44*30fdc8d8SChris Lattner 45*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 46*30fdc8d8SChris Lattner // SBProcess constructor 47*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 48*30fdc8d8SChris Lattner 49*30fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 50*30fdc8d8SChris Lattner m_lldb_object_sp (rhs.m_lldb_object_sp) 51*30fdc8d8SChris Lattner { 52*30fdc8d8SChris Lattner } 53*30fdc8d8SChris Lattner 54*30fdc8d8SChris Lattner 55*30fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 56*30fdc8d8SChris Lattner m_lldb_object_sp (process_sp) 57*30fdc8d8SChris Lattner { 58*30fdc8d8SChris Lattner } 59*30fdc8d8SChris Lattner 60*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 61*30fdc8d8SChris Lattner // Destructor 62*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 63*30fdc8d8SChris Lattner SBProcess::~SBProcess() 64*30fdc8d8SChris Lattner { 65*30fdc8d8SChris Lattner } 66*30fdc8d8SChris Lattner 67*30fdc8d8SChris Lattner void 68*30fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp) 69*30fdc8d8SChris Lattner { 70*30fdc8d8SChris Lattner m_lldb_object_sp = process_sp; 71*30fdc8d8SChris Lattner } 72*30fdc8d8SChris Lattner 73*30fdc8d8SChris Lattner void 74*30fdc8d8SChris Lattner SBProcess::Clear () 75*30fdc8d8SChris Lattner { 76*30fdc8d8SChris Lattner m_lldb_object_sp.reset(); 77*30fdc8d8SChris Lattner } 78*30fdc8d8SChris Lattner 79*30fdc8d8SChris Lattner 80*30fdc8d8SChris Lattner bool 81*30fdc8d8SChris Lattner SBProcess::IsValid() const 82*30fdc8d8SChris Lattner { 83*30fdc8d8SChris Lattner return m_lldb_object_sp.get() != NULL; 84*30fdc8d8SChris Lattner } 85*30fdc8d8SChris Lattner 86*30fdc8d8SChris Lattner 87*30fdc8d8SChris Lattner uint32_t 88*30fdc8d8SChris Lattner SBProcess::GetNumThreads () 89*30fdc8d8SChris Lattner { 90*30fdc8d8SChris Lattner if (m_lldb_object_sp) 91*30fdc8d8SChris Lattner { 92*30fdc8d8SChris Lattner const bool can_update = true; 93*30fdc8d8SChris Lattner return m_lldb_object_sp->GetThreadList().GetSize(can_update); 94*30fdc8d8SChris Lattner } 95*30fdc8d8SChris Lattner return 0; 96*30fdc8d8SChris Lattner } 97*30fdc8d8SChris Lattner 98*30fdc8d8SChris Lattner SBThread 99*30fdc8d8SChris Lattner SBProcess::GetCurrentThread () const 100*30fdc8d8SChris Lattner { 101*30fdc8d8SChris Lattner SBThread sb_thread; 102*30fdc8d8SChris Lattner if (m_lldb_object_sp) 103*30fdc8d8SChris Lattner sb_thread.SetThread (m_lldb_object_sp->GetThreadList().GetCurrentThread()); 104*30fdc8d8SChris Lattner return sb_thread; 105*30fdc8d8SChris Lattner } 106*30fdc8d8SChris Lattner 107*30fdc8d8SChris Lattner SBTarget 108*30fdc8d8SChris Lattner SBProcess::GetTarget() const 109*30fdc8d8SChris Lattner { 110*30fdc8d8SChris Lattner SBTarget sb_target; 111*30fdc8d8SChris Lattner if (m_lldb_object_sp) 112*30fdc8d8SChris Lattner sb_target = SBDebugger::FindTargetWithLLDBProcess (m_lldb_object_sp); 113*30fdc8d8SChris Lattner return sb_target; 114*30fdc8d8SChris Lattner } 115*30fdc8d8SChris Lattner 116*30fdc8d8SChris Lattner 117*30fdc8d8SChris Lattner size_t 118*30fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 119*30fdc8d8SChris Lattner { 120*30fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 121*30fdc8d8SChris Lattner { 122*30fdc8d8SChris Lattner Error error; 123*30fdc8d8SChris Lattner return m_lldb_object_sp->PutSTDIN (src, src_len, error); 124*30fdc8d8SChris Lattner } 125*30fdc8d8SChris Lattner else 126*30fdc8d8SChris Lattner return 0; 127*30fdc8d8SChris Lattner } 128*30fdc8d8SChris Lattner 129*30fdc8d8SChris Lattner size_t 130*30fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 131*30fdc8d8SChris Lattner { 132*30fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 133*30fdc8d8SChris Lattner { 134*30fdc8d8SChris Lattner Error error; 135*30fdc8d8SChris Lattner return m_lldb_object_sp->GetSTDOUT (dst, dst_len, error); 136*30fdc8d8SChris Lattner } 137*30fdc8d8SChris Lattner else 138*30fdc8d8SChris Lattner return 0; 139*30fdc8d8SChris Lattner } 140*30fdc8d8SChris Lattner 141*30fdc8d8SChris Lattner size_t 142*30fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 143*30fdc8d8SChris Lattner { 144*30fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 145*30fdc8d8SChris Lattner { 146*30fdc8d8SChris Lattner Error error; 147*30fdc8d8SChris Lattner return m_lldb_object_sp->GetSTDERR (dst, dst_len, error); 148*30fdc8d8SChris Lattner } 149*30fdc8d8SChris Lattner else 150*30fdc8d8SChris Lattner return 0; 151*30fdc8d8SChris Lattner } 152*30fdc8d8SChris Lattner 153*30fdc8d8SChris Lattner void 154*30fdc8d8SChris Lattner SBProcess::ReportCurrentState (const SBEvent &event, FILE *out) const 155*30fdc8d8SChris Lattner { 156*30fdc8d8SChris Lattner if (out == NULL) 157*30fdc8d8SChris Lattner return; 158*30fdc8d8SChris Lattner 159*30fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 160*30fdc8d8SChris Lattner { 161*30fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 162*30fdc8d8SChris Lattner char message[1024]; 163*30fdc8d8SChris Lattner int message_len = ::snprintf (message, 164*30fdc8d8SChris Lattner sizeof (message), 165*30fdc8d8SChris Lattner "Process %d %s\n", 166*30fdc8d8SChris Lattner m_lldb_object_sp->GetID(), 167*30fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 168*30fdc8d8SChris Lattner 169*30fdc8d8SChris Lattner if (message_len > 0) 170*30fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 171*30fdc8d8SChris Lattner } 172*30fdc8d8SChris Lattner } 173*30fdc8d8SChris Lattner 174*30fdc8d8SChris Lattner void 175*30fdc8d8SChris Lattner SBProcess::AppendCurrentStateReport (const SBEvent &event, SBCommandReturnObject &result) 176*30fdc8d8SChris Lattner { 177*30fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 178*30fdc8d8SChris Lattner { 179*30fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 180*30fdc8d8SChris Lattner char message[1024]; 181*30fdc8d8SChris Lattner ::snprintf (message, 182*30fdc8d8SChris Lattner sizeof (message), 183*30fdc8d8SChris Lattner "Process %d %s\n", 184*30fdc8d8SChris Lattner m_lldb_object_sp->GetID(), 185*30fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 186*30fdc8d8SChris Lattner 187*30fdc8d8SChris Lattner result.AppendMessage (message); 188*30fdc8d8SChris Lattner } 189*30fdc8d8SChris Lattner } 190*30fdc8d8SChris Lattner 191*30fdc8d8SChris Lattner bool 192*30fdc8d8SChris Lattner SBProcess::SetCurrentThread (const SBThread &thread) 193*30fdc8d8SChris Lattner { 194*30fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 195*30fdc8d8SChris Lattner return m_lldb_object_sp->GetThreadList().SetCurrentThreadByID (thread.GetThreadID()); 196*30fdc8d8SChris Lattner return false; 197*30fdc8d8SChris Lattner } 198*30fdc8d8SChris Lattner 199*30fdc8d8SChris Lattner bool 200*30fdc8d8SChris Lattner SBProcess::SetCurrentThreadByID (uint32_t tid) 201*30fdc8d8SChris Lattner { 202*30fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 203*30fdc8d8SChris Lattner return m_lldb_object_sp->GetThreadList().SetCurrentThreadByID (tid); 204*30fdc8d8SChris Lattner return false; 205*30fdc8d8SChris Lattner } 206*30fdc8d8SChris Lattner 207*30fdc8d8SChris Lattner SBThread 208*30fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 209*30fdc8d8SChris Lattner { 210*30fdc8d8SChris Lattner SBThread thread; 211*30fdc8d8SChris Lattner if (m_lldb_object_sp) 212*30fdc8d8SChris Lattner thread.SetThread (m_lldb_object_sp->GetThreadList().GetThreadAtIndex(index)); 213*30fdc8d8SChris Lattner return thread; 214*30fdc8d8SChris Lattner } 215*30fdc8d8SChris Lattner 216*30fdc8d8SChris Lattner StateType 217*30fdc8d8SChris Lattner SBProcess::GetState () 218*30fdc8d8SChris Lattner { 219*30fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 220*30fdc8d8SChris Lattner return m_lldb_object_sp->GetState(); 221*30fdc8d8SChris Lattner else 222*30fdc8d8SChris Lattner return eStateInvalid; 223*30fdc8d8SChris Lattner } 224*30fdc8d8SChris Lattner 225*30fdc8d8SChris Lattner 226*30fdc8d8SChris Lattner int 227*30fdc8d8SChris Lattner SBProcess::GetExitStatus () 228*30fdc8d8SChris Lattner { 229*30fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 230*30fdc8d8SChris Lattner return m_lldb_object_sp->GetExitStatus (); 231*30fdc8d8SChris Lattner else 232*30fdc8d8SChris Lattner return 0; 233*30fdc8d8SChris Lattner } 234*30fdc8d8SChris Lattner 235*30fdc8d8SChris Lattner const char * 236*30fdc8d8SChris Lattner SBProcess::GetExitDescription () 237*30fdc8d8SChris Lattner { 238*30fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 239*30fdc8d8SChris Lattner return m_lldb_object_sp->GetExitDescription (); 240*30fdc8d8SChris Lattner else 241*30fdc8d8SChris Lattner return NULL; 242*30fdc8d8SChris Lattner } 243*30fdc8d8SChris Lattner 244*30fdc8d8SChris Lattner lldb::pid_t 245*30fdc8d8SChris Lattner SBProcess::GetProcessID () 246*30fdc8d8SChris Lattner { 247*30fdc8d8SChris Lattner if (m_lldb_object_sp) 248*30fdc8d8SChris Lattner return m_lldb_object_sp->GetID(); 249*30fdc8d8SChris Lattner else 250*30fdc8d8SChris Lattner return LLDB_INVALID_PROCESS_ID; 251*30fdc8d8SChris Lattner } 252*30fdc8d8SChris Lattner 253*30fdc8d8SChris Lattner uint32_t 254*30fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 255*30fdc8d8SChris Lattner { 256*30fdc8d8SChris Lattner if (m_lldb_object_sp) 257*30fdc8d8SChris Lattner return m_lldb_object_sp->GetAddressByteSize(); 258*30fdc8d8SChris Lattner else 259*30fdc8d8SChris Lattner return 0; 260*30fdc8d8SChris Lattner } 261*30fdc8d8SChris Lattner 262*30fdc8d8SChris Lattner 263*30fdc8d8SChris Lattner void 264*30fdc8d8SChris Lattner SBProcess::DisplayThreadsInfo (FILE *out, FILE *err, bool only_threads_with_stop_reason) 265*30fdc8d8SChris Lattner { 266*30fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 267*30fdc8d8SChris Lattner { 268*30fdc8d8SChris Lattner size_t num_thread_infos_dumped = 0; 269*30fdc8d8SChris Lattner size_t num_threads = GetNumThreads(); 270*30fdc8d8SChris Lattner 271*30fdc8d8SChris Lattner if (out == NULL) 272*30fdc8d8SChris Lattner out = SBDebugger::GetOutputFileHandle(); 273*30fdc8d8SChris Lattner 274*30fdc8d8SChris Lattner if (err == NULL) 275*30fdc8d8SChris Lattner err = SBDebugger::GetErrorFileHandle(); 276*30fdc8d8SChris Lattner 277*30fdc8d8SChris Lattner if ((out == NULL) ||(err == NULL)) 278*30fdc8d8SChris Lattner return; 279*30fdc8d8SChris Lattner 280*30fdc8d8SChris Lattner if (num_threads > 0) 281*30fdc8d8SChris Lattner { 282*30fdc8d8SChris Lattner Thread::StopInfo thread_stop_info; 283*30fdc8d8SChris Lattner SBThread curr_thread (m_lldb_object_sp->GetThreadList().GetCurrentThread()); 284*30fdc8d8SChris Lattner for (int i = 0; i < num_threads; ++i) 285*30fdc8d8SChris Lattner { 286*30fdc8d8SChris Lattner SBThread thread (m_lldb_object_sp->GetThreadList().GetThreadAtIndex(i)); 287*30fdc8d8SChris Lattner if (thread.IsValid()) 288*30fdc8d8SChris Lattner { 289*30fdc8d8SChris Lattner bool is_current_thread = false; 290*30fdc8d8SChris Lattner StreamFile str (out); 291*30fdc8d8SChris Lattner if (thread == curr_thread) 292*30fdc8d8SChris Lattner is_current_thread = true; 293*30fdc8d8SChris Lattner StopReason thread_stop_reason = eStopReasonNone; 294*30fdc8d8SChris Lattner if (thread->GetStopInfo (&thread_stop_info)) 295*30fdc8d8SChris Lattner { 296*30fdc8d8SChris Lattner thread_stop_reason = thread_stop_info.GetStopReason(); 297*30fdc8d8SChris Lattner if (thread_stop_reason == eStopReasonNone) 298*30fdc8d8SChris Lattner { 299*30fdc8d8SChris Lattner if (only_threads_with_stop_reason && !is_current_thread) 300*30fdc8d8SChris Lattner continue; 301*30fdc8d8SChris Lattner } 302*30fdc8d8SChris Lattner } 303*30fdc8d8SChris Lattner ++num_thread_infos_dumped; 304*30fdc8d8SChris Lattner fprintf (out, " %c thread #%u: tid = 0x%4.4x, pc = 0x%16.16llx", 305*30fdc8d8SChris Lattner (is_current_thread ? '*' : ' '), 306*30fdc8d8SChris Lattner thread->GetIndexID(), thread->GetID(), thread->GetRegisterContext()->GetPC()); 307*30fdc8d8SChris Lattner 308*30fdc8d8SChris Lattner StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0)); 309*30fdc8d8SChris Lattner if (frame_sp) 310*30fdc8d8SChris Lattner { 311*30fdc8d8SChris Lattner SymbolContext sc (frame_sp->GetSymbolContext (eSymbolContextEverything)); 312*30fdc8d8SChris Lattner fprintf (out, ", where = "); 313*30fdc8d8SChris Lattner sc.DumpStopContext (&str, m_lldb_object_sp.get(), frame_sp->GetPC ()); 314*30fdc8d8SChris Lattner } 315*30fdc8d8SChris Lattner 316*30fdc8d8SChris Lattner if (thread_stop_reason != eStopReasonNone) 317*30fdc8d8SChris Lattner { 318*30fdc8d8SChris Lattner fprintf (out, ", stop reason = "); 319*30fdc8d8SChris Lattner thread_stop_info.Dump (&str); 320*30fdc8d8SChris Lattner } 321*30fdc8d8SChris Lattner 322*30fdc8d8SChris Lattner const char *thread_name = thread->GetName(); 323*30fdc8d8SChris Lattner if (thread_name && thread_name[0]) 324*30fdc8d8SChris Lattner fprintf (out, ", thread_name = '%s'", thread_name); 325*30fdc8d8SChris Lattner 326*30fdc8d8SChris Lattner fprintf (out, "\n"); 327*30fdc8d8SChris Lattner 328*30fdc8d8SChris Lattner SBThread sb_thread (thread); 329*30fdc8d8SChris Lattner sb_thread.DisplayFramesForCurrentContext (out, err, 0, 1, false, 1); 330*30fdc8d8SChris Lattner } 331*30fdc8d8SChris Lattner } 332*30fdc8d8SChris Lattner } 333*30fdc8d8SChris Lattner } 334*30fdc8d8SChris Lattner } 335*30fdc8d8SChris Lattner bool 336*30fdc8d8SChris Lattner SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result) 337*30fdc8d8SChris Lattner { 338*30fdc8d8SChris Lattner bool state_changed = false; 339*30fdc8d8SChris Lattner 340*30fdc8d8SChris Lattner if (IsValid()) 341*30fdc8d8SChris Lattner { 342*30fdc8d8SChris Lattner EventSP event_sp; 343*30fdc8d8SChris Lattner StateType state = m_lldb_object_sp->WaitForStateChangedEvents (NULL, event_sp); 344*30fdc8d8SChris Lattner 345*30fdc8d8SChris Lattner while (StateIsStoppedState (state)) 346*30fdc8d8SChris Lattner { 347*30fdc8d8SChris Lattner state = m_lldb_object_sp->WaitForStateChangedEvents (NULL, event_sp); 348*30fdc8d8SChris Lattner SBEvent event (event_sp); 349*30fdc8d8SChris Lattner AppendCurrentStateReport (event, result); 350*30fdc8d8SChris Lattner state_changed = true; 351*30fdc8d8SChris Lattner } 352*30fdc8d8SChris Lattner } 353*30fdc8d8SChris Lattner return state_changed; 354*30fdc8d8SChris Lattner } 355*30fdc8d8SChris Lattner 356*30fdc8d8SChris Lattner SBError 357*30fdc8d8SChris Lattner SBProcess::Continue () 358*30fdc8d8SChris Lattner { 359*30fdc8d8SChris Lattner SBError sb_error; 360*30fdc8d8SChris Lattner if (IsValid()) 361*30fdc8d8SChris Lattner sb_error.SetError(m_lldb_object_sp->Resume()); 362*30fdc8d8SChris Lattner else 363*30fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 364*30fdc8d8SChris Lattner 365*30fdc8d8SChris Lattner return sb_error; 366*30fdc8d8SChris Lattner } 367*30fdc8d8SChris Lattner 368*30fdc8d8SChris Lattner 369*30fdc8d8SChris Lattner SBError 370*30fdc8d8SChris Lattner SBProcess::Destroy () 371*30fdc8d8SChris Lattner { 372*30fdc8d8SChris Lattner SBError sb_error; 373*30fdc8d8SChris Lattner if (m_lldb_object_sp) 374*30fdc8d8SChris Lattner sb_error.SetError(m_lldb_object_sp->Destroy()); 375*30fdc8d8SChris Lattner else 376*30fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 377*30fdc8d8SChris Lattner 378*30fdc8d8SChris Lattner return sb_error; 379*30fdc8d8SChris Lattner } 380*30fdc8d8SChris Lattner 381*30fdc8d8SChris Lattner 382*30fdc8d8SChris Lattner SBError 383*30fdc8d8SChris Lattner SBProcess::Stop () 384*30fdc8d8SChris Lattner { 385*30fdc8d8SChris Lattner SBError sb_error; 386*30fdc8d8SChris Lattner if (IsValid()) 387*30fdc8d8SChris Lattner sb_error.SetError (m_lldb_object_sp->Halt()); 388*30fdc8d8SChris Lattner else 389*30fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 390*30fdc8d8SChris Lattner return sb_error; 391*30fdc8d8SChris Lattner } 392*30fdc8d8SChris Lattner 393*30fdc8d8SChris Lattner SBError 394*30fdc8d8SChris Lattner SBProcess::Kill () 395*30fdc8d8SChris Lattner { 396*30fdc8d8SChris Lattner SBError sb_error; 397*30fdc8d8SChris Lattner if (m_lldb_object_sp) 398*30fdc8d8SChris Lattner sb_error.SetError (m_lldb_object_sp->Destroy()); 399*30fdc8d8SChris Lattner else 400*30fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 401*30fdc8d8SChris Lattner return sb_error; 402*30fdc8d8SChris Lattner } 403*30fdc8d8SChris Lattner 404*30fdc8d8SChris Lattner 405*30fdc8d8SChris Lattner SBError 406*30fdc8d8SChris Lattner SBProcess::AttachByName (const char *name, bool wait_for_launch) 407*30fdc8d8SChris Lattner { 408*30fdc8d8SChris Lattner SBError sb_error; 409*30fdc8d8SChris Lattner if (m_lldb_object_sp) 410*30fdc8d8SChris Lattner sb_error.SetError (m_lldb_object_sp->Attach (name, wait_for_launch)); 411*30fdc8d8SChris Lattner else 412*30fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 413*30fdc8d8SChris Lattner return sb_error; 414*30fdc8d8SChris Lattner } 415*30fdc8d8SChris Lattner 416*30fdc8d8SChris Lattner lldb::pid_t 417*30fdc8d8SChris Lattner SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t) 418*30fdc8d8SChris Lattner { 419*30fdc8d8SChris Lattner Attach (attach_pid); 420*30fdc8d8SChris Lattner return GetProcessID(); 421*30fdc8d8SChris Lattner } 422*30fdc8d8SChris Lattner 423*30fdc8d8SChris Lattner 424*30fdc8d8SChris Lattner SBError 425*30fdc8d8SChris Lattner SBProcess::Attach (lldb::pid_t attach_pid) 426*30fdc8d8SChris Lattner { 427*30fdc8d8SChris Lattner SBError sb_error; 428*30fdc8d8SChris Lattner if (m_lldb_object_sp) 429*30fdc8d8SChris Lattner sb_error.SetError (m_lldb_object_sp->Attach (attach_pid)); 430*30fdc8d8SChris Lattner else 431*30fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 432*30fdc8d8SChris Lattner return sb_error; 433*30fdc8d8SChris Lattner } 434*30fdc8d8SChris Lattner 435*30fdc8d8SChris Lattner SBError 436*30fdc8d8SChris Lattner SBProcess::Detach () 437*30fdc8d8SChris Lattner { 438*30fdc8d8SChris Lattner SBError sb_error; 439*30fdc8d8SChris Lattner if (m_lldb_object_sp) 440*30fdc8d8SChris Lattner sb_error.SetError (m_lldb_object_sp->Detach()); 441*30fdc8d8SChris Lattner else 442*30fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 443*30fdc8d8SChris Lattner 444*30fdc8d8SChris Lattner return sb_error; 445*30fdc8d8SChris Lattner } 446*30fdc8d8SChris Lattner 447*30fdc8d8SChris Lattner SBError 448*30fdc8d8SChris Lattner SBProcess::Signal (int signal) 449*30fdc8d8SChris Lattner { 450*30fdc8d8SChris Lattner SBError sb_error; 451*30fdc8d8SChris Lattner if (m_lldb_object_sp) 452*30fdc8d8SChris Lattner sb_error.SetError (m_lldb_object_sp->Signal (signal)); 453*30fdc8d8SChris Lattner else 454*30fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 455*30fdc8d8SChris Lattner return sb_error; 456*30fdc8d8SChris Lattner } 457*30fdc8d8SChris Lattner 458*30fdc8d8SChris Lattner void 459*30fdc8d8SChris Lattner SBProcess::ListThreads () 460*30fdc8d8SChris Lattner { 461*30fdc8d8SChris Lattner FILE *out = SBDebugger::GetOutputFileHandle(); 462*30fdc8d8SChris Lattner if (out == NULL) 463*30fdc8d8SChris Lattner return; 464*30fdc8d8SChris Lattner 465*30fdc8d8SChris Lattner if (m_lldb_object_sp) 466*30fdc8d8SChris Lattner { 467*30fdc8d8SChris Lattner size_t num_threads = GetNumThreads (); 468*30fdc8d8SChris Lattner if (num_threads > 0) 469*30fdc8d8SChris Lattner { 470*30fdc8d8SChris Lattner Thread *cur_thread = m_lldb_object_sp->GetThreadList().GetCurrentThread().get(); 471*30fdc8d8SChris Lattner for (int i = 0; i < num_threads; ++i) 472*30fdc8d8SChris Lattner { 473*30fdc8d8SChris Lattner Thread *thread = m_lldb_object_sp->GetThreadList().GetThreadAtIndex(i).get(); 474*30fdc8d8SChris Lattner if (thread) 475*30fdc8d8SChris Lattner { 476*30fdc8d8SChris Lattner bool is_current_thread = false; 477*30fdc8d8SChris Lattner if (thread == cur_thread) 478*30fdc8d8SChris Lattner is_current_thread = true; 479*30fdc8d8SChris Lattner fprintf (out, " [%u] %c tid = 0x%4.4x, pc = 0x%16.16llx", 480*30fdc8d8SChris Lattner i, 481*30fdc8d8SChris Lattner (is_current_thread ? '*' : ' '), 482*30fdc8d8SChris Lattner thread->GetID(), 483*30fdc8d8SChris Lattner thread->GetRegisterContext()->GetPC()); 484*30fdc8d8SChris Lattner const char *thread_name = thread->GetName(); 485*30fdc8d8SChris Lattner if (thread_name && thread_name[0]) 486*30fdc8d8SChris Lattner fprintf (out, ", name = %s", thread_name); 487*30fdc8d8SChris Lattner const char *queue_name = thread->GetQueueName(); 488*30fdc8d8SChris Lattner if (queue_name && queue_name[0]) 489*30fdc8d8SChris Lattner fprintf (out, ", queue = %s", queue_name); 490*30fdc8d8SChris Lattner fprintf (out, "\n"); 491*30fdc8d8SChris Lattner } 492*30fdc8d8SChris Lattner } 493*30fdc8d8SChris Lattner } 494*30fdc8d8SChris Lattner } 495*30fdc8d8SChris Lattner } 496*30fdc8d8SChris Lattner 497*30fdc8d8SChris Lattner SBThread 498*30fdc8d8SChris Lattner SBProcess::GetThreadByID (tid_t sb_thread_id) 499*30fdc8d8SChris Lattner { 500*30fdc8d8SChris Lattner SBThread thread; 501*30fdc8d8SChris Lattner if (m_lldb_object_sp) 502*30fdc8d8SChris Lattner thread.SetThread (m_lldb_object_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id)); 503*30fdc8d8SChris Lattner return thread; 504*30fdc8d8SChris Lattner } 505*30fdc8d8SChris Lattner 506*30fdc8d8SChris Lattner void 507*30fdc8d8SChris Lattner SBProcess::Backtrace (bool all_threads, uint32_t num_frames) 508*30fdc8d8SChris Lattner { 509*30fdc8d8SChris Lattner if (m_lldb_object_sp) 510*30fdc8d8SChris Lattner { 511*30fdc8d8SChris Lattner if (!all_threads) 512*30fdc8d8SChris Lattner { 513*30fdc8d8SChris Lattner SBDebugger::UpdateCurrentThread (*this); 514*30fdc8d8SChris Lattner SBThread cur_thread = GetCurrentThread(); 515*30fdc8d8SChris Lattner if (cur_thread.IsValid()) 516*30fdc8d8SChris Lattner cur_thread.Backtrace (num_frames); 517*30fdc8d8SChris Lattner } 518*30fdc8d8SChris Lattner else 519*30fdc8d8SChris Lattner { 520*30fdc8d8SChris Lattner int num_threads = GetNumThreads (); 521*30fdc8d8SChris Lattner for (int i = 0; i < num_threads; ++i) 522*30fdc8d8SChris Lattner { 523*30fdc8d8SChris Lattner SBThread sb_thread = GetThreadAtIndex (i); 524*30fdc8d8SChris Lattner sb_thread.Backtrace (num_frames); 525*30fdc8d8SChris Lattner } 526*30fdc8d8SChris Lattner } 527*30fdc8d8SChris Lattner } 528*30fdc8d8SChris Lattner } 529*30fdc8d8SChris Lattner 530*30fdc8d8SChris Lattner StateType 531*30fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 532*30fdc8d8SChris Lattner { 533*30fdc8d8SChris Lattner return Process::ProcessEventData::GetStateFromEvent (event.GetLLDBObjectPtr()); 534*30fdc8d8SChris Lattner } 535*30fdc8d8SChris Lattner 536*30fdc8d8SChris Lattner 537*30fdc8d8SChris Lattner bool 538*30fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 539*30fdc8d8SChris Lattner { 540*30fdc8d8SChris Lattner return Process::ProcessEventData::GetRestartedFromEvent (event.GetLLDBObjectPtr()); 541*30fdc8d8SChris Lattner } 542*30fdc8d8SChris Lattner 543*30fdc8d8SChris Lattner SBProcess 544*30fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 545*30fdc8d8SChris Lattner { 546*30fdc8d8SChris Lattner SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.GetLLDBObjectPtr())); 547*30fdc8d8SChris Lattner return process; 548*30fdc8d8SChris Lattner } 549*30fdc8d8SChris Lattner 550*30fdc8d8SChris Lattner 551*30fdc8d8SChris Lattner SBBroadcaster 552*30fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 553*30fdc8d8SChris Lattner { 554*30fdc8d8SChris Lattner SBBroadcaster broadcaster(m_lldb_object_sp.get(), false); 555*30fdc8d8SChris Lattner return broadcaster; 556*30fdc8d8SChris Lattner } 557*30fdc8d8SChris Lattner 558*30fdc8d8SChris Lattner lldb_private::Process * 559*30fdc8d8SChris Lattner SBProcess::operator->() const 560*30fdc8d8SChris Lattner { 561*30fdc8d8SChris Lattner return m_lldb_object_sp.get(); 562*30fdc8d8SChris Lattner } 563*30fdc8d8SChris Lattner 564*30fdc8d8SChris Lattner size_t 565*30fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 566*30fdc8d8SChris Lattner { 567*30fdc8d8SChris Lattner size_t bytes_read = 0; 568*30fdc8d8SChris Lattner 569*30fdc8d8SChris Lattner if (IsValid()) 570*30fdc8d8SChris Lattner { 571*30fdc8d8SChris Lattner Error error; 572*30fdc8d8SChris Lattner bytes_read = m_lldb_object_sp->ReadMemory (addr, dst, dst_len, error); 573*30fdc8d8SChris Lattner sb_error.SetError (error); 574*30fdc8d8SChris Lattner } 575*30fdc8d8SChris Lattner else 576*30fdc8d8SChris Lattner { 577*30fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 578*30fdc8d8SChris Lattner } 579*30fdc8d8SChris Lattner 580*30fdc8d8SChris Lattner return bytes_read; 581*30fdc8d8SChris Lattner } 582*30fdc8d8SChris Lattner 583*30fdc8d8SChris Lattner size_t 584*30fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 585*30fdc8d8SChris Lattner { 586*30fdc8d8SChris Lattner size_t bytes_written = 0; 587*30fdc8d8SChris Lattner 588*30fdc8d8SChris Lattner if (IsValid()) 589*30fdc8d8SChris Lattner { 590*30fdc8d8SChris Lattner Error error; 591*30fdc8d8SChris Lattner bytes_written = m_lldb_object_sp->WriteMemory (addr, src, src_len, error); 592*30fdc8d8SChris Lattner sb_error.SetError (error); 593*30fdc8d8SChris Lattner } 594*30fdc8d8SChris Lattner 595*30fdc8d8SChris Lattner return bytes_written; 596*30fdc8d8SChris Lattner } 597*30fdc8d8SChris Lattner 598*30fdc8d8SChris Lattner // Mimic shared pointer... 599*30fdc8d8SChris Lattner lldb_private::Process * 600*30fdc8d8SChris Lattner SBProcess::get() const 601*30fdc8d8SChris Lattner { 602*30fdc8d8SChris Lattner return m_lldb_object_sp.get(); 603*30fdc8d8SChris Lattner } 604*30fdc8d8SChris Lattner 605