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" 181f746071SGreg Clayton #include "lldb/Core/Module.h" 1930fdc8d8SChris Lattner #include "lldb/Core/State.h" 2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 246611103cSGreg Clayton #include "lldb/Target/Target.h" 256611103cSGreg Clayton #include "lldb/Target/Thread.h" 2630fdc8d8SChris Lattner 2730fdc8d8SChris Lattner // Project includes 2830fdc8d8SChris Lattner 294c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 304c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 310e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 324c5de699SEli Friedman #include "lldb/API/SBEvent.h" 330e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 344c5de699SEli Friedman #include "lldb/API/SBThread.h" 35dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 364c5de699SEli Friedman #include "lldb/API/SBStringList.h" 3730fdc8d8SChris Lattner 3830fdc8d8SChris Lattner using namespace lldb; 3930fdc8d8SChris Lattner using namespace lldb_private; 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner 4230fdc8d8SChris Lattner SBProcess::SBProcess () : 434e0fe8abSGreg Clayton m_opaque_wp() 4430fdc8d8SChris Lattner { 4530fdc8d8SChris Lattner } 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner //---------------------------------------------------------------------- 4930fdc8d8SChris Lattner // SBProcess constructor 5030fdc8d8SChris Lattner //---------------------------------------------------------------------- 5130fdc8d8SChris Lattner 5230fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 534e0fe8abSGreg Clayton m_opaque_wp (rhs.m_opaque_wp) 5430fdc8d8SChris Lattner { 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 594e0fe8abSGreg Clayton m_opaque_wp (process_sp) 6030fdc8d8SChris Lattner { 6130fdc8d8SChris Lattner } 6230fdc8d8SChris Lattner 63efabb123SGreg Clayton const SBProcess& 64efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 65efabb123SGreg Clayton { 66efabb123SGreg Clayton if (this != &rhs) 674e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 68efabb123SGreg Clayton return *this; 69efabb123SGreg Clayton } 70efabb123SGreg Clayton 7130fdc8d8SChris Lattner //---------------------------------------------------------------------- 7230fdc8d8SChris Lattner // Destructor 7330fdc8d8SChris Lattner //---------------------------------------------------------------------- 7430fdc8d8SChris Lattner SBProcess::~SBProcess() 7530fdc8d8SChris Lattner { 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 784bddaeb5SJim Ingham const char * 794bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName () 804bddaeb5SJim Ingham { 814bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 824bddaeb5SJim Ingham } 834bddaeb5SJim Ingham 84b9556accSGreg Clayton lldb::ProcessSP 85b9556accSGreg Clayton SBProcess::GetSP() const 86b9556accSGreg Clayton { 874e0fe8abSGreg Clayton return m_opaque_wp.lock(); 88b9556accSGreg Clayton } 89b9556accSGreg Clayton 9030fdc8d8SChris Lattner void 91b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 9230fdc8d8SChris Lattner { 934e0fe8abSGreg Clayton m_opaque_wp = process_sp; 9430fdc8d8SChris Lattner } 9530fdc8d8SChris Lattner 9630fdc8d8SChris Lattner void 9730fdc8d8SChris Lattner SBProcess::Clear () 9830fdc8d8SChris Lattner { 994e0fe8abSGreg Clayton m_opaque_wp.reset(); 10030fdc8d8SChris Lattner } 10130fdc8d8SChris Lattner 10230fdc8d8SChris Lattner 10330fdc8d8SChris Lattner bool 10430fdc8d8SChris Lattner SBProcess::IsValid() const 10530fdc8d8SChris Lattner { 1064fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1074fc6cb9cSJim Ingham return ((bool) process_sp && process_sp->IsValid()); 10830fdc8d8SChris Lattner } 10930fdc8d8SChris Lattner 1109631aae2SJames McIlree bool 1119631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1129631aae2SJames McIlree char const **envp, 1139631aae2SJames McIlree const char *stdin_path, 1149631aae2SJames McIlree const char *stdout_path, 1159631aae2SJames McIlree const char *stderr_path, 1169631aae2SJames McIlree const char *working_directory, 1179631aae2SJames McIlree uint32_t launch_flags, 1189631aae2SJames McIlree bool stop_at_entry, 1199631aae2SJames McIlree lldb::SBError& error) 1209631aae2SJames McIlree { 1219631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1229631aae2SJames McIlree if (log) { 1239631aae2SJames 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))...", 1244e0fe8abSGreg Clayton m_opaque_wp.lock().get(), 1259631aae2SJames McIlree argv, 1269631aae2SJames McIlree envp, 1279631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1289631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1299631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1309631aae2SJames McIlree working_directory ? working_directory : "NULL", 1319631aae2SJames McIlree launch_flags, 1329631aae2SJames McIlree stop_at_entry, 1339631aae2SJames McIlree error.get()); 1349631aae2SJames McIlree } 1359631aae2SJames McIlree 136acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 137acdbe816SGreg Clayton if (process_sp) 1389631aae2SJames McIlree { 139acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 140acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1419631aae2SJames McIlree { 142982c9762SGreg Clayton if (stop_at_entry) 143982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 144982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 145982c9762SGreg Clayton stdout_path, 146982c9762SGreg Clayton stderr_path, 147982c9762SGreg Clayton working_directory, 148982c9762SGreg Clayton launch_flags); 149acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 150982c9762SGreg Clayton if (exe_module) 151982c9762SGreg Clayton launch_info.SetExecutableFile(exe_module->GetFileSpec(), true); 152982c9762SGreg Clayton if (argv) 153982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 154982c9762SGreg Clayton if (envp) 155982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 156acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1579631aae2SJames McIlree } 1589631aae2SJames McIlree else 1599631aae2SJames McIlree { 1609631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1619631aae2SJames McIlree } 1629631aae2SJames McIlree } 1639631aae2SJames McIlree else 1649631aae2SJames McIlree { 1659631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1669631aae2SJames McIlree } 1679631aae2SJames McIlree 1689631aae2SJames McIlree if (log) { 1699631aae2SJames McIlree SBStream sstr; 1709631aae2SJames McIlree error.GetDescription (sstr); 171acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData()); 1729631aae2SJames McIlree } 1739631aae2SJames McIlree 1749631aae2SJames McIlree return error.Success(); 1759631aae2SJames McIlree } 1769631aae2SJames McIlree 1779631aae2SJames McIlree bool 1789631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 1799631aae2SJames McIlree { 180acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 181acdbe816SGreg Clayton if (process_sp) 1829631aae2SJames McIlree { 183acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 184acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1859631aae2SJames McIlree { 186144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 187144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 188acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 1899631aae2SJames McIlree } 1909631aae2SJames McIlree else 1919631aae2SJames McIlree { 1929631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 1939631aae2SJames McIlree } 1949631aae2SJames McIlree } 1959631aae2SJames McIlree else 1969631aae2SJames McIlree { 1979631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1989631aae2SJames McIlree } 1999631aae2SJames McIlree 2009631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2019631aae2SJames McIlree if (log) { 2029631aae2SJames McIlree SBStream sstr; 2039631aae2SJames McIlree error.GetDescription (sstr); 204acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData()); 2059631aae2SJames McIlree } 2069631aae2SJames McIlree 2079631aae2SJames McIlree return error.Success(); 2089631aae2SJames McIlree } 2099631aae2SJames McIlree 21030fdc8d8SChris Lattner 21130fdc8d8SChris Lattner uint32_t 21230fdc8d8SChris Lattner SBProcess::GetNumThreads () 21330fdc8d8SChris Lattner { 2142d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 215ceb6b139SCaroline Tice 216ceb6b139SCaroline Tice uint32_t num_threads = 0; 217acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 218acdbe816SGreg Clayton if (process_sp) 21930fdc8d8SChris Lattner { 2207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2217fdf9ef1SGreg Clayton 2227fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 223acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 224acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 22530fdc8d8SChris Lattner } 226ceb6b139SCaroline Tice 227ceb6b139SCaroline Tice if (log) 228acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads); 229ceb6b139SCaroline Tice 230ceb6b139SCaroline Tice return num_threads; 23130fdc8d8SChris Lattner } 23230fdc8d8SChris Lattner 23330fdc8d8SChris Lattner SBThread 2342976d00aSJim Ingham SBProcess::GetSelectedThread () const 23530fdc8d8SChris Lattner { 2362d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 237ceb6b139SCaroline Tice 23830fdc8d8SChris Lattner SBThread sb_thread; 23917a6ad05SGreg Clayton ThreadSP thread_sp; 240acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 241acdbe816SGreg Clayton if (process_sp) 242af67cecdSGreg Clayton { 243acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 244acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 24517a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 246af67cecdSGreg Clayton } 247ceb6b139SCaroline Tice 248ceb6b139SCaroline Tice if (log) 249ceb6b139SCaroline Tice { 250acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get()); 251ceb6b139SCaroline Tice } 252ceb6b139SCaroline Tice 25330fdc8d8SChris Lattner return sb_thread; 25430fdc8d8SChris Lattner } 25530fdc8d8SChris Lattner 25630fdc8d8SChris Lattner SBTarget 25730fdc8d8SChris Lattner SBProcess::GetTarget() const 25830fdc8d8SChris Lattner { 2592d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 260ceb6b139SCaroline Tice 26130fdc8d8SChris Lattner SBTarget sb_target; 262b9556accSGreg Clayton TargetSP target_sp; 263acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 264acdbe816SGreg Clayton if (process_sp) 265b9556accSGreg Clayton { 266acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 267b9556accSGreg Clayton sb_target.SetSP (target_sp); 268b9556accSGreg Clayton } 269ceb6b139SCaroline Tice 270ceb6b139SCaroline Tice if (log) 271acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get()); 272ceb6b139SCaroline Tice 27330fdc8d8SChris Lattner return sb_target; 27430fdc8d8SChris Lattner } 27530fdc8d8SChris Lattner 27630fdc8d8SChris Lattner 27730fdc8d8SChris Lattner size_t 27830fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 27930fdc8d8SChris Lattner { 2802d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 281ceb6b139SCaroline Tice 282ceb6b139SCaroline Tice size_t ret_val = 0; 283acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 284acdbe816SGreg Clayton if (process_sp) 28530fdc8d8SChris Lattner { 28630fdc8d8SChris Lattner Error error; 287acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 28830fdc8d8SChris Lattner } 289ceb6b139SCaroline Tice 290ceb6b139SCaroline Tice if (log) 291fd54b368SJason Molenda log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu", 292acdbe816SGreg Clayton process_sp.get(), 29393aa84e8SGreg Clayton src, 29493aa84e8SGreg Clayton (uint32_t) src_len, 29593aa84e8SGreg Clayton ret_val); 296ceb6b139SCaroline Tice 297ceb6b139SCaroline Tice return ret_val; 29830fdc8d8SChris Lattner } 29930fdc8d8SChris Lattner 30030fdc8d8SChris Lattner size_t 30130fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 30230fdc8d8SChris Lattner { 303cfd1acedSGreg Clayton size_t bytes_read = 0; 304acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 305acdbe816SGreg Clayton if (process_sp) 30630fdc8d8SChris Lattner { 30730fdc8d8SChris Lattner Error error; 308acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 30930fdc8d8SChris Lattner } 310ceb6b139SCaroline Tice 3112d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 312ceb6b139SCaroline Tice if (log) 31343e0af06SGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%llu) => %llu", 31443e0af06SGreg Clayton process_sp.get(), 31543e0af06SGreg Clayton (int) bytes_read, 31643e0af06SGreg Clayton dst, 31743e0af06SGreg Clayton (uint64_t)dst_len, 31843e0af06SGreg Clayton (uint64_t)bytes_read); 319ceb6b139SCaroline Tice 320cfd1acedSGreg Clayton return bytes_read; 32130fdc8d8SChris Lattner } 32230fdc8d8SChris Lattner 32330fdc8d8SChris Lattner size_t 32430fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 32530fdc8d8SChris Lattner { 326cfd1acedSGreg Clayton size_t bytes_read = 0; 327acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 328acdbe816SGreg Clayton if (process_sp) 32930fdc8d8SChris Lattner { 33030fdc8d8SChris Lattner Error error; 331acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 33230fdc8d8SChris Lattner } 333ceb6b139SCaroline Tice 3342d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 335ceb6b139SCaroline Tice if (log) 33643e0af06SGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%llu) => %llu", 33743e0af06SGreg Clayton process_sp.get(), 33843e0af06SGreg Clayton (int) bytes_read, 33943e0af06SGreg Clayton dst, 34043e0af06SGreg Clayton (uint64_t)dst_len, 34143e0af06SGreg Clayton (uint64_t)bytes_read); 342ceb6b139SCaroline Tice 343cfd1acedSGreg Clayton return bytes_read; 34430fdc8d8SChris Lattner } 34530fdc8d8SChris Lattner 34630fdc8d8SChris Lattner void 3472976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 34830fdc8d8SChris Lattner { 34930fdc8d8SChris Lattner if (out == NULL) 35030fdc8d8SChris Lattner return; 35130fdc8d8SChris Lattner 352acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 353acdbe816SGreg Clayton if (process_sp) 35430fdc8d8SChris Lattner { 35530fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 35630fdc8d8SChris Lattner char message[1024]; 35730fdc8d8SChris Lattner int message_len = ::snprintf (message, 35830fdc8d8SChris Lattner sizeof (message), 35981c22f61SGreg Clayton "Process %llu %s\n", 360acdbe816SGreg Clayton process_sp->GetID(), 36130fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 36230fdc8d8SChris Lattner 36330fdc8d8SChris Lattner if (message_len > 0) 36430fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 36530fdc8d8SChris Lattner } 36630fdc8d8SChris Lattner } 36730fdc8d8SChris Lattner 36830fdc8d8SChris Lattner void 3692976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 37030fdc8d8SChris Lattner { 371acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 372acdbe816SGreg Clayton if (process_sp) 37330fdc8d8SChris Lattner { 37430fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 37530fdc8d8SChris Lattner char message[1024]; 37630fdc8d8SChris Lattner ::snprintf (message, 37730fdc8d8SChris Lattner sizeof (message), 37881c22f61SGreg Clayton "Process %llu %s\n", 379acdbe816SGreg Clayton process_sp->GetID(), 38030fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 38130fdc8d8SChris Lattner 38230fdc8d8SChris Lattner result.AppendMessage (message); 38330fdc8d8SChris Lattner } 38430fdc8d8SChris Lattner } 38530fdc8d8SChris Lattner 38630fdc8d8SChris Lattner bool 3872976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 38830fdc8d8SChris Lattner { 389acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 390acdbe816SGreg Clayton if (process_sp) 391af67cecdSGreg Clayton { 392acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 393acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 394af67cecdSGreg Clayton } 39530fdc8d8SChris Lattner return false; 39630fdc8d8SChris Lattner } 39730fdc8d8SChris Lattner 39830fdc8d8SChris Lattner bool 3992976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 40030fdc8d8SChris Lattner { 401*ea561dcfSGreg Clayton return SetSelectedThreadByID ((lldb::tid_t)tid); 402*ea561dcfSGreg Clayton } 403*ea561dcfSGreg Clayton 404*ea561dcfSGreg Clayton bool 405*ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid) 406*ea561dcfSGreg Clayton { 4072d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 408ceb6b139SCaroline Tice 409ceb6b139SCaroline Tice bool ret_val = false; 410acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 411acdbe816SGreg Clayton if (process_sp) 412af67cecdSGreg Clayton { 413acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 414acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 415af67cecdSGreg Clayton } 416ceb6b139SCaroline Tice 417ceb6b139SCaroline Tice if (log) 418*ea561dcfSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4llx) => %s", 419acdbe816SGreg Clayton process_sp.get(), tid, (ret_val ? "true" : "false")); 420ceb6b139SCaroline Tice 421ceb6b139SCaroline Tice return ret_val; 42230fdc8d8SChris Lattner } 42330fdc8d8SChris Lattner 42418b46896SJim Ingham bool 42518b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 42618b46896SJim Ingham { 42718b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 42818b46896SJim Ingham 42918b46896SJim Ingham bool ret_val = false; 43018b46896SJim Ingham ProcessSP process_sp(GetSP()); 43118b46896SJim Ingham if (process_sp) 43218b46896SJim Ingham { 43318b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 43418b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 43518b46896SJim Ingham } 43618b46896SJim Ingham 43718b46896SJim Ingham if (log) 43818b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 43918b46896SJim Ingham process_sp.get(), index_id, (ret_val ? "true" : "false")); 44018b46896SJim Ingham 44118b46896SJim Ingham return ret_val; 44218b46896SJim Ingham } 44318b46896SJim Ingham 44430fdc8d8SChris Lattner SBThread 44530fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 44630fdc8d8SChris Lattner { 4472d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 448ceb6b139SCaroline Tice 44917a6ad05SGreg Clayton SBThread sb_thread; 45017a6ad05SGreg Clayton ThreadSP thread_sp; 451acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 452acdbe816SGreg Clayton if (process_sp) 453af67cecdSGreg Clayton { 4547fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4557fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 456acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 4577fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 45817a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 459af67cecdSGreg Clayton } 460ceb6b139SCaroline Tice 461ceb6b139SCaroline Tice if (log) 462ceb6b139SCaroline Tice { 46393aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 464acdbe816SGreg Clayton process_sp.get(), (uint32_t) index, thread_sp.get()); 465ceb6b139SCaroline Tice } 466ceb6b139SCaroline Tice 46717a6ad05SGreg Clayton return sb_thread; 46830fdc8d8SChris Lattner } 46930fdc8d8SChris Lattner 47030fdc8d8SChris Lattner StateType 47130fdc8d8SChris Lattner SBProcess::GetState () 47230fdc8d8SChris Lattner { 473ceb6b139SCaroline Tice 474ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 475acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 476acdbe816SGreg Clayton if (process_sp) 477af67cecdSGreg Clayton { 478acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 479acdbe816SGreg Clayton ret_val = process_sp->GetState(); 480af67cecdSGreg Clayton } 481ceb6b139SCaroline Tice 4822d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 483ceb6b139SCaroline Tice if (log) 484cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 485acdbe816SGreg Clayton process_sp.get(), 486750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 487ceb6b139SCaroline Tice 488ceb6b139SCaroline Tice return ret_val; 48930fdc8d8SChris Lattner } 49030fdc8d8SChris Lattner 49130fdc8d8SChris Lattner 49230fdc8d8SChris Lattner int 49330fdc8d8SChris Lattner SBProcess::GetExitStatus () 49430fdc8d8SChris Lattner { 4954838131bSGreg Clayton int exit_status = 0; 496acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 497acdbe816SGreg Clayton if (process_sp) 498af67cecdSGreg Clayton { 499acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 500acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 501af67cecdSGreg Clayton } 5022d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5034838131bSGreg Clayton if (log) 5044838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 505acdbe816SGreg Clayton process_sp.get(), exit_status, exit_status); 5064838131bSGreg Clayton 5074838131bSGreg Clayton return exit_status; 50830fdc8d8SChris Lattner } 50930fdc8d8SChris Lattner 51030fdc8d8SChris Lattner const char * 51130fdc8d8SChris Lattner SBProcess::GetExitDescription () 51230fdc8d8SChris Lattner { 5134838131bSGreg Clayton const char *exit_desc = NULL; 514acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 515acdbe816SGreg Clayton if (process_sp) 516af67cecdSGreg Clayton { 517acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 518acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 519af67cecdSGreg Clayton } 5202d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5214838131bSGreg Clayton if (log) 5224838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 523acdbe816SGreg Clayton process_sp.get(), exit_desc); 5244838131bSGreg Clayton return exit_desc; 52530fdc8d8SChris Lattner } 52630fdc8d8SChris Lattner 52730fdc8d8SChris Lattner lldb::pid_t 52830fdc8d8SChris Lattner SBProcess::GetProcessID () 52930fdc8d8SChris Lattner { 530ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 531acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 532acdbe816SGreg Clayton if (process_sp) 533acdbe816SGreg Clayton ret_val = process_sp->GetID(); 534ceb6b139SCaroline Tice 5352d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 536ceb6b139SCaroline Tice if (log) 537acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val); 538ceb6b139SCaroline Tice 539ceb6b139SCaroline Tice return ret_val; 54030fdc8d8SChris Lattner } 54130fdc8d8SChris Lattner 542cf386e24SJohnny Chen ByteOrder 543cf386e24SJohnny Chen SBProcess::GetByteOrder () const 544cf386e24SJohnny Chen { 545cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 546acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 547acdbe816SGreg Clayton if (process_sp) 548acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 549cf386e24SJohnny Chen 550cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 551cf386e24SJohnny Chen if (log) 552acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder); 553cf386e24SJohnny Chen 554cf386e24SJohnny Chen return byteOrder; 555cf386e24SJohnny Chen } 556cf386e24SJohnny Chen 55730fdc8d8SChris Lattner uint32_t 55830fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 55930fdc8d8SChris Lattner { 560ceb6b139SCaroline Tice uint32_t size = 0; 561acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 562acdbe816SGreg Clayton if (process_sp) 563acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 564ceb6b139SCaroline Tice 5652d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 566ceb6b139SCaroline Tice if (log) 567acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size); 568ceb6b139SCaroline Tice 569ceb6b139SCaroline Tice return size; 57030fdc8d8SChris Lattner } 57130fdc8d8SChris Lattner 57230fdc8d8SChris Lattner SBError 57330fdc8d8SChris Lattner SBProcess::Continue () 57430fdc8d8SChris Lattner { 5752d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 576ceb6b139SCaroline Tice 57730fdc8d8SChris Lattner SBError sb_error; 578acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 5790c74e78dSGreg Clayton 580acdbe816SGreg Clayton if (log) 581acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get()); 582acdbe816SGreg Clayton 583acdbe816SGreg Clayton if (process_sp) 584acdbe816SGreg Clayton { 585acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 586acdbe816SGreg Clayton 587acdbe816SGreg Clayton Error error (process_sp->Resume()); 5885d5028b5SGreg Clayton if (error.Success()) 5895d5028b5SGreg Clayton { 590acdbe816SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 5914838131bSGreg Clayton { 5924838131bSGreg Clayton if (log) 593acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get()); 594acdbe816SGreg Clayton process_sp->WaitForProcessToStop (NULL); 5955d5028b5SGreg Clayton } 5964838131bSGreg Clayton } 5975d5028b5SGreg Clayton sb_error.SetError(error); 5985d5028b5SGreg Clayton } 59930fdc8d8SChris Lattner else 60030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 60130fdc8d8SChris Lattner 602ceb6b139SCaroline Tice if (log) 603ceb6b139SCaroline Tice { 604ceb6b139SCaroline Tice SBStream sstr; 605ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 606acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData()); 607ceb6b139SCaroline Tice } 608ceb6b139SCaroline Tice 60930fdc8d8SChris Lattner return sb_error; 61030fdc8d8SChris Lattner } 61130fdc8d8SChris Lattner 61230fdc8d8SChris Lattner 61330fdc8d8SChris Lattner SBError 61430fdc8d8SChris Lattner SBProcess::Destroy () 61530fdc8d8SChris Lattner { 61630fdc8d8SChris Lattner SBError sb_error; 617acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 618acdbe816SGreg Clayton if (process_sp) 6196779606aSGreg Clayton { 620acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 621acdbe816SGreg Clayton sb_error.SetError(process_sp->Destroy()); 6226779606aSGreg Clayton } 62330fdc8d8SChris Lattner else 62430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 62530fdc8d8SChris Lattner 6262d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6274838131bSGreg Clayton if (log) 6284838131bSGreg Clayton { 6294838131bSGreg Clayton SBStream sstr; 6304838131bSGreg Clayton sb_error.GetDescription (sstr); 6316779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 632acdbe816SGreg Clayton process_sp.get(), 6336779606aSGreg Clayton sb_error.get(), 6346779606aSGreg Clayton sstr.GetData()); 6354838131bSGreg Clayton } 6364838131bSGreg Clayton 63730fdc8d8SChris Lattner return sb_error; 63830fdc8d8SChris Lattner } 63930fdc8d8SChris Lattner 64030fdc8d8SChris Lattner 64130fdc8d8SChris Lattner SBError 64230fdc8d8SChris Lattner SBProcess::Stop () 64330fdc8d8SChris Lattner { 64430fdc8d8SChris Lattner SBError sb_error; 645acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 646acdbe816SGreg Clayton if (process_sp) 647af67cecdSGreg Clayton { 648acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 649acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 650af67cecdSGreg Clayton } 65130fdc8d8SChris Lattner else 65230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 653ceb6b139SCaroline Tice 6542d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 655ceb6b139SCaroline Tice if (log) 656ceb6b139SCaroline Tice { 657ceb6b139SCaroline Tice SBStream sstr; 658ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 65993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 660acdbe816SGreg Clayton process_sp.get(), 66193aa84e8SGreg Clayton sb_error.get(), 662750cd175SCaroline Tice sstr.GetData()); 663ceb6b139SCaroline Tice } 664ceb6b139SCaroline Tice 66530fdc8d8SChris Lattner return sb_error; 66630fdc8d8SChris Lattner } 66730fdc8d8SChris Lattner 66830fdc8d8SChris Lattner SBError 66930fdc8d8SChris Lattner SBProcess::Kill () 67030fdc8d8SChris Lattner { 67130fdc8d8SChris Lattner SBError sb_error; 672acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 673acdbe816SGreg Clayton if (process_sp) 674af67cecdSGreg Clayton { 675acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 676acdbe816SGreg Clayton sb_error.SetError (process_sp->Destroy()); 677af67cecdSGreg Clayton } 67830fdc8d8SChris Lattner else 67930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 680ceb6b139SCaroline Tice 6812d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 682ceb6b139SCaroline Tice if (log) 683ceb6b139SCaroline Tice { 684ceb6b139SCaroline Tice SBStream sstr; 685ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 68693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 687acdbe816SGreg Clayton process_sp.get(), 68893aa84e8SGreg Clayton sb_error.get(), 689750cd175SCaroline Tice sstr.GetData()); 690ceb6b139SCaroline Tice } 691ceb6b139SCaroline Tice 69230fdc8d8SChris Lattner return sb_error; 69330fdc8d8SChris Lattner } 69430fdc8d8SChris Lattner 69530fdc8d8SChris Lattner SBError 69630fdc8d8SChris Lattner SBProcess::Detach () 69730fdc8d8SChris Lattner { 69830fdc8d8SChris Lattner SBError sb_error; 699acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 700acdbe816SGreg Clayton if (process_sp) 701af67cecdSGreg Clayton { 702acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 703acdbe816SGreg Clayton sb_error.SetError (process_sp->Detach()); 704af67cecdSGreg Clayton } 70530fdc8d8SChris Lattner else 70630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 70730fdc8d8SChris Lattner 70830fdc8d8SChris Lattner return sb_error; 70930fdc8d8SChris Lattner } 71030fdc8d8SChris Lattner 71130fdc8d8SChris Lattner SBError 7124838131bSGreg Clayton SBProcess::Signal (int signo) 71330fdc8d8SChris Lattner { 71430fdc8d8SChris Lattner SBError sb_error; 715acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 716acdbe816SGreg Clayton if (process_sp) 717af67cecdSGreg Clayton { 718acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 719acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 720af67cecdSGreg Clayton } 72130fdc8d8SChris Lattner else 72230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 7232d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7244838131bSGreg Clayton if (log) 7254838131bSGreg Clayton { 7264838131bSGreg Clayton SBStream sstr; 7274838131bSGreg Clayton sb_error.GetDescription (sstr); 7284838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 729acdbe816SGreg Clayton process_sp.get(), 7304838131bSGreg Clayton signo, 7314838131bSGreg Clayton sb_error.get(), 7324838131bSGreg Clayton sstr.GetData()); 7334838131bSGreg Clayton } 73430fdc8d8SChris Lattner return sb_error; 73530fdc8d8SChris Lattner } 73630fdc8d8SChris Lattner 737cfc0935eSJim Ingham void 738cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 739cfc0935eSJim Ingham { 740cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 741cfc0935eSJim Ingham if (process_sp) 742cfc0935eSJim Ingham { 743cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 744cfc0935eSJim Ingham } 745cfc0935eSJim Ingham } 746cfc0935eSJim Ingham 74730fdc8d8SChris Lattner SBThread 7484838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 74930fdc8d8SChris Lattner { 7504838131bSGreg Clayton SBThread sb_thread; 75117a6ad05SGreg Clayton ThreadSP thread_sp; 752acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 753acdbe816SGreg Clayton if (process_sp) 754af67cecdSGreg Clayton { 755acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 7567fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7577fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 7587fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 75917a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 760af67cecdSGreg Clayton } 7614838131bSGreg Clayton 7622d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7634838131bSGreg Clayton if (log) 7644838131bSGreg Clayton { 76561e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)", 766acdbe816SGreg Clayton process_sp.get(), 7674838131bSGreg Clayton tid, 76817a6ad05SGreg Clayton thread_sp.get()); 7694838131bSGreg Clayton } 7704838131bSGreg Clayton 7714838131bSGreg Clayton return sb_thread; 77230fdc8d8SChris Lattner } 77330fdc8d8SChris Lattner 77418b46896SJim Ingham SBThread 77518b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 77618b46896SJim Ingham { 77718b46896SJim Ingham SBThread sb_thread; 77818b46896SJim Ingham ThreadSP thread_sp; 77918b46896SJim Ingham ProcessSP process_sp(GetSP()); 78018b46896SJim Ingham if (process_sp) 78118b46896SJim Ingham { 78218b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 78318b46896SJim Ingham Process::StopLocker stop_locker; 78418b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 78518b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 78618b46896SJim Ingham sb_thread.SetThread (thread_sp); 78718b46896SJim Ingham } 78818b46896SJim Ingham 78918b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 79018b46896SJim Ingham if (log) 79118b46896SJim Ingham { 79218b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 79318b46896SJim Ingham process_sp.get(), 79418b46896SJim Ingham index_id, 79518b46896SJim Ingham thread_sp.get()); 79618b46896SJim Ingham } 79718b46896SJim Ingham 79818b46896SJim Ingham return sb_thread; 79918b46896SJim Ingham } 80018b46896SJim Ingham 80130fdc8d8SChris Lattner StateType 80230fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 80330fdc8d8SChris Lattner { 8042d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 805ceb6b139SCaroline Tice 806ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 807ceb6b139SCaroline Tice 808ceb6b139SCaroline Tice if (log) 809cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 810750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 811ceb6b139SCaroline Tice 812ceb6b139SCaroline Tice return ret_val; 81330fdc8d8SChris Lattner } 81430fdc8d8SChris Lattner 81530fdc8d8SChris Lattner bool 81630fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 81730fdc8d8SChris Lattner { 8186611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 81930fdc8d8SChris Lattner } 82030fdc8d8SChris Lattner 82130fdc8d8SChris Lattner SBProcess 82230fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 82330fdc8d8SChris Lattner { 8246611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 82530fdc8d8SChris Lattner return process; 82630fdc8d8SChris Lattner } 82730fdc8d8SChris Lattner 828e6bc6cb9SJim Ingham bool 829e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 830e6bc6cb9SJim Ingham { 8314bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 832e6bc6cb9SJim Ingham } 83330fdc8d8SChris Lattner 83430fdc8d8SChris Lattner SBBroadcaster 83530fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 83630fdc8d8SChris Lattner { 8372d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 838ceb6b139SCaroline Tice 839acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 840acdbe816SGreg Clayton 841acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 842ceb6b139SCaroline Tice 843ceb6b139SCaroline Tice if (log) 844acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 845750cd175SCaroline Tice broadcaster.get()); 846ceb6b139SCaroline Tice 84730fdc8d8SChris Lattner return broadcaster; 84830fdc8d8SChris Lattner } 84930fdc8d8SChris Lattner 8504bddaeb5SJim Ingham const char * 8514bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 8524bddaeb5SJim Ingham { 8534bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 8544bddaeb5SJim Ingham } 8554bddaeb5SJim Ingham 85630fdc8d8SChris Lattner size_t 85730fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 85830fdc8d8SChris Lattner { 8592d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 860ceb6b139SCaroline Tice 86130fdc8d8SChris Lattner size_t bytes_read = 0; 86230fdc8d8SChris Lattner 863acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 864acdbe816SGreg Clayton 8654838131bSGreg Clayton if (log) 8664838131bSGreg Clayton { 86743e0af06SGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p))...", 868acdbe816SGreg Clayton process_sp.get(), 8694838131bSGreg Clayton addr, 8704838131bSGreg Clayton dst, 87143e0af06SGreg Clayton (uint64_t)dst_len, 8724838131bSGreg Clayton sb_error.get()); 8734838131bSGreg Clayton } 8744838131bSGreg Clayton 875acdbe816SGreg Clayton if (process_sp) 87630fdc8d8SChris Lattner { 8777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8787fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 8797fdf9ef1SGreg Clayton { 880acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 8817fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 8827fdf9ef1SGreg Clayton } 8837fdf9ef1SGreg Clayton else 8847fdf9ef1SGreg Clayton { 885c9858e4dSGreg Clayton if (log) 886c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get()); 8877fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 8887fdf9ef1SGreg Clayton } 88930fdc8d8SChris Lattner } 89030fdc8d8SChris Lattner else 89130fdc8d8SChris Lattner { 89230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 89330fdc8d8SChris Lattner } 89430fdc8d8SChris Lattner 895ceb6b139SCaroline Tice if (log) 89693aa84e8SGreg Clayton { 89793aa84e8SGreg Clayton SBStream sstr; 89893aa84e8SGreg Clayton sb_error.GetDescription (sstr); 89943e0af06SGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p): %s) => %llu", 900acdbe816SGreg Clayton process_sp.get(), 90193aa84e8SGreg Clayton addr, 90293aa84e8SGreg Clayton dst, 90343e0af06SGreg Clayton (uint64_t)dst_len, 90493aa84e8SGreg Clayton sb_error.get(), 90593aa84e8SGreg Clayton sstr.GetData(), 90643e0af06SGreg Clayton (uint64_t)bytes_read); 90793aa84e8SGreg Clayton } 908ceb6b139SCaroline Tice 90930fdc8d8SChris Lattner return bytes_read; 91030fdc8d8SChris Lattner } 91130fdc8d8SChris Lattner 91230fdc8d8SChris Lattner size_t 913e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 914e91b7957SGreg Clayton { 915e91b7957SGreg Clayton size_t bytes_read = 0; 916acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 917acdbe816SGreg Clayton if (process_sp) 918e91b7957SGreg Clayton { 9197fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9207fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9217fdf9ef1SGreg Clayton { 922acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9237fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 9247fdf9ef1SGreg Clayton } 9257fdf9ef1SGreg Clayton else 9267fdf9ef1SGreg Clayton { 927c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 928c9858e4dSGreg Clayton if (log) 929c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get()); 9307fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9317fdf9ef1SGreg Clayton } 932e91b7957SGreg Clayton } 933e91b7957SGreg Clayton else 934e91b7957SGreg Clayton { 935e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 936e91b7957SGreg Clayton } 937e91b7957SGreg Clayton return bytes_read; 938e91b7957SGreg Clayton } 939e91b7957SGreg Clayton 940e91b7957SGreg Clayton uint64_t 941e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 942e91b7957SGreg Clayton { 9437fdf9ef1SGreg Clayton uint64_t value = 0; 944acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 945acdbe816SGreg Clayton if (process_sp) 946e91b7957SGreg Clayton { 9477fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9487fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9497fdf9ef1SGreg Clayton { 950acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9517fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 9527fdf9ef1SGreg Clayton } 9537fdf9ef1SGreg Clayton else 9547fdf9ef1SGreg Clayton { 955c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 956c9858e4dSGreg Clayton if (log) 957c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get()); 9587fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9597fdf9ef1SGreg Clayton } 960e91b7957SGreg Clayton } 961e91b7957SGreg Clayton else 962e91b7957SGreg Clayton { 963e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 964e91b7957SGreg Clayton } 9657fdf9ef1SGreg Clayton return value; 966e91b7957SGreg Clayton } 967e91b7957SGreg Clayton 968e91b7957SGreg Clayton lldb::addr_t 969e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 970e91b7957SGreg Clayton { 971e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 972acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 973acdbe816SGreg Clayton if (process_sp) 974e91b7957SGreg Clayton { 9757fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9767fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9777fdf9ef1SGreg Clayton { 978acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9797fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 9807fdf9ef1SGreg Clayton } 9817fdf9ef1SGreg Clayton else 9827fdf9ef1SGreg Clayton { 983c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 984c9858e4dSGreg Clayton if (log) 985c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get()); 9867fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9877fdf9ef1SGreg Clayton } 988e91b7957SGreg Clayton } 989e91b7957SGreg Clayton else 990e91b7957SGreg Clayton { 991e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 992e91b7957SGreg Clayton } 993e91b7957SGreg Clayton return ptr; 994e91b7957SGreg Clayton } 995e91b7957SGreg Clayton 996e91b7957SGreg Clayton size_t 99730fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 99830fdc8d8SChris Lattner { 99930fdc8d8SChris Lattner size_t bytes_written = 0; 100030fdc8d8SChris Lattner 10012d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1002acdbe816SGreg Clayton 1003acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1004acdbe816SGreg Clayton 10054838131bSGreg Clayton if (log) 10064838131bSGreg Clayton { 100743e0af06SGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p))...", 1008acdbe816SGreg Clayton process_sp.get(), 10094838131bSGreg Clayton addr, 10104838131bSGreg Clayton src, 101143e0af06SGreg Clayton (uint64_t)src_len, 10124838131bSGreg Clayton sb_error.get()); 10134838131bSGreg Clayton } 10144838131bSGreg Clayton 1015acdbe816SGreg Clayton if (process_sp) 101630fdc8d8SChris Lattner { 10177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10187fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10197fdf9ef1SGreg Clayton { 1020acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10217fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 10227fdf9ef1SGreg Clayton } 10237fdf9ef1SGreg Clayton else 10247fdf9ef1SGreg Clayton { 1025c9858e4dSGreg Clayton if (log) 1026c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get()); 10277fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10287fdf9ef1SGreg Clayton } 102930fdc8d8SChris Lattner } 103030fdc8d8SChris Lattner 10314838131bSGreg Clayton if (log) 10324838131bSGreg Clayton { 10334838131bSGreg Clayton SBStream sstr; 10344838131bSGreg Clayton sb_error.GetDescription (sstr); 103543e0af06SGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p): %s) => %llu", 1036acdbe816SGreg Clayton process_sp.get(), 10374838131bSGreg Clayton addr, 10384838131bSGreg Clayton src, 103943e0af06SGreg Clayton (uint64_t)src_len, 10404838131bSGreg Clayton sb_error.get(), 10414838131bSGreg Clayton sstr.GetData(), 104243e0af06SGreg Clayton (uint64_t)bytes_written); 10434838131bSGreg Clayton } 10444838131bSGreg Clayton 104530fdc8d8SChris Lattner return bytes_written; 104630fdc8d8SChris Lattner } 104730fdc8d8SChris Lattner 1048dde9cff3SCaroline Tice bool 1049dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1050dde9cff3SCaroline Tice { 1051da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1052da7bc7d0SGreg Clayton 1053acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1054acdbe816SGreg Clayton if (process_sp) 1055dde9cff3SCaroline Tice { 1056dde9cff3SCaroline Tice char path[PATH_MAX]; 1057dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1058acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 10591d273166SGreg Clayton const char *exe_name = NULL; 10601d273166SGreg Clayton if (exe_module) 10611d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 10621d273166SGreg Clayton 1063da7bc7d0SGreg Clayton strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s", 1064acdbe816SGreg Clayton process_sp->GetID(), 1065ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 10661d273166SGreg Clayton GetNumThreads(), 106705faeb71SGreg Clayton exe_name ? ", executable = " : "", 10681d273166SGreg Clayton exe_name ? exe_name : ""); 1069dde9cff3SCaroline Tice } 1070dde9cff3SCaroline Tice else 1071da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1072dde9cff3SCaroline Tice 1073dde9cff3SCaroline Tice return true; 1074dde9cff3SCaroline Tice } 10758f343b09SGreg Clayton 10768f343b09SGreg Clayton uint32_t 1077f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1078f9ef60d2SJohnny Chen { 1079f9ef60d2SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1080f9ef60d2SJohnny Chen 1081f9ef60d2SJohnny Chen uint32_t num = 0; 1082f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1083f9ef60d2SJohnny Chen if (process_sp) 1084f9ef60d2SJohnny Chen { 1085f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1086f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1087f9ef60d2SJohnny Chen if (log) 1088f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1089f9ef60d2SJohnny Chen process_sp.get(), num); 1090f9ef60d2SJohnny Chen } 1091f9ef60d2SJohnny Chen else 1092f9ef60d2SJohnny Chen { 1093f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1094f9ef60d2SJohnny Chen } 1095f9ef60d2SJohnny Chen return num; 1096f9ef60d2SJohnny Chen } 1097f9ef60d2SJohnny Chen 1098f9ef60d2SJohnny Chen uint32_t 10998f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 11008f343b09SGreg Clayton { 1101acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1102acdbe816SGreg Clayton if (process_sp) 1103af67cecdSGreg Clayton { 11047fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11057fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11067fdf9ef1SGreg Clayton { 1107acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1108acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1109af67cecdSGreg Clayton } 11107fdf9ef1SGreg Clayton else 11117fdf9ef1SGreg Clayton { 1112c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1113c9858e4dSGreg Clayton if (log) 1114c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get()); 11157fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11167fdf9ef1SGreg Clayton } 11177fdf9ef1SGreg Clayton } 11188f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11198f343b09SGreg Clayton } 11208f343b09SGreg Clayton 11218f343b09SGreg Clayton lldb::SBError 11228f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 11238f343b09SGreg Clayton { 11248f343b09SGreg Clayton lldb::SBError sb_error; 1125acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1126acdbe816SGreg Clayton if (process_sp) 1127af67cecdSGreg Clayton { 11287fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11297fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11307fdf9ef1SGreg Clayton { 1131acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1132acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1133af67cecdSGreg Clayton } 11348f343b09SGreg Clayton else 11357fdf9ef1SGreg Clayton { 1136c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1137c9858e4dSGreg Clayton if (log) 1138c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get()); 11397fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11407fdf9ef1SGreg Clayton } 11417fdf9ef1SGreg Clayton } 11427fdf9ef1SGreg Clayton else 11438f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 11448f343b09SGreg Clayton return sb_error; 11458f343b09SGreg Clayton } 1146