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 77*4bddaeb5SJim Ingham const char * 78*4bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName () 79*4bddaeb5SJim Ingham { 80*4bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 81*4bddaeb5SJim Ingham } 82*4bddaeb5SJim Ingham 83b9556accSGreg Clayton lldb::ProcessSP 84b9556accSGreg Clayton SBProcess::GetSP() const 85b9556accSGreg Clayton { 86b9556accSGreg Clayton return m_opaque_sp; 87b9556accSGreg Clayton } 88b9556accSGreg Clayton 8930fdc8d8SChris Lattner void 90b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 9130fdc8d8SChris Lattner { 926611103cSGreg Clayton m_opaque_sp = process_sp; 9330fdc8d8SChris Lattner } 9430fdc8d8SChris Lattner 9530fdc8d8SChris Lattner void 9630fdc8d8SChris Lattner SBProcess::Clear () 9730fdc8d8SChris Lattner { 986611103cSGreg Clayton m_opaque_sp.reset(); 9930fdc8d8SChris Lattner } 10030fdc8d8SChris Lattner 10130fdc8d8SChris Lattner 10230fdc8d8SChris Lattner bool 10330fdc8d8SChris Lattner SBProcess::IsValid() const 10430fdc8d8SChris Lattner { 1056611103cSGreg Clayton return m_opaque_sp.get() != NULL; 10630fdc8d8SChris Lattner } 10730fdc8d8SChris Lattner 1089631aae2SJames McIlree bool 1099631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1109631aae2SJames McIlree char const **envp, 1119631aae2SJames McIlree const char *stdin_path, 1129631aae2SJames McIlree const char *stdout_path, 1139631aae2SJames McIlree const char *stderr_path, 1149631aae2SJames McIlree const char *working_directory, 1159631aae2SJames McIlree uint32_t launch_flags, 1169631aae2SJames McIlree bool stop_at_entry, 1179631aae2SJames McIlree lldb::SBError& error) 1189631aae2SJames McIlree { 1199631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1209631aae2SJames McIlree if (log) { 1219631aae2SJames 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))...", 1229631aae2SJames McIlree m_opaque_sp.get(), 1239631aae2SJames McIlree argv, 1249631aae2SJames McIlree envp, 1259631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1269631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1279631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1289631aae2SJames McIlree working_directory ? working_directory : "NULL", 1299631aae2SJames McIlree launch_flags, 1309631aae2SJames McIlree stop_at_entry, 1319631aae2SJames McIlree error.get()); 1329631aae2SJames McIlree } 1339631aae2SJames McIlree 134acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 135acdbe816SGreg Clayton if (process_sp) 1369631aae2SJames McIlree { 137acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 138acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1399631aae2SJames McIlree { 140982c9762SGreg Clayton if (stop_at_entry) 141982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 142982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 143982c9762SGreg Clayton stdout_path, 144982c9762SGreg Clayton stderr_path, 145982c9762SGreg Clayton working_directory, 146982c9762SGreg Clayton launch_flags); 147acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 148982c9762SGreg Clayton if (exe_module) 149982c9762SGreg Clayton launch_info.SetExecutableFile(exe_module->GetFileSpec(), true); 150982c9762SGreg Clayton if (argv) 151982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 152982c9762SGreg Clayton if (envp) 153982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 154acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1559631aae2SJames McIlree } 1569631aae2SJames McIlree else 1579631aae2SJames McIlree { 1589631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1599631aae2SJames McIlree } 1609631aae2SJames McIlree } 1619631aae2SJames McIlree else 1629631aae2SJames McIlree { 1639631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1649631aae2SJames McIlree } 1659631aae2SJames McIlree 1669631aae2SJames McIlree if (log) { 1679631aae2SJames McIlree SBStream sstr; 1689631aae2SJames McIlree error.GetDescription (sstr); 169acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData()); 1709631aae2SJames McIlree } 1719631aae2SJames McIlree 1729631aae2SJames McIlree return error.Success(); 1739631aae2SJames McIlree } 1749631aae2SJames McIlree 1759631aae2SJames McIlree bool 1769631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 1779631aae2SJames McIlree { 178acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 179acdbe816SGreg Clayton if (process_sp) 1809631aae2SJames McIlree { 181acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 182acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1839631aae2SJames McIlree { 184144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 185144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 186acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 1879631aae2SJames McIlree } 1889631aae2SJames McIlree else 1899631aae2SJames McIlree { 1909631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 1919631aae2SJames McIlree } 1929631aae2SJames McIlree } 1939631aae2SJames McIlree else 1949631aae2SJames McIlree { 1959631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1969631aae2SJames McIlree } 1979631aae2SJames McIlree 1989631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1999631aae2SJames McIlree if (log) { 2009631aae2SJames McIlree SBStream sstr; 2019631aae2SJames McIlree error.GetDescription (sstr); 202acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData()); 2039631aae2SJames McIlree } 2049631aae2SJames McIlree 2059631aae2SJames McIlree return error.Success(); 2069631aae2SJames McIlree } 2079631aae2SJames McIlree 20830fdc8d8SChris Lattner 20930fdc8d8SChris Lattner uint32_t 21030fdc8d8SChris Lattner SBProcess::GetNumThreads () 21130fdc8d8SChris Lattner { 2122d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 213ceb6b139SCaroline Tice 214ceb6b139SCaroline Tice uint32_t num_threads = 0; 215acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 216acdbe816SGreg Clayton if (process_sp) 21730fdc8d8SChris Lattner { 218acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 21930fdc8d8SChris Lattner const bool can_update = true; 220acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 22130fdc8d8SChris Lattner } 222ceb6b139SCaroline Tice 223ceb6b139SCaroline Tice if (log) 224acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads); 225ceb6b139SCaroline Tice 226ceb6b139SCaroline Tice return num_threads; 22730fdc8d8SChris Lattner } 22830fdc8d8SChris Lattner 22930fdc8d8SChris Lattner SBThread 2302976d00aSJim Ingham SBProcess::GetSelectedThread () const 23130fdc8d8SChris Lattner { 2322d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 233ceb6b139SCaroline Tice 23430fdc8d8SChris Lattner SBThread sb_thread; 23517a6ad05SGreg Clayton ThreadSP thread_sp; 236acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 237acdbe816SGreg Clayton if (process_sp) 238af67cecdSGreg Clayton { 239acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 240acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 24117a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 242af67cecdSGreg Clayton } 243ceb6b139SCaroline Tice 244ceb6b139SCaroline Tice if (log) 245ceb6b139SCaroline Tice { 246acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get()); 247ceb6b139SCaroline Tice } 248ceb6b139SCaroline Tice 24930fdc8d8SChris Lattner return sb_thread; 25030fdc8d8SChris Lattner } 25130fdc8d8SChris Lattner 25230fdc8d8SChris Lattner SBTarget 25330fdc8d8SChris Lattner SBProcess::GetTarget() const 25430fdc8d8SChris Lattner { 2552d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 256ceb6b139SCaroline Tice 25730fdc8d8SChris Lattner SBTarget sb_target; 258b9556accSGreg Clayton TargetSP target_sp; 259acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 260acdbe816SGreg Clayton if (process_sp) 261b9556accSGreg Clayton { 262acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 263b9556accSGreg Clayton sb_target.SetSP (target_sp); 264b9556accSGreg Clayton } 265ceb6b139SCaroline Tice 266ceb6b139SCaroline Tice if (log) 267acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get()); 268ceb6b139SCaroline Tice 26930fdc8d8SChris Lattner return sb_target; 27030fdc8d8SChris Lattner } 27130fdc8d8SChris Lattner 27230fdc8d8SChris Lattner 27330fdc8d8SChris Lattner size_t 27430fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 27530fdc8d8SChris Lattner { 2762d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 277ceb6b139SCaroline Tice 278ceb6b139SCaroline Tice size_t ret_val = 0; 279acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 280acdbe816SGreg Clayton if (process_sp) 28130fdc8d8SChris Lattner { 28230fdc8d8SChris Lattner Error error; 283acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 28430fdc8d8SChris Lattner } 285ceb6b139SCaroline Tice 286ceb6b139SCaroline Tice if (log) 287fd54b368SJason Molenda log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu", 288acdbe816SGreg Clayton process_sp.get(), 28993aa84e8SGreg Clayton src, 29093aa84e8SGreg Clayton (uint32_t) src_len, 29193aa84e8SGreg Clayton ret_val); 292ceb6b139SCaroline Tice 293ceb6b139SCaroline Tice return ret_val; 29430fdc8d8SChris Lattner } 29530fdc8d8SChris Lattner 29630fdc8d8SChris Lattner size_t 29730fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 29830fdc8d8SChris Lattner { 299cfd1acedSGreg Clayton size_t bytes_read = 0; 300acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 301acdbe816SGreg Clayton if (process_sp) 30230fdc8d8SChris Lattner { 30330fdc8d8SChris Lattner Error error; 304acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 30530fdc8d8SChris Lattner } 306ceb6b139SCaroline Tice 3072d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 308ceb6b139SCaroline Tice if (log) 309cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu", 310acdbe816SGreg Clayton process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 311ceb6b139SCaroline Tice 312cfd1acedSGreg Clayton return bytes_read; 31330fdc8d8SChris Lattner } 31430fdc8d8SChris Lattner 31530fdc8d8SChris Lattner size_t 31630fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 31730fdc8d8SChris Lattner { 318cfd1acedSGreg Clayton size_t bytes_read = 0; 319acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 320acdbe816SGreg Clayton if (process_sp) 32130fdc8d8SChris Lattner { 32230fdc8d8SChris Lattner Error error; 323acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 32430fdc8d8SChris Lattner } 325ceb6b139SCaroline Tice 3262d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 327ceb6b139SCaroline Tice if (log) 328cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu", 329acdbe816SGreg Clayton process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 330ceb6b139SCaroline Tice 331cfd1acedSGreg Clayton return bytes_read; 33230fdc8d8SChris Lattner } 33330fdc8d8SChris Lattner 33430fdc8d8SChris Lattner void 3352976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 33630fdc8d8SChris Lattner { 33730fdc8d8SChris Lattner if (out == NULL) 33830fdc8d8SChris Lattner return; 33930fdc8d8SChris Lattner 340acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 341acdbe816SGreg Clayton if (process_sp) 34230fdc8d8SChris Lattner { 34330fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 34430fdc8d8SChris Lattner char message[1024]; 34530fdc8d8SChris Lattner int message_len = ::snprintf (message, 34630fdc8d8SChris Lattner sizeof (message), 34781c22f61SGreg Clayton "Process %llu %s\n", 348acdbe816SGreg Clayton process_sp->GetID(), 34930fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 35030fdc8d8SChris Lattner 35130fdc8d8SChris Lattner if (message_len > 0) 35230fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 35330fdc8d8SChris Lattner } 35430fdc8d8SChris Lattner } 35530fdc8d8SChris Lattner 35630fdc8d8SChris Lattner void 3572976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 35830fdc8d8SChris Lattner { 359acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 360acdbe816SGreg Clayton if (process_sp) 36130fdc8d8SChris Lattner { 36230fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 36330fdc8d8SChris Lattner char message[1024]; 36430fdc8d8SChris Lattner ::snprintf (message, 36530fdc8d8SChris Lattner sizeof (message), 36681c22f61SGreg Clayton "Process %llu %s\n", 367acdbe816SGreg Clayton process_sp->GetID(), 36830fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 36930fdc8d8SChris Lattner 37030fdc8d8SChris Lattner result.AppendMessage (message); 37130fdc8d8SChris Lattner } 37230fdc8d8SChris Lattner } 37330fdc8d8SChris Lattner 37430fdc8d8SChris Lattner bool 3752976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 37630fdc8d8SChris Lattner { 377acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 378acdbe816SGreg Clayton if (process_sp) 379af67cecdSGreg Clayton { 380acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 381acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 382af67cecdSGreg Clayton } 38330fdc8d8SChris Lattner return false; 38430fdc8d8SChris Lattner } 38530fdc8d8SChris Lattner 38630fdc8d8SChris Lattner bool 3872976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 38830fdc8d8SChris Lattner { 3892d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 390ceb6b139SCaroline Tice 391ceb6b139SCaroline Tice bool ret_val = false; 392acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 393acdbe816SGreg Clayton if (process_sp) 394af67cecdSGreg Clayton { 395acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 396acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 397af67cecdSGreg Clayton } 398ceb6b139SCaroline Tice 399ceb6b139SCaroline Tice if (log) 400cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s", 401acdbe816SGreg Clayton process_sp.get(), tid, (ret_val ? "true" : "false")); 402ceb6b139SCaroline Tice 403ceb6b139SCaroline Tice return ret_val; 40430fdc8d8SChris Lattner } 40530fdc8d8SChris Lattner 40630fdc8d8SChris Lattner SBThread 40730fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 40830fdc8d8SChris Lattner { 4092d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 410ceb6b139SCaroline Tice 41117a6ad05SGreg Clayton SBThread sb_thread; 41217a6ad05SGreg Clayton ThreadSP thread_sp; 413acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 414acdbe816SGreg Clayton if (process_sp) 415af67cecdSGreg Clayton { 416acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 417acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index); 41817a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 419af67cecdSGreg Clayton } 420ceb6b139SCaroline Tice 421ceb6b139SCaroline Tice if (log) 422ceb6b139SCaroline Tice { 42393aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 424acdbe816SGreg Clayton process_sp.get(), (uint32_t) index, thread_sp.get()); 425ceb6b139SCaroline Tice } 426ceb6b139SCaroline Tice 42717a6ad05SGreg Clayton return sb_thread; 42830fdc8d8SChris Lattner } 42930fdc8d8SChris Lattner 43030fdc8d8SChris Lattner StateType 43130fdc8d8SChris Lattner SBProcess::GetState () 43230fdc8d8SChris Lattner { 433ceb6b139SCaroline Tice 434ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 435acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 436acdbe816SGreg Clayton if (process_sp) 437af67cecdSGreg Clayton { 438acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 439acdbe816SGreg Clayton ret_val = process_sp->GetState(); 440af67cecdSGreg Clayton } 441ceb6b139SCaroline Tice 4422d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 443ceb6b139SCaroline Tice if (log) 444cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 445acdbe816SGreg Clayton process_sp.get(), 446750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 447ceb6b139SCaroline Tice 448ceb6b139SCaroline Tice return ret_val; 44930fdc8d8SChris Lattner } 45030fdc8d8SChris Lattner 45130fdc8d8SChris Lattner 45230fdc8d8SChris Lattner int 45330fdc8d8SChris Lattner SBProcess::GetExitStatus () 45430fdc8d8SChris Lattner { 4554838131bSGreg Clayton int exit_status = 0; 456acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 457acdbe816SGreg Clayton if (process_sp) 458af67cecdSGreg Clayton { 459acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 460acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 461af67cecdSGreg Clayton } 4622d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4634838131bSGreg Clayton if (log) 4644838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 465acdbe816SGreg Clayton process_sp.get(), exit_status, exit_status); 4664838131bSGreg Clayton 4674838131bSGreg Clayton return exit_status; 46830fdc8d8SChris Lattner } 46930fdc8d8SChris Lattner 47030fdc8d8SChris Lattner const char * 47130fdc8d8SChris Lattner SBProcess::GetExitDescription () 47230fdc8d8SChris Lattner { 4734838131bSGreg Clayton const char *exit_desc = NULL; 474acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 475acdbe816SGreg Clayton if (process_sp) 476af67cecdSGreg Clayton { 477acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 478acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 479af67cecdSGreg Clayton } 4802d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4814838131bSGreg Clayton if (log) 4824838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 483acdbe816SGreg Clayton process_sp.get(), exit_desc); 4844838131bSGreg Clayton return exit_desc; 48530fdc8d8SChris Lattner } 48630fdc8d8SChris Lattner 48730fdc8d8SChris Lattner lldb::pid_t 48830fdc8d8SChris Lattner SBProcess::GetProcessID () 48930fdc8d8SChris Lattner { 490ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 491acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 492acdbe816SGreg Clayton if (process_sp) 493acdbe816SGreg Clayton ret_val = process_sp->GetID(); 494ceb6b139SCaroline Tice 4952d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 496ceb6b139SCaroline Tice if (log) 497acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val); 498ceb6b139SCaroline Tice 499ceb6b139SCaroline Tice return ret_val; 50030fdc8d8SChris Lattner } 50130fdc8d8SChris Lattner 502cf386e24SJohnny Chen ByteOrder 503cf386e24SJohnny Chen SBProcess::GetByteOrder () const 504cf386e24SJohnny Chen { 505cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 506acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 507acdbe816SGreg Clayton if (process_sp) 508acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 509cf386e24SJohnny Chen 510cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 511cf386e24SJohnny Chen if (log) 512acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder); 513cf386e24SJohnny Chen 514cf386e24SJohnny Chen return byteOrder; 515cf386e24SJohnny Chen } 516cf386e24SJohnny Chen 51730fdc8d8SChris Lattner uint32_t 51830fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 51930fdc8d8SChris Lattner { 520ceb6b139SCaroline Tice uint32_t size = 0; 521acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 522acdbe816SGreg Clayton if (process_sp) 523acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 524ceb6b139SCaroline Tice 5252d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 526ceb6b139SCaroline Tice if (log) 527acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size); 528ceb6b139SCaroline Tice 529ceb6b139SCaroline Tice return size; 53030fdc8d8SChris Lattner } 53130fdc8d8SChris Lattner 53230fdc8d8SChris Lattner SBError 53330fdc8d8SChris Lattner SBProcess::Continue () 53430fdc8d8SChris Lattner { 5352d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 536ceb6b139SCaroline Tice 53730fdc8d8SChris Lattner SBError sb_error; 538acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 5390c74e78dSGreg Clayton 540acdbe816SGreg Clayton if (log) 541acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get()); 542acdbe816SGreg Clayton 543acdbe816SGreg Clayton if (process_sp) 544acdbe816SGreg Clayton { 545acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 546acdbe816SGreg Clayton 547acdbe816SGreg Clayton Error error (process_sp->Resume()); 5485d5028b5SGreg Clayton if (error.Success()) 5495d5028b5SGreg Clayton { 550acdbe816SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 5514838131bSGreg Clayton { 5524838131bSGreg Clayton if (log) 553acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get()); 554acdbe816SGreg Clayton process_sp->WaitForProcessToStop (NULL); 5555d5028b5SGreg Clayton } 5564838131bSGreg Clayton } 5575d5028b5SGreg Clayton sb_error.SetError(error); 5585d5028b5SGreg Clayton } 55930fdc8d8SChris Lattner else 56030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 56130fdc8d8SChris Lattner 562ceb6b139SCaroline Tice if (log) 563ceb6b139SCaroline Tice { 564ceb6b139SCaroline Tice SBStream sstr; 565ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 566acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData()); 567ceb6b139SCaroline Tice } 568ceb6b139SCaroline Tice 56930fdc8d8SChris Lattner return sb_error; 57030fdc8d8SChris Lattner } 57130fdc8d8SChris Lattner 57230fdc8d8SChris Lattner 57330fdc8d8SChris Lattner SBError 57430fdc8d8SChris Lattner SBProcess::Destroy () 57530fdc8d8SChris Lattner { 57630fdc8d8SChris Lattner SBError sb_error; 577acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 578acdbe816SGreg Clayton if (process_sp) 5796779606aSGreg Clayton { 580acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 581acdbe816SGreg Clayton sb_error.SetError(process_sp->Destroy()); 5826779606aSGreg Clayton } 58330fdc8d8SChris Lattner else 58430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 58530fdc8d8SChris Lattner 5862d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5874838131bSGreg Clayton if (log) 5884838131bSGreg Clayton { 5894838131bSGreg Clayton SBStream sstr; 5904838131bSGreg Clayton sb_error.GetDescription (sstr); 5916779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 592acdbe816SGreg Clayton process_sp.get(), 5936779606aSGreg Clayton sb_error.get(), 5946779606aSGreg Clayton sstr.GetData()); 5954838131bSGreg Clayton } 5964838131bSGreg Clayton 59730fdc8d8SChris Lattner return sb_error; 59830fdc8d8SChris Lattner } 59930fdc8d8SChris Lattner 60030fdc8d8SChris Lattner 60130fdc8d8SChris Lattner SBError 60230fdc8d8SChris Lattner SBProcess::Stop () 60330fdc8d8SChris Lattner { 60430fdc8d8SChris Lattner SBError sb_error; 605acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 606acdbe816SGreg Clayton if (process_sp) 607af67cecdSGreg Clayton { 608acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 609acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 610af67cecdSGreg Clayton } 61130fdc8d8SChris Lattner else 61230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 613ceb6b139SCaroline Tice 6142d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 615ceb6b139SCaroline Tice if (log) 616ceb6b139SCaroline Tice { 617ceb6b139SCaroline Tice SBStream sstr; 618ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 61993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 620acdbe816SGreg Clayton process_sp.get(), 62193aa84e8SGreg Clayton sb_error.get(), 622750cd175SCaroline Tice sstr.GetData()); 623ceb6b139SCaroline Tice } 624ceb6b139SCaroline Tice 62530fdc8d8SChris Lattner return sb_error; 62630fdc8d8SChris Lattner } 62730fdc8d8SChris Lattner 62830fdc8d8SChris Lattner SBError 62930fdc8d8SChris Lattner SBProcess::Kill () 63030fdc8d8SChris Lattner { 63130fdc8d8SChris Lattner SBError sb_error; 632acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 633acdbe816SGreg Clayton if (process_sp) 634af67cecdSGreg Clayton { 635acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 636acdbe816SGreg Clayton sb_error.SetError (process_sp->Destroy()); 637af67cecdSGreg Clayton } 63830fdc8d8SChris Lattner else 63930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 640ceb6b139SCaroline Tice 6412d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 642ceb6b139SCaroline Tice if (log) 643ceb6b139SCaroline Tice { 644ceb6b139SCaroline Tice SBStream sstr; 645ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 64693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 647acdbe816SGreg Clayton process_sp.get(), 64893aa84e8SGreg Clayton sb_error.get(), 649750cd175SCaroline Tice sstr.GetData()); 650ceb6b139SCaroline Tice } 651ceb6b139SCaroline Tice 65230fdc8d8SChris Lattner return sb_error; 65330fdc8d8SChris Lattner } 65430fdc8d8SChris Lattner 65530fdc8d8SChris Lattner SBError 65630fdc8d8SChris Lattner SBProcess::Detach () 65730fdc8d8SChris Lattner { 65830fdc8d8SChris Lattner SBError sb_error; 659acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 660acdbe816SGreg Clayton if (process_sp) 661af67cecdSGreg Clayton { 662acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 663acdbe816SGreg Clayton sb_error.SetError (process_sp->Detach()); 664af67cecdSGreg Clayton } 66530fdc8d8SChris Lattner else 66630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 66730fdc8d8SChris Lattner 66830fdc8d8SChris Lattner return sb_error; 66930fdc8d8SChris Lattner } 67030fdc8d8SChris Lattner 67130fdc8d8SChris Lattner SBError 6724838131bSGreg Clayton SBProcess::Signal (int signo) 67330fdc8d8SChris Lattner { 67430fdc8d8SChris Lattner SBError sb_error; 675acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 676acdbe816SGreg Clayton if (process_sp) 677af67cecdSGreg Clayton { 678acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 679acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 680af67cecdSGreg Clayton } 68130fdc8d8SChris Lattner else 68230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 6832d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6844838131bSGreg Clayton if (log) 6854838131bSGreg Clayton { 6864838131bSGreg Clayton SBStream sstr; 6874838131bSGreg Clayton sb_error.GetDescription (sstr); 6884838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 689acdbe816SGreg Clayton process_sp.get(), 6904838131bSGreg Clayton signo, 6914838131bSGreg Clayton sb_error.get(), 6924838131bSGreg Clayton sstr.GetData()); 6934838131bSGreg Clayton } 69430fdc8d8SChris Lattner return sb_error; 69530fdc8d8SChris Lattner } 69630fdc8d8SChris Lattner 69730fdc8d8SChris Lattner SBThread 6984838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 69930fdc8d8SChris Lattner { 7004838131bSGreg Clayton SBThread sb_thread; 70117a6ad05SGreg Clayton ThreadSP thread_sp; 702acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 703acdbe816SGreg Clayton if (process_sp) 704af67cecdSGreg Clayton { 705acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 706acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid); 70717a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 708af67cecdSGreg Clayton } 7094838131bSGreg Clayton 7102d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7114838131bSGreg Clayton if (log) 7124838131bSGreg Clayton { 71361e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)", 714acdbe816SGreg Clayton process_sp.get(), 7154838131bSGreg Clayton tid, 71617a6ad05SGreg Clayton thread_sp.get()); 7174838131bSGreg Clayton } 7184838131bSGreg Clayton 7194838131bSGreg Clayton return sb_thread; 72030fdc8d8SChris Lattner } 72130fdc8d8SChris Lattner 72230fdc8d8SChris Lattner StateType 72330fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 72430fdc8d8SChris Lattner { 7252d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 726ceb6b139SCaroline Tice 727ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 728ceb6b139SCaroline Tice 729ceb6b139SCaroline Tice if (log) 730cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 731750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 732ceb6b139SCaroline Tice 733ceb6b139SCaroline Tice return ret_val; 73430fdc8d8SChris Lattner } 73530fdc8d8SChris Lattner 73630fdc8d8SChris Lattner bool 73730fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 73830fdc8d8SChris Lattner { 7396611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 74030fdc8d8SChris Lattner } 74130fdc8d8SChris Lattner 74230fdc8d8SChris Lattner SBProcess 74330fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 74430fdc8d8SChris Lattner { 7456611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 74630fdc8d8SChris Lattner return process; 74730fdc8d8SChris Lattner } 74830fdc8d8SChris Lattner 749e6bc6cb9SJim Ingham bool 750e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 751e6bc6cb9SJim Ingham { 752*4bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 753e6bc6cb9SJim Ingham } 75430fdc8d8SChris Lattner 75530fdc8d8SChris Lattner SBBroadcaster 75630fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 75730fdc8d8SChris Lattner { 7582d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 759ceb6b139SCaroline Tice 760acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 761acdbe816SGreg Clayton 762acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 763ceb6b139SCaroline Tice 764ceb6b139SCaroline Tice if (log) 765acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 766750cd175SCaroline Tice broadcaster.get()); 767ceb6b139SCaroline Tice 76830fdc8d8SChris Lattner return broadcaster; 76930fdc8d8SChris Lattner } 77030fdc8d8SChris Lattner 771*4bddaeb5SJim Ingham const char * 772*4bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 773*4bddaeb5SJim Ingham { 774*4bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 775*4bddaeb5SJim Ingham } 776*4bddaeb5SJim Ingham 77730fdc8d8SChris Lattner size_t 77830fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 77930fdc8d8SChris Lattner { 7802d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 781ceb6b139SCaroline Tice 78230fdc8d8SChris Lattner size_t bytes_read = 0; 78330fdc8d8SChris Lattner 784acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 785acdbe816SGreg Clayton 7864838131bSGreg Clayton if (log) 7874838131bSGreg Clayton { 7884838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...", 789acdbe816SGreg Clayton process_sp.get(), 7904838131bSGreg Clayton addr, 7914838131bSGreg Clayton dst, 792c91d804aSGreg Clayton dst_len, 7934838131bSGreg Clayton sb_error.get()); 7944838131bSGreg Clayton } 7954838131bSGreg Clayton 796acdbe816SGreg Clayton if (process_sp) 79730fdc8d8SChris Lattner { 79830fdc8d8SChris Lattner Error error; 799acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 800acdbe816SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, error); 80130fdc8d8SChris Lattner sb_error.SetError (error); 80230fdc8d8SChris Lattner } 80330fdc8d8SChris Lattner else 80430fdc8d8SChris Lattner { 80530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 80630fdc8d8SChris Lattner } 80730fdc8d8SChris Lattner 808ceb6b139SCaroline Tice if (log) 80993aa84e8SGreg Clayton { 81093aa84e8SGreg Clayton SBStream sstr; 81193aa84e8SGreg Clayton sb_error.GetDescription (sstr); 812c91d804aSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu", 813acdbe816SGreg Clayton process_sp.get(), 81493aa84e8SGreg Clayton addr, 81593aa84e8SGreg Clayton dst, 816c91d804aSGreg Clayton dst_len, 81793aa84e8SGreg Clayton sb_error.get(), 81893aa84e8SGreg Clayton sstr.GetData(), 819c91d804aSGreg Clayton bytes_read); 82093aa84e8SGreg Clayton } 821ceb6b139SCaroline Tice 82230fdc8d8SChris Lattner return bytes_read; 82330fdc8d8SChris Lattner } 82430fdc8d8SChris Lattner 82530fdc8d8SChris Lattner size_t 826e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 827e91b7957SGreg Clayton { 828e91b7957SGreg Clayton size_t bytes_read = 0; 829acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 830acdbe816SGreg Clayton if (process_sp) 831e91b7957SGreg Clayton { 832e91b7957SGreg Clayton Error error; 833acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 834acdbe816SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, error); 835e91b7957SGreg Clayton sb_error.SetError (error); 836e91b7957SGreg Clayton } 837e91b7957SGreg Clayton else 838e91b7957SGreg Clayton { 839e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 840e91b7957SGreg Clayton } 841e91b7957SGreg Clayton return bytes_read; 842e91b7957SGreg Clayton } 843e91b7957SGreg Clayton 844e91b7957SGreg Clayton uint64_t 845e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 846e91b7957SGreg Clayton { 847acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 848acdbe816SGreg Clayton if (process_sp) 849e91b7957SGreg Clayton { 850e91b7957SGreg Clayton Error error; 851acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 852acdbe816SGreg Clayton uint64_t value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, error); 853e91b7957SGreg Clayton sb_error.SetError (error); 854e91b7957SGreg Clayton return value; 855e91b7957SGreg Clayton } 856e91b7957SGreg Clayton else 857e91b7957SGreg Clayton { 858e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 859e91b7957SGreg Clayton } 860e91b7957SGreg Clayton return 0; 861e91b7957SGreg Clayton } 862e91b7957SGreg Clayton 863e91b7957SGreg Clayton lldb::addr_t 864e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 865e91b7957SGreg Clayton { 866e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 867acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 868acdbe816SGreg Clayton if (process_sp) 869e91b7957SGreg Clayton { 870e91b7957SGreg Clayton Error error; 871acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 872acdbe816SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, error); 873e91b7957SGreg Clayton sb_error.SetError (error); 874e91b7957SGreg Clayton } 875e91b7957SGreg Clayton else 876e91b7957SGreg Clayton { 877e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 878e91b7957SGreg Clayton } 879e91b7957SGreg Clayton return ptr; 880e91b7957SGreg Clayton } 881e91b7957SGreg Clayton 882e91b7957SGreg Clayton size_t 88330fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 88430fdc8d8SChris Lattner { 88530fdc8d8SChris Lattner size_t bytes_written = 0; 88630fdc8d8SChris Lattner 8872d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 888acdbe816SGreg Clayton 889acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 890acdbe816SGreg Clayton 8914838131bSGreg Clayton if (log) 8924838131bSGreg Clayton { 8934838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...", 894acdbe816SGreg Clayton process_sp.get(), 8954838131bSGreg Clayton addr, 8964838131bSGreg Clayton src, 897c91d804aSGreg Clayton src_len, 8984838131bSGreg Clayton sb_error.get()); 8994838131bSGreg Clayton } 9004838131bSGreg Clayton 901acdbe816SGreg Clayton if (process_sp) 90230fdc8d8SChris Lattner { 90330fdc8d8SChris Lattner Error error; 904acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 905acdbe816SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, error); 90630fdc8d8SChris Lattner sb_error.SetError (error); 90730fdc8d8SChris Lattner } 90830fdc8d8SChris Lattner 9094838131bSGreg Clayton if (log) 9104838131bSGreg Clayton { 9114838131bSGreg Clayton SBStream sstr; 9124838131bSGreg Clayton sb_error.GetDescription (sstr); 913c91d804aSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu", 914acdbe816SGreg Clayton process_sp.get(), 9154838131bSGreg Clayton addr, 9164838131bSGreg Clayton src, 917c91d804aSGreg Clayton src_len, 9184838131bSGreg Clayton sb_error.get(), 9194838131bSGreg Clayton sstr.GetData(), 920c91d804aSGreg Clayton bytes_written); 9214838131bSGreg Clayton } 9224838131bSGreg Clayton 92330fdc8d8SChris Lattner return bytes_written; 92430fdc8d8SChris Lattner } 92530fdc8d8SChris Lattner 926dde9cff3SCaroline Tice bool 927dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 928dde9cff3SCaroline Tice { 929da7bc7d0SGreg Clayton Stream &strm = description.ref(); 930da7bc7d0SGreg Clayton 931acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 932acdbe816SGreg Clayton if (process_sp) 933dde9cff3SCaroline Tice { 934dde9cff3SCaroline Tice char path[PATH_MAX]; 935dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 936acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 9371d273166SGreg Clayton const char *exe_name = NULL; 9381d273166SGreg Clayton if (exe_module) 9391d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 9401d273166SGreg Clayton 941da7bc7d0SGreg Clayton strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s", 942acdbe816SGreg Clayton process_sp->GetID(), 943ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 9441d273166SGreg Clayton GetNumThreads(), 94505faeb71SGreg Clayton exe_name ? ", executable = " : "", 9461d273166SGreg Clayton exe_name ? exe_name : ""); 947dde9cff3SCaroline Tice } 948dde9cff3SCaroline Tice else 949da7bc7d0SGreg Clayton strm.PutCString ("No value"); 950dde9cff3SCaroline Tice 951dde9cff3SCaroline Tice return true; 952dde9cff3SCaroline Tice } 9538f343b09SGreg Clayton 9548f343b09SGreg Clayton uint32_t 9558f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 9568f343b09SGreg Clayton { 957acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 958acdbe816SGreg Clayton if (process_sp) 959af67cecdSGreg Clayton { 960acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 961acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 962af67cecdSGreg Clayton } 9638f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 9648f343b09SGreg Clayton } 9658f343b09SGreg Clayton 9668f343b09SGreg Clayton lldb::SBError 9678f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 9688f343b09SGreg Clayton { 9698f343b09SGreg Clayton lldb::SBError sb_error; 970acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 971acdbe816SGreg Clayton if (process_sp) 972af67cecdSGreg Clayton { 973acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 974acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 975af67cecdSGreg Clayton } 9768f343b09SGreg Clayton else 9778f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 9788f343b09SGreg Clayton return sb_error; 9798f343b09SGreg Clayton } 980