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" 165d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 17ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 1830fdc8d8SChris Lattner #include "lldb/Core/State.h" 1930fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2130fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2230fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 236611103cSGreg Clayton #include "lldb/Target/Target.h" 246611103cSGreg Clayton #include "lldb/Target/Thread.h" 2530fdc8d8SChris Lattner 2630fdc8d8SChris Lattner // Project includes 2730fdc8d8SChris Lattner 284c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 294c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 304c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 314c5de699SEli Friedman #include "lldb/API/SBEvent.h" 324c5de699SEli Friedman #include "lldb/API/SBThread.h" 33dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 344c5de699SEli Friedman #include "lldb/API/SBStringList.h" 3530fdc8d8SChris Lattner 3630fdc8d8SChris Lattner using namespace lldb; 3730fdc8d8SChris Lattner using namespace lldb_private; 3830fdc8d8SChris Lattner 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner SBProcess::SBProcess () : 426611103cSGreg Clayton m_opaque_sp() 4330fdc8d8SChris Lattner { 4430fdc8d8SChris Lattner } 4530fdc8d8SChris Lattner 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner //---------------------------------------------------------------------- 4830fdc8d8SChris Lattner // SBProcess constructor 4930fdc8d8SChris Lattner //---------------------------------------------------------------------- 5030fdc8d8SChris Lattner 5130fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 526611103cSGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 5330fdc8d8SChris Lattner { 5430fdc8d8SChris Lattner } 5530fdc8d8SChris Lattner 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 586611103cSGreg Clayton m_opaque_sp (process_sp) 5930fdc8d8SChris Lattner { 6030fdc8d8SChris Lattner } 6130fdc8d8SChris Lattner 62efabb123SGreg Clayton const SBProcess& 63efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 64efabb123SGreg Clayton { 65efabb123SGreg Clayton if (this != &rhs) 66efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 67efabb123SGreg Clayton return *this; 68efabb123SGreg Clayton } 69efabb123SGreg Clayton 7030fdc8d8SChris Lattner //---------------------------------------------------------------------- 7130fdc8d8SChris Lattner // Destructor 7230fdc8d8SChris Lattner //---------------------------------------------------------------------- 7330fdc8d8SChris Lattner SBProcess::~SBProcess() 7430fdc8d8SChris Lattner { 7530fdc8d8SChris Lattner } 7630fdc8d8SChris Lattner 7730fdc8d8SChris Lattner void 7830fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp) 7930fdc8d8SChris Lattner { 806611103cSGreg Clayton m_opaque_sp = process_sp; 8130fdc8d8SChris Lattner } 8230fdc8d8SChris Lattner 8330fdc8d8SChris Lattner void 8430fdc8d8SChris Lattner SBProcess::Clear () 8530fdc8d8SChris Lattner { 866611103cSGreg Clayton m_opaque_sp.reset(); 8730fdc8d8SChris Lattner } 8830fdc8d8SChris Lattner 8930fdc8d8SChris Lattner 9030fdc8d8SChris Lattner bool 9130fdc8d8SChris Lattner SBProcess::IsValid() const 9230fdc8d8SChris Lattner { 936611103cSGreg Clayton return m_opaque_sp.get() != NULL; 9430fdc8d8SChris Lattner } 9530fdc8d8SChris Lattner 969631aae2SJames McIlree bool 979631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 989631aae2SJames McIlree char const **envp, 999631aae2SJames McIlree const char *stdin_path, 1009631aae2SJames McIlree const char *stdout_path, 1019631aae2SJames McIlree const char *stderr_path, 1029631aae2SJames McIlree const char *working_directory, 1039631aae2SJames McIlree uint32_t launch_flags, 1049631aae2SJames McIlree bool stop_at_entry, 1059631aae2SJames McIlree lldb::SBError& error) 1069631aae2SJames McIlree { 1079631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1089631aae2SJames McIlree if (log) { 1099631aae2SJames 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))...", 1109631aae2SJames McIlree m_opaque_sp.get(), 1119631aae2SJames McIlree argv, 1129631aae2SJames McIlree envp, 1139631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1149631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1159631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1169631aae2SJames McIlree working_directory ? working_directory : "NULL", 1179631aae2SJames McIlree launch_flags, 1189631aae2SJames McIlree stop_at_entry, 1199631aae2SJames McIlree error.get()); 1209631aae2SJames McIlree } 1219631aae2SJames McIlree 1229631aae2SJames McIlree if (m_opaque_sp) 1239631aae2SJames McIlree { 1249631aae2SJames McIlree Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1259631aae2SJames McIlree if (m_opaque_sp->GetState() == eStateConnected) 1269631aae2SJames McIlree { 127982c9762SGreg Clayton if (stop_at_entry) 128982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 129982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 130982c9762SGreg Clayton stdout_path, 131982c9762SGreg Clayton stderr_path, 132982c9762SGreg Clayton working_directory, 133982c9762SGreg Clayton launch_flags); 134982c9762SGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModulePointer(); 135982c9762SGreg Clayton if (exe_module) 136982c9762SGreg Clayton launch_info.SetExecutableFile(exe_module->GetFileSpec(), true); 137982c9762SGreg Clayton if (argv) 138982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 139982c9762SGreg Clayton if (envp) 140982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 141982c9762SGreg Clayton error.SetError (m_opaque_sp->Launch (launch_info)); 1429631aae2SJames McIlree } 1439631aae2SJames McIlree else 1449631aae2SJames McIlree { 1459631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1469631aae2SJames McIlree } 1479631aae2SJames McIlree } 1489631aae2SJames McIlree else 1499631aae2SJames McIlree { 1509631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1519631aae2SJames McIlree } 1529631aae2SJames McIlree 1539631aae2SJames McIlree if (log) { 1549631aae2SJames McIlree SBStream sstr; 1559631aae2SJames McIlree error.GetDescription (sstr); 156930e3ad5SJohnny Chen log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", m_opaque_sp.get(), error.get(), sstr.GetData()); 1579631aae2SJames McIlree } 1589631aae2SJames McIlree 1599631aae2SJames McIlree return error.Success(); 1609631aae2SJames McIlree } 1619631aae2SJames McIlree 1629631aae2SJames McIlree bool 1639631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 1649631aae2SJames McIlree { 1659631aae2SJames McIlree if (m_opaque_sp) 1669631aae2SJames McIlree { 1679631aae2SJames McIlree Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1689631aae2SJames McIlree if (m_opaque_sp->GetState() == eStateConnected) 1699631aae2SJames McIlree { 170144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 171144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 172144f3a9cSGreg Clayton error.SetError (m_opaque_sp->Attach (attach_info)); 1739631aae2SJames McIlree } 1749631aae2SJames McIlree else 1759631aae2SJames McIlree { 1769631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 1779631aae2SJames McIlree } 1789631aae2SJames McIlree } 1799631aae2SJames McIlree else 1809631aae2SJames McIlree { 1819631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1829631aae2SJames McIlree } 1839631aae2SJames McIlree 1849631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1859631aae2SJames McIlree if (log) { 1869631aae2SJames McIlree SBStream sstr; 1879631aae2SJames McIlree error.GetDescription (sstr); 18861e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", m_opaque_sp.get(), pid, error.get(), sstr.GetData()); 1899631aae2SJames McIlree } 1909631aae2SJames McIlree 1919631aae2SJames McIlree return error.Success(); 1929631aae2SJames McIlree } 1939631aae2SJames McIlree 19430fdc8d8SChris Lattner 19530fdc8d8SChris Lattner uint32_t 19630fdc8d8SChris Lattner SBProcess::GetNumThreads () 19730fdc8d8SChris Lattner { 1982d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 199ceb6b139SCaroline Tice 200ceb6b139SCaroline Tice uint32_t num_threads = 0; 2016611103cSGreg Clayton if (m_opaque_sp) 20230fdc8d8SChris Lattner { 203af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 20430fdc8d8SChris Lattner const bool can_update = true; 205ceb6b139SCaroline Tice num_threads = m_opaque_sp->GetThreadList().GetSize(can_update); 20630fdc8d8SChris Lattner } 207ceb6b139SCaroline Tice 208ceb6b139SCaroline Tice if (log) 20993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", m_opaque_sp.get(), num_threads); 210ceb6b139SCaroline Tice 211ceb6b139SCaroline Tice return num_threads; 21230fdc8d8SChris Lattner } 21330fdc8d8SChris Lattner 21430fdc8d8SChris Lattner SBThread 2152976d00aSJim Ingham SBProcess::GetSelectedThread () const 21630fdc8d8SChris Lattner { 2172d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 218ceb6b139SCaroline Tice 21930fdc8d8SChris Lattner SBThread sb_thread; 220*17a6ad05SGreg Clayton ThreadSP thread_sp; 2216611103cSGreg Clayton if (m_opaque_sp) 222af67cecdSGreg Clayton { 223af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 224*17a6ad05SGreg Clayton thread_sp = m_opaque_sp->GetThreadList().GetSelectedThread(); 225*17a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 226af67cecdSGreg Clayton } 227ceb6b139SCaroline Tice 228ceb6b139SCaroline Tice if (log) 229ceb6b139SCaroline Tice { 230*17a6ad05SGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), thread_sp.get()); 231ceb6b139SCaroline Tice } 232ceb6b139SCaroline Tice 23330fdc8d8SChris Lattner return sb_thread; 23430fdc8d8SChris Lattner } 23530fdc8d8SChris Lattner 23630fdc8d8SChris Lattner SBTarget 23730fdc8d8SChris Lattner SBProcess::GetTarget() const 23830fdc8d8SChris Lattner { 2392d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 240ceb6b139SCaroline Tice 24130fdc8d8SChris Lattner SBTarget sb_target; 2426611103cSGreg Clayton if (m_opaque_sp) 243e1cd1be6SGreg Clayton sb_target = m_opaque_sp->GetTarget().shared_from_this(); 244ceb6b139SCaroline Tice 245ceb6b139SCaroline Tice if (log) 24693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), sb_target.get()); 247ceb6b139SCaroline Tice 24830fdc8d8SChris Lattner return sb_target; 24930fdc8d8SChris Lattner } 25030fdc8d8SChris Lattner 25130fdc8d8SChris Lattner 25230fdc8d8SChris Lattner size_t 25330fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 25430fdc8d8SChris Lattner { 2552d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 256ceb6b139SCaroline Tice 257ceb6b139SCaroline Tice size_t ret_val = 0; 258af67cecdSGreg Clayton if (m_opaque_sp) 25930fdc8d8SChris Lattner { 26030fdc8d8SChris Lattner Error error; 261ceb6b139SCaroline Tice ret_val = m_opaque_sp->PutSTDIN (src, src_len, error); 26230fdc8d8SChris Lattner } 263ceb6b139SCaroline Tice 264ceb6b139SCaroline Tice if (log) 265fd54b368SJason Molenda log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu", 26693aa84e8SGreg Clayton m_opaque_sp.get(), 26793aa84e8SGreg Clayton src, 26893aa84e8SGreg Clayton (uint32_t) src_len, 26993aa84e8SGreg Clayton ret_val); 270ceb6b139SCaroline Tice 271ceb6b139SCaroline Tice return ret_val; 27230fdc8d8SChris Lattner } 27330fdc8d8SChris Lattner 27430fdc8d8SChris Lattner size_t 27530fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 27630fdc8d8SChris Lattner { 277cfd1acedSGreg Clayton size_t bytes_read = 0; 278af67cecdSGreg Clayton if (m_opaque_sp) 27930fdc8d8SChris Lattner { 28030fdc8d8SChris Lattner Error error; 281cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDOUT (dst, dst_len, error); 28230fdc8d8SChris Lattner } 283ceb6b139SCaroline Tice 2842d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 285ceb6b139SCaroline Tice if (log) 286cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu", 287cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 288ceb6b139SCaroline Tice 289cfd1acedSGreg Clayton return bytes_read; 29030fdc8d8SChris Lattner } 29130fdc8d8SChris Lattner 29230fdc8d8SChris Lattner size_t 29330fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 29430fdc8d8SChris Lattner { 295cfd1acedSGreg Clayton size_t bytes_read = 0; 296af67cecdSGreg Clayton if (m_opaque_sp) 29730fdc8d8SChris Lattner { 29830fdc8d8SChris Lattner Error error; 299cfd1acedSGreg Clayton bytes_read = m_opaque_sp->GetSTDERR (dst, dst_len, error); 30030fdc8d8SChris Lattner } 301ceb6b139SCaroline Tice 3022d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 303ceb6b139SCaroline Tice if (log) 304cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu", 305cfd1acedSGreg Clayton m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 306ceb6b139SCaroline Tice 307cfd1acedSGreg Clayton return bytes_read; 30830fdc8d8SChris Lattner } 30930fdc8d8SChris Lattner 31030fdc8d8SChris Lattner void 3112976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 31230fdc8d8SChris Lattner { 31330fdc8d8SChris Lattner if (out == NULL) 31430fdc8d8SChris Lattner return; 31530fdc8d8SChris Lattner 316af67cecdSGreg Clayton if (m_opaque_sp) 31730fdc8d8SChris Lattner { 31830fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 31930fdc8d8SChris Lattner char message[1024]; 32030fdc8d8SChris Lattner int message_len = ::snprintf (message, 32130fdc8d8SChris Lattner sizeof (message), 32281c22f61SGreg Clayton "Process %llu %s\n", 3236611103cSGreg Clayton m_opaque_sp->GetID(), 32430fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 32530fdc8d8SChris Lattner 32630fdc8d8SChris Lattner if (message_len > 0) 32730fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 32830fdc8d8SChris Lattner } 32930fdc8d8SChris Lattner } 33030fdc8d8SChris Lattner 33130fdc8d8SChris Lattner void 3322976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 33330fdc8d8SChris Lattner { 334af67cecdSGreg Clayton if (m_opaque_sp) 33530fdc8d8SChris Lattner { 33630fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 33730fdc8d8SChris Lattner char message[1024]; 33830fdc8d8SChris Lattner ::snprintf (message, 33930fdc8d8SChris Lattner sizeof (message), 34081c22f61SGreg Clayton "Process %llu %s\n", 3416611103cSGreg Clayton m_opaque_sp->GetID(), 34230fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 34330fdc8d8SChris Lattner 34430fdc8d8SChris Lattner result.AppendMessage (message); 34530fdc8d8SChris Lattner } 34630fdc8d8SChris Lattner } 34730fdc8d8SChris Lattner 34830fdc8d8SChris Lattner bool 3492976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 35030fdc8d8SChris Lattner { 351af67cecdSGreg Clayton if (m_opaque_sp) 352af67cecdSGreg Clayton { 353af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3542976d00aSJim Ingham return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 355af67cecdSGreg Clayton } 35630fdc8d8SChris Lattner return false; 35730fdc8d8SChris Lattner } 35830fdc8d8SChris Lattner 35930fdc8d8SChris Lattner bool 3602976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 36130fdc8d8SChris Lattner { 3622d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 363ceb6b139SCaroline Tice 364ceb6b139SCaroline Tice bool ret_val = false; 365af67cecdSGreg Clayton if (m_opaque_sp) 366af67cecdSGreg Clayton { 367af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 368ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid); 369af67cecdSGreg Clayton } 370ceb6b139SCaroline Tice 371ceb6b139SCaroline Tice if (log) 372cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s", 37393aa84e8SGreg Clayton m_opaque_sp.get(), tid, (ret_val ? "true" : "false")); 374ceb6b139SCaroline Tice 375ceb6b139SCaroline Tice return ret_val; 37630fdc8d8SChris Lattner } 37730fdc8d8SChris Lattner 37830fdc8d8SChris Lattner SBThread 37930fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 38030fdc8d8SChris Lattner { 3812d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 382ceb6b139SCaroline Tice 383*17a6ad05SGreg Clayton SBThread sb_thread; 384*17a6ad05SGreg Clayton ThreadSP thread_sp; 3856611103cSGreg Clayton if (m_opaque_sp) 386af67cecdSGreg Clayton { 387af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 388*17a6ad05SGreg Clayton thread_sp = m_opaque_sp->GetThreadList().GetThreadAtIndex(index); 389*17a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 390af67cecdSGreg Clayton } 391ceb6b139SCaroline Tice 392ceb6b139SCaroline Tice if (log) 393ceb6b139SCaroline Tice { 39493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 395*17a6ad05SGreg Clayton m_opaque_sp.get(), (uint32_t) index, thread_sp.get()); 396ceb6b139SCaroline Tice } 397ceb6b139SCaroline Tice 398*17a6ad05SGreg Clayton return sb_thread; 39930fdc8d8SChris Lattner } 40030fdc8d8SChris Lattner 40130fdc8d8SChris Lattner StateType 40230fdc8d8SChris Lattner SBProcess::GetState () 40330fdc8d8SChris Lattner { 404ceb6b139SCaroline Tice 405ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 406af67cecdSGreg Clayton if (m_opaque_sp) 407af67cecdSGreg Clayton { 408af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 409ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetState(); 410af67cecdSGreg Clayton } 411ceb6b139SCaroline Tice 4122d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 413ceb6b139SCaroline Tice if (log) 414cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 41593aa84e8SGreg Clayton m_opaque_sp.get(), 416750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 417ceb6b139SCaroline Tice 418ceb6b139SCaroline Tice return ret_val; 41930fdc8d8SChris Lattner } 42030fdc8d8SChris Lattner 42130fdc8d8SChris Lattner 42230fdc8d8SChris Lattner int 42330fdc8d8SChris Lattner SBProcess::GetExitStatus () 42430fdc8d8SChris Lattner { 4254838131bSGreg Clayton int exit_status = 0; 4264838131bSGreg Clayton if (m_opaque_sp) 427af67cecdSGreg Clayton { 428af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4294838131bSGreg Clayton exit_status = m_opaque_sp->GetExitStatus (); 430af67cecdSGreg Clayton } 4312d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4324838131bSGreg Clayton if (log) 4334838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 4344838131bSGreg Clayton m_opaque_sp.get(), exit_status, exit_status); 4354838131bSGreg Clayton 4364838131bSGreg Clayton return exit_status; 43730fdc8d8SChris Lattner } 43830fdc8d8SChris Lattner 43930fdc8d8SChris Lattner const char * 44030fdc8d8SChris Lattner SBProcess::GetExitDescription () 44130fdc8d8SChris Lattner { 4424838131bSGreg Clayton const char *exit_desc = NULL; 443af67cecdSGreg Clayton if (m_opaque_sp) 444af67cecdSGreg Clayton { 445af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4464838131bSGreg Clayton exit_desc = m_opaque_sp->GetExitDescription (); 447af67cecdSGreg Clayton } 4482d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4494838131bSGreg Clayton if (log) 4504838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 4514838131bSGreg Clayton m_opaque_sp.get(), exit_desc); 4524838131bSGreg Clayton return exit_desc; 45330fdc8d8SChris Lattner } 45430fdc8d8SChris Lattner 45530fdc8d8SChris Lattner lldb::pid_t 45630fdc8d8SChris Lattner SBProcess::GetProcessID () 45730fdc8d8SChris Lattner { 458ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 4596611103cSGreg Clayton if (m_opaque_sp) 460ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetID(); 461ceb6b139SCaroline Tice 4622d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 463ceb6b139SCaroline Tice if (log) 46461e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %llu", m_opaque_sp.get(), ret_val); 465ceb6b139SCaroline Tice 466ceb6b139SCaroline Tice return ret_val; 46730fdc8d8SChris Lattner } 46830fdc8d8SChris Lattner 469cf386e24SJohnny Chen ByteOrder 470cf386e24SJohnny Chen SBProcess::GetByteOrder () const 471cf386e24SJohnny Chen { 472cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 473cf386e24SJohnny Chen if (m_opaque_sp) 474cf386e24SJohnny Chen byteOrder = m_opaque_sp->GetTarget().GetArchitecture().GetByteOrder(); 475cf386e24SJohnny Chen 476cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 477cf386e24SJohnny Chen if (log) 478cf386e24SJohnny Chen log->Printf ("SBProcess(%p)::GetByteOrder () => %d", m_opaque_sp.get(), byteOrder); 479cf386e24SJohnny Chen 480cf386e24SJohnny Chen return byteOrder; 481cf386e24SJohnny Chen } 482cf386e24SJohnny Chen 48330fdc8d8SChris Lattner uint32_t 48430fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 48530fdc8d8SChris Lattner { 486ceb6b139SCaroline Tice uint32_t size = 0; 4876611103cSGreg Clayton if (m_opaque_sp) 488514487e8SGreg Clayton size = m_opaque_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 489ceb6b139SCaroline Tice 4902d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 491ceb6b139SCaroline Tice if (log) 49293aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size); 493ceb6b139SCaroline Tice 494ceb6b139SCaroline Tice return size; 49530fdc8d8SChris Lattner } 49630fdc8d8SChris Lattner 49730fdc8d8SChris Lattner SBError 49830fdc8d8SChris Lattner SBProcess::Continue () 49930fdc8d8SChris Lattner { 5002d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5014838131bSGreg Clayton if (log) 5024838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get()); 503ceb6b139SCaroline Tice 50430fdc8d8SChris Lattner SBError sb_error; 5050c74e78dSGreg Clayton if (m_opaque_sp) 5065d5028b5SGreg Clayton { 5070c74e78dSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5080c74e78dSGreg Clayton 5095d5028b5SGreg Clayton Error error (m_opaque_sp->Resume()); 5105d5028b5SGreg Clayton if (error.Success()) 5115d5028b5SGreg Clayton { 5125d5028b5SGreg Clayton if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 5134838131bSGreg Clayton { 5144838131bSGreg Clayton if (log) 5154838131bSGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get()); 5165d5028b5SGreg Clayton m_opaque_sp->WaitForProcessToStop (NULL); 5175d5028b5SGreg Clayton } 5184838131bSGreg Clayton } 5195d5028b5SGreg Clayton sb_error.SetError(error); 5205d5028b5SGreg Clayton } 52130fdc8d8SChris Lattner else 52230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 52330fdc8d8SChris Lattner 524ceb6b139SCaroline Tice if (log) 525ceb6b139SCaroline Tice { 526ceb6b139SCaroline Tice SBStream sstr; 527ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 52893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData()); 529ceb6b139SCaroline Tice } 530ceb6b139SCaroline Tice 53130fdc8d8SChris Lattner return sb_error; 53230fdc8d8SChris Lattner } 53330fdc8d8SChris Lattner 53430fdc8d8SChris Lattner 53530fdc8d8SChris Lattner SBError 53630fdc8d8SChris Lattner SBProcess::Destroy () 53730fdc8d8SChris Lattner { 53830fdc8d8SChris Lattner SBError sb_error; 5396611103cSGreg Clayton if (m_opaque_sp) 5406779606aSGreg Clayton { 5416779606aSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5426611103cSGreg Clayton sb_error.SetError(m_opaque_sp->Destroy()); 5436779606aSGreg Clayton } 54430fdc8d8SChris Lattner else 54530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 54630fdc8d8SChris Lattner 5472d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5484838131bSGreg Clayton if (log) 5494838131bSGreg Clayton { 5504838131bSGreg Clayton SBStream sstr; 5514838131bSGreg Clayton sb_error.GetDescription (sstr); 5526779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 5536779606aSGreg Clayton m_opaque_sp.get(), 5546779606aSGreg Clayton sb_error.get(), 5556779606aSGreg Clayton sstr.GetData()); 5564838131bSGreg Clayton } 5574838131bSGreg Clayton 55830fdc8d8SChris Lattner return sb_error; 55930fdc8d8SChris Lattner } 56030fdc8d8SChris Lattner 56130fdc8d8SChris Lattner 56230fdc8d8SChris Lattner SBError 56330fdc8d8SChris Lattner SBProcess::Stop () 56430fdc8d8SChris Lattner { 56530fdc8d8SChris Lattner SBError sb_error; 5660c74e78dSGreg Clayton if (m_opaque_sp) 567af67cecdSGreg Clayton { 568af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5696611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Halt()); 570af67cecdSGreg Clayton } 57130fdc8d8SChris Lattner else 57230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 573ceb6b139SCaroline Tice 5742d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 575ceb6b139SCaroline Tice if (log) 576ceb6b139SCaroline Tice { 577ceb6b139SCaroline Tice SBStream sstr; 578ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 57993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 58093aa84e8SGreg Clayton m_opaque_sp.get(), 58193aa84e8SGreg Clayton sb_error.get(), 582750cd175SCaroline Tice sstr.GetData()); 583ceb6b139SCaroline Tice } 584ceb6b139SCaroline Tice 58530fdc8d8SChris Lattner return sb_error; 58630fdc8d8SChris Lattner } 58730fdc8d8SChris Lattner 58830fdc8d8SChris Lattner SBError 58930fdc8d8SChris Lattner SBProcess::Kill () 59030fdc8d8SChris Lattner { 59130fdc8d8SChris Lattner SBError sb_error; 5926611103cSGreg Clayton if (m_opaque_sp) 593af67cecdSGreg Clayton { 594af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5956611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Destroy()); 596af67cecdSGreg Clayton } 59730fdc8d8SChris Lattner else 59830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 599ceb6b139SCaroline Tice 6002d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 601ceb6b139SCaroline Tice if (log) 602ceb6b139SCaroline Tice { 603ceb6b139SCaroline Tice SBStream sstr; 604ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 60593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 60693aa84e8SGreg Clayton m_opaque_sp.get(), 60793aa84e8SGreg Clayton sb_error.get(), 608750cd175SCaroline Tice sstr.GetData()); 609ceb6b139SCaroline Tice } 610ceb6b139SCaroline Tice 61130fdc8d8SChris Lattner return sb_error; 61230fdc8d8SChris Lattner } 61330fdc8d8SChris Lattner 61430fdc8d8SChris Lattner SBError 61530fdc8d8SChris Lattner SBProcess::Detach () 61630fdc8d8SChris Lattner { 61730fdc8d8SChris Lattner SBError sb_error; 6186611103cSGreg Clayton if (m_opaque_sp) 619af67cecdSGreg Clayton { 620af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6216611103cSGreg Clayton sb_error.SetError (m_opaque_sp->Detach()); 622af67cecdSGreg Clayton } 62330fdc8d8SChris Lattner else 62430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 62530fdc8d8SChris Lattner 62630fdc8d8SChris Lattner return sb_error; 62730fdc8d8SChris Lattner } 62830fdc8d8SChris Lattner 62930fdc8d8SChris Lattner SBError 6304838131bSGreg Clayton SBProcess::Signal (int signo) 63130fdc8d8SChris Lattner { 63230fdc8d8SChris Lattner SBError sb_error; 6336611103cSGreg Clayton if (m_opaque_sp) 634af67cecdSGreg Clayton { 635af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 6364838131bSGreg Clayton sb_error.SetError (m_opaque_sp->Signal (signo)); 637af67cecdSGreg Clayton } 63830fdc8d8SChris Lattner else 63930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 6402d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6414838131bSGreg Clayton if (log) 6424838131bSGreg Clayton { 6434838131bSGreg Clayton SBStream sstr; 6444838131bSGreg Clayton sb_error.GetDescription (sstr); 6454838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 6464838131bSGreg Clayton m_opaque_sp.get(), 6474838131bSGreg Clayton signo, 6484838131bSGreg Clayton sb_error.get(), 6494838131bSGreg Clayton sstr.GetData()); 6504838131bSGreg Clayton } 65130fdc8d8SChris Lattner return sb_error; 65230fdc8d8SChris Lattner } 65330fdc8d8SChris Lattner 65430fdc8d8SChris Lattner SBThread 6554838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 65630fdc8d8SChris Lattner { 6574838131bSGreg Clayton SBThread sb_thread; 658*17a6ad05SGreg Clayton ThreadSP thread_sp; 6596611103cSGreg Clayton if (m_opaque_sp) 660af67cecdSGreg Clayton { 661af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 662*17a6ad05SGreg Clayton thread_sp = m_opaque_sp->GetThreadList().FindThreadByID (tid); 663*17a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 664af67cecdSGreg Clayton } 6654838131bSGreg Clayton 6662d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6674838131bSGreg Clayton if (log) 6684838131bSGreg Clayton { 66961e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)", 6704838131bSGreg Clayton m_opaque_sp.get(), 6714838131bSGreg Clayton tid, 672*17a6ad05SGreg Clayton thread_sp.get()); 6734838131bSGreg Clayton } 6744838131bSGreg Clayton 6754838131bSGreg Clayton return sb_thread; 67630fdc8d8SChris Lattner } 67730fdc8d8SChris Lattner 67830fdc8d8SChris Lattner StateType 67930fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 68030fdc8d8SChris Lattner { 6812d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 682ceb6b139SCaroline Tice 683ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 684ceb6b139SCaroline Tice 685ceb6b139SCaroline Tice if (log) 686cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 687750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 688ceb6b139SCaroline Tice 689ceb6b139SCaroline Tice return ret_val; 69030fdc8d8SChris Lattner } 69130fdc8d8SChris Lattner 69230fdc8d8SChris Lattner bool 69330fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 69430fdc8d8SChris Lattner { 6956611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 69630fdc8d8SChris Lattner } 69730fdc8d8SChris Lattner 69830fdc8d8SChris Lattner SBProcess 69930fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 70030fdc8d8SChris Lattner { 7016611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 70230fdc8d8SChris Lattner return process; 70330fdc8d8SChris Lattner } 70430fdc8d8SChris Lattner 70530fdc8d8SChris Lattner 70630fdc8d8SChris Lattner SBBroadcaster 70730fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 70830fdc8d8SChris Lattner { 7092d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 710ceb6b139SCaroline Tice 7116611103cSGreg Clayton SBBroadcaster broadcaster(m_opaque_sp.get(), false); 712ceb6b139SCaroline Tice 713ceb6b139SCaroline Tice if (log) 71493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(), 715750cd175SCaroline Tice broadcaster.get()); 716ceb6b139SCaroline Tice 71730fdc8d8SChris Lattner return broadcaster; 71830fdc8d8SChris Lattner } 71930fdc8d8SChris Lattner 72030fdc8d8SChris Lattner lldb_private::Process * 72130fdc8d8SChris Lattner SBProcess::operator->() const 72230fdc8d8SChris Lattner { 7236611103cSGreg Clayton return m_opaque_sp.get(); 72430fdc8d8SChris Lattner } 72530fdc8d8SChris Lattner 72630fdc8d8SChris Lattner size_t 72730fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 72830fdc8d8SChris Lattner { 7292d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 730ceb6b139SCaroline Tice 73130fdc8d8SChris Lattner size_t bytes_read = 0; 73230fdc8d8SChris Lattner 7334838131bSGreg Clayton if (log) 7344838131bSGreg Clayton { 7354838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...", 7364838131bSGreg Clayton m_opaque_sp.get(), 7374838131bSGreg Clayton addr, 7384838131bSGreg Clayton dst, 739c91d804aSGreg Clayton dst_len, 7404838131bSGreg Clayton sb_error.get()); 7414838131bSGreg Clayton } 7424838131bSGreg Clayton 743af67cecdSGreg Clayton if (m_opaque_sp) 74430fdc8d8SChris Lattner { 74530fdc8d8SChris Lattner Error error; 746af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 7476611103cSGreg Clayton bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error); 74830fdc8d8SChris Lattner sb_error.SetError (error); 74930fdc8d8SChris Lattner } 75030fdc8d8SChris Lattner else 75130fdc8d8SChris Lattner { 75230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 75330fdc8d8SChris Lattner } 75430fdc8d8SChris Lattner 755ceb6b139SCaroline Tice if (log) 75693aa84e8SGreg Clayton { 75793aa84e8SGreg Clayton SBStream sstr; 75893aa84e8SGreg Clayton sb_error.GetDescription (sstr); 759c91d804aSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu", 76093aa84e8SGreg Clayton m_opaque_sp.get(), 76193aa84e8SGreg Clayton addr, 76293aa84e8SGreg Clayton dst, 763c91d804aSGreg Clayton dst_len, 76493aa84e8SGreg Clayton sb_error.get(), 76593aa84e8SGreg Clayton sstr.GetData(), 766c91d804aSGreg Clayton bytes_read); 76793aa84e8SGreg Clayton } 768ceb6b139SCaroline Tice 76930fdc8d8SChris Lattner return bytes_read; 77030fdc8d8SChris Lattner } 77130fdc8d8SChris Lattner 77230fdc8d8SChris Lattner size_t 773e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 774e91b7957SGreg Clayton { 775e91b7957SGreg Clayton size_t bytes_read = 0; 776e91b7957SGreg Clayton if (m_opaque_sp) 777e91b7957SGreg Clayton { 778e91b7957SGreg Clayton Error error; 779e91b7957SGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 780e91b7957SGreg Clayton bytes_read = m_opaque_sp->ReadCStringFromMemory (addr, (char *)buf, size, error); 781e91b7957SGreg Clayton sb_error.SetError (error); 782e91b7957SGreg Clayton } 783e91b7957SGreg Clayton else 784e91b7957SGreg Clayton { 785e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 786e91b7957SGreg Clayton } 787e91b7957SGreg Clayton return bytes_read; 788e91b7957SGreg Clayton } 789e91b7957SGreg Clayton 790e91b7957SGreg Clayton uint64_t 791e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 792e91b7957SGreg Clayton { 793e91b7957SGreg Clayton if (m_opaque_sp) 794e91b7957SGreg Clayton { 795e91b7957SGreg Clayton Error error; 796e91b7957SGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 797e91b7957SGreg Clayton uint64_t value = m_opaque_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, error); 798e91b7957SGreg Clayton sb_error.SetError (error); 799e91b7957SGreg Clayton return value; 800e91b7957SGreg Clayton } 801e91b7957SGreg Clayton else 802e91b7957SGreg Clayton { 803e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 804e91b7957SGreg Clayton } 805e91b7957SGreg Clayton return 0; 806e91b7957SGreg Clayton } 807e91b7957SGreg Clayton 808e91b7957SGreg Clayton lldb::addr_t 809e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 810e91b7957SGreg Clayton { 811e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 812e91b7957SGreg Clayton if (m_opaque_sp) 813e91b7957SGreg Clayton { 814e91b7957SGreg Clayton Error error; 815e91b7957SGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 816e91b7957SGreg Clayton ptr = m_opaque_sp->ReadPointerFromMemory (addr, error); 817e91b7957SGreg Clayton sb_error.SetError (error); 818e91b7957SGreg Clayton } 819e91b7957SGreg Clayton else 820e91b7957SGreg Clayton { 821e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 822e91b7957SGreg Clayton } 823e91b7957SGreg Clayton return ptr; 824e91b7957SGreg Clayton } 825e91b7957SGreg Clayton 826e91b7957SGreg Clayton size_t 82730fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 82830fdc8d8SChris Lattner { 82930fdc8d8SChris Lattner size_t bytes_written = 0; 83030fdc8d8SChris Lattner 8312d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8324838131bSGreg Clayton if (log) 8334838131bSGreg Clayton { 8344838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...", 8354838131bSGreg Clayton m_opaque_sp.get(), 8364838131bSGreg Clayton addr, 8374838131bSGreg Clayton src, 838c91d804aSGreg Clayton src_len, 8394838131bSGreg Clayton sb_error.get()); 8404838131bSGreg Clayton } 8414838131bSGreg Clayton 842af67cecdSGreg Clayton if (m_opaque_sp) 84330fdc8d8SChris Lattner { 84430fdc8d8SChris Lattner Error error; 845af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 8466611103cSGreg Clayton bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error); 84730fdc8d8SChris Lattner sb_error.SetError (error); 84830fdc8d8SChris Lattner } 84930fdc8d8SChris Lattner 8504838131bSGreg Clayton if (log) 8514838131bSGreg Clayton { 8524838131bSGreg Clayton SBStream sstr; 8534838131bSGreg Clayton sb_error.GetDescription (sstr); 854c91d804aSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu", 8554838131bSGreg Clayton m_opaque_sp.get(), 8564838131bSGreg Clayton addr, 8574838131bSGreg Clayton src, 858c91d804aSGreg Clayton src_len, 8594838131bSGreg Clayton sb_error.get(), 8604838131bSGreg Clayton sstr.GetData(), 861c91d804aSGreg Clayton bytes_written); 8624838131bSGreg Clayton } 8634838131bSGreg Clayton 86430fdc8d8SChris Lattner return bytes_written; 86530fdc8d8SChris Lattner } 86630fdc8d8SChris Lattner 86730fdc8d8SChris Lattner // Mimic shared pointer... 86830fdc8d8SChris Lattner lldb_private::Process * 86930fdc8d8SChris Lattner SBProcess::get() const 87030fdc8d8SChris Lattner { 8716611103cSGreg Clayton return m_opaque_sp.get(); 87230fdc8d8SChris Lattner } 87330fdc8d8SChris Lattner 874dde9cff3SCaroline Tice bool 875dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 876dde9cff3SCaroline Tice { 877da7bc7d0SGreg Clayton Stream &strm = description.ref(); 878da7bc7d0SGreg Clayton 879dde9cff3SCaroline Tice if (m_opaque_sp) 880dde9cff3SCaroline Tice { 881dde9cff3SCaroline Tice char path[PATH_MAX]; 882dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 883aa149cbdSGreg Clayton Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModulePointer(); 8841d273166SGreg Clayton const char *exe_name = NULL; 8851d273166SGreg Clayton if (exe_module) 8861d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 8871d273166SGreg Clayton 888da7bc7d0SGreg Clayton strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s", 8891d273166SGreg Clayton m_opaque_sp->GetID(), 890ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 8911d273166SGreg Clayton GetNumThreads(), 89205faeb71SGreg Clayton exe_name ? ", executable = " : "", 8931d273166SGreg Clayton exe_name ? exe_name : ""); 894dde9cff3SCaroline Tice } 895dde9cff3SCaroline Tice else 896da7bc7d0SGreg Clayton strm.PutCString ("No value"); 897dde9cff3SCaroline Tice 898dde9cff3SCaroline Tice return true; 899dde9cff3SCaroline Tice } 9008f343b09SGreg Clayton 9018f343b09SGreg Clayton uint32_t 9028f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 9038f343b09SGreg Clayton { 9048f343b09SGreg Clayton if (m_opaque_sp) 905af67cecdSGreg Clayton { 906af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 907c5f57830SGreg Clayton return m_opaque_sp->LoadImage (*sb_image_spec, sb_error.ref()); 908af67cecdSGreg Clayton } 9098f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 9108f343b09SGreg Clayton } 9118f343b09SGreg Clayton 9128f343b09SGreg Clayton lldb::SBError 9138f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 9148f343b09SGreg Clayton { 9158f343b09SGreg Clayton lldb::SBError sb_error; 9168f343b09SGreg Clayton if (m_opaque_sp) 917af67cecdSGreg Clayton { 918af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 9198f343b09SGreg Clayton sb_error.SetError (m_opaque_sp->UnloadImage (image_token)); 920af67cecdSGreg Clayton } 9218f343b09SGreg Clayton else 9228f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 9238f343b09SGreg Clayton return sb_error; 9248f343b09SGreg Clayton } 925