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 { 1204838131bSGreg 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) 155*cfd1acedSGreg 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 { 167*cfd1acedSGreg Clayton size_t bytes_read = 0; 1686611103cSGreg Clayton if (m_opaque_sp != NULL) 16930fdc8d8SChris Lattner { 17030fdc8d8SChris Lattner Error error; 171*cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDOUT (dst, dst_len, error); 17230fdc8d8SChris Lattner } 173ceb6b139SCaroline Tice 174*cfd1acedSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 175ceb6b139SCaroline Tice if (log) 176*cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu", 177*cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 178ceb6b139SCaroline Tice 179*cfd1acedSGreg Clayton return bytes_read; 18030fdc8d8SChris Lattner } 18130fdc8d8SChris Lattner 18230fdc8d8SChris Lattner size_t 18330fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 18430fdc8d8SChris Lattner { 185*cfd1acedSGreg Clayton size_t bytes_read = 0; 1866611103cSGreg Clayton if (m_opaque_sp != NULL) 18730fdc8d8SChris Lattner { 18830fdc8d8SChris Lattner Error error; 189*cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDERR (dst, dst_len, error); 19030fdc8d8SChris Lattner } 191ceb6b139SCaroline Tice 192*cfd1acedSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 193ceb6b139SCaroline Tice if (log) 194*cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu", 195*cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 196ceb6b139SCaroline Tice 197*cfd1acedSGreg Clayton return bytes_read; 19830fdc8d8SChris Lattner } 19930fdc8d8SChris Lattner 20030fdc8d8SChris Lattner void 2012976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 20230fdc8d8SChris Lattner { 20330fdc8d8SChris Lattner if (out == NULL) 20430fdc8d8SChris Lattner return; 20530fdc8d8SChris Lattner 2066611103cSGreg Clayton if (m_opaque_sp != NULL) 20730fdc8d8SChris Lattner { 20830fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 20930fdc8d8SChris Lattner char message[1024]; 21030fdc8d8SChris Lattner int message_len = ::snprintf (message, 21130fdc8d8SChris Lattner sizeof (message), 21230fdc8d8SChris Lattner "Process %d %s\n", 2136611103cSGreg Clayton m_opaque_sp->GetID(), 21430fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 21530fdc8d8SChris Lattner 21630fdc8d8SChris Lattner if (message_len > 0) 21730fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 21830fdc8d8SChris Lattner } 21930fdc8d8SChris Lattner } 22030fdc8d8SChris Lattner 22130fdc8d8SChris Lattner void 2222976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 22330fdc8d8SChris Lattner { 2246611103cSGreg Clayton if (m_opaque_sp != NULL) 22530fdc8d8SChris Lattner { 22630fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 22730fdc8d8SChris Lattner char message[1024]; 22830fdc8d8SChris Lattner ::snprintf (message, 22930fdc8d8SChris Lattner sizeof (message), 23030fdc8d8SChris Lattner "Process %d %s\n", 2316611103cSGreg Clayton m_opaque_sp->GetID(), 23230fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 23330fdc8d8SChris Lattner 23430fdc8d8SChris Lattner result.AppendMessage (message); 23530fdc8d8SChris Lattner } 23630fdc8d8SChris Lattner } 23730fdc8d8SChris Lattner 23830fdc8d8SChris Lattner bool 2392976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 24030fdc8d8SChris Lattner { 2416611103cSGreg Clayton if (m_opaque_sp != NULL) 2422976d00aSJim Ingham return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 24330fdc8d8SChris Lattner return false; 24430fdc8d8SChris Lattner } 24530fdc8d8SChris Lattner 24630fdc8d8SChris Lattner bool 2472976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 24830fdc8d8SChris Lattner { 249ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 250ceb6b139SCaroline Tice 251ceb6b139SCaroline Tice bool ret_val = false; 2526611103cSGreg Clayton if (m_opaque_sp != NULL) 253ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid); 254ceb6b139SCaroline Tice 255ceb6b139SCaroline Tice if (log) 256*cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s", 25793aa84e8SGreg Clayton m_opaque_sp.get(), tid, (ret_val ? "true" : "false")); 258ceb6b139SCaroline Tice 259ceb6b139SCaroline Tice return ret_val; 26030fdc8d8SChris Lattner } 26130fdc8d8SChris Lattner 26230fdc8d8SChris Lattner SBThread 26330fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 26430fdc8d8SChris Lattner { 265ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 266ceb6b139SCaroline Tice 26730fdc8d8SChris Lattner SBThread thread; 2686611103cSGreg Clayton if (m_opaque_sp) 2696611103cSGreg Clayton thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index)); 270ceb6b139SCaroline Tice 271ceb6b139SCaroline Tice if (log) 272ceb6b139SCaroline Tice { 27393aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 2744838131bSGreg Clayton m_opaque_sp.get(), (uint32_t) index, thread.get()); 275ceb6b139SCaroline Tice } 276ceb6b139SCaroline Tice 27730fdc8d8SChris Lattner return thread; 27830fdc8d8SChris Lattner } 27930fdc8d8SChris Lattner 28030fdc8d8SChris Lattner StateType 28130fdc8d8SChris Lattner SBProcess::GetState () 28230fdc8d8SChris Lattner { 283ceb6b139SCaroline Tice 284ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 2856611103cSGreg Clayton if (m_opaque_sp != NULL) 286ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetState(); 287ceb6b139SCaroline Tice 2884838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 289ceb6b139SCaroline Tice if (log) 290*cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 29193aa84e8SGreg Clayton m_opaque_sp.get(), 292750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 293ceb6b139SCaroline Tice 294ceb6b139SCaroline Tice return ret_val; 29530fdc8d8SChris Lattner } 29630fdc8d8SChris Lattner 29730fdc8d8SChris Lattner 29830fdc8d8SChris Lattner int 29930fdc8d8SChris Lattner SBProcess::GetExitStatus () 30030fdc8d8SChris Lattner { 3014838131bSGreg Clayton int exit_status = 0; 3024838131bSGreg Clayton if (m_opaque_sp) 3034838131bSGreg Clayton exit_status = m_opaque_sp->GetExitStatus (); 3044838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 3054838131bSGreg Clayton if (log) 3064838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 3074838131bSGreg Clayton m_opaque_sp.get(), exit_status, exit_status); 3084838131bSGreg Clayton 3094838131bSGreg Clayton return exit_status; 31030fdc8d8SChris Lattner } 31130fdc8d8SChris Lattner 31230fdc8d8SChris Lattner const char * 31330fdc8d8SChris Lattner SBProcess::GetExitDescription () 31430fdc8d8SChris Lattner { 3154838131bSGreg Clayton const char *exit_desc = NULL; 3166611103cSGreg Clayton if (m_opaque_sp != NULL) 3174838131bSGreg Clayton exit_desc = m_opaque_sp->GetExitDescription (); 3184838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 3194838131bSGreg Clayton if (log) 3204838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 3214838131bSGreg Clayton m_opaque_sp.get(), exit_desc); 3224838131bSGreg Clayton return exit_desc; 32330fdc8d8SChris Lattner } 32430fdc8d8SChris Lattner 32530fdc8d8SChris Lattner lldb::pid_t 32630fdc8d8SChris Lattner SBProcess::GetProcessID () 32730fdc8d8SChris Lattner { 328ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 3296611103cSGreg Clayton if (m_opaque_sp) 330ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetID(); 331ceb6b139SCaroline Tice 3324838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 333ceb6b139SCaroline Tice if (log) 33493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %d", m_opaque_sp.get(), ret_val); 335ceb6b139SCaroline Tice 336ceb6b139SCaroline Tice return ret_val; 33730fdc8d8SChris Lattner } 33830fdc8d8SChris Lattner 33930fdc8d8SChris Lattner uint32_t 34030fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 34130fdc8d8SChris Lattner { 342ceb6b139SCaroline Tice uint32_t size = 0; 3436611103cSGreg Clayton if (m_opaque_sp) 344ceb6b139SCaroline Tice size = m_opaque_sp->GetAddressByteSize(); 345ceb6b139SCaroline Tice 3464838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 347ceb6b139SCaroline Tice if (log) 34893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size); 349ceb6b139SCaroline Tice 350ceb6b139SCaroline Tice return size; 35130fdc8d8SChris Lattner } 35230fdc8d8SChris Lattner 35330fdc8d8SChris Lattner SBError 35430fdc8d8SChris Lattner SBProcess::Continue () 35530fdc8d8SChris Lattner { 3564838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 3574838131bSGreg Clayton if (log) 3584838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get()); 359ceb6b139SCaroline Tice 36030fdc8d8SChris Lattner SBError sb_error; 36130fdc8d8SChris Lattner if (IsValid()) 3625d5028b5SGreg Clayton { 3635d5028b5SGreg Clayton Error error (m_opaque_sp->Resume()); 3645d5028b5SGreg Clayton if (error.Success()) 3655d5028b5SGreg Clayton { 3665d5028b5SGreg Clayton if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 3674838131bSGreg Clayton { 3684838131bSGreg Clayton if (log) 3694838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get()); 3705d5028b5SGreg Clayton m_opaque_sp->WaitForProcessToStop (NULL); 3715d5028b5SGreg Clayton } 3724838131bSGreg Clayton } 3735d5028b5SGreg Clayton sb_error.SetError(error); 3745d5028b5SGreg Clayton } 37530fdc8d8SChris Lattner else 37630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 37730fdc8d8SChris Lattner 378ceb6b139SCaroline Tice if (log) 379ceb6b139SCaroline Tice { 380ceb6b139SCaroline Tice SBStream sstr; 381ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 38293aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData()); 383ceb6b139SCaroline Tice } 384ceb6b139SCaroline Tice 38530fdc8d8SChris Lattner return sb_error; 38630fdc8d8SChris Lattner } 38730fdc8d8SChris Lattner 38830fdc8d8SChris Lattner 38930fdc8d8SChris Lattner SBError 39030fdc8d8SChris Lattner SBProcess::Destroy () 39130fdc8d8SChris Lattner { 39230fdc8d8SChris Lattner SBError sb_error; 3936611103cSGreg Clayton if (m_opaque_sp) 3946611103cSGreg Clayton sb_error.SetError(m_opaque_sp->Destroy()); 39530fdc8d8SChris Lattner else 39630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 39730fdc8d8SChris Lattner 3984838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 3994838131bSGreg Clayton if (log) 4004838131bSGreg Clayton { 4014838131bSGreg Clayton SBStream sstr; 4024838131bSGreg Clayton sb_error.GetDescription (sstr); 4034838131bSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData()); 4044838131bSGreg Clayton } 4054838131bSGreg Clayton 40630fdc8d8SChris Lattner return sb_error; 40730fdc8d8SChris Lattner } 40830fdc8d8SChris Lattner 40930fdc8d8SChris Lattner 41030fdc8d8SChris Lattner SBError 41130fdc8d8SChris Lattner SBProcess::Stop () 41230fdc8d8SChris Lattner { 413ceb6b139SCaroline Tice 41430fdc8d8SChris Lattner SBError sb_error; 41530fdc8d8SChris Lattner if (IsValid()) 4166611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Halt()); 41730fdc8d8SChris Lattner else 41830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 419ceb6b139SCaroline Tice 42020ad3c40SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 421ceb6b139SCaroline Tice if (log) 422ceb6b139SCaroline Tice { 423ceb6b139SCaroline Tice SBStream sstr; 424ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 42593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 42693aa84e8SGreg Clayton m_opaque_sp.get(), 42793aa84e8SGreg Clayton sb_error.get(), 428750cd175SCaroline Tice sstr.GetData()); 429ceb6b139SCaroline Tice } 430ceb6b139SCaroline Tice 43130fdc8d8SChris Lattner return sb_error; 43230fdc8d8SChris Lattner } 43330fdc8d8SChris Lattner 43430fdc8d8SChris Lattner SBError 43530fdc8d8SChris Lattner SBProcess::Kill () 43630fdc8d8SChris Lattner { 437ceb6b139SCaroline Tice 43830fdc8d8SChris Lattner SBError sb_error; 4396611103cSGreg Clayton if (m_opaque_sp) 4406611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Destroy()); 44130fdc8d8SChris Lattner else 44230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 443ceb6b139SCaroline Tice 44420ad3c40SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 445ceb6b139SCaroline Tice if (log) 446ceb6b139SCaroline Tice { 447ceb6b139SCaroline Tice SBStream sstr; 448ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 44993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 45093aa84e8SGreg Clayton m_opaque_sp.get(), 45193aa84e8SGreg Clayton sb_error.get(), 452750cd175SCaroline Tice sstr.GetData()); 453ceb6b139SCaroline Tice } 454ceb6b139SCaroline Tice 45530fdc8d8SChris Lattner return sb_error; 45630fdc8d8SChris Lattner } 45730fdc8d8SChris Lattner 45830fdc8d8SChris Lattner 45930fdc8d8SChris Lattner SBError 4604838131bSGreg Clayton SBProcess::AttachByName (const char *name, bool wait_for_launch) // DEPRECATED 46130fdc8d8SChris Lattner { 46230fdc8d8SChris Lattner SBError sb_error; 4636611103cSGreg Clayton if (m_opaque_sp) 4646611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch)); 46530fdc8d8SChris Lattner else 46630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 46730fdc8d8SChris Lattner return sb_error; 46830fdc8d8SChris Lattner } 46930fdc8d8SChris Lattner 47030fdc8d8SChris Lattner lldb::pid_t 4714838131bSGreg Clayton SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED 47230fdc8d8SChris Lattner { 47330fdc8d8SChris Lattner Attach (attach_pid); 47430fdc8d8SChris Lattner return GetProcessID(); 47530fdc8d8SChris Lattner } 47630fdc8d8SChris Lattner 47730fdc8d8SChris Lattner 47830fdc8d8SChris Lattner SBError 4794838131bSGreg Clayton SBProcess::Attach (lldb::pid_t attach_pid) // DEPRECATED 48030fdc8d8SChris Lattner { 48130fdc8d8SChris Lattner SBError sb_error; 4826611103cSGreg Clayton if (m_opaque_sp) 4836611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Attach (attach_pid)); 48430fdc8d8SChris Lattner else 48530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 48630fdc8d8SChris Lattner return sb_error; 48730fdc8d8SChris Lattner } 48830fdc8d8SChris Lattner 48930fdc8d8SChris Lattner SBError 49030fdc8d8SChris Lattner SBProcess::Detach () 49130fdc8d8SChris Lattner { 49230fdc8d8SChris Lattner SBError sb_error; 4936611103cSGreg Clayton if (m_opaque_sp) 4946611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Detach()); 49530fdc8d8SChris Lattner else 49630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 49730fdc8d8SChris Lattner 49830fdc8d8SChris Lattner return sb_error; 49930fdc8d8SChris Lattner } 50030fdc8d8SChris Lattner 50130fdc8d8SChris Lattner SBError 5024838131bSGreg Clayton SBProcess::Signal (int signo) 50330fdc8d8SChris Lattner { 50430fdc8d8SChris Lattner SBError sb_error; 5056611103cSGreg Clayton if (m_opaque_sp) 5064838131bSGreg Clayton sb_error.SetError (m_opaque_sp->Signal (signo)); 50730fdc8d8SChris Lattner else 50830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 5094838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 5104838131bSGreg Clayton if (log) 5114838131bSGreg Clayton { 5124838131bSGreg Clayton SBStream sstr; 5134838131bSGreg Clayton sb_error.GetDescription (sstr); 5144838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 5154838131bSGreg Clayton m_opaque_sp.get(), 5164838131bSGreg Clayton signo, 5174838131bSGreg Clayton sb_error.get(), 5184838131bSGreg Clayton sstr.GetData()); 5194838131bSGreg Clayton } 52030fdc8d8SChris Lattner return sb_error; 52130fdc8d8SChris Lattner } 52230fdc8d8SChris Lattner 52330fdc8d8SChris Lattner SBThread 5244838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 52530fdc8d8SChris Lattner { 5264838131bSGreg Clayton SBThread sb_thread; 5276611103cSGreg Clayton if (m_opaque_sp) 5284838131bSGreg Clayton sb_thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) tid)); 5294838131bSGreg Clayton 5304838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 5314838131bSGreg Clayton if (log) 5324838131bSGreg Clayton { 5334838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4x) => SBThread (%p)", 5344838131bSGreg Clayton m_opaque_sp.get(), 5354838131bSGreg Clayton tid, 5364838131bSGreg Clayton sb_thread.get()); 5374838131bSGreg Clayton } 5384838131bSGreg Clayton 5394838131bSGreg Clayton return sb_thread; 54030fdc8d8SChris Lattner } 54130fdc8d8SChris Lattner 54230fdc8d8SChris Lattner StateType 54330fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 54430fdc8d8SChris Lattner { 545ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 546ceb6b139SCaroline Tice 547ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 548ceb6b139SCaroline Tice 549ceb6b139SCaroline Tice if (log) 550*cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 551750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 552ceb6b139SCaroline Tice 553ceb6b139SCaroline Tice return ret_val; 55430fdc8d8SChris Lattner } 55530fdc8d8SChris Lattner 55630fdc8d8SChris Lattner bool 55730fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 55830fdc8d8SChris Lattner { 5596611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 56030fdc8d8SChris Lattner } 56130fdc8d8SChris Lattner 56230fdc8d8SChris Lattner SBProcess 56330fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 56430fdc8d8SChris Lattner { 5656611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 56630fdc8d8SChris Lattner return process; 56730fdc8d8SChris Lattner } 56830fdc8d8SChris Lattner 56930fdc8d8SChris Lattner 57030fdc8d8SChris Lattner SBBroadcaster 57130fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 57230fdc8d8SChris Lattner { 573ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 574ceb6b139SCaroline Tice 5756611103cSGreg Clayton SBBroadcaster broadcaster(m_opaque_sp.get(), false); 576ceb6b139SCaroline Tice 577ceb6b139SCaroline Tice if (log) 57893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(), 579750cd175SCaroline Tice broadcaster.get()); 580ceb6b139SCaroline Tice 58130fdc8d8SChris Lattner return broadcaster; 58230fdc8d8SChris Lattner } 58330fdc8d8SChris Lattner 58430fdc8d8SChris Lattner lldb_private::Process * 58530fdc8d8SChris Lattner SBProcess::operator->() const 58630fdc8d8SChris Lattner { 5876611103cSGreg Clayton return m_opaque_sp.get(); 58830fdc8d8SChris Lattner } 58930fdc8d8SChris Lattner 59030fdc8d8SChris Lattner size_t 59130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 59230fdc8d8SChris Lattner { 593ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 594ceb6b139SCaroline Tice 59530fdc8d8SChris Lattner size_t bytes_read = 0; 59630fdc8d8SChris Lattner 5974838131bSGreg Clayton if (log) 5984838131bSGreg Clayton { 5994838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...", 6004838131bSGreg Clayton m_opaque_sp.get(), 6014838131bSGreg Clayton addr, 6024838131bSGreg Clayton dst, 6034838131bSGreg Clayton (uint32_t) dst_len, 6044838131bSGreg Clayton sb_error.get()); 6054838131bSGreg Clayton } 6064838131bSGreg Clayton 60730fdc8d8SChris Lattner if (IsValid()) 60830fdc8d8SChris Lattner { 60930fdc8d8SChris Lattner Error error; 6106611103cSGreg Clayton bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error); 61130fdc8d8SChris Lattner sb_error.SetError (error); 61230fdc8d8SChris Lattner } 61330fdc8d8SChris Lattner else 61430fdc8d8SChris Lattner { 61530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 61630fdc8d8SChris Lattner } 61730fdc8d8SChris Lattner 618ceb6b139SCaroline Tice if (log) 61993aa84e8SGreg Clayton { 62093aa84e8SGreg Clayton SBStream sstr; 62193aa84e8SGreg Clayton sb_error.GetDescription (sstr); 6224838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %d", 62393aa84e8SGreg Clayton m_opaque_sp.get(), 62493aa84e8SGreg Clayton addr, 62593aa84e8SGreg Clayton dst, 62693aa84e8SGreg Clayton (uint32_t) dst_len, 62793aa84e8SGreg Clayton sb_error.get(), 62893aa84e8SGreg Clayton sstr.GetData(), 62993aa84e8SGreg Clayton (uint32_t) bytes_read); 63093aa84e8SGreg Clayton } 631ceb6b139SCaroline Tice 63230fdc8d8SChris Lattner return bytes_read; 63330fdc8d8SChris Lattner } 63430fdc8d8SChris Lattner 63530fdc8d8SChris Lattner size_t 63630fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 63730fdc8d8SChris Lattner { 63830fdc8d8SChris Lattner size_t bytes_written = 0; 63930fdc8d8SChris Lattner 6404838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 6414838131bSGreg Clayton if (log) 6424838131bSGreg Clayton { 6434838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...", 6444838131bSGreg Clayton m_opaque_sp.get(), 6454838131bSGreg Clayton addr, 6464838131bSGreg Clayton src, 6474838131bSGreg Clayton (uint32_t) src_len, 6484838131bSGreg Clayton sb_error.get()); 6494838131bSGreg Clayton } 6504838131bSGreg Clayton 65130fdc8d8SChris Lattner if (IsValid()) 65230fdc8d8SChris Lattner { 65330fdc8d8SChris Lattner Error error; 6546611103cSGreg Clayton bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error); 65530fdc8d8SChris Lattner sb_error.SetError (error); 65630fdc8d8SChris Lattner } 65730fdc8d8SChris Lattner 6584838131bSGreg Clayton if (log) 6594838131bSGreg Clayton { 6604838131bSGreg Clayton SBStream sstr; 6614838131bSGreg Clayton sb_error.GetDescription (sstr); 6624838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %d", 6634838131bSGreg Clayton m_opaque_sp.get(), 6644838131bSGreg Clayton addr, 6654838131bSGreg Clayton src, 6664838131bSGreg Clayton (uint32_t) src_len, 6674838131bSGreg Clayton sb_error.get(), 6684838131bSGreg Clayton sstr.GetData(), 6694838131bSGreg Clayton (uint32_t) bytes_written); 6704838131bSGreg Clayton } 6714838131bSGreg Clayton 67230fdc8d8SChris Lattner return bytes_written; 67330fdc8d8SChris Lattner } 67430fdc8d8SChris Lattner 67530fdc8d8SChris Lattner // Mimic shared pointer... 67630fdc8d8SChris Lattner lldb_private::Process * 67730fdc8d8SChris Lattner SBProcess::get() const 67830fdc8d8SChris Lattner { 6796611103cSGreg Clayton return m_opaque_sp.get(); 68030fdc8d8SChris Lattner } 68130fdc8d8SChris Lattner 682dde9cff3SCaroline Tice bool 683dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 684dde9cff3SCaroline Tice { 685dde9cff3SCaroline Tice if (m_opaque_sp) 686dde9cff3SCaroline Tice { 687dde9cff3SCaroline Tice char path[PATH_MAX]; 688dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 6891d273166SGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get(); 6901d273166SGreg Clayton const char *exe_name = NULL; 6911d273166SGreg Clayton if (exe_module) 6921d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 6931d273166SGreg Clayton 69405faeb71SGreg Clayton description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s", 6951d273166SGreg Clayton m_opaque_sp->GetID(), 696ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 6971d273166SGreg Clayton GetNumThreads(), 69805faeb71SGreg Clayton exe_name ? ", executable = " : "", 6991d273166SGreg Clayton exe_name ? exe_name : ""); 700dde9cff3SCaroline Tice } 701dde9cff3SCaroline Tice else 702dde9cff3SCaroline Tice description.Printf ("No value"); 703dde9cff3SCaroline Tice 704dde9cff3SCaroline Tice return true; 705dde9cff3SCaroline Tice } 706