130fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 104c5de699SEli Friedman #include "lldb/API/SBProcess.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1330fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1430fdc8d8SChris Lattner 1540af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 1630fdc8d8SChris Lattner #include "lldb/Core/DataBufferHeap.h" 1730fdc8d8SChris Lattner #include "lldb/Core/DataExtractor.h" 185d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 19ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 2030fdc8d8SChris Lattner #include "lldb/Core/State.h" 2130fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2230fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2330fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2430fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 256611103cSGreg Clayton #include "lldb/Target/Target.h" 266611103cSGreg Clayton #include "lldb/Target/Thread.h" 2730fdc8d8SChris Lattner 2830fdc8d8SChris Lattner // Project includes 2930fdc8d8SChris Lattner 304c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 314c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 324c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 334c5de699SEli Friedman #include "lldb/API/SBEvent.h" 344c5de699SEli Friedman #include "lldb/API/SBThread.h" 35dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 364c5de699SEli Friedman #include "lldb/API/SBStringList.h" 3730fdc8d8SChris Lattner 3830fdc8d8SChris Lattner using namespace lldb; 3930fdc8d8SChris Lattner using namespace lldb_private; 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner SBProcess::SBProcess () : 446611103cSGreg Clayton m_opaque_sp() 4530fdc8d8SChris Lattner { 4630fdc8d8SChris Lattner } 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner //---------------------------------------------------------------------- 5030fdc8d8SChris Lattner // SBProcess constructor 5130fdc8d8SChris Lattner //---------------------------------------------------------------------- 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 546611103cSGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 5530fdc8d8SChris Lattner { 5630fdc8d8SChris Lattner } 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner 5930fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 606611103cSGreg Clayton m_opaque_sp (process_sp) 6130fdc8d8SChris Lattner { 6230fdc8d8SChris Lattner } 6330fdc8d8SChris Lattner 64efabb123SGreg Clayton const SBProcess& 65efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 66efabb123SGreg Clayton { 67efabb123SGreg Clayton if (this != &rhs) 68efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 69efabb123SGreg Clayton return *this; 70efabb123SGreg Clayton } 71efabb123SGreg Clayton 7230fdc8d8SChris Lattner //---------------------------------------------------------------------- 7330fdc8d8SChris Lattner // Destructor 7430fdc8d8SChris Lattner //---------------------------------------------------------------------- 7530fdc8d8SChris Lattner SBProcess::~SBProcess() 7630fdc8d8SChris Lattner { 7730fdc8d8SChris Lattner } 7830fdc8d8SChris Lattner 7930fdc8d8SChris Lattner void 8030fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp) 8130fdc8d8SChris Lattner { 826611103cSGreg Clayton m_opaque_sp = process_sp; 8330fdc8d8SChris Lattner } 8430fdc8d8SChris Lattner 8530fdc8d8SChris Lattner void 8630fdc8d8SChris Lattner SBProcess::Clear () 8730fdc8d8SChris Lattner { 886611103cSGreg Clayton m_opaque_sp.reset(); 8930fdc8d8SChris Lattner } 9030fdc8d8SChris Lattner 9130fdc8d8SChris Lattner 9230fdc8d8SChris Lattner bool 9330fdc8d8SChris Lattner SBProcess::IsValid() const 9430fdc8d8SChris Lattner { 956611103cSGreg Clayton return m_opaque_sp.get() != NULL; 9630fdc8d8SChris Lattner } 9730fdc8d8SChris Lattner 989631aae2SJames McIlree bool 999631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1009631aae2SJames McIlree char const **envp, 1019631aae2SJames McIlree const char *stdin_path, 1029631aae2SJames McIlree const char *stdout_path, 1039631aae2SJames McIlree const char *stderr_path, 1049631aae2SJames McIlree const char *working_directory, 1059631aae2SJames McIlree uint32_t launch_flags, 1069631aae2SJames McIlree bool stop_at_entry, 1079631aae2SJames McIlree lldb::SBError& error) 1089631aae2SJames McIlree { 1099631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1109631aae2SJames McIlree if (log) { 1119631aae2SJames McIlree log->Printf ("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, stop_at_entry=%i, &error (%p))...", 1129631aae2SJames McIlree m_opaque_sp.get(), 1139631aae2SJames McIlree argv, 1149631aae2SJames McIlree envp, 1159631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1169631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1179631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1189631aae2SJames McIlree working_directory ? working_directory : "NULL", 1199631aae2SJames McIlree launch_flags, 1209631aae2SJames McIlree stop_at_entry, 1219631aae2SJames McIlree error.get()); 1229631aae2SJames McIlree } 1239631aae2SJames McIlree 1249631aae2SJames McIlree if (m_opaque_sp) 1259631aae2SJames McIlree { 1269631aae2SJames McIlree Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1279631aae2SJames McIlree if (m_opaque_sp->GetState() == eStateConnected) 1289631aae2SJames McIlree { 1299631aae2SJames McIlree error.SetError (m_opaque_sp->Launch (argv, envp, launch_flags, stdin_path, stdout_path, stderr_path, working_directory)); 1309631aae2SJames McIlree } 1319631aae2SJames McIlree else 1329631aae2SJames McIlree { 1339631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1349631aae2SJames McIlree } 1359631aae2SJames McIlree } 1369631aae2SJames McIlree else 1379631aae2SJames McIlree { 1389631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1399631aae2SJames McIlree } 1409631aae2SJames McIlree 1419631aae2SJames McIlree if (log) { 1429631aae2SJames McIlree SBStream sstr; 1439631aae2SJames McIlree error.GetDescription (sstr); 144930e3ad5SJohnny Chen log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", m_opaque_sp.get(), error.get(), sstr.GetData()); 1459631aae2SJames McIlree } 1469631aae2SJames McIlree 1479631aae2SJames McIlree return error.Success(); 1489631aae2SJames McIlree } 1499631aae2SJames McIlree 1509631aae2SJames McIlree bool 1519631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 1529631aae2SJames McIlree { 1539631aae2SJames McIlree if (m_opaque_sp) 1549631aae2SJames McIlree { 1559631aae2SJames McIlree Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1569631aae2SJames McIlree if (m_opaque_sp->GetState() == eStateConnected) 1579631aae2SJames McIlree { 1589631aae2SJames McIlree error.SetError (m_opaque_sp->Attach (pid)); 1599631aae2SJames McIlree } 1609631aae2SJames McIlree else 1619631aae2SJames McIlree { 1629631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 1639631aae2SJames McIlree } 1649631aae2SJames McIlree } 1659631aae2SJames McIlree else 1669631aae2SJames McIlree { 1679631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1689631aae2SJames McIlree } 1699631aae2SJames McIlree 1709631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1719631aae2SJames McIlree if (log) { 1729631aae2SJames McIlree SBStream sstr; 1739631aae2SJames McIlree error.GetDescription (sstr); 174930e3ad5SJohnny Chen log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%d) => SBError (%p): %s", m_opaque_sp.get(), pid, error.get(), sstr.GetData()); 1759631aae2SJames McIlree } 1769631aae2SJames McIlree 1779631aae2SJames McIlree return error.Success(); 1789631aae2SJames McIlree } 1799631aae2SJames McIlree 18030fdc8d8SChris Lattner 18130fdc8d8SChris Lattner uint32_t 18230fdc8d8SChris Lattner SBProcess::GetNumThreads () 18330fdc8d8SChris Lattner { 1842d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 185ceb6b139SCaroline Tice 186ceb6b139SCaroline Tice uint32_t num_threads = 0; 1876611103cSGreg Clayton if (m_opaque_sp) 18830fdc8d8SChris Lattner { 189af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 19030fdc8d8SChris Lattner const bool can_update = true; 191ceb6b139SCaroline Tice num_threads = m_opaque_sp->GetThreadList().GetSize(can_update); 19230fdc8d8SChris Lattner } 193ceb6b139SCaroline Tice 194ceb6b139SCaroline Tice if (log) 19593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", m_opaque_sp.get(), num_threads); 196ceb6b139SCaroline Tice 197ceb6b139SCaroline Tice return num_threads; 19830fdc8d8SChris Lattner } 19930fdc8d8SChris Lattner 20030fdc8d8SChris Lattner SBThread 2012976d00aSJim Ingham SBProcess::GetSelectedThread () const 20230fdc8d8SChris Lattner { 2032d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 204ceb6b139SCaroline Tice 20530fdc8d8SChris Lattner SBThread sb_thread; 2066611103cSGreg Clayton if (m_opaque_sp) 207af67cecdSGreg Clayton { 208af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2092976d00aSJim Ingham sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread()); 210af67cecdSGreg Clayton } 211ceb6b139SCaroline Tice 212ceb6b139SCaroline Tice if (log) 213ceb6b139SCaroline Tice { 2144838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), sb_thread.get()); 215ceb6b139SCaroline Tice } 216ceb6b139SCaroline Tice 21730fdc8d8SChris Lattner return sb_thread; 21830fdc8d8SChris Lattner } 21930fdc8d8SChris Lattner 22030fdc8d8SChris Lattner SBTarget 22130fdc8d8SChris Lattner SBProcess::GetTarget() const 22230fdc8d8SChris Lattner { 2232d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 224ceb6b139SCaroline Tice 22530fdc8d8SChris Lattner SBTarget sb_target; 2266611103cSGreg Clayton if (m_opaque_sp) 2276611103cSGreg Clayton sb_target = m_opaque_sp->GetTarget().GetSP(); 228ceb6b139SCaroline Tice 229ceb6b139SCaroline Tice if (log) 23093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), sb_target.get()); 231ceb6b139SCaroline Tice 23230fdc8d8SChris Lattner return sb_target; 23330fdc8d8SChris Lattner } 23430fdc8d8SChris Lattner 23530fdc8d8SChris Lattner 23630fdc8d8SChris Lattner size_t 23730fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 23830fdc8d8SChris Lattner { 2392d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 240ceb6b139SCaroline Tice 241ceb6b139SCaroline Tice size_t ret_val = 0; 242af67cecdSGreg Clayton if (m_opaque_sp) 24330fdc8d8SChris Lattner { 24430fdc8d8SChris Lattner Error error; 245ceb6b139SCaroline Tice ret_val = m_opaque_sp->PutSTDIN (src, src_len, error); 24630fdc8d8SChris Lattner } 247ceb6b139SCaroline Tice 248ceb6b139SCaroline Tice if (log) 249cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %d", 25093aa84e8SGreg Clayton m_opaque_sp.get(), 25193aa84e8SGreg Clayton src, 25293aa84e8SGreg Clayton (uint32_t) src_len, 25393aa84e8SGreg Clayton ret_val); 254ceb6b139SCaroline Tice 255ceb6b139SCaroline Tice return ret_val; 25630fdc8d8SChris Lattner } 25730fdc8d8SChris Lattner 25830fdc8d8SChris Lattner size_t 25930fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 26030fdc8d8SChris Lattner { 261cfd1acedSGreg Clayton size_t bytes_read = 0; 262af67cecdSGreg Clayton if (m_opaque_sp) 26330fdc8d8SChris Lattner { 26430fdc8d8SChris Lattner Error error; 265cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDOUT (dst, dst_len, error); 26630fdc8d8SChris Lattner } 267ceb6b139SCaroline Tice 2682d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 269ceb6b139SCaroline Tice if (log) 270cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu", 271cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 272ceb6b139SCaroline Tice 273cfd1acedSGreg Clayton return bytes_read; 27430fdc8d8SChris Lattner } 27530fdc8d8SChris Lattner 27630fdc8d8SChris Lattner size_t 27730fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 27830fdc8d8SChris Lattner { 279cfd1acedSGreg Clayton size_t bytes_read = 0; 280af67cecdSGreg Clayton if (m_opaque_sp) 28130fdc8d8SChris Lattner { 28230fdc8d8SChris Lattner Error error; 283cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDERR (dst, dst_len, error); 28430fdc8d8SChris Lattner } 285ceb6b139SCaroline Tice 2862d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 287ceb6b139SCaroline Tice if (log) 288cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu", 289cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 290ceb6b139SCaroline Tice 291cfd1acedSGreg Clayton return bytes_read; 29230fdc8d8SChris Lattner } 29330fdc8d8SChris Lattner 29430fdc8d8SChris Lattner void 2952976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 29630fdc8d8SChris Lattner { 29730fdc8d8SChris Lattner if (out == NULL) 29830fdc8d8SChris Lattner return; 29930fdc8d8SChris Lattner 300af67cecdSGreg Clayton if (m_opaque_sp) 30130fdc8d8SChris Lattner { 30230fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 30330fdc8d8SChris Lattner char message[1024]; 30430fdc8d8SChris Lattner int message_len = ::snprintf (message, 30530fdc8d8SChris Lattner sizeof (message), 30630fdc8d8SChris Lattner "Process %d %s\n", 3076611103cSGreg Clayton m_opaque_sp->GetID(), 30830fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 30930fdc8d8SChris Lattner 31030fdc8d8SChris Lattner if (message_len > 0) 31130fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 31230fdc8d8SChris Lattner } 31330fdc8d8SChris Lattner } 31430fdc8d8SChris Lattner 31530fdc8d8SChris Lattner void 3162976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 31730fdc8d8SChris Lattner { 318af67cecdSGreg Clayton if (m_opaque_sp) 31930fdc8d8SChris Lattner { 32030fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 32130fdc8d8SChris Lattner char message[1024]; 32230fdc8d8SChris Lattner ::snprintf (message, 32330fdc8d8SChris Lattner sizeof (message), 32430fdc8d8SChris Lattner "Process %d %s\n", 3256611103cSGreg Clayton m_opaque_sp->GetID(), 32630fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 32730fdc8d8SChris Lattner 32830fdc8d8SChris Lattner result.AppendMessage (message); 32930fdc8d8SChris Lattner } 33030fdc8d8SChris Lattner } 33130fdc8d8SChris Lattner 33230fdc8d8SChris Lattner bool 3332976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 33430fdc8d8SChris Lattner { 335af67cecdSGreg Clayton if (m_opaque_sp) 336af67cecdSGreg Clayton { 337af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3382976d00aSJim Ingham return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 339af67cecdSGreg Clayton } 34030fdc8d8SChris Lattner return false; 34130fdc8d8SChris Lattner } 34230fdc8d8SChris Lattner 34330fdc8d8SChris Lattner bool 3442976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 34530fdc8d8SChris Lattner { 3462d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 347ceb6b139SCaroline Tice 348ceb6b139SCaroline Tice bool ret_val = false; 349af67cecdSGreg Clayton if (m_opaque_sp) 350af67cecdSGreg Clayton { 351af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 352ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid); 353af67cecdSGreg Clayton } 354ceb6b139SCaroline Tice 355ceb6b139SCaroline Tice if (log) 356cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s", 35793aa84e8SGreg Clayton m_opaque_sp.get(), tid, (ret_val ? "true" : "false")); 358ceb6b139SCaroline Tice 359ceb6b139SCaroline Tice return ret_val; 36030fdc8d8SChris Lattner } 36130fdc8d8SChris Lattner 36230fdc8d8SChris Lattner SBThread 36330fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 36430fdc8d8SChris Lattner { 3652d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 366ceb6b139SCaroline Tice 36730fdc8d8SChris Lattner SBThread thread; 3686611103cSGreg Clayton if (m_opaque_sp) 369af67cecdSGreg Clayton { 370af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3716611103cSGreg Clayton thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index)); 372af67cecdSGreg Clayton } 373ceb6b139SCaroline Tice 374ceb6b139SCaroline Tice if (log) 375ceb6b139SCaroline Tice { 37693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 3774838131bSGreg Clayton m_opaque_sp.get(), (uint32_t) index, thread.get()); 378ceb6b139SCaroline Tice } 379ceb6b139SCaroline Tice 38030fdc8d8SChris Lattner return thread; 38130fdc8d8SChris Lattner } 38230fdc8d8SChris Lattner 38330fdc8d8SChris Lattner StateType 38430fdc8d8SChris Lattner SBProcess::GetState () 38530fdc8d8SChris Lattner { 386ceb6b139SCaroline Tice 387ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 388af67cecdSGreg Clayton if (m_opaque_sp) 389af67cecdSGreg Clayton { 390af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 391ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetState(); 392af67cecdSGreg Clayton } 393ceb6b139SCaroline Tice 3942d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 395ceb6b139SCaroline Tice if (log) 396cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 39793aa84e8SGreg Clayton m_opaque_sp.get(), 398750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 399ceb6b139SCaroline Tice 400ceb6b139SCaroline Tice return ret_val; 40130fdc8d8SChris Lattner } 40230fdc8d8SChris Lattner 40330fdc8d8SChris Lattner 40430fdc8d8SChris Lattner int 40530fdc8d8SChris Lattner SBProcess::GetExitStatus () 40630fdc8d8SChris Lattner { 4074838131bSGreg Clayton int exit_status = 0; 4084838131bSGreg Clayton if (m_opaque_sp) 409af67cecdSGreg Clayton { 410af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4114838131bSGreg Clayton exit_status = m_opaque_sp->GetExitStatus (); 412af67cecdSGreg Clayton } 4132d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4144838131bSGreg Clayton if (log) 4154838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 4164838131bSGreg Clayton m_opaque_sp.get(), exit_status, exit_status); 4174838131bSGreg Clayton 4184838131bSGreg Clayton return exit_status; 41930fdc8d8SChris Lattner } 42030fdc8d8SChris Lattner 42130fdc8d8SChris Lattner const char * 42230fdc8d8SChris Lattner SBProcess::GetExitDescription () 42330fdc8d8SChris Lattner { 4244838131bSGreg Clayton const char *exit_desc = NULL; 425af67cecdSGreg Clayton if (m_opaque_sp) 426af67cecdSGreg Clayton { 427af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4284838131bSGreg Clayton exit_desc = m_opaque_sp->GetExitDescription (); 429af67cecdSGreg Clayton } 4302d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4314838131bSGreg Clayton if (log) 4324838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 4334838131bSGreg Clayton m_opaque_sp.get(), exit_desc); 4344838131bSGreg Clayton return exit_desc; 43530fdc8d8SChris Lattner } 43630fdc8d8SChris Lattner 43730fdc8d8SChris Lattner lldb::pid_t 43830fdc8d8SChris Lattner SBProcess::GetProcessID () 43930fdc8d8SChris Lattner { 440ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 4416611103cSGreg Clayton if (m_opaque_sp) 442ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetID(); 443ceb6b139SCaroline Tice 4442d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 445ceb6b139SCaroline Tice if (log) 44693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %d", m_opaque_sp.get(), ret_val); 447ceb6b139SCaroline Tice 448ceb6b139SCaroline Tice return ret_val; 44930fdc8d8SChris Lattner } 45030fdc8d8SChris Lattner 451cf386e24SJohnny Chen ByteOrder 452cf386e24SJohnny Chen SBProcess::GetByteOrder () const 453cf386e24SJohnny Chen { 454cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 455cf386e24SJohnny Chen if (m_opaque_sp) 456cf386e24SJohnny Chen byteOrder = m_opaque_sp->GetTarget().GetArchitecture().GetByteOrder(); 457cf386e24SJohnny Chen 458cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 459cf386e24SJohnny Chen if (log) 460cf386e24SJohnny Chen log->Printf ("SBProcess(%p)::GetByteOrder () => %d", m_opaque_sp.get(), byteOrder); 461cf386e24SJohnny Chen 462cf386e24SJohnny Chen return byteOrder; 463cf386e24SJohnny Chen } 464cf386e24SJohnny Chen 46530fdc8d8SChris Lattner uint32_t 46630fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 46730fdc8d8SChris Lattner { 468ceb6b139SCaroline Tice uint32_t size = 0; 4696611103cSGreg Clayton if (m_opaque_sp) 470514487e8SGreg Clayton size = m_opaque_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 471ceb6b139SCaroline Tice 4722d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 473ceb6b139SCaroline Tice if (log) 47493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size); 475ceb6b139SCaroline Tice 476ceb6b139SCaroline Tice return size; 47730fdc8d8SChris Lattner } 47830fdc8d8SChris Lattner 47930fdc8d8SChris Lattner SBError 48030fdc8d8SChris Lattner SBProcess::Continue () 48130fdc8d8SChris Lattner { 4822d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4834838131bSGreg Clayton if (log) 4844838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get()); 485ceb6b139SCaroline Tice 48630fdc8d8SChris Lattner SBError sb_error; 4870c74e78dSGreg Clayton if (m_opaque_sp) 4885d5028b5SGreg Clayton { 4890c74e78dSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4900c74e78dSGreg Clayton 4915d5028b5SGreg Clayton Error error (m_opaque_sp->Resume()); 4925d5028b5SGreg Clayton if (error.Success()) 4935d5028b5SGreg Clayton { 4945d5028b5SGreg Clayton if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 4954838131bSGreg Clayton { 4964838131bSGreg Clayton if (log) 4974838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get()); 4985d5028b5SGreg Clayton m_opaque_sp->WaitForProcessToStop (NULL); 4995d5028b5SGreg Clayton } 5004838131bSGreg Clayton } 5015d5028b5SGreg Clayton sb_error.SetError(error); 5025d5028b5SGreg Clayton } 50330fdc8d8SChris Lattner else 50430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 50530fdc8d8SChris Lattner 506ceb6b139SCaroline Tice if (log) 507ceb6b139SCaroline Tice { 508ceb6b139SCaroline Tice SBStream sstr; 509ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 51093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData()); 511ceb6b139SCaroline Tice } 512ceb6b139SCaroline Tice 51330fdc8d8SChris Lattner return sb_error; 51430fdc8d8SChris Lattner } 51530fdc8d8SChris Lattner 51630fdc8d8SChris Lattner 51730fdc8d8SChris Lattner SBError 51830fdc8d8SChris Lattner SBProcess::Destroy () 51930fdc8d8SChris Lattner { 52030fdc8d8SChris Lattner SBError sb_error; 5216611103cSGreg Clayton if (m_opaque_sp) 5226779606aSGreg Clayton { 5236779606aSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5246611103cSGreg Clayton sb_error.SetError(m_opaque_sp->Destroy()); 5256779606aSGreg Clayton } 52630fdc8d8SChris Lattner else 52730fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 52830fdc8d8SChris Lattner 5292d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5304838131bSGreg Clayton if (log) 5314838131bSGreg Clayton { 5324838131bSGreg Clayton SBStream sstr; 5334838131bSGreg Clayton sb_error.GetDescription (sstr); 5346779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 5356779606aSGreg Clayton m_opaque_sp.get(), 5366779606aSGreg Clayton sb_error.get(), 5376779606aSGreg Clayton sstr.GetData()); 5384838131bSGreg Clayton } 5394838131bSGreg Clayton 54030fdc8d8SChris Lattner return sb_error; 54130fdc8d8SChris Lattner } 54230fdc8d8SChris Lattner 54330fdc8d8SChris Lattner 54430fdc8d8SChris Lattner SBError 54530fdc8d8SChris Lattner SBProcess::Stop () 54630fdc8d8SChris Lattner { 54730fdc8d8SChris Lattner SBError sb_error; 5480c74e78dSGreg Clayton if (m_opaque_sp) 549af67cecdSGreg Clayton { 550af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5516611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Halt()); 552af67cecdSGreg Clayton } 55330fdc8d8SChris Lattner else 55430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 555ceb6b139SCaroline Tice 5562d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 557ceb6b139SCaroline Tice if (log) 558ceb6b139SCaroline Tice { 559ceb6b139SCaroline Tice SBStream sstr; 560ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 56193aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 56293aa84e8SGreg Clayton m_opaque_sp.get(), 56393aa84e8SGreg Clayton sb_error.get(), 564750cd175SCaroline Tice sstr.GetData()); 565ceb6b139SCaroline Tice } 566ceb6b139SCaroline Tice 56730fdc8d8SChris Lattner return sb_error; 56830fdc8d8SChris Lattner } 56930fdc8d8SChris Lattner 57030fdc8d8SChris Lattner SBError 57130fdc8d8SChris Lattner SBProcess::Kill () 57230fdc8d8SChris Lattner { 57330fdc8d8SChris Lattner SBError sb_error; 5746611103cSGreg Clayton if (m_opaque_sp) 575af67cecdSGreg Clayton { 576af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5776611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Destroy()); 578af67cecdSGreg Clayton } 57930fdc8d8SChris Lattner else 58030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 581ceb6b139SCaroline Tice 5822d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 583ceb6b139SCaroline Tice if (log) 584ceb6b139SCaroline Tice { 585ceb6b139SCaroline Tice SBStream sstr; 586ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 58793aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 58893aa84e8SGreg Clayton m_opaque_sp.get(), 58993aa84e8SGreg Clayton sb_error.get(), 590750cd175SCaroline Tice sstr.GetData()); 591ceb6b139SCaroline Tice } 592ceb6b139SCaroline Tice 59330fdc8d8SChris Lattner return sb_error; 59430fdc8d8SChris Lattner } 59530fdc8d8SChris Lattner 59630fdc8d8SChris Lattner SBError 59730fdc8d8SChris Lattner SBProcess::Detach () 59830fdc8d8SChris Lattner { 59930fdc8d8SChris Lattner SBError sb_error; 6006611103cSGreg Clayton if (m_opaque_sp) 601af67cecdSGreg Clayton { 602af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6036611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Detach()); 604af67cecdSGreg Clayton } 60530fdc8d8SChris Lattner else 60630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 60730fdc8d8SChris Lattner 60830fdc8d8SChris Lattner return sb_error; 60930fdc8d8SChris Lattner } 61030fdc8d8SChris Lattner 61130fdc8d8SChris Lattner SBError 6124838131bSGreg Clayton SBProcess::Signal (int signo) 61330fdc8d8SChris Lattner { 61430fdc8d8SChris Lattner SBError sb_error; 6156611103cSGreg Clayton if (m_opaque_sp) 616af67cecdSGreg Clayton { 617af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6184838131bSGreg Clayton sb_error.SetError (m_opaque_sp->Signal (signo)); 619af67cecdSGreg Clayton } 62030fdc8d8SChris Lattner else 62130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 6222d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6234838131bSGreg Clayton if (log) 6244838131bSGreg Clayton { 6254838131bSGreg Clayton SBStream sstr; 6264838131bSGreg Clayton sb_error.GetDescription (sstr); 6274838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 6284838131bSGreg Clayton m_opaque_sp.get(), 6294838131bSGreg Clayton signo, 6304838131bSGreg Clayton sb_error.get(), 6314838131bSGreg Clayton sstr.GetData()); 6324838131bSGreg Clayton } 63330fdc8d8SChris Lattner return sb_error; 63430fdc8d8SChris Lattner } 63530fdc8d8SChris Lattner 63630fdc8d8SChris Lattner SBThread 6374838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 63830fdc8d8SChris Lattner { 6394838131bSGreg Clayton SBThread sb_thread; 6406611103cSGreg Clayton if (m_opaque_sp) 641af67cecdSGreg Clayton { 642af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6434838131bSGreg Clayton sb_thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) tid)); 644af67cecdSGreg Clayton } 6454838131bSGreg Clayton 6462d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6474838131bSGreg Clayton if (log) 6484838131bSGreg Clayton { 6494838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4x) => SBThread (%p)", 6504838131bSGreg Clayton m_opaque_sp.get(), 6514838131bSGreg Clayton tid, 6524838131bSGreg Clayton sb_thread.get()); 6534838131bSGreg Clayton } 6544838131bSGreg Clayton 6554838131bSGreg Clayton return sb_thread; 65630fdc8d8SChris Lattner } 65730fdc8d8SChris Lattner 65830fdc8d8SChris Lattner StateType 65930fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 66030fdc8d8SChris Lattner { 6612d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 662ceb6b139SCaroline Tice 663ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 664ceb6b139SCaroline Tice 665ceb6b139SCaroline Tice if (log) 666cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 667750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 668ceb6b139SCaroline Tice 669ceb6b139SCaroline Tice return ret_val; 67030fdc8d8SChris Lattner } 67130fdc8d8SChris Lattner 67230fdc8d8SChris Lattner bool 67330fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 67430fdc8d8SChris Lattner { 6756611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 67630fdc8d8SChris Lattner } 67730fdc8d8SChris Lattner 67830fdc8d8SChris Lattner SBProcess 67930fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 68030fdc8d8SChris Lattner { 6816611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 68230fdc8d8SChris Lattner return process; 68330fdc8d8SChris Lattner } 68430fdc8d8SChris Lattner 68530fdc8d8SChris Lattner 68630fdc8d8SChris Lattner SBBroadcaster 68730fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 68830fdc8d8SChris Lattner { 6892d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 690ceb6b139SCaroline Tice 6916611103cSGreg Clayton SBBroadcaster broadcaster(m_opaque_sp.get(), false); 692ceb6b139SCaroline Tice 693ceb6b139SCaroline Tice if (log) 69493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(), 695750cd175SCaroline Tice broadcaster.get()); 696ceb6b139SCaroline Tice 69730fdc8d8SChris Lattner return broadcaster; 69830fdc8d8SChris Lattner } 69930fdc8d8SChris Lattner 70030fdc8d8SChris Lattner lldb_private::Process * 70130fdc8d8SChris Lattner SBProcess::operator->() const 70230fdc8d8SChris Lattner { 7036611103cSGreg Clayton return m_opaque_sp.get(); 70430fdc8d8SChris Lattner } 70530fdc8d8SChris Lattner 70630fdc8d8SChris Lattner size_t 70730fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 70830fdc8d8SChris Lattner { 7092d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 710ceb6b139SCaroline Tice 71130fdc8d8SChris Lattner size_t bytes_read = 0; 71230fdc8d8SChris Lattner 7134838131bSGreg Clayton if (log) 7144838131bSGreg Clayton { 7154838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...", 7164838131bSGreg Clayton m_opaque_sp.get(), 7174838131bSGreg Clayton addr, 7184838131bSGreg Clayton dst, 7194838131bSGreg Clayton (uint32_t) dst_len, 7204838131bSGreg Clayton sb_error.get()); 7214838131bSGreg Clayton } 7224838131bSGreg Clayton 723af67cecdSGreg Clayton if (m_opaque_sp) 72430fdc8d8SChris Lattner { 72530fdc8d8SChris Lattner Error error; 726af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 7276611103cSGreg Clayton bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error); 72830fdc8d8SChris Lattner sb_error.SetError (error); 72930fdc8d8SChris Lattner } 73030fdc8d8SChris Lattner else 73130fdc8d8SChris Lattner { 73230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 73330fdc8d8SChris Lattner } 73430fdc8d8SChris Lattner 735ceb6b139SCaroline Tice if (log) 73693aa84e8SGreg Clayton { 73793aa84e8SGreg Clayton SBStream sstr; 73893aa84e8SGreg Clayton sb_error.GetDescription (sstr); 7394838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %d", 74093aa84e8SGreg Clayton m_opaque_sp.get(), 74193aa84e8SGreg Clayton addr, 74293aa84e8SGreg Clayton dst, 74393aa84e8SGreg Clayton (uint32_t) dst_len, 74493aa84e8SGreg Clayton sb_error.get(), 74593aa84e8SGreg Clayton sstr.GetData(), 74693aa84e8SGreg Clayton (uint32_t) bytes_read); 74793aa84e8SGreg Clayton } 748ceb6b139SCaroline Tice 74930fdc8d8SChris Lattner return bytes_read; 75030fdc8d8SChris Lattner } 75130fdc8d8SChris Lattner 75230fdc8d8SChris Lattner size_t 75330fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 75430fdc8d8SChris Lattner { 75530fdc8d8SChris Lattner size_t bytes_written = 0; 75630fdc8d8SChris Lattner 7572d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7584838131bSGreg Clayton if (log) 7594838131bSGreg Clayton { 7604838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...", 7614838131bSGreg Clayton m_opaque_sp.get(), 7624838131bSGreg Clayton addr, 7634838131bSGreg Clayton src, 7644838131bSGreg Clayton (uint32_t) src_len, 7654838131bSGreg Clayton sb_error.get()); 7664838131bSGreg Clayton } 7674838131bSGreg Clayton 768af67cecdSGreg Clayton if (m_opaque_sp) 76930fdc8d8SChris Lattner { 77030fdc8d8SChris Lattner Error error; 771af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 7726611103cSGreg Clayton bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error); 77330fdc8d8SChris Lattner sb_error.SetError (error); 77430fdc8d8SChris Lattner } 77530fdc8d8SChris Lattner 7764838131bSGreg Clayton if (log) 7774838131bSGreg Clayton { 7784838131bSGreg Clayton SBStream sstr; 7794838131bSGreg Clayton sb_error.GetDescription (sstr); 7804838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %d", 7814838131bSGreg Clayton m_opaque_sp.get(), 7824838131bSGreg Clayton addr, 7834838131bSGreg Clayton src, 7844838131bSGreg Clayton (uint32_t) src_len, 7854838131bSGreg Clayton sb_error.get(), 7864838131bSGreg Clayton sstr.GetData(), 7874838131bSGreg Clayton (uint32_t) bytes_written); 7884838131bSGreg Clayton } 7894838131bSGreg Clayton 79030fdc8d8SChris Lattner return bytes_written; 79130fdc8d8SChris Lattner } 79230fdc8d8SChris Lattner 79330fdc8d8SChris Lattner // Mimic shared pointer... 79430fdc8d8SChris Lattner lldb_private::Process * 79530fdc8d8SChris Lattner SBProcess::get() const 79630fdc8d8SChris Lattner { 7976611103cSGreg Clayton return m_opaque_sp.get(); 79830fdc8d8SChris Lattner } 79930fdc8d8SChris Lattner 800dde9cff3SCaroline Tice bool 801dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 802dde9cff3SCaroline Tice { 803dde9cff3SCaroline Tice if (m_opaque_sp) 804dde9cff3SCaroline Tice { 805dde9cff3SCaroline Tice char path[PATH_MAX]; 806dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 807*aa149cbdSGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModulePointer(); 8081d273166SGreg Clayton const char *exe_name = NULL; 8091d273166SGreg Clayton if (exe_module) 8101d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 8111d273166SGreg Clayton 81205faeb71SGreg Clayton description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s", 8131d273166SGreg Clayton m_opaque_sp->GetID(), 814ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 8151d273166SGreg Clayton GetNumThreads(), 81605faeb71SGreg Clayton exe_name ? ", executable = " : "", 8171d273166SGreg Clayton exe_name ? exe_name : ""); 818dde9cff3SCaroline Tice } 819dde9cff3SCaroline Tice else 820dde9cff3SCaroline Tice description.Printf ("No value"); 821dde9cff3SCaroline Tice 822dde9cff3SCaroline Tice return true; 823dde9cff3SCaroline Tice } 8248f343b09SGreg Clayton 8258f343b09SGreg Clayton uint32_t 8268f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 8278f343b09SGreg Clayton { 8288f343b09SGreg Clayton if (m_opaque_sp) 829af67cecdSGreg Clayton { 830af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 831c5f57830SGreg Clayton return m_opaque_sp->LoadImage (*sb_image_spec, sb_error.ref()); 832af67cecdSGreg Clayton } 8338f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 8348f343b09SGreg Clayton } 8358f343b09SGreg Clayton 8368f343b09SGreg Clayton lldb::SBError 8378f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 8388f343b09SGreg Clayton { 8398f343b09SGreg Clayton lldb::SBError sb_error; 8408f343b09SGreg Clayton if (m_opaque_sp) 841af67cecdSGreg Clayton { 842af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 8438f343b09SGreg Clayton sb_error.SetError (m_opaque_sp->UnloadImage (image_token)); 844af67cecdSGreg Clayton } 8458f343b09SGreg Clayton else 8468f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 8478f343b09SGreg Clayton return sb_error; 8488f343b09SGreg Clayton } 8498f343b09SGreg Clayton 8508f343b09SGreg Clayton 851