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 77b9556accSGreg Clayton lldb::ProcessSP 78b9556accSGreg Clayton SBProcess::GetSP() const 79b9556accSGreg Clayton { 80b9556accSGreg Clayton return m_opaque_sp; 81b9556accSGreg Clayton } 82b9556accSGreg Clayton 8330fdc8d8SChris Lattner void 84b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 8530fdc8d8SChris Lattner { 866611103cSGreg Clayton m_opaque_sp = process_sp; 8730fdc8d8SChris Lattner } 8830fdc8d8SChris Lattner 8930fdc8d8SChris Lattner void 9030fdc8d8SChris Lattner SBProcess::Clear () 9130fdc8d8SChris Lattner { 926611103cSGreg Clayton m_opaque_sp.reset(); 9330fdc8d8SChris Lattner } 9430fdc8d8SChris Lattner 9530fdc8d8SChris Lattner 9630fdc8d8SChris Lattner bool 9730fdc8d8SChris Lattner SBProcess::IsValid() const 9830fdc8d8SChris Lattner { 996611103cSGreg Clayton return m_opaque_sp.get() != NULL; 10030fdc8d8SChris Lattner } 10130fdc8d8SChris Lattner 1029631aae2SJames McIlree bool 1039631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1049631aae2SJames McIlree char const **envp, 1059631aae2SJames McIlree const char *stdin_path, 1069631aae2SJames McIlree const char *stdout_path, 1079631aae2SJames McIlree const char *stderr_path, 1089631aae2SJames McIlree const char *working_directory, 1099631aae2SJames McIlree uint32_t launch_flags, 1109631aae2SJames McIlree bool stop_at_entry, 1119631aae2SJames McIlree lldb::SBError& error) 1129631aae2SJames McIlree { 1139631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1149631aae2SJames McIlree if (log) { 1159631aae2SJames 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))...", 1169631aae2SJames McIlree m_opaque_sp.get(), 1179631aae2SJames McIlree argv, 1189631aae2SJames McIlree envp, 1199631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1209631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1219631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1229631aae2SJames McIlree working_directory ? working_directory : "NULL", 1239631aae2SJames McIlree launch_flags, 1249631aae2SJames McIlree stop_at_entry, 1259631aae2SJames McIlree error.get()); 1269631aae2SJames McIlree } 1279631aae2SJames McIlree 128*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 129*acdbe816SGreg Clayton if (process_sp) 1309631aae2SJames McIlree { 131*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 132*acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1339631aae2SJames McIlree { 134982c9762SGreg Clayton if (stop_at_entry) 135982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 136982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 137982c9762SGreg Clayton stdout_path, 138982c9762SGreg Clayton stderr_path, 139982c9762SGreg Clayton working_directory, 140982c9762SGreg Clayton launch_flags); 141*acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 142982c9762SGreg Clayton if (exe_module) 143982c9762SGreg Clayton launch_info.SetExecutableFile(exe_module->GetFileSpec(), true); 144982c9762SGreg Clayton if (argv) 145982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 146982c9762SGreg Clayton if (envp) 147982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 148*acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1499631aae2SJames McIlree } 1509631aae2SJames McIlree else 1519631aae2SJames McIlree { 1529631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1539631aae2SJames McIlree } 1549631aae2SJames McIlree } 1559631aae2SJames McIlree else 1569631aae2SJames McIlree { 1579631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1589631aae2SJames McIlree } 1599631aae2SJames McIlree 1609631aae2SJames McIlree if (log) { 1619631aae2SJames McIlree SBStream sstr; 1629631aae2SJames McIlree error.GetDescription (sstr); 163*acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData()); 1649631aae2SJames McIlree } 1659631aae2SJames McIlree 1669631aae2SJames McIlree return error.Success(); 1679631aae2SJames McIlree } 1689631aae2SJames McIlree 1699631aae2SJames McIlree bool 1709631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 1719631aae2SJames McIlree { 172*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 173*acdbe816SGreg Clayton if (process_sp) 1749631aae2SJames McIlree { 175*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 176*acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1779631aae2SJames McIlree { 178144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 179144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 180*acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 1819631aae2SJames McIlree } 1829631aae2SJames McIlree else 1839631aae2SJames McIlree { 1849631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 1859631aae2SJames McIlree } 1869631aae2SJames McIlree } 1879631aae2SJames McIlree else 1889631aae2SJames McIlree { 1899631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1909631aae2SJames McIlree } 1919631aae2SJames McIlree 1929631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1939631aae2SJames McIlree if (log) { 1949631aae2SJames McIlree SBStream sstr; 1959631aae2SJames McIlree error.GetDescription (sstr); 196*acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData()); 1979631aae2SJames McIlree } 1989631aae2SJames McIlree 1999631aae2SJames McIlree return error.Success(); 2009631aae2SJames McIlree } 2019631aae2SJames McIlree 20230fdc8d8SChris Lattner 20330fdc8d8SChris Lattner uint32_t 20430fdc8d8SChris Lattner SBProcess::GetNumThreads () 20530fdc8d8SChris Lattner { 2062d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 207ceb6b139SCaroline Tice 208ceb6b139SCaroline Tice uint32_t num_threads = 0; 209*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 210*acdbe816SGreg Clayton if (process_sp) 21130fdc8d8SChris Lattner { 212*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 21330fdc8d8SChris Lattner const bool can_update = true; 214*acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 21530fdc8d8SChris Lattner } 216ceb6b139SCaroline Tice 217ceb6b139SCaroline Tice if (log) 218*acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads); 219ceb6b139SCaroline Tice 220ceb6b139SCaroline Tice return num_threads; 22130fdc8d8SChris Lattner } 22230fdc8d8SChris Lattner 22330fdc8d8SChris Lattner SBThread 2242976d00aSJim Ingham SBProcess::GetSelectedThread () const 22530fdc8d8SChris Lattner { 2262d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 227ceb6b139SCaroline Tice 22830fdc8d8SChris Lattner SBThread sb_thread; 22917a6ad05SGreg Clayton ThreadSP thread_sp; 230*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 231*acdbe816SGreg Clayton if (process_sp) 232af67cecdSGreg Clayton { 233*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 234*acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 23517a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 236af67cecdSGreg Clayton } 237ceb6b139SCaroline Tice 238ceb6b139SCaroline Tice if (log) 239ceb6b139SCaroline Tice { 240*acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get()); 241ceb6b139SCaroline Tice } 242ceb6b139SCaroline Tice 24330fdc8d8SChris Lattner return sb_thread; 24430fdc8d8SChris Lattner } 24530fdc8d8SChris Lattner 24630fdc8d8SChris Lattner SBTarget 24730fdc8d8SChris Lattner SBProcess::GetTarget() const 24830fdc8d8SChris Lattner { 2492d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 250ceb6b139SCaroline Tice 25130fdc8d8SChris Lattner SBTarget sb_target; 252b9556accSGreg Clayton TargetSP target_sp; 253*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 254*acdbe816SGreg Clayton if (process_sp) 255b9556accSGreg Clayton { 256*acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 257b9556accSGreg Clayton sb_target.SetSP (target_sp); 258b9556accSGreg Clayton } 259ceb6b139SCaroline Tice 260ceb6b139SCaroline Tice if (log) 261*acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get()); 262ceb6b139SCaroline Tice 26330fdc8d8SChris Lattner return sb_target; 26430fdc8d8SChris Lattner } 26530fdc8d8SChris Lattner 26630fdc8d8SChris Lattner 26730fdc8d8SChris Lattner size_t 26830fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 26930fdc8d8SChris Lattner { 2702d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 271ceb6b139SCaroline Tice 272ceb6b139SCaroline Tice size_t ret_val = 0; 273*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 274*acdbe816SGreg Clayton if (process_sp) 27530fdc8d8SChris Lattner { 27630fdc8d8SChris Lattner Error error; 277*acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 27830fdc8d8SChris Lattner } 279ceb6b139SCaroline Tice 280ceb6b139SCaroline Tice if (log) 281fd54b368SJason Molenda log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu", 282*acdbe816SGreg Clayton process_sp.get(), 28393aa84e8SGreg Clayton src, 28493aa84e8SGreg Clayton (uint32_t) src_len, 28593aa84e8SGreg Clayton ret_val); 286ceb6b139SCaroline Tice 287ceb6b139SCaroline Tice return ret_val; 28830fdc8d8SChris Lattner } 28930fdc8d8SChris Lattner 29030fdc8d8SChris Lattner size_t 29130fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 29230fdc8d8SChris Lattner { 293cfd1acedSGreg Clayton size_t bytes_read = 0; 294*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 295*acdbe816SGreg Clayton if (process_sp) 29630fdc8d8SChris Lattner { 29730fdc8d8SChris Lattner Error error; 298*acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 29930fdc8d8SChris Lattner } 300ceb6b139SCaroline Tice 3012d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 302ceb6b139SCaroline Tice if (log) 303cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu", 304*acdbe816SGreg Clayton process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 305ceb6b139SCaroline Tice 306cfd1acedSGreg Clayton return bytes_read; 30730fdc8d8SChris Lattner } 30830fdc8d8SChris Lattner 30930fdc8d8SChris Lattner size_t 31030fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 31130fdc8d8SChris Lattner { 312cfd1acedSGreg Clayton size_t bytes_read = 0; 313*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 314*acdbe816SGreg Clayton if (process_sp) 31530fdc8d8SChris Lattner { 31630fdc8d8SChris Lattner Error error; 317*acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 31830fdc8d8SChris Lattner } 319ceb6b139SCaroline Tice 3202d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 321ceb6b139SCaroline Tice if (log) 322cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu", 323*acdbe816SGreg Clayton process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 324ceb6b139SCaroline Tice 325cfd1acedSGreg Clayton return bytes_read; 32630fdc8d8SChris Lattner } 32730fdc8d8SChris Lattner 32830fdc8d8SChris Lattner void 3292976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 33030fdc8d8SChris Lattner { 33130fdc8d8SChris Lattner if (out == NULL) 33230fdc8d8SChris Lattner return; 33330fdc8d8SChris Lattner 334*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 335*acdbe816SGreg Clayton if (process_sp) 33630fdc8d8SChris Lattner { 33730fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 33830fdc8d8SChris Lattner char message[1024]; 33930fdc8d8SChris Lattner int message_len = ::snprintf (message, 34030fdc8d8SChris Lattner sizeof (message), 34181c22f61SGreg Clayton "Process %llu %s\n", 342*acdbe816SGreg Clayton process_sp->GetID(), 34330fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 34430fdc8d8SChris Lattner 34530fdc8d8SChris Lattner if (message_len > 0) 34630fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 34730fdc8d8SChris Lattner } 34830fdc8d8SChris Lattner } 34930fdc8d8SChris Lattner 35030fdc8d8SChris Lattner void 3512976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 35230fdc8d8SChris Lattner { 353*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 354*acdbe816SGreg Clayton if (process_sp) 35530fdc8d8SChris Lattner { 35630fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 35730fdc8d8SChris Lattner char message[1024]; 35830fdc8d8SChris Lattner ::snprintf (message, 35930fdc8d8SChris Lattner sizeof (message), 36081c22f61SGreg Clayton "Process %llu %s\n", 361*acdbe816SGreg Clayton process_sp->GetID(), 36230fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 36330fdc8d8SChris Lattner 36430fdc8d8SChris Lattner result.AppendMessage (message); 36530fdc8d8SChris Lattner } 36630fdc8d8SChris Lattner } 36730fdc8d8SChris Lattner 36830fdc8d8SChris Lattner bool 3692976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 37030fdc8d8SChris Lattner { 371*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 372*acdbe816SGreg Clayton if (process_sp) 373af67cecdSGreg Clayton { 374*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 375*acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 376af67cecdSGreg Clayton } 37730fdc8d8SChris Lattner return false; 37830fdc8d8SChris Lattner } 37930fdc8d8SChris Lattner 38030fdc8d8SChris Lattner bool 3812976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 38230fdc8d8SChris Lattner { 3832d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 384ceb6b139SCaroline Tice 385ceb6b139SCaroline Tice bool ret_val = false; 386*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 387*acdbe816SGreg Clayton if (process_sp) 388af67cecdSGreg Clayton { 389*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 390*acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 391af67cecdSGreg Clayton } 392ceb6b139SCaroline Tice 393ceb6b139SCaroline Tice if (log) 394cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s", 395*acdbe816SGreg Clayton process_sp.get(), tid, (ret_val ? "true" : "false")); 396ceb6b139SCaroline Tice 397ceb6b139SCaroline Tice return ret_val; 39830fdc8d8SChris Lattner } 39930fdc8d8SChris Lattner 40030fdc8d8SChris Lattner SBThread 40130fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 40230fdc8d8SChris Lattner { 4032d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 404ceb6b139SCaroline Tice 40517a6ad05SGreg Clayton SBThread sb_thread; 40617a6ad05SGreg Clayton ThreadSP thread_sp; 407*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 408*acdbe816SGreg Clayton if (process_sp) 409af67cecdSGreg Clayton { 410*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 411*acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index); 41217a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 413af67cecdSGreg Clayton } 414ceb6b139SCaroline Tice 415ceb6b139SCaroline Tice if (log) 416ceb6b139SCaroline Tice { 41793aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 418*acdbe816SGreg Clayton process_sp.get(), (uint32_t) index, thread_sp.get()); 419ceb6b139SCaroline Tice } 420ceb6b139SCaroline Tice 42117a6ad05SGreg Clayton return sb_thread; 42230fdc8d8SChris Lattner } 42330fdc8d8SChris Lattner 42430fdc8d8SChris Lattner StateType 42530fdc8d8SChris Lattner SBProcess::GetState () 42630fdc8d8SChris Lattner { 427ceb6b139SCaroline Tice 428ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 429*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 430*acdbe816SGreg Clayton if (process_sp) 431af67cecdSGreg Clayton { 432*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 433*acdbe816SGreg Clayton ret_val = process_sp->GetState(); 434af67cecdSGreg Clayton } 435ceb6b139SCaroline Tice 4362d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 437ceb6b139SCaroline Tice if (log) 438cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 439*acdbe816SGreg Clayton process_sp.get(), 440750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 441ceb6b139SCaroline Tice 442ceb6b139SCaroline Tice return ret_val; 44330fdc8d8SChris Lattner } 44430fdc8d8SChris Lattner 44530fdc8d8SChris Lattner 44630fdc8d8SChris Lattner int 44730fdc8d8SChris Lattner SBProcess::GetExitStatus () 44830fdc8d8SChris Lattner { 4494838131bSGreg Clayton int exit_status = 0; 450*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 451*acdbe816SGreg Clayton if (process_sp) 452af67cecdSGreg Clayton { 453*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 454*acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 455af67cecdSGreg Clayton } 4562d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4574838131bSGreg Clayton if (log) 4584838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 459*acdbe816SGreg Clayton process_sp.get(), exit_status, exit_status); 4604838131bSGreg Clayton 4614838131bSGreg Clayton return exit_status; 46230fdc8d8SChris Lattner } 46330fdc8d8SChris Lattner 46430fdc8d8SChris Lattner const char * 46530fdc8d8SChris Lattner SBProcess::GetExitDescription () 46630fdc8d8SChris Lattner { 4674838131bSGreg Clayton const char *exit_desc = NULL; 468*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 469*acdbe816SGreg Clayton if (process_sp) 470af67cecdSGreg Clayton { 471*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 472*acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 473af67cecdSGreg Clayton } 4742d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4754838131bSGreg Clayton if (log) 4764838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 477*acdbe816SGreg Clayton process_sp.get(), exit_desc); 4784838131bSGreg Clayton return exit_desc; 47930fdc8d8SChris Lattner } 48030fdc8d8SChris Lattner 48130fdc8d8SChris Lattner lldb::pid_t 48230fdc8d8SChris Lattner SBProcess::GetProcessID () 48330fdc8d8SChris Lattner { 484ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 485*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 486*acdbe816SGreg Clayton if (process_sp) 487*acdbe816SGreg Clayton ret_val = process_sp->GetID(); 488ceb6b139SCaroline Tice 4892d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 490ceb6b139SCaroline Tice if (log) 491*acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val); 492ceb6b139SCaroline Tice 493ceb6b139SCaroline Tice return ret_val; 49430fdc8d8SChris Lattner } 49530fdc8d8SChris Lattner 496cf386e24SJohnny Chen ByteOrder 497cf386e24SJohnny Chen SBProcess::GetByteOrder () const 498cf386e24SJohnny Chen { 499cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 500*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 501*acdbe816SGreg Clayton if (process_sp) 502*acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 503cf386e24SJohnny Chen 504cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 505cf386e24SJohnny Chen if (log) 506*acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder); 507cf386e24SJohnny Chen 508cf386e24SJohnny Chen return byteOrder; 509cf386e24SJohnny Chen } 510cf386e24SJohnny Chen 51130fdc8d8SChris Lattner uint32_t 51230fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 51330fdc8d8SChris Lattner { 514ceb6b139SCaroline Tice uint32_t size = 0; 515*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 516*acdbe816SGreg Clayton if (process_sp) 517*acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 518ceb6b139SCaroline Tice 5192d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 520ceb6b139SCaroline Tice if (log) 521*acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size); 522ceb6b139SCaroline Tice 523ceb6b139SCaroline Tice return size; 52430fdc8d8SChris Lattner } 52530fdc8d8SChris Lattner 52630fdc8d8SChris Lattner SBError 52730fdc8d8SChris Lattner SBProcess::Continue () 52830fdc8d8SChris Lattner { 5292d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 530ceb6b139SCaroline Tice 53130fdc8d8SChris Lattner SBError sb_error; 532*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 5330c74e78dSGreg Clayton 534*acdbe816SGreg Clayton if (log) 535*acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get()); 536*acdbe816SGreg Clayton 537*acdbe816SGreg Clayton if (process_sp) 538*acdbe816SGreg Clayton { 539*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 540*acdbe816SGreg Clayton 541*acdbe816SGreg Clayton Error error (process_sp->Resume()); 5425d5028b5SGreg Clayton if (error.Success()) 5435d5028b5SGreg Clayton { 544*acdbe816SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 5454838131bSGreg Clayton { 5464838131bSGreg Clayton if (log) 547*acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get()); 548*acdbe816SGreg Clayton process_sp->WaitForProcessToStop (NULL); 5495d5028b5SGreg Clayton } 5504838131bSGreg Clayton } 5515d5028b5SGreg Clayton sb_error.SetError(error); 5525d5028b5SGreg Clayton } 55330fdc8d8SChris Lattner else 55430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 55530fdc8d8SChris Lattner 556ceb6b139SCaroline Tice if (log) 557ceb6b139SCaroline Tice { 558ceb6b139SCaroline Tice SBStream sstr; 559ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 560*acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData()); 561ceb6b139SCaroline Tice } 562ceb6b139SCaroline Tice 56330fdc8d8SChris Lattner return sb_error; 56430fdc8d8SChris Lattner } 56530fdc8d8SChris Lattner 56630fdc8d8SChris Lattner 56730fdc8d8SChris Lattner SBError 56830fdc8d8SChris Lattner SBProcess::Destroy () 56930fdc8d8SChris Lattner { 57030fdc8d8SChris Lattner SBError sb_error; 571*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 572*acdbe816SGreg Clayton if (process_sp) 5736779606aSGreg Clayton { 574*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 575*acdbe816SGreg Clayton sb_error.SetError(process_sp->Destroy()); 5766779606aSGreg Clayton } 57730fdc8d8SChris Lattner else 57830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 57930fdc8d8SChris Lattner 5802d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5814838131bSGreg Clayton if (log) 5824838131bSGreg Clayton { 5834838131bSGreg Clayton SBStream sstr; 5844838131bSGreg Clayton sb_error.GetDescription (sstr); 5856779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 586*acdbe816SGreg Clayton process_sp.get(), 5876779606aSGreg Clayton sb_error.get(), 5886779606aSGreg Clayton sstr.GetData()); 5894838131bSGreg Clayton } 5904838131bSGreg Clayton 59130fdc8d8SChris Lattner return sb_error; 59230fdc8d8SChris Lattner } 59330fdc8d8SChris Lattner 59430fdc8d8SChris Lattner 59530fdc8d8SChris Lattner SBError 59630fdc8d8SChris Lattner SBProcess::Stop () 59730fdc8d8SChris Lattner { 59830fdc8d8SChris Lattner SBError sb_error; 599*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 600*acdbe816SGreg Clayton if (process_sp) 601af67cecdSGreg Clayton { 602*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 603*acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 604af67cecdSGreg Clayton } 60530fdc8d8SChris Lattner else 60630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 607ceb6b139SCaroline Tice 6082d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 609ceb6b139SCaroline Tice if (log) 610ceb6b139SCaroline Tice { 611ceb6b139SCaroline Tice SBStream sstr; 612ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 61393aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 614*acdbe816SGreg Clayton process_sp.get(), 61593aa84e8SGreg Clayton sb_error.get(), 616750cd175SCaroline Tice sstr.GetData()); 617ceb6b139SCaroline Tice } 618ceb6b139SCaroline Tice 61930fdc8d8SChris Lattner return sb_error; 62030fdc8d8SChris Lattner } 62130fdc8d8SChris Lattner 62230fdc8d8SChris Lattner SBError 62330fdc8d8SChris Lattner SBProcess::Kill () 62430fdc8d8SChris Lattner { 62530fdc8d8SChris Lattner SBError sb_error; 626*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 627*acdbe816SGreg Clayton if (process_sp) 628af67cecdSGreg Clayton { 629*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 630*acdbe816SGreg Clayton sb_error.SetError (process_sp->Destroy()); 631af67cecdSGreg Clayton } 63230fdc8d8SChris Lattner else 63330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 634ceb6b139SCaroline Tice 6352d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 636ceb6b139SCaroline Tice if (log) 637ceb6b139SCaroline Tice { 638ceb6b139SCaroline Tice SBStream sstr; 639ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 64093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 641*acdbe816SGreg Clayton process_sp.get(), 64293aa84e8SGreg Clayton sb_error.get(), 643750cd175SCaroline Tice sstr.GetData()); 644ceb6b139SCaroline Tice } 645ceb6b139SCaroline Tice 64630fdc8d8SChris Lattner return sb_error; 64730fdc8d8SChris Lattner } 64830fdc8d8SChris Lattner 64930fdc8d8SChris Lattner SBError 65030fdc8d8SChris Lattner SBProcess::Detach () 65130fdc8d8SChris Lattner { 65230fdc8d8SChris Lattner SBError sb_error; 653*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 654*acdbe816SGreg Clayton if (process_sp) 655af67cecdSGreg Clayton { 656*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 657*acdbe816SGreg Clayton sb_error.SetError (process_sp->Detach()); 658af67cecdSGreg Clayton } 65930fdc8d8SChris Lattner else 66030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 66130fdc8d8SChris Lattner 66230fdc8d8SChris Lattner return sb_error; 66330fdc8d8SChris Lattner } 66430fdc8d8SChris Lattner 66530fdc8d8SChris Lattner SBError 6664838131bSGreg Clayton SBProcess::Signal (int signo) 66730fdc8d8SChris Lattner { 66830fdc8d8SChris Lattner SBError sb_error; 669*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 670*acdbe816SGreg Clayton if (process_sp) 671af67cecdSGreg Clayton { 672*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 673*acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 674af67cecdSGreg Clayton } 67530fdc8d8SChris Lattner else 67630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 6772d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6784838131bSGreg Clayton if (log) 6794838131bSGreg Clayton { 6804838131bSGreg Clayton SBStream sstr; 6814838131bSGreg Clayton sb_error.GetDescription (sstr); 6824838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 683*acdbe816SGreg Clayton process_sp.get(), 6844838131bSGreg Clayton signo, 6854838131bSGreg Clayton sb_error.get(), 6864838131bSGreg Clayton sstr.GetData()); 6874838131bSGreg Clayton } 68830fdc8d8SChris Lattner return sb_error; 68930fdc8d8SChris Lattner } 69030fdc8d8SChris Lattner 69130fdc8d8SChris Lattner SBThread 6924838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 69330fdc8d8SChris Lattner { 6944838131bSGreg Clayton SBThread sb_thread; 69517a6ad05SGreg Clayton ThreadSP thread_sp; 696*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 697*acdbe816SGreg Clayton if (process_sp) 698af67cecdSGreg Clayton { 699*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 700*acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid); 70117a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 702af67cecdSGreg Clayton } 7034838131bSGreg Clayton 7042d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7054838131bSGreg Clayton if (log) 7064838131bSGreg Clayton { 70761e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)", 708*acdbe816SGreg Clayton process_sp.get(), 7094838131bSGreg Clayton tid, 71017a6ad05SGreg Clayton thread_sp.get()); 7114838131bSGreg Clayton } 7124838131bSGreg Clayton 7134838131bSGreg Clayton return sb_thread; 71430fdc8d8SChris Lattner } 71530fdc8d8SChris Lattner 71630fdc8d8SChris Lattner StateType 71730fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 71830fdc8d8SChris Lattner { 7192d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 720ceb6b139SCaroline Tice 721ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 722ceb6b139SCaroline Tice 723ceb6b139SCaroline Tice if (log) 724cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 725750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 726ceb6b139SCaroline Tice 727ceb6b139SCaroline Tice return ret_val; 72830fdc8d8SChris Lattner } 72930fdc8d8SChris Lattner 73030fdc8d8SChris Lattner bool 73130fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 73230fdc8d8SChris Lattner { 7336611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 73430fdc8d8SChris Lattner } 73530fdc8d8SChris Lattner 73630fdc8d8SChris Lattner SBProcess 73730fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 73830fdc8d8SChris Lattner { 7396611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 74030fdc8d8SChris Lattner return process; 74130fdc8d8SChris Lattner } 74230fdc8d8SChris Lattner 74330fdc8d8SChris Lattner 74430fdc8d8SChris Lattner SBBroadcaster 74530fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 74630fdc8d8SChris Lattner { 7472d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 748ceb6b139SCaroline Tice 749*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 750*acdbe816SGreg Clayton 751*acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 752ceb6b139SCaroline Tice 753ceb6b139SCaroline Tice if (log) 754*acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 755750cd175SCaroline Tice broadcaster.get()); 756ceb6b139SCaroline Tice 75730fdc8d8SChris Lattner return broadcaster; 75830fdc8d8SChris Lattner } 75930fdc8d8SChris Lattner 76030fdc8d8SChris Lattner size_t 76130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 76230fdc8d8SChris Lattner { 7632d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 764ceb6b139SCaroline Tice 76530fdc8d8SChris Lattner size_t bytes_read = 0; 76630fdc8d8SChris Lattner 767*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 768*acdbe816SGreg Clayton 7694838131bSGreg Clayton if (log) 7704838131bSGreg Clayton { 7714838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...", 772*acdbe816SGreg Clayton process_sp.get(), 7734838131bSGreg Clayton addr, 7744838131bSGreg Clayton dst, 775c91d804aSGreg Clayton dst_len, 7764838131bSGreg Clayton sb_error.get()); 7774838131bSGreg Clayton } 7784838131bSGreg Clayton 779*acdbe816SGreg Clayton if (process_sp) 78030fdc8d8SChris Lattner { 78130fdc8d8SChris Lattner Error error; 782*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 783*acdbe816SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, error); 78430fdc8d8SChris Lattner sb_error.SetError (error); 78530fdc8d8SChris Lattner } 78630fdc8d8SChris Lattner else 78730fdc8d8SChris Lattner { 78830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 78930fdc8d8SChris Lattner } 79030fdc8d8SChris Lattner 791ceb6b139SCaroline Tice if (log) 79293aa84e8SGreg Clayton { 79393aa84e8SGreg Clayton SBStream sstr; 79493aa84e8SGreg Clayton sb_error.GetDescription (sstr); 795c91d804aSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu", 796*acdbe816SGreg Clayton process_sp.get(), 79793aa84e8SGreg Clayton addr, 79893aa84e8SGreg Clayton dst, 799c91d804aSGreg Clayton dst_len, 80093aa84e8SGreg Clayton sb_error.get(), 80193aa84e8SGreg Clayton sstr.GetData(), 802c91d804aSGreg Clayton bytes_read); 80393aa84e8SGreg Clayton } 804ceb6b139SCaroline Tice 80530fdc8d8SChris Lattner return bytes_read; 80630fdc8d8SChris Lattner } 80730fdc8d8SChris Lattner 80830fdc8d8SChris Lattner size_t 809e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 810e91b7957SGreg Clayton { 811e91b7957SGreg Clayton size_t bytes_read = 0; 812*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 813*acdbe816SGreg Clayton if (process_sp) 814e91b7957SGreg Clayton { 815e91b7957SGreg Clayton Error error; 816*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 817*acdbe816SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, error); 818e91b7957SGreg Clayton sb_error.SetError (error); 819e91b7957SGreg Clayton } 820e91b7957SGreg Clayton else 821e91b7957SGreg Clayton { 822e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 823e91b7957SGreg Clayton } 824e91b7957SGreg Clayton return bytes_read; 825e91b7957SGreg Clayton } 826e91b7957SGreg Clayton 827e91b7957SGreg Clayton uint64_t 828e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 829e91b7957SGreg Clayton { 830*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 831*acdbe816SGreg Clayton if (process_sp) 832e91b7957SGreg Clayton { 833e91b7957SGreg Clayton Error error; 834*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 835*acdbe816SGreg Clayton uint64_t value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, error); 836e91b7957SGreg Clayton sb_error.SetError (error); 837e91b7957SGreg Clayton return value; 838e91b7957SGreg Clayton } 839e91b7957SGreg Clayton else 840e91b7957SGreg Clayton { 841e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 842e91b7957SGreg Clayton } 843e91b7957SGreg Clayton return 0; 844e91b7957SGreg Clayton } 845e91b7957SGreg Clayton 846e91b7957SGreg Clayton lldb::addr_t 847e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 848e91b7957SGreg Clayton { 849e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 850*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 851*acdbe816SGreg Clayton if (process_sp) 852e91b7957SGreg Clayton { 853e91b7957SGreg Clayton Error error; 854*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 855*acdbe816SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, error); 856e91b7957SGreg Clayton sb_error.SetError (error); 857e91b7957SGreg Clayton } 858e91b7957SGreg Clayton else 859e91b7957SGreg Clayton { 860e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 861e91b7957SGreg Clayton } 862e91b7957SGreg Clayton return ptr; 863e91b7957SGreg Clayton } 864e91b7957SGreg Clayton 865e91b7957SGreg Clayton size_t 86630fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 86730fdc8d8SChris Lattner { 86830fdc8d8SChris Lattner size_t bytes_written = 0; 86930fdc8d8SChris Lattner 8702d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 871*acdbe816SGreg Clayton 872*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 873*acdbe816SGreg Clayton 8744838131bSGreg Clayton if (log) 8754838131bSGreg Clayton { 8764838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...", 877*acdbe816SGreg Clayton process_sp.get(), 8784838131bSGreg Clayton addr, 8794838131bSGreg Clayton src, 880c91d804aSGreg Clayton src_len, 8814838131bSGreg Clayton sb_error.get()); 8824838131bSGreg Clayton } 8834838131bSGreg Clayton 884*acdbe816SGreg Clayton if (process_sp) 88530fdc8d8SChris Lattner { 88630fdc8d8SChris Lattner Error error; 887*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 888*acdbe816SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, error); 88930fdc8d8SChris Lattner sb_error.SetError (error); 89030fdc8d8SChris Lattner } 89130fdc8d8SChris Lattner 8924838131bSGreg Clayton if (log) 8934838131bSGreg Clayton { 8944838131bSGreg Clayton SBStream sstr; 8954838131bSGreg Clayton sb_error.GetDescription (sstr); 896c91d804aSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu", 897*acdbe816SGreg Clayton process_sp.get(), 8984838131bSGreg Clayton addr, 8994838131bSGreg Clayton src, 900c91d804aSGreg Clayton src_len, 9014838131bSGreg Clayton sb_error.get(), 9024838131bSGreg Clayton sstr.GetData(), 903c91d804aSGreg Clayton bytes_written); 9044838131bSGreg Clayton } 9054838131bSGreg Clayton 90630fdc8d8SChris Lattner return bytes_written; 90730fdc8d8SChris Lattner } 90830fdc8d8SChris Lattner 909dde9cff3SCaroline Tice bool 910dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 911dde9cff3SCaroline Tice { 912da7bc7d0SGreg Clayton Stream &strm = description.ref(); 913da7bc7d0SGreg Clayton 914*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 915*acdbe816SGreg Clayton if (process_sp) 916dde9cff3SCaroline Tice { 917dde9cff3SCaroline Tice char path[PATH_MAX]; 918dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 919*acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 9201d273166SGreg Clayton const char *exe_name = NULL; 9211d273166SGreg Clayton if (exe_module) 9221d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 9231d273166SGreg Clayton 924da7bc7d0SGreg Clayton strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s", 925*acdbe816SGreg Clayton process_sp->GetID(), 926ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 9271d273166SGreg Clayton GetNumThreads(), 92805faeb71SGreg Clayton exe_name ? ", executable = " : "", 9291d273166SGreg Clayton exe_name ? exe_name : ""); 930dde9cff3SCaroline Tice } 931dde9cff3SCaroline Tice else 932da7bc7d0SGreg Clayton strm.PutCString ("No value"); 933dde9cff3SCaroline Tice 934dde9cff3SCaroline Tice return true; 935dde9cff3SCaroline Tice } 9368f343b09SGreg Clayton 9378f343b09SGreg Clayton uint32_t 9388f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 9398f343b09SGreg Clayton { 940*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 941*acdbe816SGreg Clayton if (process_sp) 942af67cecdSGreg Clayton { 943*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 944*acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 945af67cecdSGreg Clayton } 9468f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 9478f343b09SGreg Clayton } 9488f343b09SGreg Clayton 9498f343b09SGreg Clayton lldb::SBError 9508f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 9518f343b09SGreg Clayton { 9528f343b09SGreg Clayton lldb::SBError sb_error; 953*acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 954*acdbe816SGreg Clayton if (process_sp) 955af67cecdSGreg Clayton { 956*acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 957*acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 958af67cecdSGreg Clayton } 9598f343b09SGreg Clayton else 9608f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 9618f343b09SGreg Clayton return sb_error; 9628f343b09SGreg Clayton } 963