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 { 1022d4edfbcSGreg 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 { 107af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 10830fdc8d8SChris Lattner const bool can_update = true; 109ceb6b139SCaroline Tice num_threads = m_opaque_sp->GetThreadList().GetSize(can_update); 11030fdc8d8SChris Lattner } 111ceb6b139SCaroline Tice 112ceb6b139SCaroline Tice if (log) 11393aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", m_opaque_sp.get(), num_threads); 114ceb6b139SCaroline Tice 115ceb6b139SCaroline Tice return num_threads; 11630fdc8d8SChris Lattner } 11730fdc8d8SChris Lattner 11830fdc8d8SChris Lattner SBThread 1192976d00aSJim Ingham SBProcess::GetSelectedThread () const 12030fdc8d8SChris Lattner { 1212d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 122ceb6b139SCaroline Tice 12330fdc8d8SChris Lattner SBThread sb_thread; 1246611103cSGreg Clayton if (m_opaque_sp) 125af67cecdSGreg Clayton { 126af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1272976d00aSJim Ingham sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread()); 128af67cecdSGreg Clayton } 129ceb6b139SCaroline Tice 130ceb6b139SCaroline Tice if (log) 131ceb6b139SCaroline Tice { 1324838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), sb_thread.get()); 133ceb6b139SCaroline Tice } 134ceb6b139SCaroline Tice 13530fdc8d8SChris Lattner return sb_thread; 13630fdc8d8SChris Lattner } 13730fdc8d8SChris Lattner 13830fdc8d8SChris Lattner SBTarget 13930fdc8d8SChris Lattner SBProcess::GetTarget() const 14030fdc8d8SChris Lattner { 1412d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 142ceb6b139SCaroline Tice 14330fdc8d8SChris Lattner SBTarget sb_target; 1446611103cSGreg Clayton if (m_opaque_sp) 1456611103cSGreg Clayton sb_target = m_opaque_sp->GetTarget().GetSP(); 146ceb6b139SCaroline Tice 147ceb6b139SCaroline Tice if (log) 14893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), sb_target.get()); 149ceb6b139SCaroline Tice 15030fdc8d8SChris Lattner return sb_target; 15130fdc8d8SChris Lattner } 15230fdc8d8SChris Lattner 15330fdc8d8SChris Lattner 15430fdc8d8SChris Lattner size_t 15530fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 15630fdc8d8SChris Lattner { 1572d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 158ceb6b139SCaroline Tice 159ceb6b139SCaroline Tice size_t ret_val = 0; 160af67cecdSGreg Clayton if (m_opaque_sp) 16130fdc8d8SChris Lattner { 16230fdc8d8SChris Lattner Error error; 163ceb6b139SCaroline Tice ret_val = m_opaque_sp->PutSTDIN (src, src_len, error); 16430fdc8d8SChris Lattner } 165ceb6b139SCaroline Tice 166ceb6b139SCaroline Tice if (log) 167cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %d", 16893aa84e8SGreg Clayton m_opaque_sp.get(), 16993aa84e8SGreg Clayton src, 17093aa84e8SGreg Clayton (uint32_t) src_len, 17193aa84e8SGreg Clayton ret_val); 172ceb6b139SCaroline Tice 173ceb6b139SCaroline Tice return ret_val; 17430fdc8d8SChris Lattner } 17530fdc8d8SChris Lattner 17630fdc8d8SChris Lattner size_t 17730fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 17830fdc8d8SChris Lattner { 179cfd1acedSGreg Clayton size_t bytes_read = 0; 180af67cecdSGreg Clayton if (m_opaque_sp) 18130fdc8d8SChris Lattner { 18230fdc8d8SChris Lattner Error error; 183cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDOUT (dst, dst_len, error); 18430fdc8d8SChris Lattner } 185ceb6b139SCaroline Tice 1862d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 187ceb6b139SCaroline Tice if (log) 188cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu", 189cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 190ceb6b139SCaroline Tice 191cfd1acedSGreg Clayton return bytes_read; 19230fdc8d8SChris Lattner } 19330fdc8d8SChris Lattner 19430fdc8d8SChris Lattner size_t 19530fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 19630fdc8d8SChris Lattner { 197cfd1acedSGreg Clayton size_t bytes_read = 0; 198af67cecdSGreg Clayton if (m_opaque_sp) 19930fdc8d8SChris Lattner { 20030fdc8d8SChris Lattner Error error; 201cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDERR (dst, dst_len, error); 20230fdc8d8SChris Lattner } 203ceb6b139SCaroline Tice 2042d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 205ceb6b139SCaroline Tice if (log) 206cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu", 207cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 208ceb6b139SCaroline Tice 209cfd1acedSGreg Clayton return bytes_read; 21030fdc8d8SChris Lattner } 21130fdc8d8SChris Lattner 21230fdc8d8SChris Lattner void 2132976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 21430fdc8d8SChris Lattner { 21530fdc8d8SChris Lattner if (out == NULL) 21630fdc8d8SChris Lattner return; 21730fdc8d8SChris Lattner 218af67cecdSGreg Clayton if (m_opaque_sp) 21930fdc8d8SChris Lattner { 22030fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 22130fdc8d8SChris Lattner char message[1024]; 22230fdc8d8SChris Lattner int message_len = ::snprintf (message, 22330fdc8d8SChris Lattner sizeof (message), 22430fdc8d8SChris Lattner "Process %d %s\n", 2256611103cSGreg Clayton m_opaque_sp->GetID(), 22630fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 22730fdc8d8SChris Lattner 22830fdc8d8SChris Lattner if (message_len > 0) 22930fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 23030fdc8d8SChris Lattner } 23130fdc8d8SChris Lattner } 23230fdc8d8SChris Lattner 23330fdc8d8SChris Lattner void 2342976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 23530fdc8d8SChris Lattner { 236af67cecdSGreg Clayton if (m_opaque_sp) 23730fdc8d8SChris Lattner { 23830fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 23930fdc8d8SChris Lattner char message[1024]; 24030fdc8d8SChris Lattner ::snprintf (message, 24130fdc8d8SChris Lattner sizeof (message), 24230fdc8d8SChris Lattner "Process %d %s\n", 2436611103cSGreg Clayton m_opaque_sp->GetID(), 24430fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 24530fdc8d8SChris Lattner 24630fdc8d8SChris Lattner result.AppendMessage (message); 24730fdc8d8SChris Lattner } 24830fdc8d8SChris Lattner } 24930fdc8d8SChris Lattner 25030fdc8d8SChris Lattner bool 2512976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 25230fdc8d8SChris Lattner { 253af67cecdSGreg Clayton if (m_opaque_sp) 254af67cecdSGreg Clayton { 255af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2562976d00aSJim Ingham return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 257af67cecdSGreg Clayton } 25830fdc8d8SChris Lattner return false; 25930fdc8d8SChris Lattner } 26030fdc8d8SChris Lattner 26130fdc8d8SChris Lattner bool 2622976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 26330fdc8d8SChris Lattner { 2642d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 265ceb6b139SCaroline Tice 266ceb6b139SCaroline Tice bool ret_val = false; 267af67cecdSGreg Clayton if (m_opaque_sp) 268af67cecdSGreg Clayton { 269af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 270ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid); 271af67cecdSGreg Clayton } 272ceb6b139SCaroline Tice 273ceb6b139SCaroline Tice if (log) 274cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s", 27593aa84e8SGreg 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 { 2832d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 284ceb6b139SCaroline Tice 28530fdc8d8SChris Lattner SBThread thread; 2866611103cSGreg Clayton if (m_opaque_sp) 287af67cecdSGreg Clayton { 288af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2896611103cSGreg Clayton thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index)); 290af67cecdSGreg Clayton } 291ceb6b139SCaroline Tice 292ceb6b139SCaroline Tice if (log) 293ceb6b139SCaroline Tice { 29493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 2954838131bSGreg Clayton m_opaque_sp.get(), (uint32_t) index, thread.get()); 296ceb6b139SCaroline Tice } 297ceb6b139SCaroline Tice 29830fdc8d8SChris Lattner return thread; 29930fdc8d8SChris Lattner } 30030fdc8d8SChris Lattner 30130fdc8d8SChris Lattner StateType 30230fdc8d8SChris Lattner SBProcess::GetState () 30330fdc8d8SChris Lattner { 304ceb6b139SCaroline Tice 305ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 306af67cecdSGreg Clayton if (m_opaque_sp) 307af67cecdSGreg Clayton { 308af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 309ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetState(); 310af67cecdSGreg Clayton } 311ceb6b139SCaroline Tice 3122d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 313ceb6b139SCaroline Tice if (log) 314cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 31593aa84e8SGreg Clayton m_opaque_sp.get(), 316750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 317ceb6b139SCaroline Tice 318ceb6b139SCaroline Tice return ret_val; 31930fdc8d8SChris Lattner } 32030fdc8d8SChris Lattner 32130fdc8d8SChris Lattner 32230fdc8d8SChris Lattner int 32330fdc8d8SChris Lattner SBProcess::GetExitStatus () 32430fdc8d8SChris Lattner { 3254838131bSGreg Clayton int exit_status = 0; 3264838131bSGreg Clayton if (m_opaque_sp) 327af67cecdSGreg Clayton { 328af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3294838131bSGreg Clayton exit_status = m_opaque_sp->GetExitStatus (); 330af67cecdSGreg Clayton } 3312d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3324838131bSGreg Clayton if (log) 3334838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 3344838131bSGreg Clayton m_opaque_sp.get(), exit_status, exit_status); 3354838131bSGreg Clayton 3364838131bSGreg Clayton return exit_status; 33730fdc8d8SChris Lattner } 33830fdc8d8SChris Lattner 33930fdc8d8SChris Lattner const char * 34030fdc8d8SChris Lattner SBProcess::GetExitDescription () 34130fdc8d8SChris Lattner { 3424838131bSGreg Clayton const char *exit_desc = NULL; 343af67cecdSGreg Clayton if (m_opaque_sp) 344af67cecdSGreg Clayton { 345af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3464838131bSGreg Clayton exit_desc = m_opaque_sp->GetExitDescription (); 347af67cecdSGreg Clayton } 3482d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3494838131bSGreg Clayton if (log) 3504838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 3514838131bSGreg Clayton m_opaque_sp.get(), exit_desc); 3524838131bSGreg Clayton return exit_desc; 35330fdc8d8SChris Lattner } 35430fdc8d8SChris Lattner 35530fdc8d8SChris Lattner lldb::pid_t 35630fdc8d8SChris Lattner SBProcess::GetProcessID () 35730fdc8d8SChris Lattner { 358ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 3596611103cSGreg Clayton if (m_opaque_sp) 360ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetID(); 361ceb6b139SCaroline Tice 3622d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 363ceb6b139SCaroline Tice if (log) 36493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %d", m_opaque_sp.get(), ret_val); 365ceb6b139SCaroline Tice 366ceb6b139SCaroline Tice return ret_val; 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner 369*cf386e24SJohnny Chen ByteOrder 370*cf386e24SJohnny Chen SBProcess::GetByteOrder () const 371*cf386e24SJohnny Chen { 372*cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 373*cf386e24SJohnny Chen if (m_opaque_sp) 374*cf386e24SJohnny Chen byteOrder = m_opaque_sp->GetTarget().GetArchitecture().GetByteOrder(); 375*cf386e24SJohnny Chen 376*cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 377*cf386e24SJohnny Chen if (log) 378*cf386e24SJohnny Chen log->Printf ("SBProcess(%p)::GetByteOrder () => %d", m_opaque_sp.get(), byteOrder); 379*cf386e24SJohnny Chen 380*cf386e24SJohnny Chen return byteOrder; 381*cf386e24SJohnny Chen } 382*cf386e24SJohnny Chen 38330fdc8d8SChris Lattner uint32_t 38430fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 38530fdc8d8SChris Lattner { 386ceb6b139SCaroline Tice uint32_t size = 0; 3876611103cSGreg Clayton if (m_opaque_sp) 388514487e8SGreg Clayton size = m_opaque_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 389ceb6b139SCaroline Tice 3902d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 391ceb6b139SCaroline Tice if (log) 39293aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size); 393ceb6b139SCaroline Tice 394ceb6b139SCaroline Tice return size; 39530fdc8d8SChris Lattner } 39630fdc8d8SChris Lattner 39730fdc8d8SChris Lattner SBError 39830fdc8d8SChris Lattner SBProcess::Continue () 39930fdc8d8SChris Lattner { 400af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 401af67cecdSGreg Clayton 4022d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4034838131bSGreg Clayton if (log) 4044838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get()); 405ceb6b139SCaroline Tice 40630fdc8d8SChris Lattner SBError sb_error; 40730fdc8d8SChris Lattner if (IsValid()) 4085d5028b5SGreg Clayton { 4095d5028b5SGreg Clayton Error error (m_opaque_sp->Resume()); 4105d5028b5SGreg Clayton if (error.Success()) 4115d5028b5SGreg Clayton { 4125d5028b5SGreg Clayton if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 4134838131bSGreg Clayton { 4144838131bSGreg Clayton if (log) 4154838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get()); 4165d5028b5SGreg Clayton m_opaque_sp->WaitForProcessToStop (NULL); 4175d5028b5SGreg Clayton } 4184838131bSGreg Clayton } 4195d5028b5SGreg Clayton sb_error.SetError(error); 4205d5028b5SGreg Clayton } 42130fdc8d8SChris Lattner else 42230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 42330fdc8d8SChris Lattner 424ceb6b139SCaroline Tice if (log) 425ceb6b139SCaroline Tice { 426ceb6b139SCaroline Tice SBStream sstr; 427ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 42893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData()); 429ceb6b139SCaroline Tice } 430ceb6b139SCaroline Tice 43130fdc8d8SChris Lattner return sb_error; 43230fdc8d8SChris Lattner } 43330fdc8d8SChris Lattner 43430fdc8d8SChris Lattner 43530fdc8d8SChris Lattner SBError 43630fdc8d8SChris Lattner SBProcess::Destroy () 43730fdc8d8SChris Lattner { 43830fdc8d8SChris Lattner SBError sb_error; 4396611103cSGreg Clayton if (m_opaque_sp) 4406779606aSGreg Clayton { 4416779606aSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4426611103cSGreg Clayton sb_error.SetError(m_opaque_sp->Destroy()); 4436779606aSGreg Clayton } 44430fdc8d8SChris Lattner else 44530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 44630fdc8d8SChris Lattner 4472d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4484838131bSGreg Clayton if (log) 4494838131bSGreg Clayton { 4504838131bSGreg Clayton SBStream sstr; 4514838131bSGreg Clayton sb_error.GetDescription (sstr); 4526779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 4536779606aSGreg Clayton m_opaque_sp.get(), 4546779606aSGreg Clayton sb_error.get(), 4556779606aSGreg Clayton sstr.GetData()); 4564838131bSGreg Clayton } 4574838131bSGreg Clayton 45830fdc8d8SChris Lattner return sb_error; 45930fdc8d8SChris Lattner } 46030fdc8d8SChris Lattner 46130fdc8d8SChris Lattner 46230fdc8d8SChris Lattner SBError 46330fdc8d8SChris Lattner SBProcess::Stop () 46430fdc8d8SChris Lattner { 46530fdc8d8SChris Lattner SBError sb_error; 46630fdc8d8SChris Lattner if (IsValid()) 467af67cecdSGreg Clayton { 468af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4696611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Halt()); 470af67cecdSGreg Clayton } 47130fdc8d8SChris Lattner else 47230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 473ceb6b139SCaroline Tice 4742d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 475ceb6b139SCaroline Tice if (log) 476ceb6b139SCaroline Tice { 477ceb6b139SCaroline Tice SBStream sstr; 478ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 47993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 48093aa84e8SGreg Clayton m_opaque_sp.get(), 48193aa84e8SGreg Clayton sb_error.get(), 482750cd175SCaroline Tice sstr.GetData()); 483ceb6b139SCaroline Tice } 484ceb6b139SCaroline Tice 48530fdc8d8SChris Lattner return sb_error; 48630fdc8d8SChris Lattner } 48730fdc8d8SChris Lattner 48830fdc8d8SChris Lattner SBError 48930fdc8d8SChris Lattner SBProcess::Kill () 49030fdc8d8SChris Lattner { 49130fdc8d8SChris Lattner SBError sb_error; 4926611103cSGreg Clayton if (m_opaque_sp) 493af67cecdSGreg Clayton { 494af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4956611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Destroy()); 496af67cecdSGreg Clayton } 49730fdc8d8SChris Lattner else 49830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 499ceb6b139SCaroline Tice 5002d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 501ceb6b139SCaroline Tice if (log) 502ceb6b139SCaroline Tice { 503ceb6b139SCaroline Tice SBStream sstr; 504ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 50593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 50693aa84e8SGreg Clayton m_opaque_sp.get(), 50793aa84e8SGreg Clayton sb_error.get(), 508750cd175SCaroline Tice sstr.GetData()); 509ceb6b139SCaroline Tice } 510ceb6b139SCaroline Tice 51130fdc8d8SChris Lattner return sb_error; 51230fdc8d8SChris Lattner } 51330fdc8d8SChris Lattner 51430fdc8d8SChris Lattner SBError 51530fdc8d8SChris Lattner SBProcess::Detach () 51630fdc8d8SChris Lattner { 51730fdc8d8SChris Lattner SBError sb_error; 5186611103cSGreg Clayton if (m_opaque_sp) 519af67cecdSGreg Clayton { 520af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5216611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Detach()); 522af67cecdSGreg Clayton } 52330fdc8d8SChris Lattner else 52430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 52530fdc8d8SChris Lattner 52630fdc8d8SChris Lattner return sb_error; 52730fdc8d8SChris Lattner } 52830fdc8d8SChris Lattner 52930fdc8d8SChris Lattner SBError 5304838131bSGreg Clayton SBProcess::Signal (int signo) 53130fdc8d8SChris Lattner { 53230fdc8d8SChris Lattner SBError sb_error; 5336611103cSGreg Clayton if (m_opaque_sp) 534af67cecdSGreg Clayton { 535af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5364838131bSGreg Clayton sb_error.SetError (m_opaque_sp->Signal (signo)); 537af67cecdSGreg Clayton } 53830fdc8d8SChris Lattner else 53930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 5402d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5414838131bSGreg Clayton if (log) 5424838131bSGreg Clayton { 5434838131bSGreg Clayton SBStream sstr; 5444838131bSGreg Clayton sb_error.GetDescription (sstr); 5454838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 5464838131bSGreg Clayton m_opaque_sp.get(), 5474838131bSGreg Clayton signo, 5484838131bSGreg Clayton sb_error.get(), 5494838131bSGreg Clayton sstr.GetData()); 5504838131bSGreg Clayton } 55130fdc8d8SChris Lattner return sb_error; 55230fdc8d8SChris Lattner } 55330fdc8d8SChris Lattner 55430fdc8d8SChris Lattner SBThread 5554838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 55630fdc8d8SChris Lattner { 5574838131bSGreg Clayton SBThread sb_thread; 5586611103cSGreg Clayton if (m_opaque_sp) 559af67cecdSGreg Clayton { 560af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5614838131bSGreg Clayton sb_thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) tid)); 562af67cecdSGreg Clayton } 5634838131bSGreg Clayton 5642d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5654838131bSGreg Clayton if (log) 5664838131bSGreg Clayton { 5674838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4x) => SBThread (%p)", 5684838131bSGreg Clayton m_opaque_sp.get(), 5694838131bSGreg Clayton tid, 5704838131bSGreg Clayton sb_thread.get()); 5714838131bSGreg Clayton } 5724838131bSGreg Clayton 5734838131bSGreg Clayton return sb_thread; 57430fdc8d8SChris Lattner } 57530fdc8d8SChris Lattner 57630fdc8d8SChris Lattner StateType 57730fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 57830fdc8d8SChris Lattner { 5792d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 580ceb6b139SCaroline Tice 581ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 582ceb6b139SCaroline Tice 583ceb6b139SCaroline Tice if (log) 584cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 585750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 586ceb6b139SCaroline Tice 587ceb6b139SCaroline Tice return ret_val; 58830fdc8d8SChris Lattner } 58930fdc8d8SChris Lattner 59030fdc8d8SChris Lattner bool 59130fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 59230fdc8d8SChris Lattner { 5936611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 59430fdc8d8SChris Lattner } 59530fdc8d8SChris Lattner 59630fdc8d8SChris Lattner SBProcess 59730fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 59830fdc8d8SChris Lattner { 5996611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 60030fdc8d8SChris Lattner return process; 60130fdc8d8SChris Lattner } 60230fdc8d8SChris Lattner 60330fdc8d8SChris Lattner 60430fdc8d8SChris Lattner SBBroadcaster 60530fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 60630fdc8d8SChris Lattner { 6072d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 608ceb6b139SCaroline Tice 6096611103cSGreg Clayton SBBroadcaster broadcaster(m_opaque_sp.get(), false); 610ceb6b139SCaroline Tice 611ceb6b139SCaroline Tice if (log) 61293aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(), 613750cd175SCaroline Tice broadcaster.get()); 614ceb6b139SCaroline Tice 61530fdc8d8SChris Lattner return broadcaster; 61630fdc8d8SChris Lattner } 61730fdc8d8SChris Lattner 61830fdc8d8SChris Lattner lldb_private::Process * 61930fdc8d8SChris Lattner SBProcess::operator->() const 62030fdc8d8SChris Lattner { 6216611103cSGreg Clayton return m_opaque_sp.get(); 62230fdc8d8SChris Lattner } 62330fdc8d8SChris Lattner 62430fdc8d8SChris Lattner size_t 62530fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 62630fdc8d8SChris Lattner { 6272d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 628ceb6b139SCaroline Tice 62930fdc8d8SChris Lattner size_t bytes_read = 0; 63030fdc8d8SChris Lattner 6314838131bSGreg Clayton if (log) 6324838131bSGreg Clayton { 6334838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...", 6344838131bSGreg Clayton m_opaque_sp.get(), 6354838131bSGreg Clayton addr, 6364838131bSGreg Clayton dst, 6374838131bSGreg Clayton (uint32_t) dst_len, 6384838131bSGreg Clayton sb_error.get()); 6394838131bSGreg Clayton } 6404838131bSGreg Clayton 641af67cecdSGreg Clayton if (m_opaque_sp) 64230fdc8d8SChris Lattner { 64330fdc8d8SChris Lattner Error error; 644af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6456611103cSGreg Clayton bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error); 64630fdc8d8SChris Lattner sb_error.SetError (error); 64730fdc8d8SChris Lattner } 64830fdc8d8SChris Lattner else 64930fdc8d8SChris Lattner { 65030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 65130fdc8d8SChris Lattner } 65230fdc8d8SChris Lattner 653ceb6b139SCaroline Tice if (log) 65493aa84e8SGreg Clayton { 65593aa84e8SGreg Clayton SBStream sstr; 65693aa84e8SGreg Clayton sb_error.GetDescription (sstr); 6574838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %d", 65893aa84e8SGreg Clayton m_opaque_sp.get(), 65993aa84e8SGreg Clayton addr, 66093aa84e8SGreg Clayton dst, 66193aa84e8SGreg Clayton (uint32_t) dst_len, 66293aa84e8SGreg Clayton sb_error.get(), 66393aa84e8SGreg Clayton sstr.GetData(), 66493aa84e8SGreg Clayton (uint32_t) bytes_read); 66593aa84e8SGreg Clayton } 666ceb6b139SCaroline Tice 66730fdc8d8SChris Lattner return bytes_read; 66830fdc8d8SChris Lattner } 66930fdc8d8SChris Lattner 67030fdc8d8SChris Lattner size_t 67130fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 67230fdc8d8SChris Lattner { 67330fdc8d8SChris Lattner size_t bytes_written = 0; 67430fdc8d8SChris Lattner 6752d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6764838131bSGreg Clayton if (log) 6774838131bSGreg Clayton { 6784838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...", 6794838131bSGreg Clayton m_opaque_sp.get(), 6804838131bSGreg Clayton addr, 6814838131bSGreg Clayton src, 6824838131bSGreg Clayton (uint32_t) src_len, 6834838131bSGreg Clayton sb_error.get()); 6844838131bSGreg Clayton } 6854838131bSGreg Clayton 686af67cecdSGreg Clayton if (m_opaque_sp) 68730fdc8d8SChris Lattner { 68830fdc8d8SChris Lattner Error error; 689af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6906611103cSGreg Clayton bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error); 69130fdc8d8SChris Lattner sb_error.SetError (error); 69230fdc8d8SChris Lattner } 69330fdc8d8SChris Lattner 6944838131bSGreg Clayton if (log) 6954838131bSGreg Clayton { 6964838131bSGreg Clayton SBStream sstr; 6974838131bSGreg Clayton sb_error.GetDescription (sstr); 6984838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %d", 6994838131bSGreg Clayton m_opaque_sp.get(), 7004838131bSGreg Clayton addr, 7014838131bSGreg Clayton src, 7024838131bSGreg Clayton (uint32_t) src_len, 7034838131bSGreg Clayton sb_error.get(), 7044838131bSGreg Clayton sstr.GetData(), 7054838131bSGreg Clayton (uint32_t) bytes_written); 7064838131bSGreg Clayton } 7074838131bSGreg Clayton 70830fdc8d8SChris Lattner return bytes_written; 70930fdc8d8SChris Lattner } 71030fdc8d8SChris Lattner 71130fdc8d8SChris Lattner // Mimic shared pointer... 71230fdc8d8SChris Lattner lldb_private::Process * 71330fdc8d8SChris Lattner SBProcess::get() const 71430fdc8d8SChris Lattner { 7156611103cSGreg Clayton return m_opaque_sp.get(); 71630fdc8d8SChris Lattner } 71730fdc8d8SChris Lattner 718dde9cff3SCaroline Tice bool 719dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 720dde9cff3SCaroline Tice { 721dde9cff3SCaroline Tice if (m_opaque_sp) 722dde9cff3SCaroline Tice { 723dde9cff3SCaroline Tice char path[PATH_MAX]; 724dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 7251d273166SGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get(); 7261d273166SGreg Clayton const char *exe_name = NULL; 7271d273166SGreg Clayton if (exe_module) 7281d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 7291d273166SGreg Clayton 73005faeb71SGreg Clayton description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s", 7311d273166SGreg Clayton m_opaque_sp->GetID(), 732ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 7331d273166SGreg Clayton GetNumThreads(), 73405faeb71SGreg Clayton exe_name ? ", executable = " : "", 7351d273166SGreg Clayton exe_name ? exe_name : ""); 736dde9cff3SCaroline Tice } 737dde9cff3SCaroline Tice else 738dde9cff3SCaroline Tice description.Printf ("No value"); 739dde9cff3SCaroline Tice 740dde9cff3SCaroline Tice return true; 741dde9cff3SCaroline Tice } 7428f343b09SGreg Clayton 7438f343b09SGreg Clayton uint32_t 7448f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 7458f343b09SGreg Clayton { 7468f343b09SGreg Clayton if (m_opaque_sp) 747af67cecdSGreg Clayton { 748af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 749c5f57830SGreg Clayton return m_opaque_sp->LoadImage (*sb_image_spec, sb_error.ref()); 750af67cecdSGreg Clayton } 7518f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 7528f343b09SGreg Clayton } 7538f343b09SGreg Clayton 7548f343b09SGreg Clayton lldb::SBError 7558f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 7568f343b09SGreg Clayton { 7578f343b09SGreg Clayton lldb::SBError sb_error; 7588f343b09SGreg Clayton if (m_opaque_sp) 759af67cecdSGreg Clayton { 760af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 7618f343b09SGreg Clayton sb_error.SetError (m_opaque_sp->UnloadImage (image_token)); 762af67cecdSGreg Clayton } 7638f343b09SGreg Clayton else 7648f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 7658f343b09SGreg Clayton return sb_error; 7668f343b09SGreg Clayton } 7678f343b09SGreg Clayton 7688f343b09SGreg Clayton 769