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 { 56*750cd175SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 57ceb6b139SCaroline Tice 58ceb6b139SCaroline Tice if (log) 59*750cd175SCaroline Tice log->Printf ("SBProcess::SBProcess (rhs.sp=%p) => this.sp = %p", rhs.m_opaque_sp.get(), m_opaque_sp.get()); 6030fdc8d8SChris Lattner } 6130fdc8d8SChris Lattner 6230fdc8d8SChris Lattner 6330fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 646611103cSGreg Clayton m_opaque_sp (process_sp) 6530fdc8d8SChris Lattner { 66*750cd175SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 67ceb6b139SCaroline Tice 68ceb6b139SCaroline Tice if (log) 69*750cd175SCaroline Tice log->Printf ("SBProcess::SBProcess (process_sp=%p) => this.sp = %p", process_sp.get(), m_opaque_sp.get()); 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner 7230fdc8d8SChris Lattner //---------------------------------------------------------------------- 7330fdc8d8SChris Lattner // Destructor 7430fdc8d8SChris Lattner //---------------------------------------------------------------------- 7530fdc8d8SChris Lattner SBProcess::~SBProcess() 7630fdc8d8SChris Lattner { 7730fdc8d8SChris Lattner } 7830fdc8d8SChris Lattner 7930fdc8d8SChris Lattner void 8030fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp) 8130fdc8d8SChris Lattner { 826611103cSGreg Clayton m_opaque_sp = process_sp; 8330fdc8d8SChris Lattner } 8430fdc8d8SChris Lattner 8530fdc8d8SChris Lattner void 8630fdc8d8SChris Lattner SBProcess::Clear () 8730fdc8d8SChris Lattner { 886611103cSGreg Clayton m_opaque_sp.reset(); 8930fdc8d8SChris Lattner } 9030fdc8d8SChris Lattner 9130fdc8d8SChris Lattner 9230fdc8d8SChris Lattner bool 9330fdc8d8SChris Lattner SBProcess::IsValid() const 9430fdc8d8SChris Lattner { 956611103cSGreg Clayton return m_opaque_sp.get() != NULL; 9630fdc8d8SChris Lattner } 9730fdc8d8SChris Lattner 9830fdc8d8SChris Lattner 9930fdc8d8SChris Lattner uint32_t 10030fdc8d8SChris Lattner SBProcess::GetNumThreads () 10130fdc8d8SChris Lattner { 102ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 103ceb6b139SCaroline Tice 104*750cd175SCaroline Tice //if (log) 105*750cd175SCaroline Tice // log->Printf ("SBProcess::GetNumThreads ()"); 106ceb6b139SCaroline Tice 107ceb6b139SCaroline Tice uint32_t num_threads = 0; 1086611103cSGreg Clayton if (m_opaque_sp) 10930fdc8d8SChris Lattner { 11030fdc8d8SChris Lattner const bool can_update = true; 111ceb6b139SCaroline Tice num_threads = m_opaque_sp->GetThreadList().GetSize(can_update); 11230fdc8d8SChris Lattner } 113ceb6b139SCaroline Tice 114ceb6b139SCaroline Tice if (log) 115*750cd175SCaroline Tice log->Printf ("SBProcess::GetNumThreads (this.sp=%p) => %d", m_opaque_sp.get(), num_threads); 116ceb6b139SCaroline Tice 117ceb6b139SCaroline Tice return num_threads; 11830fdc8d8SChris Lattner } 11930fdc8d8SChris Lattner 12030fdc8d8SChris Lattner SBThread 1212976d00aSJim Ingham SBProcess::GetSelectedThread () const 12230fdc8d8SChris Lattner { 123ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 124ceb6b139SCaroline Tice 125*750cd175SCaroline Tice //if (log) 126*750cd175SCaroline Tice // log->Printf ("SBProcess::GetSelectedThread ()"); 127ceb6b139SCaroline Tice 12830fdc8d8SChris Lattner SBThread sb_thread; 1296611103cSGreg Clayton if (m_opaque_sp) 1302976d00aSJim Ingham sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread()); 131ceb6b139SCaroline Tice 132ceb6b139SCaroline Tice if (log) 133ceb6b139SCaroline Tice { 134ceb6b139SCaroline Tice SBStream sstr; 135ceb6b139SCaroline Tice sb_thread.GetDescription (sstr); 136*750cd175SCaroline Tice log->Printf ("SBProcess::GetSelectedThread (this.sp=%p) => SBThread : this = %p, '%s'", m_opaque_sp.get(), 137*750cd175SCaroline Tice &sb_thread, sstr.GetData()); 138ceb6b139SCaroline Tice } 139ceb6b139SCaroline Tice 14030fdc8d8SChris Lattner return sb_thread; 14130fdc8d8SChris Lattner } 14230fdc8d8SChris Lattner 14330fdc8d8SChris Lattner SBTarget 14430fdc8d8SChris Lattner SBProcess::GetTarget() const 14530fdc8d8SChris Lattner { 146ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 147ceb6b139SCaroline Tice 148*750cd175SCaroline Tice //if (log) 149*750cd175SCaroline Tice // log->Printf ("SBProcess::GetTarget ()"); 150ceb6b139SCaroline Tice 15130fdc8d8SChris Lattner SBTarget sb_target; 1526611103cSGreg Clayton if (m_opaque_sp) 1536611103cSGreg Clayton sb_target = m_opaque_sp->GetTarget().GetSP(); 154ceb6b139SCaroline Tice 155ceb6b139SCaroline Tice if (log) 156*750cd175SCaroline Tice log->Printf ("SBProcess::GetTarget (this.sp=%p) => SBTarget (this.sp = %p)", m_opaque_sp.get(), 157ceb6b139SCaroline Tice sb_target.get()); 158ceb6b139SCaroline Tice 15930fdc8d8SChris Lattner return sb_target; 16030fdc8d8SChris Lattner } 16130fdc8d8SChris Lattner 16230fdc8d8SChris Lattner 16330fdc8d8SChris Lattner size_t 16430fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 16530fdc8d8SChris Lattner { 166ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 167ceb6b139SCaroline Tice 168*750cd175SCaroline Tice //if (log) 169*750cd175SCaroline Tice // log->Printf ("SBProcess::PutSTDIN (%s, %d)", src, src_len); 170ceb6b139SCaroline Tice 171ceb6b139SCaroline Tice size_t ret_val = 0; 1726611103cSGreg Clayton if (m_opaque_sp != NULL) 17330fdc8d8SChris Lattner { 17430fdc8d8SChris Lattner Error error; 175ceb6b139SCaroline Tice ret_val = m_opaque_sp->PutSTDIN (src, src_len, error); 17630fdc8d8SChris Lattner } 177ceb6b139SCaroline Tice 178ceb6b139SCaroline Tice if (log) 179*750cd175SCaroline Tice log->Printf ("SBProcess::PutSTDIN (this.sp=%p, src='%s', src_len=%d) => %d", m_opaque_sp.get(), src, 180*750cd175SCaroline Tice (uint32_t) src_len, ret_val); 181ceb6b139SCaroline Tice 182ceb6b139SCaroline Tice return ret_val; 18330fdc8d8SChris Lattner } 18430fdc8d8SChris Lattner 18530fdc8d8SChris Lattner size_t 18630fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 18730fdc8d8SChris Lattner { 188ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 189ceb6b139SCaroline Tice 190*750cd175SCaroline Tice //if (log) 191*750cd175SCaroline Tice // log->Printf ("SBProcess::GetSTDOUT (char *dst, size_t dst_Len)"); 192ceb6b139SCaroline Tice 193ceb6b139SCaroline Tice size_t ret_val = 0; 1946611103cSGreg Clayton if (m_opaque_sp != NULL) 19530fdc8d8SChris Lattner { 19630fdc8d8SChris Lattner Error error; 197ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetSTDOUT (dst, dst_len, error); 19830fdc8d8SChris Lattner } 199ceb6b139SCaroline Tice 200ceb6b139SCaroline Tice if (log) 201*750cd175SCaroline Tice log->Printf ("SBProcess::GetSTDOUT (this.sp=%p, dst='%s', dst_len=%d) => %d", m_opaque_sp.get(), dst, 202*750cd175SCaroline Tice (uint32_t) dst_len, (uint32_t) ret_val); 203ceb6b139SCaroline Tice 204ceb6b139SCaroline Tice return ret_val; 20530fdc8d8SChris Lattner } 20630fdc8d8SChris Lattner 20730fdc8d8SChris Lattner size_t 20830fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 20930fdc8d8SChris Lattner { 210ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 211ceb6b139SCaroline Tice 212*750cd175SCaroline Tice //if (log) 213*750cd175SCaroline Tice // log->Printf ("SBProcess::GetSTDERR (char *dst, size_t dst_len)"); 214ceb6b139SCaroline Tice 215ceb6b139SCaroline Tice size_t ret_val = 0; 2166611103cSGreg Clayton if (m_opaque_sp != NULL) 21730fdc8d8SChris Lattner { 21830fdc8d8SChris Lattner Error error; 219ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetSTDERR (dst, dst_len, error); 22030fdc8d8SChris Lattner } 221ceb6b139SCaroline Tice 222ceb6b139SCaroline Tice if (log) 223*750cd175SCaroline Tice log->Printf ("SBProcess::GetSTDERR (this.sp=%p, dst='%s', dst_len=%d) => %d", m_opaque_sp.get(), dst, 224*750cd175SCaroline Tice (uint32_t) dst_len, (uint32_t) ret_val); 225ceb6b139SCaroline Tice 226ceb6b139SCaroline Tice return ret_val; 22730fdc8d8SChris Lattner } 22830fdc8d8SChris Lattner 22930fdc8d8SChris Lattner void 2302976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 23130fdc8d8SChris Lattner { 23230fdc8d8SChris Lattner if (out == NULL) 23330fdc8d8SChris Lattner return; 23430fdc8d8SChris Lattner 2356611103cSGreg Clayton if (m_opaque_sp != NULL) 23630fdc8d8SChris Lattner { 23730fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 23830fdc8d8SChris Lattner char message[1024]; 23930fdc8d8SChris Lattner int message_len = ::snprintf (message, 24030fdc8d8SChris Lattner sizeof (message), 24130fdc8d8SChris Lattner "Process %d %s\n", 2426611103cSGreg Clayton m_opaque_sp->GetID(), 24330fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 24430fdc8d8SChris Lattner 24530fdc8d8SChris Lattner if (message_len > 0) 24630fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 24730fdc8d8SChris Lattner } 24830fdc8d8SChris Lattner } 24930fdc8d8SChris Lattner 25030fdc8d8SChris Lattner void 2512976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 25230fdc8d8SChris Lattner { 2536611103cSGreg Clayton if (m_opaque_sp != NULL) 25430fdc8d8SChris Lattner { 25530fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 25630fdc8d8SChris Lattner char message[1024]; 25730fdc8d8SChris Lattner ::snprintf (message, 25830fdc8d8SChris Lattner sizeof (message), 25930fdc8d8SChris Lattner "Process %d %s\n", 2606611103cSGreg Clayton m_opaque_sp->GetID(), 26130fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 26230fdc8d8SChris Lattner 26330fdc8d8SChris Lattner result.AppendMessage (message); 26430fdc8d8SChris Lattner } 26530fdc8d8SChris Lattner } 26630fdc8d8SChris Lattner 26730fdc8d8SChris Lattner bool 2682976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 26930fdc8d8SChris Lattner { 2706611103cSGreg Clayton if (m_opaque_sp != NULL) 2712976d00aSJim Ingham return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 27230fdc8d8SChris Lattner return false; 27330fdc8d8SChris Lattner } 27430fdc8d8SChris Lattner 27530fdc8d8SChris Lattner bool 2762976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 27730fdc8d8SChris Lattner { 278ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 279ceb6b139SCaroline Tice 280*750cd175SCaroline Tice //if (log) 281*750cd175SCaroline Tice // log->Printf ("SBProcess::SetSelectedThreadByID (%d)", tid); 282ceb6b139SCaroline Tice 283ceb6b139SCaroline Tice bool ret_val = false; 2846611103cSGreg Clayton if (m_opaque_sp != NULL) 285ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid); 286ceb6b139SCaroline Tice 287ceb6b139SCaroline Tice if (log) 288*750cd175SCaroline Tice log->Printf ("SBProcess::SetSelectedThreadByID (this.sp=%p, tid=%d) => '%s'", m_opaque_sp.get(), 289*750cd175SCaroline Tice tid, (ret_val ? "true" : "false")); 290ceb6b139SCaroline Tice 291ceb6b139SCaroline Tice return ret_val; 29230fdc8d8SChris Lattner } 29330fdc8d8SChris Lattner 29430fdc8d8SChris Lattner SBThread 29530fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 29630fdc8d8SChris Lattner { 297ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 298ceb6b139SCaroline Tice 299*750cd175SCaroline Tice //if (log) 300*750cd175SCaroline Tice // log->Printf ("SBProcess::GetThreadAtIndex (%d)"); 301ceb6b139SCaroline Tice 30230fdc8d8SChris Lattner SBThread thread; 3036611103cSGreg Clayton if (m_opaque_sp) 3046611103cSGreg Clayton thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index)); 305ceb6b139SCaroline Tice 306ceb6b139SCaroline Tice if (log) 307ceb6b139SCaroline Tice { 308ceb6b139SCaroline Tice SBStream sstr; 309ceb6b139SCaroline Tice thread.GetDescription (sstr); 310*750cd175SCaroline Tice log->Printf ("SBProcess::GetThreadAtIndex (this.sp=%p, index=%d) => SBThread : this.sp = %p, '%s'", 311*750cd175SCaroline Tice m_opaque_sp.get(), (uint32_t) index, thread.GetLLDBObjectPtr(), sstr.GetData()); 312ceb6b139SCaroline Tice } 313ceb6b139SCaroline Tice 31430fdc8d8SChris Lattner return thread; 31530fdc8d8SChris Lattner } 31630fdc8d8SChris Lattner 31730fdc8d8SChris Lattner StateType 31830fdc8d8SChris Lattner SBProcess::GetState () 31930fdc8d8SChris Lattner { 320ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 321ceb6b139SCaroline Tice 322*750cd175SCaroline Tice //if (log) 323*750cd175SCaroline Tice // log->Printf ("SBProcess::GetState ()"); 324ceb6b139SCaroline Tice 325ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 3266611103cSGreg Clayton if (m_opaque_sp != NULL) 327ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetState(); 328ceb6b139SCaroline Tice 329ceb6b139SCaroline Tice if (log) 330*750cd175SCaroline Tice log->Printf ("SBProcess::GetState (this.sp=%p) => '%s'", m_opaque_sp.get(), 331*750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 332ceb6b139SCaroline Tice 333ceb6b139SCaroline Tice return ret_val; 33430fdc8d8SChris Lattner } 33530fdc8d8SChris Lattner 33630fdc8d8SChris Lattner 33730fdc8d8SChris Lattner int 33830fdc8d8SChris Lattner SBProcess::GetExitStatus () 33930fdc8d8SChris Lattner { 3406611103cSGreg Clayton if (m_opaque_sp != NULL) 3416611103cSGreg Clayton return m_opaque_sp->GetExitStatus (); 34230fdc8d8SChris Lattner else 34330fdc8d8SChris Lattner return 0; 34430fdc8d8SChris Lattner } 34530fdc8d8SChris Lattner 34630fdc8d8SChris Lattner const char * 34730fdc8d8SChris Lattner SBProcess::GetExitDescription () 34830fdc8d8SChris Lattner { 3496611103cSGreg Clayton if (m_opaque_sp != NULL) 3506611103cSGreg Clayton return m_opaque_sp->GetExitDescription (); 35130fdc8d8SChris Lattner else 35230fdc8d8SChris Lattner return NULL; 35330fdc8d8SChris Lattner } 35430fdc8d8SChris Lattner 35530fdc8d8SChris Lattner lldb::pid_t 35630fdc8d8SChris Lattner SBProcess::GetProcessID () 35730fdc8d8SChris Lattner { 358ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 359ceb6b139SCaroline Tice 360*750cd175SCaroline Tice //if (log) 361*750cd175SCaroline Tice // log->Printf ("SBProcess::GetProcessID ()"); 362ceb6b139SCaroline Tice 363ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 3646611103cSGreg Clayton if (m_opaque_sp) 365ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetID(); 366ceb6b139SCaroline Tice 367ceb6b139SCaroline Tice if (log) 368*750cd175SCaroline Tice log->Printf ("SBProcess::GetProcessID (this.sp=%p) => %d", m_opaque_sp.get(), ret_val); 369ceb6b139SCaroline Tice 370ceb6b139SCaroline Tice return ret_val; 37130fdc8d8SChris Lattner } 37230fdc8d8SChris Lattner 37330fdc8d8SChris Lattner uint32_t 37430fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 37530fdc8d8SChris Lattner { 376ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 377ceb6b139SCaroline Tice 378*750cd175SCaroline Tice //if (log) 379*750cd175SCaroline Tice // log->Printf ("SBProcess::GetAddressByteSize()"); 380ceb6b139SCaroline Tice 381ceb6b139SCaroline Tice uint32_t size = 0; 3826611103cSGreg Clayton if (m_opaque_sp) 383ceb6b139SCaroline Tice size = m_opaque_sp->GetAddressByteSize(); 384ceb6b139SCaroline Tice 385ceb6b139SCaroline Tice if (log) 386*750cd175SCaroline Tice log->Printf ("SBProcess::GetAddressByteSize (this.sp=%p) => %d", m_opaque_sp.get(), size); 387ceb6b139SCaroline Tice 388ceb6b139SCaroline Tice return size; 38930fdc8d8SChris Lattner } 39030fdc8d8SChris Lattner 39130fdc8d8SChris Lattner bool 39230fdc8d8SChris Lattner SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result) 39330fdc8d8SChris Lattner { 39430fdc8d8SChris Lattner bool state_changed = false; 39530fdc8d8SChris Lattner 39630fdc8d8SChris Lattner if (IsValid()) 39730fdc8d8SChris Lattner { 39830fdc8d8SChris Lattner EventSP event_sp; 3996611103cSGreg Clayton StateType state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp); 40030fdc8d8SChris Lattner 40130fdc8d8SChris Lattner while (StateIsStoppedState (state)) 40230fdc8d8SChris Lattner { 4036611103cSGreg Clayton state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp); 40430fdc8d8SChris Lattner SBEvent event (event_sp); 4052976d00aSJim Ingham AppendEventStateReport (event, result); 40630fdc8d8SChris Lattner state_changed = true; 40730fdc8d8SChris Lattner } 40830fdc8d8SChris Lattner } 40930fdc8d8SChris Lattner return state_changed; 41030fdc8d8SChris Lattner } 41130fdc8d8SChris Lattner 41230fdc8d8SChris Lattner SBError 41330fdc8d8SChris Lattner SBProcess::Continue () 41430fdc8d8SChris Lattner { 415ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 416ceb6b139SCaroline Tice 417*750cd175SCaroline Tice //if (log) 418*750cd175SCaroline Tice // log->Printf ("SBProcess::Continue ()"); 419ceb6b139SCaroline Tice 42030fdc8d8SChris Lattner SBError sb_error; 42130fdc8d8SChris Lattner if (IsValid()) 4225d5028b5SGreg Clayton { 4235d5028b5SGreg Clayton Error error (m_opaque_sp->Resume()); 4245d5028b5SGreg Clayton if (error.Success()) 4255d5028b5SGreg Clayton { 4265d5028b5SGreg Clayton if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 4275d5028b5SGreg Clayton m_opaque_sp->WaitForProcessToStop (NULL); 4285d5028b5SGreg Clayton } 4295d5028b5SGreg Clayton sb_error.SetError(error); 4305d5028b5SGreg Clayton } 43130fdc8d8SChris Lattner else 43230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 43330fdc8d8SChris Lattner 434ceb6b139SCaroline Tice if (log) 435ceb6b139SCaroline Tice { 436ceb6b139SCaroline Tice SBStream sstr; 437ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 438*750cd175SCaroline Tice log->Printf ("SBProcess::Continue (this.sp=%p) => SBError (this.ap = %p, '%s')", m_opaque_sp.get(), 439*750cd175SCaroline Tice sb_error.get(), sstr.GetData()); 440ceb6b139SCaroline Tice } 441ceb6b139SCaroline Tice 44230fdc8d8SChris Lattner return sb_error; 44330fdc8d8SChris Lattner } 44430fdc8d8SChris Lattner 44530fdc8d8SChris Lattner 44630fdc8d8SChris Lattner SBError 44730fdc8d8SChris Lattner SBProcess::Destroy () 44830fdc8d8SChris Lattner { 44930fdc8d8SChris Lattner SBError sb_error; 4506611103cSGreg Clayton if (m_opaque_sp) 4516611103cSGreg Clayton sb_error.SetError(m_opaque_sp->Destroy()); 45230fdc8d8SChris Lattner else 45330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 45430fdc8d8SChris Lattner 45530fdc8d8SChris Lattner return sb_error; 45630fdc8d8SChris Lattner } 45730fdc8d8SChris Lattner 45830fdc8d8SChris Lattner 45930fdc8d8SChris Lattner SBError 46030fdc8d8SChris Lattner SBProcess::Stop () 46130fdc8d8SChris Lattner { 462ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 463ceb6b139SCaroline Tice 464*750cd175SCaroline Tice //if (log) 465*750cd175SCaroline Tice // log->Printf ("SBProcess::Stop ()"); 466ceb6b139SCaroline Tice 46730fdc8d8SChris Lattner SBError sb_error; 46830fdc8d8SChris Lattner if (IsValid()) 4696611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Halt()); 47030fdc8d8SChris Lattner else 47130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 472ceb6b139SCaroline Tice 473ceb6b139SCaroline Tice if (log) 474ceb6b139SCaroline Tice { 475ceb6b139SCaroline Tice SBStream sstr; 476ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 477*750cd175SCaroline Tice log->Printf ("SBProcess::Stop (this.sp=%p) => SBError (this.ap = %p, '%s')", m_opaque_sp.get(), sb_error.get(), 478*750cd175SCaroline Tice sstr.GetData()); 479ceb6b139SCaroline Tice } 480ceb6b139SCaroline Tice 48130fdc8d8SChris Lattner return sb_error; 48230fdc8d8SChris Lattner } 48330fdc8d8SChris Lattner 48430fdc8d8SChris Lattner SBError 48530fdc8d8SChris Lattner SBProcess::Kill () 48630fdc8d8SChris Lattner { 487ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 488ceb6b139SCaroline Tice 489*750cd175SCaroline Tice //if (log) 490*750cd175SCaroline Tice // log->Printf ("SBProcess::Kill ()"); 491ceb6b139SCaroline Tice 49230fdc8d8SChris Lattner SBError sb_error; 4936611103cSGreg Clayton if (m_opaque_sp) 4946611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Destroy()); 49530fdc8d8SChris Lattner else 49630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 497ceb6b139SCaroline Tice 498ceb6b139SCaroline Tice if (log) 499ceb6b139SCaroline Tice { 500ceb6b139SCaroline Tice SBStream sstr; 501ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 502*750cd175SCaroline Tice log->Printf ("SBProcess::Kill (this.sp=%p) => SBError (this.ap = %p,'%s')", m_opaque_sp.get(), sb_error.get(), 503*750cd175SCaroline Tice sstr.GetData()); 504ceb6b139SCaroline Tice } 505ceb6b139SCaroline Tice 50630fdc8d8SChris Lattner return sb_error; 50730fdc8d8SChris Lattner } 50830fdc8d8SChris Lattner 50930fdc8d8SChris Lattner 51030fdc8d8SChris Lattner SBError 51130fdc8d8SChris Lattner SBProcess::AttachByName (const char *name, bool wait_for_launch) 51230fdc8d8SChris Lattner { 51330fdc8d8SChris Lattner SBError sb_error; 5146611103cSGreg Clayton if (m_opaque_sp) 5156611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch)); 51630fdc8d8SChris Lattner else 51730fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 51830fdc8d8SChris Lattner return sb_error; 51930fdc8d8SChris Lattner } 52030fdc8d8SChris Lattner 52130fdc8d8SChris Lattner lldb::pid_t 52230fdc8d8SChris Lattner SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t) 52330fdc8d8SChris Lattner { 52430fdc8d8SChris Lattner Attach (attach_pid); 52530fdc8d8SChris Lattner return GetProcessID(); 52630fdc8d8SChris Lattner } 52730fdc8d8SChris Lattner 52830fdc8d8SChris Lattner 52930fdc8d8SChris Lattner SBError 53030fdc8d8SChris Lattner SBProcess::Attach (lldb::pid_t attach_pid) 53130fdc8d8SChris Lattner { 53230fdc8d8SChris Lattner SBError sb_error; 5336611103cSGreg Clayton if (m_opaque_sp) 5346611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Attach (attach_pid)); 53530fdc8d8SChris Lattner else 53630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 53730fdc8d8SChris Lattner return sb_error; 53830fdc8d8SChris Lattner } 53930fdc8d8SChris Lattner 54030fdc8d8SChris Lattner SBError 54130fdc8d8SChris Lattner SBProcess::Detach () 54230fdc8d8SChris Lattner { 54330fdc8d8SChris Lattner SBError sb_error; 5446611103cSGreg Clayton if (m_opaque_sp) 5456611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Detach()); 54630fdc8d8SChris Lattner else 54730fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 54830fdc8d8SChris Lattner 54930fdc8d8SChris Lattner return sb_error; 55030fdc8d8SChris Lattner } 55130fdc8d8SChris Lattner 55230fdc8d8SChris Lattner SBError 55330fdc8d8SChris Lattner SBProcess::Signal (int signal) 55430fdc8d8SChris Lattner { 55530fdc8d8SChris Lattner SBError sb_error; 5566611103cSGreg Clayton if (m_opaque_sp) 5576611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Signal (signal)); 55830fdc8d8SChris Lattner else 55930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 56030fdc8d8SChris Lattner return sb_error; 56130fdc8d8SChris Lattner } 56230fdc8d8SChris Lattner 56330fdc8d8SChris Lattner SBThread 56430fdc8d8SChris Lattner SBProcess::GetThreadByID (tid_t sb_thread_id) 56530fdc8d8SChris Lattner { 56630fdc8d8SChris Lattner SBThread thread; 5676611103cSGreg Clayton if (m_opaque_sp) 5686611103cSGreg Clayton thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id)); 56930fdc8d8SChris Lattner return thread; 57030fdc8d8SChris Lattner } 57130fdc8d8SChris Lattner 57230fdc8d8SChris Lattner StateType 57330fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 57430fdc8d8SChris Lattner { 575ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 576ceb6b139SCaroline Tice 577*750cd175SCaroline Tice //if (log) 578*750cd175SCaroline Tice //{ 579*750cd175SCaroline Tice // SBStream sstr; 580*750cd175SCaroline Tice // event.GetDescription (sstr); 581*750cd175SCaroline Tice // log->Printf ("SBProcess::GetStateFromEvent (%s)", sstr.GetData()); 582*750cd175SCaroline Tice //} 583ceb6b139SCaroline Tice 584ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 585ceb6b139SCaroline Tice 586ceb6b139SCaroline Tice if (log) 587*750cd175SCaroline Tice log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => '%s'", event.get(), 588*750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 589ceb6b139SCaroline Tice 590ceb6b139SCaroline Tice return ret_val; 59130fdc8d8SChris Lattner } 59230fdc8d8SChris Lattner 59330fdc8d8SChris Lattner bool 59430fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 59530fdc8d8SChris Lattner { 5966611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 59730fdc8d8SChris Lattner } 59830fdc8d8SChris Lattner 59930fdc8d8SChris Lattner SBProcess 60030fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 60130fdc8d8SChris Lattner { 6026611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 60330fdc8d8SChris Lattner return process; 60430fdc8d8SChris Lattner } 60530fdc8d8SChris Lattner 60630fdc8d8SChris Lattner 60730fdc8d8SChris Lattner SBBroadcaster 60830fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 60930fdc8d8SChris Lattner { 610ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 611ceb6b139SCaroline Tice 612*750cd175SCaroline Tice //if (log) 613*750cd175SCaroline Tice // log->Printf ("SBProcess::GetBroadcaster ()"); 614*750cd175SCaroline Tice 6156611103cSGreg Clayton SBBroadcaster broadcaster(m_opaque_sp.get(), false); 616ceb6b139SCaroline Tice 617ceb6b139SCaroline Tice if (log) 618*750cd175SCaroline Tice log->Printf ("SBProcess::GetBroadcaster (this.sp=%p) => SBBroadcaster (this.obj = %p)", m_opaque_sp.get(), 619*750cd175SCaroline Tice broadcaster.get()); 620ceb6b139SCaroline Tice 62130fdc8d8SChris Lattner return broadcaster; 62230fdc8d8SChris Lattner } 62330fdc8d8SChris Lattner 62430fdc8d8SChris Lattner lldb_private::Process * 62530fdc8d8SChris Lattner SBProcess::operator->() const 62630fdc8d8SChris Lattner { 6276611103cSGreg Clayton return m_opaque_sp.get(); 62830fdc8d8SChris Lattner } 62930fdc8d8SChris Lattner 63030fdc8d8SChris Lattner size_t 63130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 63230fdc8d8SChris Lattner { 633ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 634ceb6b139SCaroline Tice 635*750cd175SCaroline Tice //if (log) 636*750cd175SCaroline Tice // log->Printf ("SBProcess::ReadMemory (%p, %p, %d, sb_error)", addr, dst, dst_len); 637ceb6b139SCaroline Tice 63830fdc8d8SChris Lattner size_t bytes_read = 0; 63930fdc8d8SChris Lattner 64030fdc8d8SChris Lattner if (IsValid()) 64130fdc8d8SChris Lattner { 64230fdc8d8SChris Lattner Error error; 6436611103cSGreg Clayton bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error); 64430fdc8d8SChris Lattner sb_error.SetError (error); 64530fdc8d8SChris Lattner } 64630fdc8d8SChris Lattner else 64730fdc8d8SChris Lattner { 64830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 64930fdc8d8SChris Lattner } 65030fdc8d8SChris Lattner 651ceb6b139SCaroline Tice if (log) 652*750cd175SCaroline Tice log->Printf ("SBProcess::ReadMemory (this.sp=%p, addr=%p, dst=%p, dst_len=%d, sb_error.ap=%p) => %d", 653*750cd175SCaroline Tice m_opaque_sp.get(), addr, dst, (uint32_t) dst_len, sb_error.get(), (uint32_t) bytes_read); 654ceb6b139SCaroline Tice 65530fdc8d8SChris Lattner return bytes_read; 65630fdc8d8SChris Lattner } 65730fdc8d8SChris Lattner 65830fdc8d8SChris Lattner size_t 65930fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 66030fdc8d8SChris Lattner { 66130fdc8d8SChris Lattner size_t bytes_written = 0; 66230fdc8d8SChris Lattner 66330fdc8d8SChris Lattner if (IsValid()) 66430fdc8d8SChris Lattner { 66530fdc8d8SChris Lattner Error error; 6666611103cSGreg Clayton bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error); 66730fdc8d8SChris Lattner sb_error.SetError (error); 66830fdc8d8SChris Lattner } 66930fdc8d8SChris Lattner 67030fdc8d8SChris Lattner return bytes_written; 67130fdc8d8SChris Lattner } 67230fdc8d8SChris Lattner 67330fdc8d8SChris Lattner // Mimic shared pointer... 67430fdc8d8SChris Lattner lldb_private::Process * 67530fdc8d8SChris Lattner SBProcess::get() const 67630fdc8d8SChris Lattner { 6776611103cSGreg Clayton return m_opaque_sp.get(); 67830fdc8d8SChris Lattner } 67930fdc8d8SChris Lattner 680dde9cff3SCaroline Tice bool 681dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 682dde9cff3SCaroline Tice { 683dde9cff3SCaroline Tice if (m_opaque_sp) 684dde9cff3SCaroline Tice { 685dde9cff3SCaroline Tice char path[PATH_MAX]; 686dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 6871d273166SGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get(); 6881d273166SGreg Clayton const char *exe_name = NULL; 6891d273166SGreg Clayton if (exe_module) 6901d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 6911d273166SGreg Clayton 69205faeb71SGreg Clayton description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s", 6931d273166SGreg Clayton m_opaque_sp->GetID(), 694ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 6951d273166SGreg Clayton GetNumThreads(), 69605faeb71SGreg Clayton exe_name ? ", executable = " : "", 6971d273166SGreg Clayton exe_name ? exe_name : ""); 698dde9cff3SCaroline Tice } 699dde9cff3SCaroline Tice else 700dde9cff3SCaroline Tice description.Printf ("No value"); 701dde9cff3SCaroline Tice 702dde9cff3SCaroline Tice return true; 703dde9cff3SCaroline Tice } 704