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 { 5630fdc8d8SChris Lattner } 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner 5930fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 606611103cSGreg Clayton m_opaque_sp (process_sp) 6130fdc8d8SChris Lattner { 6230fdc8d8SChris Lattner } 6330fdc8d8SChris Lattner 64efabb123SGreg Clayton const SBProcess& 65efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 66efabb123SGreg Clayton { 67efabb123SGreg Clayton if (this != &rhs) 68efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 69efabb123SGreg Clayton return *this; 70efabb123SGreg Clayton } 71efabb123SGreg Clayton 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 { 102*2d4edfbcSGreg Clayton LogSP 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) 11293aa84e8SGreg 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 { 120*2d4edfbcSGreg Clayton LogSP 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 { 1284838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), sb_thread.get()); 129ceb6b139SCaroline Tice } 130ceb6b139SCaroline Tice 13130fdc8d8SChris Lattner return sb_thread; 13230fdc8d8SChris Lattner } 13330fdc8d8SChris Lattner 13430fdc8d8SChris Lattner SBTarget 13530fdc8d8SChris Lattner SBProcess::GetTarget() const 13630fdc8d8SChris Lattner { 137*2d4edfbcSGreg Clayton LogSP 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) 14493aa84e8SGreg 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 { 153*2d4edfbcSGreg Clayton LogSP 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) 163cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %d", 16493aa84e8SGreg Clayton m_opaque_sp.get(), 16593aa84e8SGreg Clayton src, 16693aa84e8SGreg Clayton (uint32_t) src_len, 16793aa84e8SGreg 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 { 175cfd1acedSGreg Clayton size_t bytes_read = 0; 1766611103cSGreg Clayton if (m_opaque_sp != NULL) 17730fdc8d8SChris Lattner { 17830fdc8d8SChris Lattner Error error; 179cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDOUT (dst, dst_len, error); 18030fdc8d8SChris Lattner } 181ceb6b139SCaroline Tice 182*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 183ceb6b139SCaroline Tice if (log) 184cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu", 185cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 186ceb6b139SCaroline Tice 187cfd1acedSGreg Clayton return bytes_read; 18830fdc8d8SChris Lattner } 18930fdc8d8SChris Lattner 19030fdc8d8SChris Lattner size_t 19130fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 19230fdc8d8SChris Lattner { 193cfd1acedSGreg Clayton size_t bytes_read = 0; 1946611103cSGreg Clayton if (m_opaque_sp != NULL) 19530fdc8d8SChris Lattner { 19630fdc8d8SChris Lattner Error error; 197cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDERR (dst, dst_len, error); 19830fdc8d8SChris Lattner } 199ceb6b139SCaroline Tice 200*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 201ceb6b139SCaroline Tice if (log) 202cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu", 203cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 204ceb6b139SCaroline Tice 205cfd1acedSGreg Clayton return bytes_read; 20630fdc8d8SChris Lattner } 20730fdc8d8SChris Lattner 20830fdc8d8SChris Lattner void 2092976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 21030fdc8d8SChris Lattner { 21130fdc8d8SChris Lattner if (out == NULL) 21230fdc8d8SChris Lattner return; 21330fdc8d8SChris Lattner 2146611103cSGreg Clayton if (m_opaque_sp != NULL) 21530fdc8d8SChris Lattner { 21630fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 21730fdc8d8SChris Lattner char message[1024]; 21830fdc8d8SChris Lattner int message_len = ::snprintf (message, 21930fdc8d8SChris Lattner sizeof (message), 22030fdc8d8SChris Lattner "Process %d %s\n", 2216611103cSGreg Clayton m_opaque_sp->GetID(), 22230fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 22330fdc8d8SChris Lattner 22430fdc8d8SChris Lattner if (message_len > 0) 22530fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 22630fdc8d8SChris Lattner } 22730fdc8d8SChris Lattner } 22830fdc8d8SChris Lattner 22930fdc8d8SChris Lattner void 2302976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 23130fdc8d8SChris Lattner { 2326611103cSGreg Clayton if (m_opaque_sp != NULL) 23330fdc8d8SChris Lattner { 23430fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 23530fdc8d8SChris Lattner char message[1024]; 23630fdc8d8SChris Lattner ::snprintf (message, 23730fdc8d8SChris Lattner sizeof (message), 23830fdc8d8SChris Lattner "Process %d %s\n", 2396611103cSGreg Clayton m_opaque_sp->GetID(), 24030fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 24130fdc8d8SChris Lattner 24230fdc8d8SChris Lattner result.AppendMessage (message); 24330fdc8d8SChris Lattner } 24430fdc8d8SChris Lattner } 24530fdc8d8SChris Lattner 24630fdc8d8SChris Lattner bool 2472976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 24830fdc8d8SChris Lattner { 2496611103cSGreg Clayton if (m_opaque_sp != NULL) 2502976d00aSJim Ingham return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 25130fdc8d8SChris Lattner return false; 25230fdc8d8SChris Lattner } 25330fdc8d8SChris Lattner 25430fdc8d8SChris Lattner bool 2552976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 25630fdc8d8SChris Lattner { 257*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 258ceb6b139SCaroline Tice 259ceb6b139SCaroline Tice bool ret_val = false; 2606611103cSGreg Clayton if (m_opaque_sp != NULL) 261ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid); 262ceb6b139SCaroline Tice 263ceb6b139SCaroline Tice if (log) 264cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s", 26593aa84e8SGreg Clayton m_opaque_sp.get(), tid, (ret_val ? "true" : "false")); 266ceb6b139SCaroline Tice 267ceb6b139SCaroline Tice return ret_val; 26830fdc8d8SChris Lattner } 26930fdc8d8SChris Lattner 27030fdc8d8SChris Lattner SBThread 27130fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 27230fdc8d8SChris Lattner { 273*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 274ceb6b139SCaroline Tice 27530fdc8d8SChris Lattner SBThread thread; 2766611103cSGreg Clayton if (m_opaque_sp) 2776611103cSGreg Clayton thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index)); 278ceb6b139SCaroline Tice 279ceb6b139SCaroline Tice if (log) 280ceb6b139SCaroline Tice { 28193aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 2824838131bSGreg Clayton m_opaque_sp.get(), (uint32_t) index, thread.get()); 283ceb6b139SCaroline Tice } 284ceb6b139SCaroline Tice 28530fdc8d8SChris Lattner return thread; 28630fdc8d8SChris Lattner } 28730fdc8d8SChris Lattner 28830fdc8d8SChris Lattner StateType 28930fdc8d8SChris Lattner SBProcess::GetState () 29030fdc8d8SChris Lattner { 291ceb6b139SCaroline Tice 292ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 2936611103cSGreg Clayton if (m_opaque_sp != NULL) 294ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetState(); 295ceb6b139SCaroline Tice 296*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 297ceb6b139SCaroline Tice if (log) 298cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 29993aa84e8SGreg Clayton m_opaque_sp.get(), 300750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 301ceb6b139SCaroline Tice 302ceb6b139SCaroline Tice return ret_val; 30330fdc8d8SChris Lattner } 30430fdc8d8SChris Lattner 30530fdc8d8SChris Lattner 30630fdc8d8SChris Lattner int 30730fdc8d8SChris Lattner SBProcess::GetExitStatus () 30830fdc8d8SChris Lattner { 3094838131bSGreg Clayton int exit_status = 0; 3104838131bSGreg Clayton if (m_opaque_sp) 3114838131bSGreg Clayton exit_status = m_opaque_sp->GetExitStatus (); 312*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3134838131bSGreg Clayton if (log) 3144838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 3154838131bSGreg Clayton m_opaque_sp.get(), exit_status, exit_status); 3164838131bSGreg Clayton 3174838131bSGreg Clayton return exit_status; 31830fdc8d8SChris Lattner } 31930fdc8d8SChris Lattner 32030fdc8d8SChris Lattner const char * 32130fdc8d8SChris Lattner SBProcess::GetExitDescription () 32230fdc8d8SChris Lattner { 3234838131bSGreg Clayton const char *exit_desc = NULL; 3246611103cSGreg Clayton if (m_opaque_sp != NULL) 3254838131bSGreg Clayton exit_desc = m_opaque_sp->GetExitDescription (); 326*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3274838131bSGreg Clayton if (log) 3284838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 3294838131bSGreg Clayton m_opaque_sp.get(), exit_desc); 3304838131bSGreg Clayton return exit_desc; 33130fdc8d8SChris Lattner } 33230fdc8d8SChris Lattner 33330fdc8d8SChris Lattner lldb::pid_t 33430fdc8d8SChris Lattner SBProcess::GetProcessID () 33530fdc8d8SChris Lattner { 336ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 3376611103cSGreg Clayton if (m_opaque_sp) 338ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetID(); 339ceb6b139SCaroline Tice 340*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 341ceb6b139SCaroline Tice if (log) 34293aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %d", m_opaque_sp.get(), ret_val); 343ceb6b139SCaroline Tice 344ceb6b139SCaroline Tice return ret_val; 34530fdc8d8SChris Lattner } 34630fdc8d8SChris Lattner 34730fdc8d8SChris Lattner uint32_t 34830fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 34930fdc8d8SChris Lattner { 350ceb6b139SCaroline Tice uint32_t size = 0; 3516611103cSGreg Clayton if (m_opaque_sp) 352ceb6b139SCaroline Tice size = m_opaque_sp->GetAddressByteSize(); 353ceb6b139SCaroline Tice 354*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 355ceb6b139SCaroline Tice if (log) 35693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size); 357ceb6b139SCaroline Tice 358ceb6b139SCaroline Tice return size; 35930fdc8d8SChris Lattner } 36030fdc8d8SChris Lattner 36130fdc8d8SChris Lattner SBError 36230fdc8d8SChris Lattner SBProcess::Continue () 36330fdc8d8SChris Lattner { 364*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3654838131bSGreg Clayton if (log) 3664838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get()); 367ceb6b139SCaroline Tice 36830fdc8d8SChris Lattner SBError sb_error; 36930fdc8d8SChris Lattner if (IsValid()) 3705d5028b5SGreg Clayton { 3715d5028b5SGreg Clayton Error error (m_opaque_sp->Resume()); 3725d5028b5SGreg Clayton if (error.Success()) 3735d5028b5SGreg Clayton { 3745d5028b5SGreg Clayton if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 3754838131bSGreg Clayton { 3764838131bSGreg Clayton if (log) 3774838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get()); 3785d5028b5SGreg Clayton m_opaque_sp->WaitForProcessToStop (NULL); 3795d5028b5SGreg Clayton } 3804838131bSGreg Clayton } 3815d5028b5SGreg Clayton sb_error.SetError(error); 3825d5028b5SGreg Clayton } 38330fdc8d8SChris Lattner else 38430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 38530fdc8d8SChris Lattner 386ceb6b139SCaroline Tice if (log) 387ceb6b139SCaroline Tice { 388ceb6b139SCaroline Tice SBStream sstr; 389ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 39093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData()); 391ceb6b139SCaroline Tice } 392ceb6b139SCaroline Tice 39330fdc8d8SChris Lattner return sb_error; 39430fdc8d8SChris Lattner } 39530fdc8d8SChris Lattner 39630fdc8d8SChris Lattner 39730fdc8d8SChris Lattner SBError 39830fdc8d8SChris Lattner SBProcess::Destroy () 39930fdc8d8SChris Lattner { 40030fdc8d8SChris Lattner SBError sb_error; 4016611103cSGreg Clayton if (m_opaque_sp) 4026611103cSGreg Clayton sb_error.SetError(m_opaque_sp->Destroy()); 40330fdc8d8SChris Lattner else 40430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 40530fdc8d8SChris Lattner 406*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4074838131bSGreg Clayton if (log) 4084838131bSGreg Clayton { 4094838131bSGreg Clayton SBStream sstr; 4104838131bSGreg Clayton sb_error.GetDescription (sstr); 4114838131bSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData()); 4124838131bSGreg Clayton } 4134838131bSGreg Clayton 41430fdc8d8SChris Lattner return sb_error; 41530fdc8d8SChris Lattner } 41630fdc8d8SChris Lattner 41730fdc8d8SChris Lattner 41830fdc8d8SChris Lattner SBError 41930fdc8d8SChris Lattner SBProcess::Stop () 42030fdc8d8SChris Lattner { 421ceb6b139SCaroline Tice 42230fdc8d8SChris Lattner SBError sb_error; 42330fdc8d8SChris Lattner if (IsValid()) 4246611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Halt()); 42530fdc8d8SChris Lattner else 42630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 427ceb6b139SCaroline Tice 428*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 429ceb6b139SCaroline Tice if (log) 430ceb6b139SCaroline Tice { 431ceb6b139SCaroline Tice SBStream sstr; 432ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 43393aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 43493aa84e8SGreg Clayton m_opaque_sp.get(), 43593aa84e8SGreg Clayton sb_error.get(), 436750cd175SCaroline Tice sstr.GetData()); 437ceb6b139SCaroline Tice } 438ceb6b139SCaroline Tice 43930fdc8d8SChris Lattner return sb_error; 44030fdc8d8SChris Lattner } 44130fdc8d8SChris Lattner 44230fdc8d8SChris Lattner SBError 44330fdc8d8SChris Lattner SBProcess::Kill () 44430fdc8d8SChris Lattner { 445ceb6b139SCaroline Tice 44630fdc8d8SChris Lattner SBError sb_error; 4476611103cSGreg Clayton if (m_opaque_sp) 4486611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Destroy()); 44930fdc8d8SChris Lattner else 45030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 451ceb6b139SCaroline Tice 452*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 453ceb6b139SCaroline Tice if (log) 454ceb6b139SCaroline Tice { 455ceb6b139SCaroline Tice SBStream sstr; 456ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 45793aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 45893aa84e8SGreg Clayton m_opaque_sp.get(), 45993aa84e8SGreg Clayton sb_error.get(), 460750cd175SCaroline Tice sstr.GetData()); 461ceb6b139SCaroline Tice } 462ceb6b139SCaroline Tice 46330fdc8d8SChris Lattner return sb_error; 46430fdc8d8SChris Lattner } 46530fdc8d8SChris Lattner 46630fdc8d8SChris Lattner 46730fdc8d8SChris Lattner SBError 4684838131bSGreg Clayton SBProcess::AttachByName (const char *name, bool wait_for_launch) // DEPRECATED 46930fdc8d8SChris Lattner { 47030fdc8d8SChris Lattner SBError sb_error; 4716611103cSGreg Clayton if (m_opaque_sp) 4726611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch)); 47330fdc8d8SChris Lattner else 47430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 47530fdc8d8SChris Lattner return sb_error; 47630fdc8d8SChris Lattner } 47730fdc8d8SChris Lattner 47830fdc8d8SChris Lattner lldb::pid_t 4794838131bSGreg Clayton SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED 48030fdc8d8SChris Lattner { 48130fdc8d8SChris Lattner Attach (attach_pid); 48230fdc8d8SChris Lattner return GetProcessID(); 48330fdc8d8SChris Lattner } 48430fdc8d8SChris Lattner 48530fdc8d8SChris Lattner 48630fdc8d8SChris Lattner SBError 4874838131bSGreg Clayton SBProcess::Attach (lldb::pid_t attach_pid) // DEPRECATED 48830fdc8d8SChris Lattner { 48930fdc8d8SChris Lattner SBError sb_error; 4906611103cSGreg Clayton if (m_opaque_sp) 4916611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Attach (attach_pid)); 49230fdc8d8SChris Lattner else 49330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 49430fdc8d8SChris Lattner return sb_error; 49530fdc8d8SChris Lattner } 49630fdc8d8SChris Lattner 49730fdc8d8SChris Lattner SBError 49830fdc8d8SChris Lattner SBProcess::Detach () 49930fdc8d8SChris Lattner { 50030fdc8d8SChris Lattner SBError sb_error; 5016611103cSGreg Clayton if (m_opaque_sp) 5026611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Detach()); 50330fdc8d8SChris Lattner else 50430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 50530fdc8d8SChris Lattner 50630fdc8d8SChris Lattner return sb_error; 50730fdc8d8SChris Lattner } 50830fdc8d8SChris Lattner 50930fdc8d8SChris Lattner SBError 5104838131bSGreg Clayton SBProcess::Signal (int signo) 51130fdc8d8SChris Lattner { 51230fdc8d8SChris Lattner SBError sb_error; 5136611103cSGreg Clayton if (m_opaque_sp) 5144838131bSGreg Clayton sb_error.SetError (m_opaque_sp->Signal (signo)); 51530fdc8d8SChris Lattner else 51630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 517*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5184838131bSGreg Clayton if (log) 5194838131bSGreg Clayton { 5204838131bSGreg Clayton SBStream sstr; 5214838131bSGreg Clayton sb_error.GetDescription (sstr); 5224838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 5234838131bSGreg Clayton m_opaque_sp.get(), 5244838131bSGreg Clayton signo, 5254838131bSGreg Clayton sb_error.get(), 5264838131bSGreg Clayton sstr.GetData()); 5274838131bSGreg Clayton } 52830fdc8d8SChris Lattner return sb_error; 52930fdc8d8SChris Lattner } 53030fdc8d8SChris Lattner 53130fdc8d8SChris Lattner SBThread 5324838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 53330fdc8d8SChris Lattner { 5344838131bSGreg Clayton SBThread sb_thread; 5356611103cSGreg Clayton if (m_opaque_sp) 5364838131bSGreg Clayton sb_thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) tid)); 5374838131bSGreg Clayton 538*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5394838131bSGreg Clayton if (log) 5404838131bSGreg Clayton { 5414838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4x) => SBThread (%p)", 5424838131bSGreg Clayton m_opaque_sp.get(), 5434838131bSGreg Clayton tid, 5444838131bSGreg Clayton sb_thread.get()); 5454838131bSGreg Clayton } 5464838131bSGreg Clayton 5474838131bSGreg Clayton return sb_thread; 54830fdc8d8SChris Lattner } 54930fdc8d8SChris Lattner 55030fdc8d8SChris Lattner StateType 55130fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 55230fdc8d8SChris Lattner { 553*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 554ceb6b139SCaroline Tice 555ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 556ceb6b139SCaroline Tice 557ceb6b139SCaroline Tice if (log) 558cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 559750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 560ceb6b139SCaroline Tice 561ceb6b139SCaroline Tice return ret_val; 56230fdc8d8SChris Lattner } 56330fdc8d8SChris Lattner 56430fdc8d8SChris Lattner bool 56530fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 56630fdc8d8SChris Lattner { 5676611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 56830fdc8d8SChris Lattner } 56930fdc8d8SChris Lattner 57030fdc8d8SChris Lattner SBProcess 57130fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 57230fdc8d8SChris Lattner { 5736611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 57430fdc8d8SChris Lattner return process; 57530fdc8d8SChris Lattner } 57630fdc8d8SChris Lattner 57730fdc8d8SChris Lattner 57830fdc8d8SChris Lattner SBBroadcaster 57930fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 58030fdc8d8SChris Lattner { 581*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 582ceb6b139SCaroline Tice 5836611103cSGreg Clayton SBBroadcaster broadcaster(m_opaque_sp.get(), false); 584ceb6b139SCaroline Tice 585ceb6b139SCaroline Tice if (log) 58693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(), 587750cd175SCaroline Tice broadcaster.get()); 588ceb6b139SCaroline Tice 58930fdc8d8SChris Lattner return broadcaster; 59030fdc8d8SChris Lattner } 59130fdc8d8SChris Lattner 59230fdc8d8SChris Lattner lldb_private::Process * 59330fdc8d8SChris Lattner SBProcess::operator->() const 59430fdc8d8SChris Lattner { 5956611103cSGreg Clayton return m_opaque_sp.get(); 59630fdc8d8SChris Lattner } 59730fdc8d8SChris Lattner 59830fdc8d8SChris Lattner size_t 59930fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 60030fdc8d8SChris Lattner { 601*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 602ceb6b139SCaroline Tice 60330fdc8d8SChris Lattner size_t bytes_read = 0; 60430fdc8d8SChris Lattner 6054838131bSGreg Clayton if (log) 6064838131bSGreg Clayton { 6074838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...", 6084838131bSGreg Clayton m_opaque_sp.get(), 6094838131bSGreg Clayton addr, 6104838131bSGreg Clayton dst, 6114838131bSGreg Clayton (uint32_t) dst_len, 6124838131bSGreg Clayton sb_error.get()); 6134838131bSGreg Clayton } 6144838131bSGreg Clayton 61530fdc8d8SChris Lattner if (IsValid()) 61630fdc8d8SChris Lattner { 61730fdc8d8SChris Lattner Error error; 6186611103cSGreg Clayton bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error); 61930fdc8d8SChris Lattner sb_error.SetError (error); 62030fdc8d8SChris Lattner } 62130fdc8d8SChris Lattner else 62230fdc8d8SChris Lattner { 62330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 62430fdc8d8SChris Lattner } 62530fdc8d8SChris Lattner 626ceb6b139SCaroline Tice if (log) 62793aa84e8SGreg Clayton { 62893aa84e8SGreg Clayton SBStream sstr; 62993aa84e8SGreg Clayton sb_error.GetDescription (sstr); 6304838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %d", 63193aa84e8SGreg Clayton m_opaque_sp.get(), 63293aa84e8SGreg Clayton addr, 63393aa84e8SGreg Clayton dst, 63493aa84e8SGreg Clayton (uint32_t) dst_len, 63593aa84e8SGreg Clayton sb_error.get(), 63693aa84e8SGreg Clayton sstr.GetData(), 63793aa84e8SGreg Clayton (uint32_t) bytes_read); 63893aa84e8SGreg Clayton } 639ceb6b139SCaroline Tice 64030fdc8d8SChris Lattner return bytes_read; 64130fdc8d8SChris Lattner } 64230fdc8d8SChris Lattner 64330fdc8d8SChris Lattner size_t 64430fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 64530fdc8d8SChris Lattner { 64630fdc8d8SChris Lattner size_t bytes_written = 0; 64730fdc8d8SChris Lattner 648*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6494838131bSGreg Clayton if (log) 6504838131bSGreg Clayton { 6514838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...", 6524838131bSGreg Clayton m_opaque_sp.get(), 6534838131bSGreg Clayton addr, 6544838131bSGreg Clayton src, 6554838131bSGreg Clayton (uint32_t) src_len, 6564838131bSGreg Clayton sb_error.get()); 6574838131bSGreg Clayton } 6584838131bSGreg Clayton 65930fdc8d8SChris Lattner if (IsValid()) 66030fdc8d8SChris Lattner { 66130fdc8d8SChris Lattner Error error; 6626611103cSGreg Clayton bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error); 66330fdc8d8SChris Lattner sb_error.SetError (error); 66430fdc8d8SChris Lattner } 66530fdc8d8SChris Lattner 6664838131bSGreg Clayton if (log) 6674838131bSGreg Clayton { 6684838131bSGreg Clayton SBStream sstr; 6694838131bSGreg Clayton sb_error.GetDescription (sstr); 6704838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %d", 6714838131bSGreg Clayton m_opaque_sp.get(), 6724838131bSGreg Clayton addr, 6734838131bSGreg Clayton src, 6744838131bSGreg Clayton (uint32_t) src_len, 6754838131bSGreg Clayton sb_error.get(), 6764838131bSGreg Clayton sstr.GetData(), 6774838131bSGreg Clayton (uint32_t) bytes_written); 6784838131bSGreg Clayton } 6794838131bSGreg Clayton 68030fdc8d8SChris Lattner return bytes_written; 68130fdc8d8SChris Lattner } 68230fdc8d8SChris Lattner 68330fdc8d8SChris Lattner // Mimic shared pointer... 68430fdc8d8SChris Lattner lldb_private::Process * 68530fdc8d8SChris Lattner SBProcess::get() const 68630fdc8d8SChris Lattner { 6876611103cSGreg Clayton return m_opaque_sp.get(); 68830fdc8d8SChris Lattner } 68930fdc8d8SChris Lattner 690dde9cff3SCaroline Tice bool 691dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 692dde9cff3SCaroline Tice { 693dde9cff3SCaroline Tice if (m_opaque_sp) 694dde9cff3SCaroline Tice { 695dde9cff3SCaroline Tice char path[PATH_MAX]; 696dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 6971d273166SGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get(); 6981d273166SGreg Clayton const char *exe_name = NULL; 6991d273166SGreg Clayton if (exe_module) 7001d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 7011d273166SGreg Clayton 70205faeb71SGreg Clayton description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s", 7031d273166SGreg Clayton m_opaque_sp->GetID(), 704ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 7051d273166SGreg Clayton GetNumThreads(), 70605faeb71SGreg Clayton exe_name ? ", executable = " : "", 7071d273166SGreg Clayton exe_name ? exe_name : ""); 708dde9cff3SCaroline Tice } 709dde9cff3SCaroline Tice else 710dde9cff3SCaroline Tice description.Printf ("No value"); 711dde9cff3SCaroline Tice 712dde9cff3SCaroline Tice return true; 713dde9cff3SCaroline Tice } 7148f343b09SGreg Clayton 7158f343b09SGreg Clayton uint32_t 7168f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 7178f343b09SGreg Clayton { 7188f343b09SGreg Clayton if (m_opaque_sp) 7198f343b09SGreg Clayton m_opaque_sp->LoadImage (*sb_image_spec, sb_error.ref()); 7208f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 7218f343b09SGreg Clayton } 7228f343b09SGreg Clayton 7238f343b09SGreg Clayton lldb::SBError 7248f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 7258f343b09SGreg Clayton { 7268f343b09SGreg Clayton lldb::SBError sb_error; 7278f343b09SGreg Clayton if (m_opaque_sp) 7288f343b09SGreg Clayton sb_error.SetError (m_opaque_sp->UnloadImage (image_token)); 7298f343b09SGreg Clayton else 7308f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 7318f343b09SGreg Clayton return sb_error; 7328f343b09SGreg Clayton } 7338f343b09SGreg Clayton 7348f343b09SGreg Clayton 735