130fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 104c5de699SEli Friedman #include "lldb/API/SBProcess.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1330fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1430fdc8d8SChris Lattner 15*40af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 1630fdc8d8SChris Lattner #include "lldb/Core/DataBufferHeap.h" 1730fdc8d8SChris Lattner #include "lldb/Core/DataExtractor.h" 1830fdc8d8SChris Lattner #include "lldb/Core/State.h" 1930fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2130fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2230fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 2330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 2430fdc8d8SChris Lattner 2530fdc8d8SChris Lattner // Project includes 2630fdc8d8SChris Lattner 274c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 284c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 294c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 304c5de699SEli Friedman #include "lldb/API/SBEvent.h" 314c5de699SEli Friedman #include "lldb/API/SBThread.h" 324c5de699SEli Friedman #include "lldb/API/SBStringList.h" 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner using namespace lldb; 3530fdc8d8SChris Lattner using namespace lldb_private; 3630fdc8d8SChris Lattner 3730fdc8d8SChris Lattner 3830fdc8d8SChris Lattner 3930fdc8d8SChris Lattner SBProcess::SBProcess () : 4030fdc8d8SChris Lattner m_lldb_object_sp() 4130fdc8d8SChris Lattner { 4230fdc8d8SChris Lattner } 4330fdc8d8SChris Lattner 4430fdc8d8SChris Lattner 4530fdc8d8SChris Lattner //---------------------------------------------------------------------- 4630fdc8d8SChris Lattner // SBProcess constructor 4730fdc8d8SChris Lattner //---------------------------------------------------------------------- 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 5030fdc8d8SChris Lattner m_lldb_object_sp (rhs.m_lldb_object_sp) 5130fdc8d8SChris Lattner { 5230fdc8d8SChris Lattner } 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner 5530fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 5630fdc8d8SChris Lattner m_lldb_object_sp (process_sp) 5730fdc8d8SChris Lattner { 5830fdc8d8SChris Lattner } 5930fdc8d8SChris Lattner 6030fdc8d8SChris Lattner //---------------------------------------------------------------------- 6130fdc8d8SChris Lattner // Destructor 6230fdc8d8SChris Lattner //---------------------------------------------------------------------- 6330fdc8d8SChris Lattner SBProcess::~SBProcess() 6430fdc8d8SChris Lattner { 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner 6730fdc8d8SChris Lattner void 6830fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp) 6930fdc8d8SChris Lattner { 7030fdc8d8SChris Lattner m_lldb_object_sp = process_sp; 7130fdc8d8SChris Lattner } 7230fdc8d8SChris Lattner 7330fdc8d8SChris Lattner void 7430fdc8d8SChris Lattner SBProcess::Clear () 7530fdc8d8SChris Lattner { 7630fdc8d8SChris Lattner m_lldb_object_sp.reset(); 7730fdc8d8SChris Lattner } 7830fdc8d8SChris Lattner 7930fdc8d8SChris Lattner 8030fdc8d8SChris Lattner bool 8130fdc8d8SChris Lattner SBProcess::IsValid() const 8230fdc8d8SChris Lattner { 8330fdc8d8SChris Lattner return m_lldb_object_sp.get() != NULL; 8430fdc8d8SChris Lattner } 8530fdc8d8SChris Lattner 8630fdc8d8SChris Lattner 8730fdc8d8SChris Lattner uint32_t 8830fdc8d8SChris Lattner SBProcess::GetNumThreads () 8930fdc8d8SChris Lattner { 9030fdc8d8SChris Lattner if (m_lldb_object_sp) 9130fdc8d8SChris Lattner { 9230fdc8d8SChris Lattner const bool can_update = true; 9330fdc8d8SChris Lattner return m_lldb_object_sp->GetThreadList().GetSize(can_update); 9430fdc8d8SChris Lattner } 9530fdc8d8SChris Lattner return 0; 9630fdc8d8SChris Lattner } 9730fdc8d8SChris Lattner 9830fdc8d8SChris Lattner SBThread 9930fdc8d8SChris Lattner SBProcess::GetCurrentThread () const 10030fdc8d8SChris Lattner { 10130fdc8d8SChris Lattner SBThread sb_thread; 10230fdc8d8SChris Lattner if (m_lldb_object_sp) 10330fdc8d8SChris Lattner sb_thread.SetThread (m_lldb_object_sp->GetThreadList().GetCurrentThread()); 10430fdc8d8SChris Lattner return sb_thread; 10530fdc8d8SChris Lattner } 10630fdc8d8SChris Lattner 10730fdc8d8SChris Lattner SBTarget 10830fdc8d8SChris Lattner SBProcess::GetTarget() const 10930fdc8d8SChris Lattner { 11030fdc8d8SChris Lattner SBTarget sb_target; 11130fdc8d8SChris Lattner if (m_lldb_object_sp) 11230fdc8d8SChris Lattner sb_target = SBDebugger::FindTargetWithLLDBProcess (m_lldb_object_sp); 11330fdc8d8SChris Lattner return sb_target; 11430fdc8d8SChris Lattner } 11530fdc8d8SChris Lattner 11630fdc8d8SChris Lattner 11730fdc8d8SChris Lattner size_t 11830fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 11930fdc8d8SChris Lattner { 12030fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 12130fdc8d8SChris Lattner { 12230fdc8d8SChris Lattner Error error; 12330fdc8d8SChris Lattner return m_lldb_object_sp->PutSTDIN (src, src_len, error); 12430fdc8d8SChris Lattner } 12530fdc8d8SChris Lattner else 12630fdc8d8SChris Lattner return 0; 12730fdc8d8SChris Lattner } 12830fdc8d8SChris Lattner 12930fdc8d8SChris Lattner size_t 13030fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 13130fdc8d8SChris Lattner { 13230fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 13330fdc8d8SChris Lattner { 13430fdc8d8SChris Lattner Error error; 13530fdc8d8SChris Lattner return m_lldb_object_sp->GetSTDOUT (dst, dst_len, error); 13630fdc8d8SChris Lattner } 13730fdc8d8SChris Lattner else 13830fdc8d8SChris Lattner return 0; 13930fdc8d8SChris Lattner } 14030fdc8d8SChris Lattner 14130fdc8d8SChris Lattner size_t 14230fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 14330fdc8d8SChris Lattner { 14430fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 14530fdc8d8SChris Lattner { 14630fdc8d8SChris Lattner Error error; 14730fdc8d8SChris Lattner return m_lldb_object_sp->GetSTDERR (dst, dst_len, error); 14830fdc8d8SChris Lattner } 14930fdc8d8SChris Lattner else 15030fdc8d8SChris Lattner return 0; 15130fdc8d8SChris Lattner } 15230fdc8d8SChris Lattner 15330fdc8d8SChris Lattner void 15430fdc8d8SChris Lattner SBProcess::ReportCurrentState (const SBEvent &event, FILE *out) const 15530fdc8d8SChris Lattner { 15630fdc8d8SChris Lattner if (out == NULL) 15730fdc8d8SChris Lattner return; 15830fdc8d8SChris Lattner 15930fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 16030fdc8d8SChris Lattner { 16130fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 16230fdc8d8SChris Lattner char message[1024]; 16330fdc8d8SChris Lattner int message_len = ::snprintf (message, 16430fdc8d8SChris Lattner sizeof (message), 16530fdc8d8SChris Lattner "Process %d %s\n", 16630fdc8d8SChris Lattner m_lldb_object_sp->GetID(), 16730fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 16830fdc8d8SChris Lattner 16930fdc8d8SChris Lattner if (message_len > 0) 17030fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 17130fdc8d8SChris Lattner } 17230fdc8d8SChris Lattner } 17330fdc8d8SChris Lattner 17430fdc8d8SChris Lattner void 17530fdc8d8SChris Lattner SBProcess::AppendCurrentStateReport (const SBEvent &event, SBCommandReturnObject &result) 17630fdc8d8SChris Lattner { 17730fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 17830fdc8d8SChris Lattner { 17930fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 18030fdc8d8SChris Lattner char message[1024]; 18130fdc8d8SChris Lattner ::snprintf (message, 18230fdc8d8SChris Lattner sizeof (message), 18330fdc8d8SChris Lattner "Process %d %s\n", 18430fdc8d8SChris Lattner m_lldb_object_sp->GetID(), 18530fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 18630fdc8d8SChris Lattner 18730fdc8d8SChris Lattner result.AppendMessage (message); 18830fdc8d8SChris Lattner } 18930fdc8d8SChris Lattner } 19030fdc8d8SChris Lattner 19130fdc8d8SChris Lattner bool 19230fdc8d8SChris Lattner SBProcess::SetCurrentThread (const SBThread &thread) 19330fdc8d8SChris Lattner { 19430fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 19530fdc8d8SChris Lattner return m_lldb_object_sp->GetThreadList().SetCurrentThreadByID (thread.GetThreadID()); 19630fdc8d8SChris Lattner return false; 19730fdc8d8SChris Lattner } 19830fdc8d8SChris Lattner 19930fdc8d8SChris Lattner bool 20030fdc8d8SChris Lattner SBProcess::SetCurrentThreadByID (uint32_t tid) 20130fdc8d8SChris Lattner { 20230fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 20330fdc8d8SChris Lattner return m_lldb_object_sp->GetThreadList().SetCurrentThreadByID (tid); 20430fdc8d8SChris Lattner return false; 20530fdc8d8SChris Lattner } 20630fdc8d8SChris Lattner 20730fdc8d8SChris Lattner SBThread 20830fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 20930fdc8d8SChris Lattner { 21030fdc8d8SChris Lattner SBThread thread; 21130fdc8d8SChris Lattner if (m_lldb_object_sp) 21230fdc8d8SChris Lattner thread.SetThread (m_lldb_object_sp->GetThreadList().GetThreadAtIndex(index)); 21330fdc8d8SChris Lattner return thread; 21430fdc8d8SChris Lattner } 21530fdc8d8SChris Lattner 21630fdc8d8SChris Lattner StateType 21730fdc8d8SChris Lattner SBProcess::GetState () 21830fdc8d8SChris Lattner { 21930fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 22030fdc8d8SChris Lattner return m_lldb_object_sp->GetState(); 22130fdc8d8SChris Lattner else 22230fdc8d8SChris Lattner return eStateInvalid; 22330fdc8d8SChris Lattner } 22430fdc8d8SChris Lattner 22530fdc8d8SChris Lattner 22630fdc8d8SChris Lattner int 22730fdc8d8SChris Lattner SBProcess::GetExitStatus () 22830fdc8d8SChris Lattner { 22930fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 23030fdc8d8SChris Lattner return m_lldb_object_sp->GetExitStatus (); 23130fdc8d8SChris Lattner else 23230fdc8d8SChris Lattner return 0; 23330fdc8d8SChris Lattner } 23430fdc8d8SChris Lattner 23530fdc8d8SChris Lattner const char * 23630fdc8d8SChris Lattner SBProcess::GetExitDescription () 23730fdc8d8SChris Lattner { 23830fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 23930fdc8d8SChris Lattner return m_lldb_object_sp->GetExitDescription (); 24030fdc8d8SChris Lattner else 24130fdc8d8SChris Lattner return NULL; 24230fdc8d8SChris Lattner } 24330fdc8d8SChris Lattner 24430fdc8d8SChris Lattner lldb::pid_t 24530fdc8d8SChris Lattner SBProcess::GetProcessID () 24630fdc8d8SChris Lattner { 24730fdc8d8SChris Lattner if (m_lldb_object_sp) 24830fdc8d8SChris Lattner return m_lldb_object_sp->GetID(); 24930fdc8d8SChris Lattner else 25030fdc8d8SChris Lattner return LLDB_INVALID_PROCESS_ID; 25130fdc8d8SChris Lattner } 25230fdc8d8SChris Lattner 25330fdc8d8SChris Lattner uint32_t 25430fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 25530fdc8d8SChris Lattner { 25630fdc8d8SChris Lattner if (m_lldb_object_sp) 25730fdc8d8SChris Lattner return m_lldb_object_sp->GetAddressByteSize(); 25830fdc8d8SChris Lattner else 25930fdc8d8SChris Lattner return 0; 26030fdc8d8SChris Lattner } 26130fdc8d8SChris Lattner 26230fdc8d8SChris Lattner 26330fdc8d8SChris Lattner void 26430fdc8d8SChris Lattner SBProcess::DisplayThreadsInfo (FILE *out, FILE *err, bool only_threads_with_stop_reason) 26530fdc8d8SChris Lattner { 26630fdc8d8SChris Lattner if (m_lldb_object_sp != NULL) 26730fdc8d8SChris Lattner { 26830fdc8d8SChris Lattner size_t num_thread_infos_dumped = 0; 26930fdc8d8SChris Lattner size_t num_threads = GetNumThreads(); 27030fdc8d8SChris Lattner 27130fdc8d8SChris Lattner if (out == NULL) 27230fdc8d8SChris Lattner out = SBDebugger::GetOutputFileHandle(); 27330fdc8d8SChris Lattner 27430fdc8d8SChris Lattner if (err == NULL) 27530fdc8d8SChris Lattner err = SBDebugger::GetErrorFileHandle(); 27630fdc8d8SChris Lattner 27730fdc8d8SChris Lattner if ((out == NULL) ||(err == NULL)) 27830fdc8d8SChris Lattner return; 27930fdc8d8SChris Lattner 28030fdc8d8SChris Lattner if (num_threads > 0) 28130fdc8d8SChris Lattner { 28230fdc8d8SChris Lattner Thread::StopInfo thread_stop_info; 28330fdc8d8SChris Lattner SBThread curr_thread (m_lldb_object_sp->GetThreadList().GetCurrentThread()); 28430fdc8d8SChris Lattner for (int i = 0; i < num_threads; ++i) 28530fdc8d8SChris Lattner { 28630fdc8d8SChris Lattner SBThread thread (m_lldb_object_sp->GetThreadList().GetThreadAtIndex(i)); 28730fdc8d8SChris Lattner if (thread.IsValid()) 28830fdc8d8SChris Lattner { 28930fdc8d8SChris Lattner bool is_current_thread = false; 29030fdc8d8SChris Lattner StreamFile str (out); 29130fdc8d8SChris Lattner if (thread == curr_thread) 29230fdc8d8SChris Lattner is_current_thread = true; 29330fdc8d8SChris Lattner StopReason thread_stop_reason = eStopReasonNone; 29430fdc8d8SChris Lattner if (thread->GetStopInfo (&thread_stop_info)) 29530fdc8d8SChris Lattner { 29630fdc8d8SChris Lattner thread_stop_reason = thread_stop_info.GetStopReason(); 29730fdc8d8SChris Lattner if (thread_stop_reason == eStopReasonNone) 29830fdc8d8SChris Lattner { 29930fdc8d8SChris Lattner if (only_threads_with_stop_reason && !is_current_thread) 30030fdc8d8SChris Lattner continue; 30130fdc8d8SChris Lattner } 30230fdc8d8SChris Lattner } 30330fdc8d8SChris Lattner ++num_thread_infos_dumped; 30430fdc8d8SChris Lattner fprintf (out, " %c thread #%u: tid = 0x%4.4x, pc = 0x%16.16llx", 30530fdc8d8SChris Lattner (is_current_thread ? '*' : ' '), 30630fdc8d8SChris Lattner thread->GetIndexID(), thread->GetID(), thread->GetRegisterContext()->GetPC()); 30730fdc8d8SChris Lattner 30830fdc8d8SChris Lattner StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0)); 30930fdc8d8SChris Lattner if (frame_sp) 31030fdc8d8SChris Lattner { 31130fdc8d8SChris Lattner SymbolContext sc (frame_sp->GetSymbolContext (eSymbolContextEverything)); 31230fdc8d8SChris Lattner fprintf (out, ", where = "); 31330fdc8d8SChris Lattner sc.DumpStopContext (&str, m_lldb_object_sp.get(), frame_sp->GetPC ()); 31430fdc8d8SChris Lattner } 31530fdc8d8SChris Lattner 31630fdc8d8SChris Lattner if (thread_stop_reason != eStopReasonNone) 31730fdc8d8SChris Lattner { 31830fdc8d8SChris Lattner fprintf (out, ", stop reason = "); 31930fdc8d8SChris Lattner thread_stop_info.Dump (&str); 32030fdc8d8SChris Lattner } 32130fdc8d8SChris Lattner 32230fdc8d8SChris Lattner const char *thread_name = thread->GetName(); 32330fdc8d8SChris Lattner if (thread_name && thread_name[0]) 32430fdc8d8SChris Lattner fprintf (out, ", thread_name = '%s'", thread_name); 32530fdc8d8SChris Lattner 32630fdc8d8SChris Lattner fprintf (out, "\n"); 32730fdc8d8SChris Lattner 32830fdc8d8SChris Lattner SBThread sb_thread (thread); 32930fdc8d8SChris Lattner sb_thread.DisplayFramesForCurrentContext (out, err, 0, 1, false, 1); 33030fdc8d8SChris Lattner } 33130fdc8d8SChris Lattner } 33230fdc8d8SChris Lattner } 33330fdc8d8SChris Lattner } 33430fdc8d8SChris Lattner } 33530fdc8d8SChris Lattner bool 33630fdc8d8SChris Lattner SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result) 33730fdc8d8SChris Lattner { 33830fdc8d8SChris Lattner bool state_changed = false; 33930fdc8d8SChris Lattner 34030fdc8d8SChris Lattner if (IsValid()) 34130fdc8d8SChris Lattner { 34230fdc8d8SChris Lattner EventSP event_sp; 34330fdc8d8SChris Lattner StateType state = m_lldb_object_sp->WaitForStateChangedEvents (NULL, event_sp); 34430fdc8d8SChris Lattner 34530fdc8d8SChris Lattner while (StateIsStoppedState (state)) 34630fdc8d8SChris Lattner { 34730fdc8d8SChris Lattner state = m_lldb_object_sp->WaitForStateChangedEvents (NULL, event_sp); 34830fdc8d8SChris Lattner SBEvent event (event_sp); 34930fdc8d8SChris Lattner AppendCurrentStateReport (event, result); 35030fdc8d8SChris Lattner state_changed = true; 35130fdc8d8SChris Lattner } 35230fdc8d8SChris Lattner } 35330fdc8d8SChris Lattner return state_changed; 35430fdc8d8SChris Lattner } 35530fdc8d8SChris Lattner 35630fdc8d8SChris Lattner SBError 35730fdc8d8SChris Lattner SBProcess::Continue () 35830fdc8d8SChris Lattner { 35930fdc8d8SChris Lattner SBError sb_error; 36030fdc8d8SChris Lattner if (IsValid()) 36130fdc8d8SChris Lattner sb_error.SetError(m_lldb_object_sp->Resume()); 36230fdc8d8SChris Lattner else 36330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 36430fdc8d8SChris Lattner 36530fdc8d8SChris Lattner return sb_error; 36630fdc8d8SChris Lattner } 36730fdc8d8SChris Lattner 36830fdc8d8SChris Lattner 36930fdc8d8SChris Lattner SBError 37030fdc8d8SChris Lattner SBProcess::Destroy () 37130fdc8d8SChris Lattner { 37230fdc8d8SChris Lattner SBError sb_error; 37330fdc8d8SChris Lattner if (m_lldb_object_sp) 37430fdc8d8SChris Lattner sb_error.SetError(m_lldb_object_sp->Destroy()); 37530fdc8d8SChris Lattner else 37630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 37730fdc8d8SChris Lattner 37830fdc8d8SChris Lattner return sb_error; 37930fdc8d8SChris Lattner } 38030fdc8d8SChris Lattner 38130fdc8d8SChris Lattner 38230fdc8d8SChris Lattner SBError 38330fdc8d8SChris Lattner SBProcess::Stop () 38430fdc8d8SChris Lattner { 38530fdc8d8SChris Lattner SBError sb_error; 38630fdc8d8SChris Lattner if (IsValid()) 38730fdc8d8SChris Lattner sb_error.SetError (m_lldb_object_sp->Halt()); 38830fdc8d8SChris Lattner else 38930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 39030fdc8d8SChris Lattner return sb_error; 39130fdc8d8SChris Lattner } 39230fdc8d8SChris Lattner 39330fdc8d8SChris Lattner SBError 39430fdc8d8SChris Lattner SBProcess::Kill () 39530fdc8d8SChris Lattner { 39630fdc8d8SChris Lattner SBError sb_error; 39730fdc8d8SChris Lattner if (m_lldb_object_sp) 39830fdc8d8SChris Lattner sb_error.SetError (m_lldb_object_sp->Destroy()); 39930fdc8d8SChris Lattner else 40030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 40130fdc8d8SChris Lattner return sb_error; 40230fdc8d8SChris Lattner } 40330fdc8d8SChris Lattner 40430fdc8d8SChris Lattner 40530fdc8d8SChris Lattner SBError 40630fdc8d8SChris Lattner SBProcess::AttachByName (const char *name, bool wait_for_launch) 40730fdc8d8SChris Lattner { 40830fdc8d8SChris Lattner SBError sb_error; 40930fdc8d8SChris Lattner if (m_lldb_object_sp) 41030fdc8d8SChris Lattner sb_error.SetError (m_lldb_object_sp->Attach (name, wait_for_launch)); 41130fdc8d8SChris Lattner else 41230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 41330fdc8d8SChris Lattner return sb_error; 41430fdc8d8SChris Lattner } 41530fdc8d8SChris Lattner 41630fdc8d8SChris Lattner lldb::pid_t 41730fdc8d8SChris Lattner SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t) 41830fdc8d8SChris Lattner { 41930fdc8d8SChris Lattner Attach (attach_pid); 42030fdc8d8SChris Lattner return GetProcessID(); 42130fdc8d8SChris Lattner } 42230fdc8d8SChris Lattner 42330fdc8d8SChris Lattner 42430fdc8d8SChris Lattner SBError 42530fdc8d8SChris Lattner SBProcess::Attach (lldb::pid_t attach_pid) 42630fdc8d8SChris Lattner { 42730fdc8d8SChris Lattner SBError sb_error; 42830fdc8d8SChris Lattner if (m_lldb_object_sp) 42930fdc8d8SChris Lattner sb_error.SetError (m_lldb_object_sp->Attach (attach_pid)); 43030fdc8d8SChris Lattner else 43130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 43230fdc8d8SChris Lattner return sb_error; 43330fdc8d8SChris Lattner } 43430fdc8d8SChris Lattner 43530fdc8d8SChris Lattner SBError 43630fdc8d8SChris Lattner SBProcess::Detach () 43730fdc8d8SChris Lattner { 43830fdc8d8SChris Lattner SBError sb_error; 43930fdc8d8SChris Lattner if (m_lldb_object_sp) 44030fdc8d8SChris Lattner sb_error.SetError (m_lldb_object_sp->Detach()); 44130fdc8d8SChris Lattner else 44230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 44330fdc8d8SChris Lattner 44430fdc8d8SChris Lattner return sb_error; 44530fdc8d8SChris Lattner } 44630fdc8d8SChris Lattner 44730fdc8d8SChris Lattner SBError 44830fdc8d8SChris Lattner SBProcess::Signal (int signal) 44930fdc8d8SChris Lattner { 45030fdc8d8SChris Lattner SBError sb_error; 45130fdc8d8SChris Lattner if (m_lldb_object_sp) 45230fdc8d8SChris Lattner sb_error.SetError (m_lldb_object_sp->Signal (signal)); 45330fdc8d8SChris Lattner else 45430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 45530fdc8d8SChris Lattner return sb_error; 45630fdc8d8SChris Lattner } 45730fdc8d8SChris Lattner 45830fdc8d8SChris Lattner void 45930fdc8d8SChris Lattner SBProcess::ListThreads () 46030fdc8d8SChris Lattner { 46130fdc8d8SChris Lattner FILE *out = SBDebugger::GetOutputFileHandle(); 46230fdc8d8SChris Lattner if (out == NULL) 46330fdc8d8SChris Lattner return; 46430fdc8d8SChris Lattner 46530fdc8d8SChris Lattner if (m_lldb_object_sp) 46630fdc8d8SChris Lattner { 46730fdc8d8SChris Lattner size_t num_threads = GetNumThreads (); 46830fdc8d8SChris Lattner if (num_threads > 0) 46930fdc8d8SChris Lattner { 47030fdc8d8SChris Lattner Thread *cur_thread = m_lldb_object_sp->GetThreadList().GetCurrentThread().get(); 47130fdc8d8SChris Lattner for (int i = 0; i < num_threads; ++i) 47230fdc8d8SChris Lattner { 47330fdc8d8SChris Lattner Thread *thread = m_lldb_object_sp->GetThreadList().GetThreadAtIndex(i).get(); 47430fdc8d8SChris Lattner if (thread) 47530fdc8d8SChris Lattner { 47630fdc8d8SChris Lattner bool is_current_thread = false; 47730fdc8d8SChris Lattner if (thread == cur_thread) 47830fdc8d8SChris Lattner is_current_thread = true; 47930fdc8d8SChris Lattner fprintf (out, " [%u] %c tid = 0x%4.4x, pc = 0x%16.16llx", 48030fdc8d8SChris Lattner i, 48130fdc8d8SChris Lattner (is_current_thread ? '*' : ' '), 48230fdc8d8SChris Lattner thread->GetID(), 48330fdc8d8SChris Lattner thread->GetRegisterContext()->GetPC()); 48430fdc8d8SChris Lattner const char *thread_name = thread->GetName(); 48530fdc8d8SChris Lattner if (thread_name && thread_name[0]) 48630fdc8d8SChris Lattner fprintf (out, ", name = %s", thread_name); 48730fdc8d8SChris Lattner const char *queue_name = thread->GetQueueName(); 48830fdc8d8SChris Lattner if (queue_name && queue_name[0]) 48930fdc8d8SChris Lattner fprintf (out, ", queue = %s", queue_name); 49030fdc8d8SChris Lattner fprintf (out, "\n"); 49130fdc8d8SChris Lattner } 49230fdc8d8SChris Lattner } 49330fdc8d8SChris Lattner } 49430fdc8d8SChris Lattner } 49530fdc8d8SChris Lattner } 49630fdc8d8SChris Lattner 49730fdc8d8SChris Lattner SBThread 49830fdc8d8SChris Lattner SBProcess::GetThreadByID (tid_t sb_thread_id) 49930fdc8d8SChris Lattner { 50030fdc8d8SChris Lattner SBThread thread; 50130fdc8d8SChris Lattner if (m_lldb_object_sp) 50230fdc8d8SChris Lattner thread.SetThread (m_lldb_object_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id)); 50330fdc8d8SChris Lattner return thread; 50430fdc8d8SChris Lattner } 50530fdc8d8SChris Lattner 50630fdc8d8SChris Lattner void 50730fdc8d8SChris Lattner SBProcess::Backtrace (bool all_threads, uint32_t num_frames) 50830fdc8d8SChris Lattner { 50930fdc8d8SChris Lattner if (m_lldb_object_sp) 51030fdc8d8SChris Lattner { 51130fdc8d8SChris Lattner if (!all_threads) 51230fdc8d8SChris Lattner { 51330fdc8d8SChris Lattner SBDebugger::UpdateCurrentThread (*this); 51430fdc8d8SChris Lattner SBThread cur_thread = GetCurrentThread(); 51530fdc8d8SChris Lattner if (cur_thread.IsValid()) 51630fdc8d8SChris Lattner cur_thread.Backtrace (num_frames); 51730fdc8d8SChris Lattner } 51830fdc8d8SChris Lattner else 51930fdc8d8SChris Lattner { 52030fdc8d8SChris Lattner int num_threads = GetNumThreads (); 52130fdc8d8SChris Lattner for (int i = 0; i < num_threads; ++i) 52230fdc8d8SChris Lattner { 52330fdc8d8SChris Lattner SBThread sb_thread = GetThreadAtIndex (i); 52430fdc8d8SChris Lattner sb_thread.Backtrace (num_frames); 52530fdc8d8SChris Lattner } 52630fdc8d8SChris Lattner } 52730fdc8d8SChris Lattner } 52830fdc8d8SChris Lattner } 52930fdc8d8SChris Lattner 53030fdc8d8SChris Lattner StateType 53130fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 53230fdc8d8SChris Lattner { 53330fdc8d8SChris Lattner return Process::ProcessEventData::GetStateFromEvent (event.GetLLDBObjectPtr()); 53430fdc8d8SChris Lattner } 53530fdc8d8SChris Lattner 53630fdc8d8SChris Lattner 53730fdc8d8SChris Lattner bool 53830fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 53930fdc8d8SChris Lattner { 54030fdc8d8SChris Lattner return Process::ProcessEventData::GetRestartedFromEvent (event.GetLLDBObjectPtr()); 54130fdc8d8SChris Lattner } 54230fdc8d8SChris Lattner 54330fdc8d8SChris Lattner SBProcess 54430fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 54530fdc8d8SChris Lattner { 54630fdc8d8SChris Lattner SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.GetLLDBObjectPtr())); 54730fdc8d8SChris Lattner return process; 54830fdc8d8SChris Lattner } 54930fdc8d8SChris Lattner 55030fdc8d8SChris Lattner 55130fdc8d8SChris Lattner SBBroadcaster 55230fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 55330fdc8d8SChris Lattner { 55430fdc8d8SChris Lattner SBBroadcaster broadcaster(m_lldb_object_sp.get(), false); 55530fdc8d8SChris Lattner return broadcaster; 55630fdc8d8SChris Lattner } 55730fdc8d8SChris Lattner 55830fdc8d8SChris Lattner lldb_private::Process * 55930fdc8d8SChris Lattner SBProcess::operator->() const 56030fdc8d8SChris Lattner { 56130fdc8d8SChris Lattner return m_lldb_object_sp.get(); 56230fdc8d8SChris Lattner } 56330fdc8d8SChris Lattner 56430fdc8d8SChris Lattner size_t 56530fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 56630fdc8d8SChris Lattner { 56730fdc8d8SChris Lattner size_t bytes_read = 0; 56830fdc8d8SChris Lattner 56930fdc8d8SChris Lattner if (IsValid()) 57030fdc8d8SChris Lattner { 57130fdc8d8SChris Lattner Error error; 57230fdc8d8SChris Lattner bytes_read = m_lldb_object_sp->ReadMemory (addr, dst, dst_len, error); 57330fdc8d8SChris Lattner sb_error.SetError (error); 57430fdc8d8SChris Lattner } 57530fdc8d8SChris Lattner else 57630fdc8d8SChris Lattner { 57730fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 57830fdc8d8SChris Lattner } 57930fdc8d8SChris Lattner 58030fdc8d8SChris Lattner return bytes_read; 58130fdc8d8SChris Lattner } 58230fdc8d8SChris Lattner 58330fdc8d8SChris Lattner size_t 58430fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 58530fdc8d8SChris Lattner { 58630fdc8d8SChris Lattner size_t bytes_written = 0; 58730fdc8d8SChris Lattner 58830fdc8d8SChris Lattner if (IsValid()) 58930fdc8d8SChris Lattner { 59030fdc8d8SChris Lattner Error error; 59130fdc8d8SChris Lattner bytes_written = m_lldb_object_sp->WriteMemory (addr, src, src_len, error); 59230fdc8d8SChris Lattner sb_error.SetError (error); 59330fdc8d8SChris Lattner } 59430fdc8d8SChris Lattner 59530fdc8d8SChris Lattner return bytes_written; 59630fdc8d8SChris Lattner } 59730fdc8d8SChris Lattner 59830fdc8d8SChris Lattner // Mimic shared pointer... 59930fdc8d8SChris Lattner lldb_private::Process * 60030fdc8d8SChris Lattner SBProcess::get() const 60130fdc8d8SChris Lattner { 60230fdc8d8SChris Lattner return m_lldb_object_sp.get(); 60330fdc8d8SChris Lattner } 60430fdc8d8SChris Lattner 605