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 6430fdc8d8SChris Lattner //---------------------------------------------------------------------- 6530fdc8d8SChris Lattner // Destructor 6630fdc8d8SChris Lattner //---------------------------------------------------------------------- 6730fdc8d8SChris Lattner SBProcess::~SBProcess() 6830fdc8d8SChris Lattner { 6930fdc8d8SChris Lattner } 7030fdc8d8SChris Lattner 7130fdc8d8SChris Lattner void 7230fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp) 7330fdc8d8SChris Lattner { 746611103cSGreg Clayton m_opaque_sp = process_sp; 7530fdc8d8SChris Lattner } 7630fdc8d8SChris Lattner 7730fdc8d8SChris Lattner void 7830fdc8d8SChris Lattner SBProcess::Clear () 7930fdc8d8SChris Lattner { 806611103cSGreg Clayton m_opaque_sp.reset(); 8130fdc8d8SChris Lattner } 8230fdc8d8SChris Lattner 8330fdc8d8SChris Lattner 8430fdc8d8SChris Lattner bool 8530fdc8d8SChris Lattner SBProcess::IsValid() const 8630fdc8d8SChris Lattner { 876611103cSGreg Clayton return m_opaque_sp.get() != NULL; 8830fdc8d8SChris Lattner } 8930fdc8d8SChris Lattner 9030fdc8d8SChris Lattner 9130fdc8d8SChris Lattner uint32_t 9230fdc8d8SChris Lattner SBProcess::GetNumThreads () 9330fdc8d8SChris Lattner { 94ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 95ceb6b139SCaroline Tice 96ceb6b139SCaroline Tice uint32_t num_threads = 0; 976611103cSGreg Clayton if (m_opaque_sp) 9830fdc8d8SChris Lattner { 9930fdc8d8SChris Lattner const bool can_update = true; 100ceb6b139SCaroline Tice num_threads = m_opaque_sp->GetThreadList().GetSize(can_update); 10130fdc8d8SChris Lattner } 102ceb6b139SCaroline Tice 103ceb6b139SCaroline Tice if (log) 10493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", m_opaque_sp.get(), num_threads); 105ceb6b139SCaroline Tice 106ceb6b139SCaroline Tice return num_threads; 10730fdc8d8SChris Lattner } 10830fdc8d8SChris Lattner 10930fdc8d8SChris Lattner SBThread 1102976d00aSJim Ingham SBProcess::GetSelectedThread () const 11130fdc8d8SChris Lattner { 112ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 113ceb6b139SCaroline Tice 11430fdc8d8SChris Lattner SBThread sb_thread; 1156611103cSGreg Clayton if (m_opaque_sp) 1162976d00aSJim Ingham sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread()); 117ceb6b139SCaroline Tice 118ceb6b139SCaroline Tice if (log) 119ceb6b139SCaroline Tice { 120*4838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), sb_thread.get()); 121ceb6b139SCaroline Tice } 122ceb6b139SCaroline Tice 12330fdc8d8SChris Lattner return sb_thread; 12430fdc8d8SChris Lattner } 12530fdc8d8SChris Lattner 12630fdc8d8SChris Lattner SBTarget 12730fdc8d8SChris Lattner SBProcess::GetTarget() const 12830fdc8d8SChris Lattner { 129ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 130ceb6b139SCaroline Tice 13130fdc8d8SChris Lattner SBTarget sb_target; 1326611103cSGreg Clayton if (m_opaque_sp) 1336611103cSGreg Clayton sb_target = m_opaque_sp->GetTarget().GetSP(); 134ceb6b139SCaroline Tice 135ceb6b139SCaroline Tice if (log) 13693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), sb_target.get()); 137ceb6b139SCaroline Tice 13830fdc8d8SChris Lattner return sb_target; 13930fdc8d8SChris Lattner } 14030fdc8d8SChris Lattner 14130fdc8d8SChris Lattner 14230fdc8d8SChris Lattner size_t 14330fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 14430fdc8d8SChris Lattner { 145ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 146ceb6b139SCaroline Tice 147ceb6b139SCaroline Tice size_t ret_val = 0; 1486611103cSGreg Clayton if (m_opaque_sp != NULL) 14930fdc8d8SChris Lattner { 15030fdc8d8SChris Lattner Error error; 151ceb6b139SCaroline Tice ret_val = m_opaque_sp->PutSTDIN (src, src_len, error); 15230fdc8d8SChris Lattner } 153ceb6b139SCaroline Tice 154ceb6b139SCaroline Tice if (log) 15593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::PutSTDIN (src='%s', src_len=%d) => %d", 15693aa84e8SGreg Clayton m_opaque_sp.get(), 15793aa84e8SGreg Clayton src, 15893aa84e8SGreg Clayton (uint32_t) src_len, 15993aa84e8SGreg Clayton ret_val); 160ceb6b139SCaroline Tice 161ceb6b139SCaroline Tice return ret_val; 16230fdc8d8SChris Lattner } 16330fdc8d8SChris Lattner 16430fdc8d8SChris Lattner size_t 16530fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 16630fdc8d8SChris Lattner { 167ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 168ceb6b139SCaroline Tice 169ceb6b139SCaroline Tice size_t ret_val = 0; 1706611103cSGreg Clayton if (m_opaque_sp != NULL) 17130fdc8d8SChris Lattner { 17230fdc8d8SChris Lattner Error error; 173ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetSTDOUT (dst, dst_len, error); 17430fdc8d8SChris Lattner } 175ceb6b139SCaroline Tice 176ceb6b139SCaroline Tice if (log) 17793aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst='%.*s', dst_len=%d) => %d", 17893aa84e8SGreg Clayton m_opaque_sp.get(), 17993aa84e8SGreg Clayton (uint32_t) dst_len, 18093aa84e8SGreg Clayton dst, 18193aa84e8SGreg Clayton (uint32_t) dst_len, 18293aa84e8SGreg Clayton (uint32_t) ret_val); 183ceb6b139SCaroline Tice 184ceb6b139SCaroline Tice return ret_val; 18530fdc8d8SChris Lattner } 18630fdc8d8SChris Lattner 18730fdc8d8SChris Lattner size_t 18830fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 18930fdc8d8SChris Lattner { 190ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 191ceb6b139SCaroline Tice 192ceb6b139SCaroline Tice size_t ret_val = 0; 1936611103cSGreg Clayton if (m_opaque_sp != NULL) 19430fdc8d8SChris Lattner { 19530fdc8d8SChris Lattner Error error; 196ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetSTDERR (dst, dst_len, error); 19730fdc8d8SChris Lattner } 198ceb6b139SCaroline Tice 199ceb6b139SCaroline Tice if (log) 20093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst='%.*s', dst_len=%d) => %d", 20193aa84e8SGreg Clayton m_opaque_sp.get(), 20293aa84e8SGreg Clayton (uint32_t) dst_len, 20393aa84e8SGreg Clayton dst, 20493aa84e8SGreg Clayton (uint32_t) dst_len, 20593aa84e8SGreg Clayton (uint32_t) ret_val); 206ceb6b139SCaroline Tice 207ceb6b139SCaroline Tice return ret_val; 20830fdc8d8SChris Lattner } 20930fdc8d8SChris Lattner 21030fdc8d8SChris Lattner void 2112976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 21230fdc8d8SChris Lattner { 21330fdc8d8SChris Lattner if (out == NULL) 21430fdc8d8SChris Lattner return; 21530fdc8d8SChris Lattner 2166611103cSGreg Clayton if (m_opaque_sp != NULL) 21730fdc8d8SChris Lattner { 21830fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 21930fdc8d8SChris Lattner char message[1024]; 22030fdc8d8SChris Lattner int message_len = ::snprintf (message, 22130fdc8d8SChris Lattner sizeof (message), 22230fdc8d8SChris Lattner "Process %d %s\n", 2236611103cSGreg Clayton m_opaque_sp->GetID(), 22430fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 22530fdc8d8SChris Lattner 22630fdc8d8SChris Lattner if (message_len > 0) 22730fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 22830fdc8d8SChris Lattner } 22930fdc8d8SChris Lattner } 23030fdc8d8SChris Lattner 23130fdc8d8SChris Lattner void 2322976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 23330fdc8d8SChris Lattner { 2346611103cSGreg Clayton if (m_opaque_sp != NULL) 23530fdc8d8SChris Lattner { 23630fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 23730fdc8d8SChris Lattner char message[1024]; 23830fdc8d8SChris Lattner ::snprintf (message, 23930fdc8d8SChris Lattner sizeof (message), 24030fdc8d8SChris Lattner "Process %d %s\n", 2416611103cSGreg Clayton m_opaque_sp->GetID(), 24230fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 24330fdc8d8SChris Lattner 24430fdc8d8SChris Lattner result.AppendMessage (message); 24530fdc8d8SChris Lattner } 24630fdc8d8SChris Lattner } 24730fdc8d8SChris Lattner 24830fdc8d8SChris Lattner bool 2492976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 25030fdc8d8SChris Lattner { 2516611103cSGreg Clayton if (m_opaque_sp != NULL) 2522976d00aSJim Ingham return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 25330fdc8d8SChris Lattner return false; 25430fdc8d8SChris Lattner } 25530fdc8d8SChris Lattner 25630fdc8d8SChris Lattner bool 2572976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 25830fdc8d8SChris Lattner { 259ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 260ceb6b139SCaroline Tice 261ceb6b139SCaroline Tice bool ret_val = false; 2626611103cSGreg Clayton if (m_opaque_sp != NULL) 263ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid); 264ceb6b139SCaroline Tice 265ceb6b139SCaroline Tice if (log) 26693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=%d) => '%s'", 26793aa84e8SGreg Clayton m_opaque_sp.get(), tid, (ret_val ? "true" : "false")); 268ceb6b139SCaroline Tice 269ceb6b139SCaroline Tice return ret_val; 27030fdc8d8SChris Lattner } 27130fdc8d8SChris Lattner 27230fdc8d8SChris Lattner SBThread 27330fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 27430fdc8d8SChris Lattner { 275ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 276ceb6b139SCaroline Tice 27730fdc8d8SChris Lattner SBThread thread; 2786611103cSGreg Clayton if (m_opaque_sp) 2796611103cSGreg Clayton thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index)); 280ceb6b139SCaroline Tice 281ceb6b139SCaroline Tice if (log) 282ceb6b139SCaroline Tice { 28393aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 284*4838131bSGreg Clayton m_opaque_sp.get(), (uint32_t) index, thread.get()); 285ceb6b139SCaroline Tice } 286ceb6b139SCaroline Tice 28730fdc8d8SChris Lattner return thread; 28830fdc8d8SChris Lattner } 28930fdc8d8SChris Lattner 29030fdc8d8SChris Lattner StateType 29130fdc8d8SChris Lattner SBProcess::GetState () 29230fdc8d8SChris Lattner { 293ceb6b139SCaroline Tice 294ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 2956611103cSGreg Clayton if (m_opaque_sp != NULL) 296ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetState(); 297ceb6b139SCaroline Tice 298*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 299ceb6b139SCaroline Tice if (log) 30093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetState () => '%s'", 30193aa84e8SGreg Clayton m_opaque_sp.get(), 302750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 303ceb6b139SCaroline Tice 304ceb6b139SCaroline Tice return ret_val; 30530fdc8d8SChris Lattner } 30630fdc8d8SChris Lattner 30730fdc8d8SChris Lattner 30830fdc8d8SChris Lattner int 30930fdc8d8SChris Lattner SBProcess::GetExitStatus () 31030fdc8d8SChris Lattner { 311*4838131bSGreg Clayton int exit_status = 0; 312*4838131bSGreg Clayton if (m_opaque_sp) 313*4838131bSGreg Clayton exit_status = m_opaque_sp->GetExitStatus (); 314*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 315*4838131bSGreg Clayton if (log) 316*4838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 317*4838131bSGreg Clayton m_opaque_sp.get(), exit_status, exit_status); 318*4838131bSGreg Clayton 319*4838131bSGreg Clayton return exit_status; 32030fdc8d8SChris Lattner } 32130fdc8d8SChris Lattner 32230fdc8d8SChris Lattner const char * 32330fdc8d8SChris Lattner SBProcess::GetExitDescription () 32430fdc8d8SChris Lattner { 325*4838131bSGreg Clayton const char *exit_desc = NULL; 3266611103cSGreg Clayton if (m_opaque_sp != NULL) 327*4838131bSGreg Clayton exit_desc = m_opaque_sp->GetExitDescription (); 328*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 329*4838131bSGreg Clayton if (log) 330*4838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 331*4838131bSGreg Clayton m_opaque_sp.get(), exit_desc); 332*4838131bSGreg Clayton return exit_desc; 33330fdc8d8SChris Lattner } 33430fdc8d8SChris Lattner 33530fdc8d8SChris Lattner lldb::pid_t 33630fdc8d8SChris Lattner SBProcess::GetProcessID () 33730fdc8d8SChris Lattner { 338ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 3396611103cSGreg Clayton if (m_opaque_sp) 340ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetID(); 341ceb6b139SCaroline Tice 342*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 343ceb6b139SCaroline Tice if (log) 34493aa84e8SGreg 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 uint32_t size = 0; 3536611103cSGreg Clayton if (m_opaque_sp) 354ceb6b139SCaroline Tice size = m_opaque_sp->GetAddressByteSize(); 355ceb6b139SCaroline Tice 356*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 357ceb6b139SCaroline Tice if (log) 35893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size); 359ceb6b139SCaroline Tice 360ceb6b139SCaroline Tice return size; 36130fdc8d8SChris Lattner } 36230fdc8d8SChris Lattner 36330fdc8d8SChris Lattner SBError 36430fdc8d8SChris Lattner SBProcess::Continue () 36530fdc8d8SChris Lattner { 366*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 367*4838131bSGreg Clayton if (log) 368*4838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get()); 369ceb6b139SCaroline Tice 37030fdc8d8SChris Lattner SBError sb_error; 37130fdc8d8SChris Lattner if (IsValid()) 3725d5028b5SGreg Clayton { 3735d5028b5SGreg Clayton Error error (m_opaque_sp->Resume()); 3745d5028b5SGreg Clayton if (error.Success()) 3755d5028b5SGreg Clayton { 3765d5028b5SGreg Clayton if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 377*4838131bSGreg Clayton { 378*4838131bSGreg Clayton if (log) 379*4838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get()); 3805d5028b5SGreg Clayton m_opaque_sp->WaitForProcessToStop (NULL); 3815d5028b5SGreg Clayton } 382*4838131bSGreg Clayton } 3835d5028b5SGreg Clayton sb_error.SetError(error); 3845d5028b5SGreg Clayton } 38530fdc8d8SChris Lattner else 38630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 38730fdc8d8SChris Lattner 388ceb6b139SCaroline Tice if (log) 389ceb6b139SCaroline Tice { 390ceb6b139SCaroline Tice SBStream sstr; 391ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 39293aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData()); 393ceb6b139SCaroline Tice } 394ceb6b139SCaroline Tice 39530fdc8d8SChris Lattner return sb_error; 39630fdc8d8SChris Lattner } 39730fdc8d8SChris Lattner 39830fdc8d8SChris Lattner 39930fdc8d8SChris Lattner SBError 40030fdc8d8SChris Lattner SBProcess::Destroy () 40130fdc8d8SChris Lattner { 40230fdc8d8SChris Lattner SBError sb_error; 4036611103cSGreg Clayton if (m_opaque_sp) 4046611103cSGreg Clayton sb_error.SetError(m_opaque_sp->Destroy()); 40530fdc8d8SChris Lattner else 40630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 40730fdc8d8SChris Lattner 408*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 409*4838131bSGreg Clayton if (log) 410*4838131bSGreg Clayton { 411*4838131bSGreg Clayton SBStream sstr; 412*4838131bSGreg Clayton sb_error.GetDescription (sstr); 413*4838131bSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData()); 414*4838131bSGreg Clayton } 415*4838131bSGreg Clayton 41630fdc8d8SChris Lattner return sb_error; 41730fdc8d8SChris Lattner } 41830fdc8d8SChris Lattner 41930fdc8d8SChris Lattner 42030fdc8d8SChris Lattner SBError 42130fdc8d8SChris Lattner SBProcess::Stop () 42230fdc8d8SChris Lattner { 423ceb6b139SCaroline Tice 42430fdc8d8SChris Lattner SBError sb_error; 42530fdc8d8SChris Lattner if (IsValid()) 4266611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Halt()); 42730fdc8d8SChris Lattner else 42830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 429ceb6b139SCaroline Tice 43020ad3c40SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 431ceb6b139SCaroline Tice if (log) 432ceb6b139SCaroline Tice { 433ceb6b139SCaroline Tice SBStream sstr; 434ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 43593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 43693aa84e8SGreg Clayton m_opaque_sp.get(), 43793aa84e8SGreg Clayton sb_error.get(), 438750cd175SCaroline Tice sstr.GetData()); 439ceb6b139SCaroline Tice } 440ceb6b139SCaroline Tice 44130fdc8d8SChris Lattner return sb_error; 44230fdc8d8SChris Lattner } 44330fdc8d8SChris Lattner 44430fdc8d8SChris Lattner SBError 44530fdc8d8SChris Lattner SBProcess::Kill () 44630fdc8d8SChris Lattner { 447ceb6b139SCaroline Tice 44830fdc8d8SChris Lattner SBError sb_error; 4496611103cSGreg Clayton if (m_opaque_sp) 4506611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Destroy()); 45130fdc8d8SChris Lattner else 45230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 453ceb6b139SCaroline Tice 45420ad3c40SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 455ceb6b139SCaroline Tice if (log) 456ceb6b139SCaroline Tice { 457ceb6b139SCaroline Tice SBStream sstr; 458ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 45993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 46093aa84e8SGreg Clayton m_opaque_sp.get(), 46193aa84e8SGreg Clayton sb_error.get(), 462750cd175SCaroline Tice sstr.GetData()); 463ceb6b139SCaroline Tice } 464ceb6b139SCaroline Tice 46530fdc8d8SChris Lattner return sb_error; 46630fdc8d8SChris Lattner } 46730fdc8d8SChris Lattner 46830fdc8d8SChris Lattner 46930fdc8d8SChris Lattner SBError 470*4838131bSGreg Clayton SBProcess::AttachByName (const char *name, bool wait_for_launch) // DEPRECATED 47130fdc8d8SChris Lattner { 47230fdc8d8SChris Lattner SBError sb_error; 4736611103cSGreg Clayton if (m_opaque_sp) 4746611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch)); 47530fdc8d8SChris Lattner else 47630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 47730fdc8d8SChris Lattner return sb_error; 47830fdc8d8SChris Lattner } 47930fdc8d8SChris Lattner 48030fdc8d8SChris Lattner lldb::pid_t 481*4838131bSGreg Clayton SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED 48230fdc8d8SChris Lattner { 48330fdc8d8SChris Lattner Attach (attach_pid); 48430fdc8d8SChris Lattner return GetProcessID(); 48530fdc8d8SChris Lattner } 48630fdc8d8SChris Lattner 48730fdc8d8SChris Lattner 48830fdc8d8SChris Lattner SBError 489*4838131bSGreg Clayton SBProcess::Attach (lldb::pid_t attach_pid) // DEPRECATED 49030fdc8d8SChris Lattner { 49130fdc8d8SChris Lattner SBError sb_error; 4926611103cSGreg Clayton if (m_opaque_sp) 4936611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Attach (attach_pid)); 49430fdc8d8SChris Lattner else 49530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 49630fdc8d8SChris Lattner return sb_error; 49730fdc8d8SChris Lattner } 49830fdc8d8SChris Lattner 49930fdc8d8SChris Lattner SBError 50030fdc8d8SChris Lattner SBProcess::Detach () 50130fdc8d8SChris Lattner { 50230fdc8d8SChris Lattner SBError sb_error; 5036611103cSGreg Clayton if (m_opaque_sp) 5046611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Detach()); 50530fdc8d8SChris Lattner else 50630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 50730fdc8d8SChris Lattner 50830fdc8d8SChris Lattner return sb_error; 50930fdc8d8SChris Lattner } 51030fdc8d8SChris Lattner 51130fdc8d8SChris Lattner SBError 512*4838131bSGreg Clayton SBProcess::Signal (int signo) 51330fdc8d8SChris Lattner { 51430fdc8d8SChris Lattner SBError sb_error; 5156611103cSGreg Clayton if (m_opaque_sp) 516*4838131bSGreg Clayton sb_error.SetError (m_opaque_sp->Signal (signo)); 51730fdc8d8SChris Lattner else 51830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 519*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 520*4838131bSGreg Clayton if (log) 521*4838131bSGreg Clayton { 522*4838131bSGreg Clayton SBStream sstr; 523*4838131bSGreg Clayton sb_error.GetDescription (sstr); 524*4838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 525*4838131bSGreg Clayton m_opaque_sp.get(), 526*4838131bSGreg Clayton signo, 527*4838131bSGreg Clayton sb_error.get(), 528*4838131bSGreg Clayton sstr.GetData()); 529*4838131bSGreg Clayton } 53030fdc8d8SChris Lattner return sb_error; 53130fdc8d8SChris Lattner } 53230fdc8d8SChris Lattner 53330fdc8d8SChris Lattner SBThread 534*4838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 53530fdc8d8SChris Lattner { 536*4838131bSGreg Clayton SBThread sb_thread; 5376611103cSGreg Clayton if (m_opaque_sp) 538*4838131bSGreg Clayton sb_thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) tid)); 539*4838131bSGreg Clayton 540*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 541*4838131bSGreg Clayton if (log) 542*4838131bSGreg Clayton { 543*4838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4x) => SBThread (%p)", 544*4838131bSGreg Clayton m_opaque_sp.get(), 545*4838131bSGreg Clayton tid, 546*4838131bSGreg Clayton sb_thread.get()); 547*4838131bSGreg Clayton } 548*4838131bSGreg Clayton 549*4838131bSGreg Clayton return sb_thread; 55030fdc8d8SChris Lattner } 55130fdc8d8SChris Lattner 55230fdc8d8SChris Lattner StateType 55330fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 55430fdc8d8SChris Lattner { 555ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 556ceb6b139SCaroline Tice 557ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 558ceb6b139SCaroline Tice 559ceb6b139SCaroline Tice if (log) 560750cd175SCaroline Tice log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => '%s'", event.get(), 561750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 562ceb6b139SCaroline Tice 563ceb6b139SCaroline Tice return ret_val; 56430fdc8d8SChris Lattner } 56530fdc8d8SChris Lattner 56630fdc8d8SChris Lattner bool 56730fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 56830fdc8d8SChris Lattner { 5696611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 57030fdc8d8SChris Lattner } 57130fdc8d8SChris Lattner 57230fdc8d8SChris Lattner SBProcess 57330fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 57430fdc8d8SChris Lattner { 5756611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 57630fdc8d8SChris Lattner return process; 57730fdc8d8SChris Lattner } 57830fdc8d8SChris Lattner 57930fdc8d8SChris Lattner 58030fdc8d8SChris Lattner SBBroadcaster 58130fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 58230fdc8d8SChris Lattner { 583ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 584ceb6b139SCaroline Tice 5856611103cSGreg Clayton SBBroadcaster broadcaster(m_opaque_sp.get(), false); 586ceb6b139SCaroline Tice 587ceb6b139SCaroline Tice if (log) 58893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(), 589750cd175SCaroline Tice broadcaster.get()); 590ceb6b139SCaroline Tice 59130fdc8d8SChris Lattner return broadcaster; 59230fdc8d8SChris Lattner } 59330fdc8d8SChris Lattner 59430fdc8d8SChris Lattner lldb_private::Process * 59530fdc8d8SChris Lattner SBProcess::operator->() const 59630fdc8d8SChris Lattner { 5976611103cSGreg Clayton return m_opaque_sp.get(); 59830fdc8d8SChris Lattner } 59930fdc8d8SChris Lattner 60030fdc8d8SChris Lattner size_t 60130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 60230fdc8d8SChris Lattner { 603ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 604ceb6b139SCaroline Tice 60530fdc8d8SChris Lattner size_t bytes_read = 0; 60630fdc8d8SChris Lattner 607*4838131bSGreg Clayton if (log) 608*4838131bSGreg Clayton { 609*4838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...", 610*4838131bSGreg Clayton m_opaque_sp.get(), 611*4838131bSGreg Clayton addr, 612*4838131bSGreg Clayton dst, 613*4838131bSGreg Clayton (uint32_t) dst_len, 614*4838131bSGreg Clayton sb_error.get()); 615*4838131bSGreg Clayton } 616*4838131bSGreg Clayton 61730fdc8d8SChris Lattner if (IsValid()) 61830fdc8d8SChris Lattner { 61930fdc8d8SChris Lattner Error error; 6206611103cSGreg Clayton bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error); 62130fdc8d8SChris Lattner sb_error.SetError (error); 62230fdc8d8SChris Lattner } 62330fdc8d8SChris Lattner else 62430fdc8d8SChris Lattner { 62530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 62630fdc8d8SChris Lattner } 62730fdc8d8SChris Lattner 628ceb6b139SCaroline Tice if (log) 62993aa84e8SGreg Clayton { 63093aa84e8SGreg Clayton SBStream sstr; 63193aa84e8SGreg Clayton sb_error.GetDescription (sstr); 632*4838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %d", 63393aa84e8SGreg Clayton m_opaque_sp.get(), 63493aa84e8SGreg Clayton addr, 63593aa84e8SGreg Clayton dst, 63693aa84e8SGreg Clayton (uint32_t) dst_len, 63793aa84e8SGreg Clayton sb_error.get(), 63893aa84e8SGreg Clayton sstr.GetData(), 63993aa84e8SGreg Clayton (uint32_t) bytes_read); 64093aa84e8SGreg Clayton } 641ceb6b139SCaroline Tice 64230fdc8d8SChris Lattner return bytes_read; 64330fdc8d8SChris Lattner } 64430fdc8d8SChris Lattner 64530fdc8d8SChris Lattner size_t 64630fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 64730fdc8d8SChris Lattner { 64830fdc8d8SChris Lattner size_t bytes_written = 0; 64930fdc8d8SChris Lattner 650*4838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 651*4838131bSGreg Clayton if (log) 652*4838131bSGreg Clayton { 653*4838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...", 654*4838131bSGreg Clayton m_opaque_sp.get(), 655*4838131bSGreg Clayton addr, 656*4838131bSGreg Clayton src, 657*4838131bSGreg Clayton (uint32_t) src_len, 658*4838131bSGreg Clayton sb_error.get()); 659*4838131bSGreg Clayton } 660*4838131bSGreg Clayton 66130fdc8d8SChris Lattner if (IsValid()) 66230fdc8d8SChris Lattner { 66330fdc8d8SChris Lattner Error error; 6646611103cSGreg Clayton bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error); 66530fdc8d8SChris Lattner sb_error.SetError (error); 66630fdc8d8SChris Lattner } 66730fdc8d8SChris Lattner 668*4838131bSGreg Clayton if (log) 669*4838131bSGreg Clayton { 670*4838131bSGreg Clayton SBStream sstr; 671*4838131bSGreg Clayton sb_error.GetDescription (sstr); 672*4838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %d", 673*4838131bSGreg Clayton m_opaque_sp.get(), 674*4838131bSGreg Clayton addr, 675*4838131bSGreg Clayton src, 676*4838131bSGreg Clayton (uint32_t) src_len, 677*4838131bSGreg Clayton sb_error.get(), 678*4838131bSGreg Clayton sstr.GetData(), 679*4838131bSGreg Clayton (uint32_t) bytes_written); 680*4838131bSGreg Clayton } 681*4838131bSGreg Clayton 68230fdc8d8SChris Lattner return bytes_written; 68330fdc8d8SChris Lattner } 68430fdc8d8SChris Lattner 68530fdc8d8SChris Lattner // Mimic shared pointer... 68630fdc8d8SChris Lattner lldb_private::Process * 68730fdc8d8SChris Lattner SBProcess::get() const 68830fdc8d8SChris Lattner { 6896611103cSGreg Clayton return m_opaque_sp.get(); 69030fdc8d8SChris Lattner } 69130fdc8d8SChris Lattner 692dde9cff3SCaroline Tice bool 693dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 694dde9cff3SCaroline Tice { 695dde9cff3SCaroline Tice if (m_opaque_sp) 696dde9cff3SCaroline Tice { 697dde9cff3SCaroline Tice char path[PATH_MAX]; 698dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 6991d273166SGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get(); 7001d273166SGreg Clayton const char *exe_name = NULL; 7011d273166SGreg Clayton if (exe_module) 7021d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 7031d273166SGreg Clayton 70405faeb71SGreg Clayton description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s", 7051d273166SGreg Clayton m_opaque_sp->GetID(), 706ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 7071d273166SGreg Clayton GetNumThreads(), 70805faeb71SGreg Clayton exe_name ? ", executable = " : "", 7091d273166SGreg Clayton exe_name ? exe_name : ""); 710dde9cff3SCaroline Tice } 711dde9cff3SCaroline Tice else 712dde9cff3SCaroline Tice description.Printf ("No value"); 713dde9cff3SCaroline Tice 714dde9cff3SCaroline Tice return true; 715dde9cff3SCaroline Tice } 716