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 1540af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 1630fdc8d8SChris Lattner #include "lldb/Core/DataBufferHeap.h" 1730fdc8d8SChris Lattner #include "lldb/Core/DataExtractor.h" 185d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 19ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 2030fdc8d8SChris Lattner #include "lldb/Core/State.h" 2130fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2230fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2330fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2430fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 256611103cSGreg Clayton #include "lldb/Target/Target.h" 266611103cSGreg Clayton #include "lldb/Target/Thread.h" 2730fdc8d8SChris Lattner 2830fdc8d8SChris Lattner // Project includes 2930fdc8d8SChris Lattner 304c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 314c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 324c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 334c5de699SEli Friedman #include "lldb/API/SBEvent.h" 344c5de699SEli Friedman #include "lldb/API/SBThread.h" 35dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 364c5de699SEli Friedman #include "lldb/API/SBStringList.h" 3730fdc8d8SChris Lattner 3830fdc8d8SChris Lattner using namespace lldb; 3930fdc8d8SChris Lattner using namespace lldb_private; 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner SBProcess::SBProcess () : 446611103cSGreg Clayton m_opaque_sp() 4530fdc8d8SChris Lattner { 4630fdc8d8SChris Lattner } 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner //---------------------------------------------------------------------- 5030fdc8d8SChris Lattner // SBProcess constructor 5130fdc8d8SChris Lattner //---------------------------------------------------------------------- 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 546611103cSGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 5530fdc8d8SChris Lattner { 56750cd175SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 57ceb6b139SCaroline Tice 58ceb6b139SCaroline Tice if (log) 59*93aa84e8SGreg Clayton log->Printf ("SBProcess::SBProcess(%p)", rhs.m_opaque_sp.get()); 6030fdc8d8SChris Lattner } 6130fdc8d8SChris Lattner 6230fdc8d8SChris Lattner 6330fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 646611103cSGreg Clayton m_opaque_sp (process_sp) 6530fdc8d8SChris Lattner { 66750cd175SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 67ceb6b139SCaroline Tice 68ceb6b139SCaroline Tice if (log) 69*93aa84e8SGreg Clayton log->Printf ("SBProcess::SBProcess(%p)", process_sp.get()); 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner 7230fdc8d8SChris Lattner //---------------------------------------------------------------------- 7330fdc8d8SChris Lattner // Destructor 7430fdc8d8SChris Lattner //---------------------------------------------------------------------- 7530fdc8d8SChris Lattner SBProcess::~SBProcess() 7630fdc8d8SChris Lattner { 7730fdc8d8SChris Lattner } 7830fdc8d8SChris Lattner 7930fdc8d8SChris Lattner void 8030fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp) 8130fdc8d8SChris Lattner { 826611103cSGreg Clayton m_opaque_sp = process_sp; 8330fdc8d8SChris Lattner } 8430fdc8d8SChris Lattner 8530fdc8d8SChris Lattner void 8630fdc8d8SChris Lattner SBProcess::Clear () 8730fdc8d8SChris Lattner { 886611103cSGreg Clayton m_opaque_sp.reset(); 8930fdc8d8SChris Lattner } 9030fdc8d8SChris Lattner 9130fdc8d8SChris Lattner 9230fdc8d8SChris Lattner bool 9330fdc8d8SChris Lattner SBProcess::IsValid() const 9430fdc8d8SChris Lattner { 956611103cSGreg Clayton return m_opaque_sp.get() != NULL; 9630fdc8d8SChris Lattner } 9730fdc8d8SChris Lattner 9830fdc8d8SChris Lattner 9930fdc8d8SChris Lattner uint32_t 10030fdc8d8SChris Lattner SBProcess::GetNumThreads () 10130fdc8d8SChris Lattner { 102ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 103ceb6b139SCaroline Tice 104ceb6b139SCaroline Tice uint32_t num_threads = 0; 1056611103cSGreg Clayton if (m_opaque_sp) 10630fdc8d8SChris Lattner { 10730fdc8d8SChris Lattner const bool can_update = true; 108ceb6b139SCaroline Tice num_threads = m_opaque_sp->GetThreadList().GetSize(can_update); 10930fdc8d8SChris Lattner } 110ceb6b139SCaroline Tice 111ceb6b139SCaroline Tice if (log) 112*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", m_opaque_sp.get(), num_threads); 113ceb6b139SCaroline Tice 114ceb6b139SCaroline Tice return num_threads; 11530fdc8d8SChris Lattner } 11630fdc8d8SChris Lattner 11730fdc8d8SChris Lattner SBThread 1182976d00aSJim Ingham SBProcess::GetSelectedThread () const 11930fdc8d8SChris Lattner { 120ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 121ceb6b139SCaroline Tice 12230fdc8d8SChris Lattner SBThread sb_thread; 1236611103cSGreg Clayton if (m_opaque_sp) 1242976d00aSJim Ingham sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread()); 125ceb6b139SCaroline Tice 126ceb6b139SCaroline Tice if (log) 127ceb6b139SCaroline Tice { 128*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), sb_thread.GetLLDBObjectPtr()); 129ceb6b139SCaroline Tice } 130ceb6b139SCaroline Tice 13130fdc8d8SChris Lattner return sb_thread; 13230fdc8d8SChris Lattner } 13330fdc8d8SChris Lattner 13430fdc8d8SChris Lattner SBTarget 13530fdc8d8SChris Lattner SBProcess::GetTarget() const 13630fdc8d8SChris Lattner { 137ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 138ceb6b139SCaroline Tice 13930fdc8d8SChris Lattner SBTarget sb_target; 1406611103cSGreg Clayton if (m_opaque_sp) 1416611103cSGreg Clayton sb_target = m_opaque_sp->GetTarget().GetSP(); 142ceb6b139SCaroline Tice 143ceb6b139SCaroline Tice if (log) 144*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), sb_target.get()); 145ceb6b139SCaroline Tice 14630fdc8d8SChris Lattner return sb_target; 14730fdc8d8SChris Lattner } 14830fdc8d8SChris Lattner 14930fdc8d8SChris Lattner 15030fdc8d8SChris Lattner size_t 15130fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 15230fdc8d8SChris Lattner { 153ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 154ceb6b139SCaroline Tice 155ceb6b139SCaroline Tice size_t ret_val = 0; 1566611103cSGreg Clayton if (m_opaque_sp != NULL) 15730fdc8d8SChris Lattner { 15830fdc8d8SChris Lattner Error error; 159ceb6b139SCaroline Tice ret_val = m_opaque_sp->PutSTDIN (src, src_len, error); 16030fdc8d8SChris Lattner } 161ceb6b139SCaroline Tice 162ceb6b139SCaroline Tice if (log) 163*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::PutSTDIN (src='%s', src_len=%d) => %d", 164*93aa84e8SGreg Clayton m_opaque_sp.get(), 165*93aa84e8SGreg Clayton src, 166*93aa84e8SGreg Clayton (uint32_t) src_len, 167*93aa84e8SGreg Clayton ret_val); 168ceb6b139SCaroline Tice 169ceb6b139SCaroline Tice return ret_val; 17030fdc8d8SChris Lattner } 17130fdc8d8SChris Lattner 17230fdc8d8SChris Lattner size_t 17330fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 17430fdc8d8SChris Lattner { 175ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 176ceb6b139SCaroline Tice 177ceb6b139SCaroline Tice size_t ret_val = 0; 1786611103cSGreg Clayton if (m_opaque_sp != NULL) 17930fdc8d8SChris Lattner { 18030fdc8d8SChris Lattner Error error; 181ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetSTDOUT (dst, dst_len, error); 18230fdc8d8SChris Lattner } 183ceb6b139SCaroline Tice 184ceb6b139SCaroline Tice if (log) 185*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst='%.*s', dst_len=%d) => %d", 186*93aa84e8SGreg Clayton m_opaque_sp.get(), 187*93aa84e8SGreg Clayton (uint32_t) dst_len, 188*93aa84e8SGreg Clayton dst, 189*93aa84e8SGreg Clayton (uint32_t) dst_len, 190*93aa84e8SGreg Clayton (uint32_t) ret_val); 191ceb6b139SCaroline Tice 192ceb6b139SCaroline Tice return ret_val; 19330fdc8d8SChris Lattner } 19430fdc8d8SChris Lattner 19530fdc8d8SChris Lattner size_t 19630fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 19730fdc8d8SChris Lattner { 198ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 199ceb6b139SCaroline Tice 200ceb6b139SCaroline Tice size_t ret_val = 0; 2016611103cSGreg Clayton if (m_opaque_sp != NULL) 20230fdc8d8SChris Lattner { 20330fdc8d8SChris Lattner Error error; 204ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetSTDERR (dst, dst_len, error); 20530fdc8d8SChris Lattner } 206ceb6b139SCaroline Tice 207ceb6b139SCaroline Tice if (log) 208*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst='%.*s', dst_len=%d) => %d", 209*93aa84e8SGreg Clayton m_opaque_sp.get(), 210*93aa84e8SGreg Clayton (uint32_t) dst_len, 211*93aa84e8SGreg Clayton dst, 212*93aa84e8SGreg Clayton (uint32_t) dst_len, 213*93aa84e8SGreg Clayton (uint32_t) ret_val); 214ceb6b139SCaroline Tice 215ceb6b139SCaroline Tice return ret_val; 21630fdc8d8SChris Lattner } 21730fdc8d8SChris Lattner 21830fdc8d8SChris Lattner void 2192976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 22030fdc8d8SChris Lattner { 22130fdc8d8SChris Lattner if (out == NULL) 22230fdc8d8SChris Lattner return; 22330fdc8d8SChris Lattner 2246611103cSGreg Clayton if (m_opaque_sp != NULL) 22530fdc8d8SChris Lattner { 22630fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 22730fdc8d8SChris Lattner char message[1024]; 22830fdc8d8SChris Lattner int message_len = ::snprintf (message, 22930fdc8d8SChris Lattner sizeof (message), 23030fdc8d8SChris Lattner "Process %d %s\n", 2316611103cSGreg Clayton m_opaque_sp->GetID(), 23230fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 23330fdc8d8SChris Lattner 23430fdc8d8SChris Lattner if (message_len > 0) 23530fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 23630fdc8d8SChris Lattner } 23730fdc8d8SChris Lattner } 23830fdc8d8SChris Lattner 23930fdc8d8SChris Lattner void 2402976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 24130fdc8d8SChris Lattner { 2426611103cSGreg Clayton if (m_opaque_sp != NULL) 24330fdc8d8SChris Lattner { 24430fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 24530fdc8d8SChris Lattner char message[1024]; 24630fdc8d8SChris Lattner ::snprintf (message, 24730fdc8d8SChris Lattner sizeof (message), 24830fdc8d8SChris Lattner "Process %d %s\n", 2496611103cSGreg Clayton m_opaque_sp->GetID(), 25030fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 25130fdc8d8SChris Lattner 25230fdc8d8SChris Lattner result.AppendMessage (message); 25330fdc8d8SChris Lattner } 25430fdc8d8SChris Lattner } 25530fdc8d8SChris Lattner 25630fdc8d8SChris Lattner bool 2572976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 25830fdc8d8SChris Lattner { 2596611103cSGreg Clayton if (m_opaque_sp != NULL) 2602976d00aSJim Ingham return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 26130fdc8d8SChris Lattner return false; 26230fdc8d8SChris Lattner } 26330fdc8d8SChris Lattner 26430fdc8d8SChris Lattner bool 2652976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 26630fdc8d8SChris Lattner { 267ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 268ceb6b139SCaroline Tice 269ceb6b139SCaroline Tice bool ret_val = false; 2706611103cSGreg Clayton if (m_opaque_sp != NULL) 271ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid); 272ceb6b139SCaroline Tice 273ceb6b139SCaroline Tice if (log) 274*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=%d) => '%s'", 275*93aa84e8SGreg Clayton m_opaque_sp.get(), tid, (ret_val ? "true" : "false")); 276ceb6b139SCaroline Tice 277ceb6b139SCaroline Tice return ret_val; 27830fdc8d8SChris Lattner } 27930fdc8d8SChris Lattner 28030fdc8d8SChris Lattner SBThread 28130fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 28230fdc8d8SChris Lattner { 283ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 284ceb6b139SCaroline Tice 28530fdc8d8SChris Lattner SBThread thread; 2866611103cSGreg Clayton if (m_opaque_sp) 2876611103cSGreg Clayton thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index)); 288ceb6b139SCaroline Tice 289ceb6b139SCaroline Tice if (log) 290ceb6b139SCaroline Tice { 291*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 292*93aa84e8SGreg Clayton m_opaque_sp.get(), (uint32_t) index, thread.GetLLDBObjectPtr()); 293ceb6b139SCaroline Tice } 294ceb6b139SCaroline Tice 29530fdc8d8SChris Lattner return thread; 29630fdc8d8SChris Lattner } 29730fdc8d8SChris Lattner 29830fdc8d8SChris Lattner StateType 29930fdc8d8SChris Lattner SBProcess::GetState () 30030fdc8d8SChris Lattner { 301ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 302ceb6b139SCaroline Tice 303ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 3046611103cSGreg Clayton if (m_opaque_sp != NULL) 305ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetState(); 306ceb6b139SCaroline Tice 307ceb6b139SCaroline Tice if (log) 308*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetState () => '%s'", 309*93aa84e8SGreg Clayton m_opaque_sp.get(), 310750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 311ceb6b139SCaroline Tice 312ceb6b139SCaroline Tice return ret_val; 31330fdc8d8SChris Lattner } 31430fdc8d8SChris Lattner 31530fdc8d8SChris Lattner 31630fdc8d8SChris Lattner int 31730fdc8d8SChris Lattner SBProcess::GetExitStatus () 31830fdc8d8SChris Lattner { 3196611103cSGreg Clayton if (m_opaque_sp != NULL) 3206611103cSGreg Clayton return m_opaque_sp->GetExitStatus (); 32130fdc8d8SChris Lattner else 32230fdc8d8SChris Lattner return 0; 32330fdc8d8SChris Lattner } 32430fdc8d8SChris Lattner 32530fdc8d8SChris Lattner const char * 32630fdc8d8SChris Lattner SBProcess::GetExitDescription () 32730fdc8d8SChris Lattner { 3286611103cSGreg Clayton if (m_opaque_sp != NULL) 3296611103cSGreg Clayton return m_opaque_sp->GetExitDescription (); 33030fdc8d8SChris Lattner else 33130fdc8d8SChris Lattner return NULL; 33230fdc8d8SChris Lattner } 33330fdc8d8SChris Lattner 33430fdc8d8SChris Lattner lldb::pid_t 33530fdc8d8SChris Lattner SBProcess::GetProcessID () 33630fdc8d8SChris Lattner { 337ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 338ceb6b139SCaroline Tice 339ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 3406611103cSGreg Clayton if (m_opaque_sp) 341ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetID(); 342ceb6b139SCaroline Tice 343ceb6b139SCaroline Tice if (log) 344*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %d", m_opaque_sp.get(), ret_val); 345ceb6b139SCaroline Tice 346ceb6b139SCaroline Tice return ret_val; 34730fdc8d8SChris Lattner } 34830fdc8d8SChris Lattner 34930fdc8d8SChris Lattner uint32_t 35030fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 35130fdc8d8SChris Lattner { 352ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 353ceb6b139SCaroline Tice 354ceb6b139SCaroline Tice uint32_t size = 0; 3556611103cSGreg Clayton if (m_opaque_sp) 356ceb6b139SCaroline Tice size = m_opaque_sp->GetAddressByteSize(); 357ceb6b139SCaroline Tice 358ceb6b139SCaroline Tice if (log) 359*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size); 360ceb6b139SCaroline Tice 361ceb6b139SCaroline Tice return size; 36230fdc8d8SChris Lattner } 36330fdc8d8SChris Lattner 36430fdc8d8SChris Lattner bool 36530fdc8d8SChris Lattner SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result) 36630fdc8d8SChris Lattner { 36730fdc8d8SChris Lattner bool state_changed = false; 36830fdc8d8SChris Lattner 36930fdc8d8SChris Lattner if (IsValid()) 37030fdc8d8SChris Lattner { 37130fdc8d8SChris Lattner EventSP event_sp; 3726611103cSGreg Clayton StateType state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp); 37330fdc8d8SChris Lattner 37430fdc8d8SChris Lattner while (StateIsStoppedState (state)) 37530fdc8d8SChris Lattner { 3766611103cSGreg Clayton state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp); 37730fdc8d8SChris Lattner SBEvent event (event_sp); 3782976d00aSJim Ingham AppendEventStateReport (event, result); 37930fdc8d8SChris Lattner state_changed = true; 38030fdc8d8SChris Lattner } 38130fdc8d8SChris Lattner } 38230fdc8d8SChris Lattner return state_changed; 38330fdc8d8SChris Lattner } 38430fdc8d8SChris Lattner 38530fdc8d8SChris Lattner SBError 38630fdc8d8SChris Lattner SBProcess::Continue () 38730fdc8d8SChris Lattner { 388ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 389ceb6b139SCaroline Tice 39030fdc8d8SChris Lattner SBError sb_error; 39130fdc8d8SChris Lattner if (IsValid()) 3925d5028b5SGreg Clayton { 3935d5028b5SGreg Clayton Error error (m_opaque_sp->Resume()); 3945d5028b5SGreg Clayton if (error.Success()) 3955d5028b5SGreg Clayton { 3965d5028b5SGreg Clayton if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 3975d5028b5SGreg Clayton m_opaque_sp->WaitForProcessToStop (NULL); 3985d5028b5SGreg Clayton } 3995d5028b5SGreg Clayton sb_error.SetError(error); 4005d5028b5SGreg Clayton } 40130fdc8d8SChris Lattner else 40230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 40330fdc8d8SChris Lattner 404ceb6b139SCaroline Tice if (log) 405ceb6b139SCaroline Tice { 406ceb6b139SCaroline Tice SBStream sstr; 407ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 408*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData()); 409ceb6b139SCaroline Tice } 410ceb6b139SCaroline Tice 41130fdc8d8SChris Lattner return sb_error; 41230fdc8d8SChris Lattner } 41330fdc8d8SChris Lattner 41430fdc8d8SChris Lattner 41530fdc8d8SChris Lattner SBError 41630fdc8d8SChris Lattner SBProcess::Destroy () 41730fdc8d8SChris Lattner { 41830fdc8d8SChris Lattner SBError sb_error; 4196611103cSGreg Clayton if (m_opaque_sp) 4206611103cSGreg Clayton sb_error.SetError(m_opaque_sp->Destroy()); 42130fdc8d8SChris Lattner else 42230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 42330fdc8d8SChris Lattner 42430fdc8d8SChris Lattner return sb_error; 42530fdc8d8SChris Lattner } 42630fdc8d8SChris Lattner 42730fdc8d8SChris Lattner 42830fdc8d8SChris Lattner SBError 42930fdc8d8SChris Lattner SBProcess::Stop () 43030fdc8d8SChris Lattner { 431ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 432ceb6b139SCaroline Tice 43330fdc8d8SChris Lattner SBError sb_error; 43430fdc8d8SChris Lattner if (IsValid()) 4356611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Halt()); 43630fdc8d8SChris Lattner else 43730fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 438ceb6b139SCaroline Tice 439ceb6b139SCaroline Tice if (log) 440ceb6b139SCaroline Tice { 441ceb6b139SCaroline Tice SBStream sstr; 442ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 443*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 444*93aa84e8SGreg Clayton m_opaque_sp.get(), 445*93aa84e8SGreg Clayton sb_error.get(), 446750cd175SCaroline Tice sstr.GetData()); 447ceb6b139SCaroline Tice } 448ceb6b139SCaroline Tice 44930fdc8d8SChris Lattner return sb_error; 45030fdc8d8SChris Lattner } 45130fdc8d8SChris Lattner 45230fdc8d8SChris Lattner SBError 45330fdc8d8SChris Lattner SBProcess::Kill () 45430fdc8d8SChris Lattner { 455ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 456ceb6b139SCaroline Tice 45730fdc8d8SChris Lattner SBError sb_error; 4586611103cSGreg Clayton if (m_opaque_sp) 4596611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Destroy()); 46030fdc8d8SChris Lattner else 46130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 462ceb6b139SCaroline Tice 463ceb6b139SCaroline Tice if (log) 464ceb6b139SCaroline Tice { 465ceb6b139SCaroline Tice SBStream sstr; 466ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 467*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 468*93aa84e8SGreg Clayton m_opaque_sp.get(), 469*93aa84e8SGreg Clayton sb_error.get(), 470750cd175SCaroline Tice sstr.GetData()); 471ceb6b139SCaroline Tice } 472ceb6b139SCaroline Tice 47330fdc8d8SChris Lattner return sb_error; 47430fdc8d8SChris Lattner } 47530fdc8d8SChris Lattner 47630fdc8d8SChris Lattner 47730fdc8d8SChris Lattner SBError 47830fdc8d8SChris Lattner SBProcess::AttachByName (const char *name, bool wait_for_launch) 47930fdc8d8SChris Lattner { 48030fdc8d8SChris Lattner SBError sb_error; 4816611103cSGreg Clayton if (m_opaque_sp) 4826611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch)); 48330fdc8d8SChris Lattner else 48430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 48530fdc8d8SChris Lattner return sb_error; 48630fdc8d8SChris Lattner } 48730fdc8d8SChris Lattner 48830fdc8d8SChris Lattner lldb::pid_t 48930fdc8d8SChris Lattner SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t) 49030fdc8d8SChris Lattner { 49130fdc8d8SChris Lattner Attach (attach_pid); 49230fdc8d8SChris Lattner return GetProcessID(); 49330fdc8d8SChris Lattner } 49430fdc8d8SChris Lattner 49530fdc8d8SChris Lattner 49630fdc8d8SChris Lattner SBError 49730fdc8d8SChris Lattner SBProcess::Attach (lldb::pid_t attach_pid) 49830fdc8d8SChris Lattner { 49930fdc8d8SChris Lattner SBError sb_error; 5006611103cSGreg Clayton if (m_opaque_sp) 5016611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Attach (attach_pid)); 50230fdc8d8SChris Lattner else 50330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 50430fdc8d8SChris Lattner return sb_error; 50530fdc8d8SChris Lattner } 50630fdc8d8SChris Lattner 50730fdc8d8SChris Lattner SBError 50830fdc8d8SChris Lattner SBProcess::Detach () 50930fdc8d8SChris Lattner { 51030fdc8d8SChris Lattner SBError sb_error; 5116611103cSGreg Clayton if (m_opaque_sp) 5126611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Detach()); 51330fdc8d8SChris Lattner else 51430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 51530fdc8d8SChris Lattner 51630fdc8d8SChris Lattner return sb_error; 51730fdc8d8SChris Lattner } 51830fdc8d8SChris Lattner 51930fdc8d8SChris Lattner SBError 52030fdc8d8SChris Lattner SBProcess::Signal (int signal) 52130fdc8d8SChris Lattner { 52230fdc8d8SChris Lattner SBError sb_error; 5236611103cSGreg Clayton if (m_opaque_sp) 5246611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Signal (signal)); 52530fdc8d8SChris Lattner else 52630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 52730fdc8d8SChris Lattner return sb_error; 52830fdc8d8SChris Lattner } 52930fdc8d8SChris Lattner 53030fdc8d8SChris Lattner SBThread 53130fdc8d8SChris Lattner SBProcess::GetThreadByID (tid_t sb_thread_id) 53230fdc8d8SChris Lattner { 53330fdc8d8SChris Lattner SBThread thread; 5346611103cSGreg Clayton if (m_opaque_sp) 5356611103cSGreg Clayton thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id)); 53630fdc8d8SChris Lattner return thread; 53730fdc8d8SChris Lattner } 53830fdc8d8SChris Lattner 53930fdc8d8SChris Lattner StateType 54030fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 54130fdc8d8SChris Lattner { 542ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 543ceb6b139SCaroline Tice 544ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 545ceb6b139SCaroline Tice 546ceb6b139SCaroline Tice if (log) 547750cd175SCaroline Tice log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => '%s'", event.get(), 548750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 549ceb6b139SCaroline Tice 550ceb6b139SCaroline Tice return ret_val; 55130fdc8d8SChris Lattner } 55230fdc8d8SChris Lattner 55330fdc8d8SChris Lattner bool 55430fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 55530fdc8d8SChris Lattner { 5566611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 55730fdc8d8SChris Lattner } 55830fdc8d8SChris Lattner 55930fdc8d8SChris Lattner SBProcess 56030fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 56130fdc8d8SChris Lattner { 5626611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 56330fdc8d8SChris Lattner return process; 56430fdc8d8SChris Lattner } 56530fdc8d8SChris Lattner 56630fdc8d8SChris Lattner 56730fdc8d8SChris Lattner SBBroadcaster 56830fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 56930fdc8d8SChris Lattner { 570ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 571ceb6b139SCaroline Tice 5726611103cSGreg Clayton SBBroadcaster broadcaster(m_opaque_sp.get(), false); 573ceb6b139SCaroline Tice 574ceb6b139SCaroline Tice if (log) 575*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(), 576750cd175SCaroline Tice broadcaster.get()); 577ceb6b139SCaroline Tice 57830fdc8d8SChris Lattner return broadcaster; 57930fdc8d8SChris Lattner } 58030fdc8d8SChris Lattner 58130fdc8d8SChris Lattner lldb_private::Process * 58230fdc8d8SChris Lattner SBProcess::operator->() const 58330fdc8d8SChris Lattner { 5846611103cSGreg Clayton return m_opaque_sp.get(); 58530fdc8d8SChris Lattner } 58630fdc8d8SChris Lattner 58730fdc8d8SChris Lattner size_t 58830fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 58930fdc8d8SChris Lattner { 590ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 591ceb6b139SCaroline Tice 59230fdc8d8SChris Lattner size_t bytes_read = 0; 59330fdc8d8SChris Lattner 59430fdc8d8SChris Lattner if (IsValid()) 59530fdc8d8SChris Lattner { 59630fdc8d8SChris Lattner Error error; 5976611103cSGreg Clayton bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error); 59830fdc8d8SChris Lattner sb_error.SetError (error); 59930fdc8d8SChris Lattner } 60030fdc8d8SChris Lattner else 60130fdc8d8SChris Lattner { 60230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 60330fdc8d8SChris Lattner } 60430fdc8d8SChris Lattner 605ceb6b139SCaroline Tice if (log) 606*93aa84e8SGreg Clayton { 607*93aa84e8SGreg Clayton SBStream sstr; 608*93aa84e8SGreg Clayton sb_error.GetDescription (sstr); 609*93aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=%llx, dst=%p, dst_len=%d, SBError (%p): %s) => %d", 610*93aa84e8SGreg Clayton m_opaque_sp.get(), 611*93aa84e8SGreg Clayton addr, 612*93aa84e8SGreg Clayton dst, 613*93aa84e8SGreg Clayton (uint32_t) dst_len, 614*93aa84e8SGreg Clayton sb_error.get(), 615*93aa84e8SGreg Clayton sstr.GetData(), 616*93aa84e8SGreg Clayton (uint32_t) bytes_read); 617*93aa84e8SGreg Clayton } 618ceb6b139SCaroline Tice 61930fdc8d8SChris Lattner return bytes_read; 62030fdc8d8SChris Lattner } 62130fdc8d8SChris Lattner 62230fdc8d8SChris Lattner size_t 62330fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 62430fdc8d8SChris Lattner { 62530fdc8d8SChris Lattner size_t bytes_written = 0; 62630fdc8d8SChris Lattner 62730fdc8d8SChris Lattner if (IsValid()) 62830fdc8d8SChris Lattner { 62930fdc8d8SChris Lattner Error error; 6306611103cSGreg Clayton bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error); 63130fdc8d8SChris Lattner sb_error.SetError (error); 63230fdc8d8SChris Lattner } 63330fdc8d8SChris Lattner 63430fdc8d8SChris Lattner return bytes_written; 63530fdc8d8SChris Lattner } 63630fdc8d8SChris Lattner 63730fdc8d8SChris Lattner // Mimic shared pointer... 63830fdc8d8SChris Lattner lldb_private::Process * 63930fdc8d8SChris Lattner SBProcess::get() const 64030fdc8d8SChris Lattner { 6416611103cSGreg Clayton return m_opaque_sp.get(); 64230fdc8d8SChris Lattner } 64330fdc8d8SChris Lattner 644dde9cff3SCaroline Tice bool 645dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 646dde9cff3SCaroline Tice { 647dde9cff3SCaroline Tice if (m_opaque_sp) 648dde9cff3SCaroline Tice { 649dde9cff3SCaroline Tice char path[PATH_MAX]; 650dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 6511d273166SGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get(); 6521d273166SGreg Clayton const char *exe_name = NULL; 6531d273166SGreg Clayton if (exe_module) 6541d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 6551d273166SGreg Clayton 65605faeb71SGreg Clayton description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s", 6571d273166SGreg Clayton m_opaque_sp->GetID(), 658ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 6591d273166SGreg Clayton GetNumThreads(), 66005faeb71SGreg Clayton exe_name ? ", executable = " : "", 6611d273166SGreg Clayton exe_name ? exe_name : ""); 662dde9cff3SCaroline Tice } 663dde9cff3SCaroline Tice else 664dde9cff3SCaroline Tice description.Printf ("No value"); 665dde9cff3SCaroline Tice 666dde9cff3SCaroline Tice return true; 667dde9cff3SCaroline Tice } 668