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" 19*ceb6b139SCaroline 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 { 46*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE); 47*ceb6b139SCaroline Tice 48*ceb6b139SCaroline Tice if (log) 49*ceb6b139SCaroline Tice log->Printf ("SBProcess::SBProcess () ==> this = %p", this); 5030fdc8d8SChris Lattner } 5130fdc8d8SChris Lattner 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner //---------------------------------------------------------------------- 5430fdc8d8SChris Lattner // SBProcess constructor 5530fdc8d8SChris Lattner //---------------------------------------------------------------------- 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 586611103cSGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 5930fdc8d8SChris Lattner { 60*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE); 61*ceb6b139SCaroline Tice 62*ceb6b139SCaroline Tice if (log) 63*ceb6b139SCaroline Tice log->Printf ("SBProcess::SBProcess (const SBProcess &rhs) rhs.m_opaque_sp.get() = %p ==> this = %p", 64*ceb6b139SCaroline Tice rhs.m_opaque_sp.get(), this); 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner 6730fdc8d8SChris Lattner 6830fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 696611103cSGreg Clayton m_opaque_sp (process_sp) 7030fdc8d8SChris Lattner { 71*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE); 72*ceb6b139SCaroline Tice 73*ceb6b139SCaroline Tice if (log) 74*ceb6b139SCaroline Tice log->Printf ("SBProcess::SBProcess (const lldb::ProcessSP &process_sp) process_sp.get() = %p ==> this = %p", 75*ceb6b139SCaroline Tice process_sp.get(), this); 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 7830fdc8d8SChris Lattner //---------------------------------------------------------------------- 7930fdc8d8SChris Lattner // Destructor 8030fdc8d8SChris Lattner //---------------------------------------------------------------------- 8130fdc8d8SChris Lattner SBProcess::~SBProcess() 8230fdc8d8SChris Lattner { 8330fdc8d8SChris Lattner } 8430fdc8d8SChris Lattner 8530fdc8d8SChris Lattner void 8630fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp) 8730fdc8d8SChris Lattner { 886611103cSGreg Clayton m_opaque_sp = process_sp; 8930fdc8d8SChris Lattner } 9030fdc8d8SChris Lattner 9130fdc8d8SChris Lattner void 9230fdc8d8SChris Lattner SBProcess::Clear () 9330fdc8d8SChris Lattner { 946611103cSGreg Clayton m_opaque_sp.reset(); 9530fdc8d8SChris Lattner } 9630fdc8d8SChris Lattner 9730fdc8d8SChris Lattner 9830fdc8d8SChris Lattner bool 9930fdc8d8SChris Lattner SBProcess::IsValid() const 10030fdc8d8SChris Lattner { 1016611103cSGreg Clayton return m_opaque_sp.get() != NULL; 10230fdc8d8SChris Lattner } 10330fdc8d8SChris Lattner 10430fdc8d8SChris Lattner 10530fdc8d8SChris Lattner uint32_t 10630fdc8d8SChris Lattner SBProcess::GetNumThreads () 10730fdc8d8SChris Lattner { 108*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 109*ceb6b139SCaroline Tice 110*ceb6b139SCaroline Tice if (log) 111*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetNumThreads ()"); 112*ceb6b139SCaroline Tice 113*ceb6b139SCaroline Tice uint32_t num_threads = 0; 1146611103cSGreg Clayton if (m_opaque_sp) 11530fdc8d8SChris Lattner { 11630fdc8d8SChris Lattner const bool can_update = true; 117*ceb6b139SCaroline Tice num_threads = m_opaque_sp->GetThreadList().GetSize(can_update); 11830fdc8d8SChris Lattner } 119*ceb6b139SCaroline Tice 120*ceb6b139SCaroline Tice if (log) 121*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetNumThreads ==> %d", num_threads); 122*ceb6b139SCaroline Tice 123*ceb6b139SCaroline Tice return num_threads; 12430fdc8d8SChris Lattner } 12530fdc8d8SChris Lattner 12630fdc8d8SChris Lattner SBThread 1272976d00aSJim Ingham SBProcess::GetSelectedThread () const 12830fdc8d8SChris Lattner { 129*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 130*ceb6b139SCaroline Tice 131*ceb6b139SCaroline Tice if (log) 132*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetSelectedThread ()"); 133*ceb6b139SCaroline Tice 13430fdc8d8SChris Lattner SBThread sb_thread; 1356611103cSGreg Clayton if (m_opaque_sp) 1362976d00aSJim Ingham sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread()); 137*ceb6b139SCaroline Tice 138*ceb6b139SCaroline Tice if (log) 139*ceb6b139SCaroline Tice { 140*ceb6b139SCaroline Tice SBStream sstr; 141*ceb6b139SCaroline Tice sb_thread.GetDescription (sstr); 142*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetSelectedThread ==> SBThread (this = %p, '%s')", &sb_thread, sstr.GetData()); 143*ceb6b139SCaroline Tice } 144*ceb6b139SCaroline Tice 14530fdc8d8SChris Lattner return sb_thread; 14630fdc8d8SChris Lattner } 14730fdc8d8SChris Lattner 14830fdc8d8SChris Lattner SBTarget 14930fdc8d8SChris Lattner SBProcess::GetTarget() const 15030fdc8d8SChris Lattner { 151*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 152*ceb6b139SCaroline Tice 153*ceb6b139SCaroline Tice if (log) 154*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetTarget ()"); 155*ceb6b139SCaroline Tice 15630fdc8d8SChris Lattner SBTarget sb_target; 1576611103cSGreg Clayton if (m_opaque_sp) 1586611103cSGreg Clayton sb_target = m_opaque_sp->GetTarget().GetSP(); 159*ceb6b139SCaroline Tice 160*ceb6b139SCaroline Tice if (log) 161*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetTarget ==> SBTarget (this = %p, m_opaque_sp.get())", &sb_target, 162*ceb6b139SCaroline Tice sb_target.get()); 163*ceb6b139SCaroline Tice 16430fdc8d8SChris Lattner return sb_target; 16530fdc8d8SChris Lattner } 16630fdc8d8SChris Lattner 16730fdc8d8SChris Lattner 16830fdc8d8SChris Lattner size_t 16930fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 17030fdc8d8SChris Lattner { 171*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 172*ceb6b139SCaroline Tice 173*ceb6b139SCaroline Tice if (log) 174*ceb6b139SCaroline Tice log->Printf ("SBProcess::PutSTDIN (%s, %d)", src, src_len); 175*ceb6b139SCaroline Tice 176*ceb6b139SCaroline Tice size_t ret_val = 0; 1776611103cSGreg Clayton if (m_opaque_sp != NULL) 17830fdc8d8SChris Lattner { 17930fdc8d8SChris Lattner Error error; 180*ceb6b139SCaroline Tice ret_val = m_opaque_sp->PutSTDIN (src, src_len, error); 18130fdc8d8SChris Lattner } 182*ceb6b139SCaroline Tice 183*ceb6b139SCaroline Tice if (log) 184*ceb6b139SCaroline Tice log->Printf ("SBProcess::PutSTDIN ==> %d", ret_val); 185*ceb6b139SCaroline Tice 186*ceb6b139SCaroline Tice return ret_val; 18730fdc8d8SChris Lattner } 18830fdc8d8SChris Lattner 18930fdc8d8SChris Lattner size_t 19030fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 19130fdc8d8SChris Lattner { 192*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 193*ceb6b139SCaroline Tice 194*ceb6b139SCaroline Tice if (log) 195*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetSTDOUT (char *dst, size_t dst_Len)"); 196*ceb6b139SCaroline Tice 197*ceb6b139SCaroline Tice size_t ret_val = 0; 1986611103cSGreg Clayton if (m_opaque_sp != NULL) 19930fdc8d8SChris Lattner { 20030fdc8d8SChris Lattner Error error; 201*ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetSTDOUT (dst, dst_len, error); 20230fdc8d8SChris Lattner } 203*ceb6b139SCaroline Tice 204*ceb6b139SCaroline Tice if (log) 205*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetSTDOUT ==> %d", ret_val); 206*ceb6b139SCaroline Tice 207*ceb6b139SCaroline Tice return ret_val; 20830fdc8d8SChris Lattner } 20930fdc8d8SChris Lattner 21030fdc8d8SChris Lattner size_t 21130fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 21230fdc8d8SChris Lattner { 213*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 214*ceb6b139SCaroline Tice 215*ceb6b139SCaroline Tice if (log) 216*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetSTDERR (char *dst, size_t dst_len)"); 217*ceb6b139SCaroline Tice 218*ceb6b139SCaroline Tice size_t ret_val = 0; 2196611103cSGreg Clayton if (m_opaque_sp != NULL) 22030fdc8d8SChris Lattner { 22130fdc8d8SChris Lattner Error error; 222*ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetSTDERR (dst, dst_len, error); 22330fdc8d8SChris Lattner } 224*ceb6b139SCaroline Tice 225*ceb6b139SCaroline Tice if (log) 226*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetSTDERR ==> %d", ret_val); 227*ceb6b139SCaroline Tice 228*ceb6b139SCaroline Tice return ret_val; 22930fdc8d8SChris Lattner } 23030fdc8d8SChris Lattner 23130fdc8d8SChris Lattner void 2322976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 23330fdc8d8SChris Lattner { 23430fdc8d8SChris Lattner if (out == NULL) 23530fdc8d8SChris Lattner return; 23630fdc8d8SChris Lattner 2376611103cSGreg Clayton if (m_opaque_sp != NULL) 23830fdc8d8SChris Lattner { 23930fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 24030fdc8d8SChris Lattner char message[1024]; 24130fdc8d8SChris Lattner int message_len = ::snprintf (message, 24230fdc8d8SChris Lattner sizeof (message), 24330fdc8d8SChris Lattner "Process %d %s\n", 2446611103cSGreg Clayton m_opaque_sp->GetID(), 24530fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 24630fdc8d8SChris Lattner 24730fdc8d8SChris Lattner if (message_len > 0) 24830fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 24930fdc8d8SChris Lattner } 25030fdc8d8SChris Lattner } 25130fdc8d8SChris Lattner 25230fdc8d8SChris Lattner void 2532976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 25430fdc8d8SChris Lattner { 2556611103cSGreg Clayton if (m_opaque_sp != NULL) 25630fdc8d8SChris Lattner { 25730fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 25830fdc8d8SChris Lattner char message[1024]; 25930fdc8d8SChris Lattner ::snprintf (message, 26030fdc8d8SChris Lattner sizeof (message), 26130fdc8d8SChris Lattner "Process %d %s\n", 2626611103cSGreg Clayton m_opaque_sp->GetID(), 26330fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 26430fdc8d8SChris Lattner 26530fdc8d8SChris Lattner result.AppendMessage (message); 26630fdc8d8SChris Lattner } 26730fdc8d8SChris Lattner } 26830fdc8d8SChris Lattner 26930fdc8d8SChris Lattner bool 2702976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 27130fdc8d8SChris Lattner { 2726611103cSGreg Clayton if (m_opaque_sp != NULL) 2732976d00aSJim Ingham return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 27430fdc8d8SChris Lattner return false; 27530fdc8d8SChris Lattner } 27630fdc8d8SChris Lattner 27730fdc8d8SChris Lattner bool 2782976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 27930fdc8d8SChris Lattner { 280*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 281*ceb6b139SCaroline Tice 282*ceb6b139SCaroline Tice if (log) 283*ceb6b139SCaroline Tice log->Printf ("SBProcess::SetSelectedThreadByID (%d)", tid); 284*ceb6b139SCaroline Tice 285*ceb6b139SCaroline Tice bool ret_val = false; 2866611103cSGreg Clayton if (m_opaque_sp != NULL) 287*ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid); 288*ceb6b139SCaroline Tice 289*ceb6b139SCaroline Tice if (log) 290*ceb6b139SCaroline Tice log->Printf ("SBProcess::SetSelectedThreadByID ==> %s", (ret_val ? "true" : "false")); 291*ceb6b139SCaroline Tice 292*ceb6b139SCaroline Tice return ret_val; 29330fdc8d8SChris Lattner } 29430fdc8d8SChris Lattner 29530fdc8d8SChris Lattner SBThread 29630fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 29730fdc8d8SChris Lattner { 298*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 299*ceb6b139SCaroline Tice 300*ceb6b139SCaroline Tice if (log) 301*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetThreadAtIndex (%d)"); 302*ceb6b139SCaroline Tice 30330fdc8d8SChris Lattner SBThread thread; 3046611103cSGreg Clayton if (m_opaque_sp) 3056611103cSGreg Clayton thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index)); 306*ceb6b139SCaroline Tice 307*ceb6b139SCaroline Tice if (log) 308*ceb6b139SCaroline Tice { 309*ceb6b139SCaroline Tice SBStream sstr; 310*ceb6b139SCaroline Tice thread.GetDescription (sstr); 311*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetThreadAtIndex ==> SBThread (this = %p, '%s')", &thread, sstr.GetData()); 312*ceb6b139SCaroline Tice } 313*ceb6b139SCaroline Tice 31430fdc8d8SChris Lattner return thread; 31530fdc8d8SChris Lattner } 31630fdc8d8SChris Lattner 31730fdc8d8SChris Lattner StateType 31830fdc8d8SChris Lattner SBProcess::GetState () 31930fdc8d8SChris Lattner { 320*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 321*ceb6b139SCaroline Tice 322*ceb6b139SCaroline Tice if (log) 323*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetState ()"); 324*ceb6b139SCaroline Tice 325*ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 3266611103cSGreg Clayton if (m_opaque_sp != NULL) 327*ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetState(); 328*ceb6b139SCaroline Tice 329*ceb6b139SCaroline Tice if (log) 330*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetState ==> %s", lldb_private::StateAsCString (ret_val)); 331*ceb6b139SCaroline Tice 332*ceb6b139SCaroline Tice return ret_val; 33330fdc8d8SChris Lattner } 33430fdc8d8SChris Lattner 33530fdc8d8SChris Lattner 33630fdc8d8SChris Lattner int 33730fdc8d8SChris Lattner SBProcess::GetExitStatus () 33830fdc8d8SChris Lattner { 3396611103cSGreg Clayton if (m_opaque_sp != NULL) 3406611103cSGreg Clayton return m_opaque_sp->GetExitStatus (); 34130fdc8d8SChris Lattner else 34230fdc8d8SChris Lattner return 0; 34330fdc8d8SChris Lattner } 34430fdc8d8SChris Lattner 34530fdc8d8SChris Lattner const char * 34630fdc8d8SChris Lattner SBProcess::GetExitDescription () 34730fdc8d8SChris Lattner { 3486611103cSGreg Clayton if (m_opaque_sp != NULL) 3496611103cSGreg Clayton return m_opaque_sp->GetExitDescription (); 35030fdc8d8SChris Lattner else 35130fdc8d8SChris Lattner return NULL; 35230fdc8d8SChris Lattner } 35330fdc8d8SChris Lattner 35430fdc8d8SChris Lattner lldb::pid_t 35530fdc8d8SChris Lattner SBProcess::GetProcessID () 35630fdc8d8SChris Lattner { 357*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 358*ceb6b139SCaroline Tice 359*ceb6b139SCaroline Tice if (log) 360*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetProcessID ()"); 361*ceb6b139SCaroline Tice 362*ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 3636611103cSGreg Clayton if (m_opaque_sp) 364*ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetID(); 365*ceb6b139SCaroline Tice 366*ceb6b139SCaroline Tice if (log) 367*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetProcessID ==> %d", ret_val); 368*ceb6b139SCaroline Tice 369*ceb6b139SCaroline Tice return ret_val; 37030fdc8d8SChris Lattner } 37130fdc8d8SChris Lattner 37230fdc8d8SChris Lattner uint32_t 37330fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 37430fdc8d8SChris Lattner { 375*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 376*ceb6b139SCaroline Tice 377*ceb6b139SCaroline Tice if (log) 378*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetAddressByteSize()"); 379*ceb6b139SCaroline Tice 380*ceb6b139SCaroline Tice uint32_t size = 0; 3816611103cSGreg Clayton if (m_opaque_sp) 382*ceb6b139SCaroline Tice size = m_opaque_sp->GetAddressByteSize(); 383*ceb6b139SCaroline Tice 384*ceb6b139SCaroline Tice if (log) 385*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetAddressByteSize ==> %d", size); 386*ceb6b139SCaroline Tice 387*ceb6b139SCaroline Tice return size; 38830fdc8d8SChris Lattner } 38930fdc8d8SChris Lattner 39030fdc8d8SChris Lattner bool 39130fdc8d8SChris Lattner SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result) 39230fdc8d8SChris Lattner { 39330fdc8d8SChris Lattner bool state_changed = false; 39430fdc8d8SChris Lattner 39530fdc8d8SChris Lattner if (IsValid()) 39630fdc8d8SChris Lattner { 39730fdc8d8SChris Lattner EventSP event_sp; 3986611103cSGreg Clayton StateType state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp); 39930fdc8d8SChris Lattner 40030fdc8d8SChris Lattner while (StateIsStoppedState (state)) 40130fdc8d8SChris Lattner { 4026611103cSGreg Clayton state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp); 40330fdc8d8SChris Lattner SBEvent event (event_sp); 4042976d00aSJim Ingham AppendEventStateReport (event, result); 40530fdc8d8SChris Lattner state_changed = true; 40630fdc8d8SChris Lattner } 40730fdc8d8SChris Lattner } 40830fdc8d8SChris Lattner return state_changed; 40930fdc8d8SChris Lattner } 41030fdc8d8SChris Lattner 41130fdc8d8SChris Lattner SBError 41230fdc8d8SChris Lattner SBProcess::Continue () 41330fdc8d8SChris Lattner { 414*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 415*ceb6b139SCaroline Tice 416*ceb6b139SCaroline Tice if (log) 417*ceb6b139SCaroline Tice log->Printf ("SBProcess::Continue ()"); 418*ceb6b139SCaroline Tice 41930fdc8d8SChris Lattner SBError sb_error; 42030fdc8d8SChris Lattner if (IsValid()) 4215d5028b5SGreg Clayton { 4225d5028b5SGreg Clayton Error error (m_opaque_sp->Resume()); 4235d5028b5SGreg Clayton if (error.Success()) 4245d5028b5SGreg Clayton { 4255d5028b5SGreg Clayton if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 4265d5028b5SGreg Clayton m_opaque_sp->WaitForProcessToStop (NULL); 4275d5028b5SGreg Clayton } 4285d5028b5SGreg Clayton sb_error.SetError(error); 4295d5028b5SGreg Clayton } 43030fdc8d8SChris Lattner else 43130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 43230fdc8d8SChris Lattner 433*ceb6b139SCaroline Tice if (log) 434*ceb6b139SCaroline Tice { 435*ceb6b139SCaroline Tice SBStream sstr; 436*ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 437*ceb6b139SCaroline Tice log->Printf ("SBProcess::Continue ==> SBError (this = %p, '%s')", &sb_error, sstr.GetData()); 438*ceb6b139SCaroline Tice } 439*ceb6b139SCaroline Tice 44030fdc8d8SChris Lattner return sb_error; 44130fdc8d8SChris Lattner } 44230fdc8d8SChris Lattner 44330fdc8d8SChris Lattner 44430fdc8d8SChris Lattner SBError 44530fdc8d8SChris Lattner SBProcess::Destroy () 44630fdc8d8SChris Lattner { 44730fdc8d8SChris Lattner SBError sb_error; 4486611103cSGreg Clayton if (m_opaque_sp) 4496611103cSGreg Clayton sb_error.SetError(m_opaque_sp->Destroy()); 45030fdc8d8SChris Lattner else 45130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 45230fdc8d8SChris Lattner 45330fdc8d8SChris Lattner return sb_error; 45430fdc8d8SChris Lattner } 45530fdc8d8SChris Lattner 45630fdc8d8SChris Lattner 45730fdc8d8SChris Lattner SBError 45830fdc8d8SChris Lattner SBProcess::Stop () 45930fdc8d8SChris Lattner { 460*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 461*ceb6b139SCaroline Tice 462*ceb6b139SCaroline Tice if (log) 463*ceb6b139SCaroline Tice log->Printf ("SBProcess::Stop ()"); 464*ceb6b139SCaroline Tice 46530fdc8d8SChris Lattner SBError sb_error; 46630fdc8d8SChris Lattner if (IsValid()) 4676611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Halt()); 46830fdc8d8SChris Lattner else 46930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 470*ceb6b139SCaroline Tice 471*ceb6b139SCaroline Tice if (log) 472*ceb6b139SCaroline Tice { 473*ceb6b139SCaroline Tice SBStream sstr; 474*ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 475*ceb6b139SCaroline Tice log->Printf ("SBProcess::Stop ==> SBError (this = %p, '%s')", &sb_error, sstr.GetData()); 476*ceb6b139SCaroline Tice } 477*ceb6b139SCaroline Tice 47830fdc8d8SChris Lattner return sb_error; 47930fdc8d8SChris Lattner } 48030fdc8d8SChris Lattner 48130fdc8d8SChris Lattner SBError 48230fdc8d8SChris Lattner SBProcess::Kill () 48330fdc8d8SChris Lattner { 484*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 485*ceb6b139SCaroline Tice 486*ceb6b139SCaroline Tice if (log) 487*ceb6b139SCaroline Tice log->Printf ("SBProcess::Kill ()"); 488*ceb6b139SCaroline Tice 48930fdc8d8SChris Lattner SBError sb_error; 4906611103cSGreg Clayton if (m_opaque_sp) 4916611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Destroy()); 49230fdc8d8SChris Lattner else 49330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 494*ceb6b139SCaroline Tice 495*ceb6b139SCaroline Tice if (log) 496*ceb6b139SCaroline Tice { 497*ceb6b139SCaroline Tice SBStream sstr; 498*ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 499*ceb6b139SCaroline Tice log->Printf ("SBProcess::Kill ==> SBError (this = %p,'%s')", &sb_error, sstr.GetData()); 500*ceb6b139SCaroline Tice } 501*ceb6b139SCaroline Tice 50230fdc8d8SChris Lattner return sb_error; 50330fdc8d8SChris Lattner } 50430fdc8d8SChris Lattner 50530fdc8d8SChris Lattner 50630fdc8d8SChris Lattner SBError 50730fdc8d8SChris Lattner SBProcess::AttachByName (const char *name, bool wait_for_launch) 50830fdc8d8SChris Lattner { 50930fdc8d8SChris Lattner SBError sb_error; 5106611103cSGreg Clayton if (m_opaque_sp) 5116611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch)); 51230fdc8d8SChris Lattner else 51330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 51430fdc8d8SChris Lattner return sb_error; 51530fdc8d8SChris Lattner } 51630fdc8d8SChris Lattner 51730fdc8d8SChris Lattner lldb::pid_t 51830fdc8d8SChris Lattner SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t) 51930fdc8d8SChris Lattner { 52030fdc8d8SChris Lattner Attach (attach_pid); 52130fdc8d8SChris Lattner return GetProcessID(); 52230fdc8d8SChris Lattner } 52330fdc8d8SChris Lattner 52430fdc8d8SChris Lattner 52530fdc8d8SChris Lattner SBError 52630fdc8d8SChris Lattner SBProcess::Attach (lldb::pid_t attach_pid) 52730fdc8d8SChris Lattner { 52830fdc8d8SChris Lattner SBError sb_error; 5296611103cSGreg Clayton if (m_opaque_sp) 5306611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Attach (attach_pid)); 53130fdc8d8SChris Lattner else 53230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 53330fdc8d8SChris Lattner return sb_error; 53430fdc8d8SChris Lattner } 53530fdc8d8SChris Lattner 53630fdc8d8SChris Lattner SBError 53730fdc8d8SChris Lattner SBProcess::Detach () 53830fdc8d8SChris Lattner { 53930fdc8d8SChris Lattner SBError sb_error; 5406611103cSGreg Clayton if (m_opaque_sp) 5416611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Detach()); 54230fdc8d8SChris Lattner else 54330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 54430fdc8d8SChris Lattner 54530fdc8d8SChris Lattner return sb_error; 54630fdc8d8SChris Lattner } 54730fdc8d8SChris Lattner 54830fdc8d8SChris Lattner SBError 54930fdc8d8SChris Lattner SBProcess::Signal (int signal) 55030fdc8d8SChris Lattner { 55130fdc8d8SChris Lattner SBError sb_error; 5526611103cSGreg Clayton if (m_opaque_sp) 5536611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Signal (signal)); 55430fdc8d8SChris Lattner else 55530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 55630fdc8d8SChris Lattner return sb_error; 55730fdc8d8SChris Lattner } 55830fdc8d8SChris Lattner 55930fdc8d8SChris Lattner SBThread 56030fdc8d8SChris Lattner SBProcess::GetThreadByID (tid_t sb_thread_id) 56130fdc8d8SChris Lattner { 56230fdc8d8SChris Lattner SBThread thread; 5636611103cSGreg Clayton if (m_opaque_sp) 5646611103cSGreg Clayton thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id)); 56530fdc8d8SChris Lattner return thread; 56630fdc8d8SChris Lattner } 56730fdc8d8SChris Lattner 56830fdc8d8SChris Lattner StateType 56930fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 57030fdc8d8SChris Lattner { 571*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 572*ceb6b139SCaroline Tice 573*ceb6b139SCaroline Tice if (log) 574*ceb6b139SCaroline Tice { 575*ceb6b139SCaroline Tice SBStream sstr; 576*ceb6b139SCaroline Tice event.GetDescription (sstr); 577*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetStateFromEvent (%s)", sstr.GetData()); 578*ceb6b139SCaroline Tice } 579*ceb6b139SCaroline Tice 580*ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 581*ceb6b139SCaroline Tice 582*ceb6b139SCaroline Tice if (log) 583*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetStateFromEvent ==> %s", lldb_private::StateAsCString (ret_val)); 584*ceb6b139SCaroline Tice 585*ceb6b139SCaroline Tice return ret_val; 58630fdc8d8SChris Lattner } 58730fdc8d8SChris Lattner 58830fdc8d8SChris Lattner bool 58930fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 59030fdc8d8SChris Lattner { 5916611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 59230fdc8d8SChris Lattner } 59330fdc8d8SChris Lattner 59430fdc8d8SChris Lattner SBProcess 59530fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 59630fdc8d8SChris Lattner { 5976611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 59830fdc8d8SChris Lattner return process; 59930fdc8d8SChris Lattner } 60030fdc8d8SChris Lattner 60130fdc8d8SChris Lattner 60230fdc8d8SChris Lattner SBBroadcaster 60330fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 60430fdc8d8SChris Lattner { 605*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 606*ceb6b139SCaroline Tice 607*ceb6b139SCaroline Tice if (log) 608*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetBroadcaster ()"); 6096611103cSGreg Clayton SBBroadcaster broadcaster(m_opaque_sp.get(), false); 610*ceb6b139SCaroline Tice 611*ceb6b139SCaroline Tice if (log) 612*ceb6b139SCaroline Tice log->Printf ("SBProcess::GetBroadcaster ==> SBBroadcaster (this = %p, m_opaque = %p)", &broadcaster, 613*ceb6b139SCaroline Tice m_opaque_sp.get()); 614*ceb6b139SCaroline Tice 61530fdc8d8SChris Lattner return broadcaster; 61630fdc8d8SChris Lattner } 61730fdc8d8SChris Lattner 61830fdc8d8SChris Lattner lldb_private::Process * 61930fdc8d8SChris Lattner SBProcess::operator->() const 62030fdc8d8SChris Lattner { 6216611103cSGreg Clayton return m_opaque_sp.get(); 62230fdc8d8SChris Lattner } 62330fdc8d8SChris Lattner 62430fdc8d8SChris Lattner size_t 62530fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 62630fdc8d8SChris Lattner { 627*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 628*ceb6b139SCaroline Tice 629*ceb6b139SCaroline Tice if (log) 630*ceb6b139SCaroline Tice log->Printf ("SBProcess::ReadMemory (%p, %p, %d, sb_error)", addr, dst, dst_len); 631*ceb6b139SCaroline Tice 63230fdc8d8SChris Lattner size_t bytes_read = 0; 63330fdc8d8SChris Lattner 63430fdc8d8SChris Lattner if (IsValid()) 63530fdc8d8SChris Lattner { 63630fdc8d8SChris Lattner Error error; 6376611103cSGreg Clayton bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error); 63830fdc8d8SChris Lattner sb_error.SetError (error); 63930fdc8d8SChris Lattner } 64030fdc8d8SChris Lattner else 64130fdc8d8SChris Lattner { 64230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 64330fdc8d8SChris Lattner } 64430fdc8d8SChris Lattner 645*ceb6b139SCaroline Tice if (log) 646*ceb6b139SCaroline Tice log->Printf ("SBProcess::ReadMemory ==> %d", bytes_read); 647*ceb6b139SCaroline Tice 64830fdc8d8SChris Lattner return bytes_read; 64930fdc8d8SChris Lattner } 65030fdc8d8SChris Lattner 65130fdc8d8SChris Lattner size_t 65230fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 65330fdc8d8SChris Lattner { 65430fdc8d8SChris Lattner size_t bytes_written = 0; 65530fdc8d8SChris Lattner 65630fdc8d8SChris Lattner if (IsValid()) 65730fdc8d8SChris Lattner { 65830fdc8d8SChris Lattner Error error; 6596611103cSGreg Clayton bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error); 66030fdc8d8SChris Lattner sb_error.SetError (error); 66130fdc8d8SChris Lattner } 66230fdc8d8SChris Lattner 66330fdc8d8SChris Lattner return bytes_written; 66430fdc8d8SChris Lattner } 66530fdc8d8SChris Lattner 66630fdc8d8SChris Lattner // Mimic shared pointer... 66730fdc8d8SChris Lattner lldb_private::Process * 66830fdc8d8SChris Lattner SBProcess::get() const 66930fdc8d8SChris Lattner { 6706611103cSGreg Clayton return m_opaque_sp.get(); 67130fdc8d8SChris Lattner } 67230fdc8d8SChris Lattner 673dde9cff3SCaroline Tice bool 674dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 675dde9cff3SCaroline Tice { 676dde9cff3SCaroline Tice if (m_opaque_sp) 677dde9cff3SCaroline Tice { 678dde9cff3SCaroline Tice char path[PATH_MAX]; 679dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 6801d273166SGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get(); 6811d273166SGreg Clayton const char *exe_name = NULL; 6821d273166SGreg Clayton if (exe_module) 6831d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 6841d273166SGreg Clayton 68505faeb71SGreg Clayton description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s", 6861d273166SGreg Clayton m_opaque_sp->GetID(), 687*ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 6881d273166SGreg Clayton GetNumThreads(), 68905faeb71SGreg Clayton exe_name ? ", executable = " : "", 6901d273166SGreg Clayton exe_name ? exe_name : ""); 691dde9cff3SCaroline Tice } 692dde9cff3SCaroline Tice else 693dde9cff3SCaroline Tice description.Printf ("No value"); 694dde9cff3SCaroline Tice 695dde9cff3SCaroline Tice return true; 696dde9cff3SCaroline Tice } 697