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) 313*43e0af06SGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%llu) => %llu", 314*43e0af06SGreg Clayton process_sp.get(), 315*43e0af06SGreg Clayton (int) bytes_read, 316*43e0af06SGreg Clayton dst, 317*43e0af06SGreg Clayton (uint64_t)dst_len, 318*43e0af06SGreg 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) 336*43e0af06SGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%llu) => %llu", 337*43e0af06SGreg Clayton process_sp.get(), 338*43e0af06SGreg Clayton (int) bytes_read, 339*43e0af06SGreg Clayton dst, 340*43e0af06SGreg Clayton (uint64_t)dst_len, 341*43e0af06SGreg 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 { 4012d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 402ceb6b139SCaroline Tice 403ceb6b139SCaroline Tice bool ret_val = false; 404acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 405acdbe816SGreg Clayton if (process_sp) 406af67cecdSGreg Clayton { 407acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 408acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 409af67cecdSGreg Clayton } 410ceb6b139SCaroline Tice 411ceb6b139SCaroline Tice if (log) 412cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s", 413acdbe816SGreg Clayton process_sp.get(), tid, (ret_val ? "true" : "false")); 414ceb6b139SCaroline Tice 415ceb6b139SCaroline Tice return ret_val; 41630fdc8d8SChris Lattner } 41730fdc8d8SChris Lattner 41818b46896SJim Ingham bool 41918b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 42018b46896SJim Ingham { 42118b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 42218b46896SJim Ingham 42318b46896SJim Ingham bool ret_val = false; 42418b46896SJim Ingham ProcessSP process_sp(GetSP()); 42518b46896SJim Ingham if (process_sp) 42618b46896SJim Ingham { 42718b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 42818b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 42918b46896SJim Ingham } 43018b46896SJim Ingham 43118b46896SJim Ingham if (log) 43218b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 43318b46896SJim Ingham process_sp.get(), index_id, (ret_val ? "true" : "false")); 43418b46896SJim Ingham 43518b46896SJim Ingham return ret_val; 43618b46896SJim Ingham } 43718b46896SJim Ingham 43830fdc8d8SChris Lattner SBThread 43930fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 44030fdc8d8SChris Lattner { 4412d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 442ceb6b139SCaroline Tice 44317a6ad05SGreg Clayton SBThread sb_thread; 44417a6ad05SGreg Clayton ThreadSP thread_sp; 445acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 446acdbe816SGreg Clayton if (process_sp) 447af67cecdSGreg Clayton { 4487fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4497fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 450acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 4517fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 45217a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 453af67cecdSGreg Clayton } 454ceb6b139SCaroline Tice 455ceb6b139SCaroline Tice if (log) 456ceb6b139SCaroline Tice { 45793aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 458acdbe816SGreg Clayton process_sp.get(), (uint32_t) index, thread_sp.get()); 459ceb6b139SCaroline Tice } 460ceb6b139SCaroline Tice 46117a6ad05SGreg Clayton return sb_thread; 46230fdc8d8SChris Lattner } 46330fdc8d8SChris Lattner 46430fdc8d8SChris Lattner StateType 46530fdc8d8SChris Lattner SBProcess::GetState () 46630fdc8d8SChris Lattner { 467ceb6b139SCaroline Tice 468ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 469acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 470acdbe816SGreg Clayton if (process_sp) 471af67cecdSGreg Clayton { 472acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 473acdbe816SGreg Clayton ret_val = process_sp->GetState(); 474af67cecdSGreg Clayton } 475ceb6b139SCaroline Tice 4762d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 477ceb6b139SCaroline Tice if (log) 478cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 479acdbe816SGreg Clayton process_sp.get(), 480750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 481ceb6b139SCaroline Tice 482ceb6b139SCaroline Tice return ret_val; 48330fdc8d8SChris Lattner } 48430fdc8d8SChris Lattner 48530fdc8d8SChris Lattner 48630fdc8d8SChris Lattner int 48730fdc8d8SChris Lattner SBProcess::GetExitStatus () 48830fdc8d8SChris Lattner { 4894838131bSGreg Clayton int exit_status = 0; 490acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 491acdbe816SGreg Clayton if (process_sp) 492af67cecdSGreg Clayton { 493acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 494acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 495af67cecdSGreg Clayton } 4962d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4974838131bSGreg Clayton if (log) 4984838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 499acdbe816SGreg Clayton process_sp.get(), exit_status, exit_status); 5004838131bSGreg Clayton 5014838131bSGreg Clayton return exit_status; 50230fdc8d8SChris Lattner } 50330fdc8d8SChris Lattner 50430fdc8d8SChris Lattner const char * 50530fdc8d8SChris Lattner SBProcess::GetExitDescription () 50630fdc8d8SChris Lattner { 5074838131bSGreg Clayton const char *exit_desc = NULL; 508acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 509acdbe816SGreg Clayton if (process_sp) 510af67cecdSGreg Clayton { 511acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 512acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 513af67cecdSGreg Clayton } 5142d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5154838131bSGreg Clayton if (log) 5164838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 517acdbe816SGreg Clayton process_sp.get(), exit_desc); 5184838131bSGreg Clayton return exit_desc; 51930fdc8d8SChris Lattner } 52030fdc8d8SChris Lattner 52130fdc8d8SChris Lattner lldb::pid_t 52230fdc8d8SChris Lattner SBProcess::GetProcessID () 52330fdc8d8SChris Lattner { 524ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 525acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 526acdbe816SGreg Clayton if (process_sp) 527acdbe816SGreg Clayton ret_val = process_sp->GetID(); 528ceb6b139SCaroline Tice 5292d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 530ceb6b139SCaroline Tice if (log) 531acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val); 532ceb6b139SCaroline Tice 533ceb6b139SCaroline Tice return ret_val; 53430fdc8d8SChris Lattner } 53530fdc8d8SChris Lattner 536cf386e24SJohnny Chen ByteOrder 537cf386e24SJohnny Chen SBProcess::GetByteOrder () const 538cf386e24SJohnny Chen { 539cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 540acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 541acdbe816SGreg Clayton if (process_sp) 542acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 543cf386e24SJohnny Chen 544cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 545cf386e24SJohnny Chen if (log) 546acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder); 547cf386e24SJohnny Chen 548cf386e24SJohnny Chen return byteOrder; 549cf386e24SJohnny Chen } 550cf386e24SJohnny Chen 55130fdc8d8SChris Lattner uint32_t 55230fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 55330fdc8d8SChris Lattner { 554ceb6b139SCaroline Tice uint32_t size = 0; 555acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 556acdbe816SGreg Clayton if (process_sp) 557acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 558ceb6b139SCaroline Tice 5592d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 560ceb6b139SCaroline Tice if (log) 561acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size); 562ceb6b139SCaroline Tice 563ceb6b139SCaroline Tice return size; 56430fdc8d8SChris Lattner } 56530fdc8d8SChris Lattner 56630fdc8d8SChris Lattner SBError 56730fdc8d8SChris Lattner SBProcess::Continue () 56830fdc8d8SChris Lattner { 5692d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 570ceb6b139SCaroline Tice 57130fdc8d8SChris Lattner SBError sb_error; 572acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 5730c74e78dSGreg Clayton 574acdbe816SGreg Clayton if (log) 575acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get()); 576acdbe816SGreg Clayton 577acdbe816SGreg Clayton if (process_sp) 578acdbe816SGreg Clayton { 579acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 580acdbe816SGreg Clayton 581acdbe816SGreg Clayton Error error (process_sp->Resume()); 5825d5028b5SGreg Clayton if (error.Success()) 5835d5028b5SGreg Clayton { 584acdbe816SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 5854838131bSGreg Clayton { 5864838131bSGreg Clayton if (log) 587acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get()); 588acdbe816SGreg Clayton process_sp->WaitForProcessToStop (NULL); 5895d5028b5SGreg Clayton } 5904838131bSGreg Clayton } 5915d5028b5SGreg Clayton sb_error.SetError(error); 5925d5028b5SGreg Clayton } 59330fdc8d8SChris Lattner else 59430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 59530fdc8d8SChris Lattner 596ceb6b139SCaroline Tice if (log) 597ceb6b139SCaroline Tice { 598ceb6b139SCaroline Tice SBStream sstr; 599ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 600acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData()); 601ceb6b139SCaroline Tice } 602ceb6b139SCaroline Tice 60330fdc8d8SChris Lattner return sb_error; 60430fdc8d8SChris Lattner } 60530fdc8d8SChris Lattner 60630fdc8d8SChris Lattner 60730fdc8d8SChris Lattner SBError 60830fdc8d8SChris Lattner SBProcess::Destroy () 60930fdc8d8SChris Lattner { 61030fdc8d8SChris Lattner SBError sb_error; 611acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 612acdbe816SGreg Clayton if (process_sp) 6136779606aSGreg Clayton { 614acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 615acdbe816SGreg Clayton sb_error.SetError(process_sp->Destroy()); 6166779606aSGreg Clayton } 61730fdc8d8SChris Lattner else 61830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 61930fdc8d8SChris Lattner 6202d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6214838131bSGreg Clayton if (log) 6224838131bSGreg Clayton { 6234838131bSGreg Clayton SBStream sstr; 6244838131bSGreg Clayton sb_error.GetDescription (sstr); 6256779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 626acdbe816SGreg Clayton process_sp.get(), 6276779606aSGreg Clayton sb_error.get(), 6286779606aSGreg Clayton sstr.GetData()); 6294838131bSGreg Clayton } 6304838131bSGreg Clayton 63130fdc8d8SChris Lattner return sb_error; 63230fdc8d8SChris Lattner } 63330fdc8d8SChris Lattner 63430fdc8d8SChris Lattner 63530fdc8d8SChris Lattner SBError 63630fdc8d8SChris Lattner SBProcess::Stop () 63730fdc8d8SChris Lattner { 63830fdc8d8SChris Lattner SBError sb_error; 639acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 640acdbe816SGreg Clayton if (process_sp) 641af67cecdSGreg Clayton { 642acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 643acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 644af67cecdSGreg Clayton } 64530fdc8d8SChris Lattner else 64630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 647ceb6b139SCaroline Tice 6482d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 649ceb6b139SCaroline Tice if (log) 650ceb6b139SCaroline Tice { 651ceb6b139SCaroline Tice SBStream sstr; 652ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 65393aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 654acdbe816SGreg Clayton process_sp.get(), 65593aa84e8SGreg Clayton sb_error.get(), 656750cd175SCaroline Tice sstr.GetData()); 657ceb6b139SCaroline Tice } 658ceb6b139SCaroline Tice 65930fdc8d8SChris Lattner return sb_error; 66030fdc8d8SChris Lattner } 66130fdc8d8SChris Lattner 66230fdc8d8SChris Lattner SBError 66330fdc8d8SChris Lattner SBProcess::Kill () 66430fdc8d8SChris Lattner { 66530fdc8d8SChris Lattner SBError sb_error; 666acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 667acdbe816SGreg Clayton if (process_sp) 668af67cecdSGreg Clayton { 669acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 670acdbe816SGreg Clayton sb_error.SetError (process_sp->Destroy()); 671af67cecdSGreg Clayton } 67230fdc8d8SChris Lattner else 67330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 674ceb6b139SCaroline Tice 6752d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 676ceb6b139SCaroline Tice if (log) 677ceb6b139SCaroline Tice { 678ceb6b139SCaroline Tice SBStream sstr; 679ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 68093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 681acdbe816SGreg Clayton process_sp.get(), 68293aa84e8SGreg Clayton sb_error.get(), 683750cd175SCaroline Tice sstr.GetData()); 684ceb6b139SCaroline Tice } 685ceb6b139SCaroline Tice 68630fdc8d8SChris Lattner return sb_error; 68730fdc8d8SChris Lattner } 68830fdc8d8SChris Lattner 68930fdc8d8SChris Lattner SBError 69030fdc8d8SChris Lattner SBProcess::Detach () 69130fdc8d8SChris Lattner { 69230fdc8d8SChris Lattner SBError sb_error; 693acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 694acdbe816SGreg Clayton if (process_sp) 695af67cecdSGreg Clayton { 696acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 697acdbe816SGreg Clayton sb_error.SetError (process_sp->Detach()); 698af67cecdSGreg Clayton } 69930fdc8d8SChris Lattner else 70030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 70130fdc8d8SChris Lattner 70230fdc8d8SChris Lattner return sb_error; 70330fdc8d8SChris Lattner } 70430fdc8d8SChris Lattner 70530fdc8d8SChris Lattner SBError 7064838131bSGreg Clayton SBProcess::Signal (int signo) 70730fdc8d8SChris Lattner { 70830fdc8d8SChris Lattner SBError sb_error; 709acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 710acdbe816SGreg Clayton if (process_sp) 711af67cecdSGreg Clayton { 712acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 713acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 714af67cecdSGreg Clayton } 71530fdc8d8SChris Lattner else 71630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 7172d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7184838131bSGreg Clayton if (log) 7194838131bSGreg Clayton { 7204838131bSGreg Clayton SBStream sstr; 7214838131bSGreg Clayton sb_error.GetDescription (sstr); 7224838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 723acdbe816SGreg Clayton process_sp.get(), 7244838131bSGreg Clayton signo, 7254838131bSGreg Clayton sb_error.get(), 7264838131bSGreg Clayton sstr.GetData()); 7274838131bSGreg Clayton } 72830fdc8d8SChris Lattner return sb_error; 72930fdc8d8SChris Lattner } 73030fdc8d8SChris Lattner 731cfc0935eSJim Ingham void 732cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 733cfc0935eSJim Ingham { 734cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 735cfc0935eSJim Ingham if (process_sp) 736cfc0935eSJim Ingham { 737cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 738cfc0935eSJim Ingham } 739cfc0935eSJim Ingham } 740cfc0935eSJim Ingham 74130fdc8d8SChris Lattner SBThread 7424838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 74330fdc8d8SChris Lattner { 7444838131bSGreg Clayton SBThread sb_thread; 74517a6ad05SGreg Clayton ThreadSP thread_sp; 746acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 747acdbe816SGreg Clayton if (process_sp) 748af67cecdSGreg Clayton { 749acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 7507fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7517fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 7527fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 75317a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 754af67cecdSGreg Clayton } 7554838131bSGreg Clayton 7562d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7574838131bSGreg Clayton if (log) 7584838131bSGreg Clayton { 75961e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)", 760acdbe816SGreg Clayton process_sp.get(), 7614838131bSGreg Clayton tid, 76217a6ad05SGreg Clayton thread_sp.get()); 7634838131bSGreg Clayton } 7644838131bSGreg Clayton 7654838131bSGreg Clayton return sb_thread; 76630fdc8d8SChris Lattner } 76730fdc8d8SChris Lattner 76818b46896SJim Ingham SBThread 76918b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 77018b46896SJim Ingham { 77118b46896SJim Ingham SBThread sb_thread; 77218b46896SJim Ingham ThreadSP thread_sp; 77318b46896SJim Ingham ProcessSP process_sp(GetSP()); 77418b46896SJim Ingham if (process_sp) 77518b46896SJim Ingham { 77618b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 77718b46896SJim Ingham Process::StopLocker stop_locker; 77818b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 77918b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 78018b46896SJim Ingham sb_thread.SetThread (thread_sp); 78118b46896SJim Ingham } 78218b46896SJim Ingham 78318b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 78418b46896SJim Ingham if (log) 78518b46896SJim Ingham { 78618b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 78718b46896SJim Ingham process_sp.get(), 78818b46896SJim Ingham index_id, 78918b46896SJim Ingham thread_sp.get()); 79018b46896SJim Ingham } 79118b46896SJim Ingham 79218b46896SJim Ingham return sb_thread; 79318b46896SJim Ingham } 79418b46896SJim Ingham 79530fdc8d8SChris Lattner StateType 79630fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 79730fdc8d8SChris Lattner { 7982d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 799ceb6b139SCaroline Tice 800ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 801ceb6b139SCaroline Tice 802ceb6b139SCaroline Tice if (log) 803cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 804750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 805ceb6b139SCaroline Tice 806ceb6b139SCaroline Tice return ret_val; 80730fdc8d8SChris Lattner } 80830fdc8d8SChris Lattner 80930fdc8d8SChris Lattner bool 81030fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 81130fdc8d8SChris Lattner { 8126611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 81330fdc8d8SChris Lattner } 81430fdc8d8SChris Lattner 81530fdc8d8SChris Lattner SBProcess 81630fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 81730fdc8d8SChris Lattner { 8186611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 81930fdc8d8SChris Lattner return process; 82030fdc8d8SChris Lattner } 82130fdc8d8SChris Lattner 822e6bc6cb9SJim Ingham bool 823e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 824e6bc6cb9SJim Ingham { 8254bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 826e6bc6cb9SJim Ingham } 82730fdc8d8SChris Lattner 82830fdc8d8SChris Lattner SBBroadcaster 82930fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 83030fdc8d8SChris Lattner { 8312d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 832ceb6b139SCaroline Tice 833acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 834acdbe816SGreg Clayton 835acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 836ceb6b139SCaroline Tice 837ceb6b139SCaroline Tice if (log) 838acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 839750cd175SCaroline Tice broadcaster.get()); 840ceb6b139SCaroline Tice 84130fdc8d8SChris Lattner return broadcaster; 84230fdc8d8SChris Lattner } 84330fdc8d8SChris Lattner 8444bddaeb5SJim Ingham const char * 8454bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 8464bddaeb5SJim Ingham { 8474bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 8484bddaeb5SJim Ingham } 8494bddaeb5SJim Ingham 85030fdc8d8SChris Lattner size_t 85130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 85230fdc8d8SChris Lattner { 8532d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 854ceb6b139SCaroline Tice 85530fdc8d8SChris Lattner size_t bytes_read = 0; 85630fdc8d8SChris Lattner 857acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 858acdbe816SGreg Clayton 8594838131bSGreg Clayton if (log) 8604838131bSGreg Clayton { 861*43e0af06SGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p))...", 862acdbe816SGreg Clayton process_sp.get(), 8634838131bSGreg Clayton addr, 8644838131bSGreg Clayton dst, 865*43e0af06SGreg Clayton (uint64_t)dst_len, 8664838131bSGreg Clayton sb_error.get()); 8674838131bSGreg Clayton } 8684838131bSGreg Clayton 869acdbe816SGreg Clayton if (process_sp) 87030fdc8d8SChris Lattner { 8717fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8727fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 8737fdf9ef1SGreg Clayton { 874acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 8757fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 8767fdf9ef1SGreg Clayton } 8777fdf9ef1SGreg Clayton else 8787fdf9ef1SGreg Clayton { 879c9858e4dSGreg Clayton if (log) 880c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get()); 8817fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 8827fdf9ef1SGreg Clayton } 88330fdc8d8SChris Lattner } 88430fdc8d8SChris Lattner else 88530fdc8d8SChris Lattner { 88630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 88730fdc8d8SChris Lattner } 88830fdc8d8SChris Lattner 889ceb6b139SCaroline Tice if (log) 89093aa84e8SGreg Clayton { 89193aa84e8SGreg Clayton SBStream sstr; 89293aa84e8SGreg Clayton sb_error.GetDescription (sstr); 893*43e0af06SGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%llu, SBError (%p): %s) => %llu", 894acdbe816SGreg Clayton process_sp.get(), 89593aa84e8SGreg Clayton addr, 89693aa84e8SGreg Clayton dst, 897*43e0af06SGreg Clayton (uint64_t)dst_len, 89893aa84e8SGreg Clayton sb_error.get(), 89993aa84e8SGreg Clayton sstr.GetData(), 900*43e0af06SGreg Clayton (uint64_t)bytes_read); 90193aa84e8SGreg Clayton } 902ceb6b139SCaroline Tice 90330fdc8d8SChris Lattner return bytes_read; 90430fdc8d8SChris Lattner } 90530fdc8d8SChris Lattner 90630fdc8d8SChris Lattner size_t 907e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 908e91b7957SGreg Clayton { 909e91b7957SGreg Clayton size_t bytes_read = 0; 910acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 911acdbe816SGreg Clayton if (process_sp) 912e91b7957SGreg Clayton { 9137fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9147fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9157fdf9ef1SGreg Clayton { 916acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9177fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 9187fdf9ef1SGreg Clayton } 9197fdf9ef1SGreg Clayton else 9207fdf9ef1SGreg Clayton { 921c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 922c9858e4dSGreg Clayton if (log) 923c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get()); 9247fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9257fdf9ef1SGreg Clayton } 926e91b7957SGreg Clayton } 927e91b7957SGreg Clayton else 928e91b7957SGreg Clayton { 929e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 930e91b7957SGreg Clayton } 931e91b7957SGreg Clayton return bytes_read; 932e91b7957SGreg Clayton } 933e91b7957SGreg Clayton 934e91b7957SGreg Clayton uint64_t 935e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 936e91b7957SGreg Clayton { 9377fdf9ef1SGreg Clayton uint64_t value = 0; 938acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 939acdbe816SGreg Clayton if (process_sp) 940e91b7957SGreg Clayton { 9417fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9427fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9437fdf9ef1SGreg Clayton { 944acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9457fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 9467fdf9ef1SGreg Clayton } 9477fdf9ef1SGreg Clayton else 9487fdf9ef1SGreg Clayton { 949c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 950c9858e4dSGreg Clayton if (log) 951c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get()); 9527fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9537fdf9ef1SGreg Clayton } 954e91b7957SGreg Clayton } 955e91b7957SGreg Clayton else 956e91b7957SGreg Clayton { 957e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 958e91b7957SGreg Clayton } 9597fdf9ef1SGreg Clayton return value; 960e91b7957SGreg Clayton } 961e91b7957SGreg Clayton 962e91b7957SGreg Clayton lldb::addr_t 963e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 964e91b7957SGreg Clayton { 965e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 966acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 967acdbe816SGreg Clayton if (process_sp) 968e91b7957SGreg Clayton { 9697fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9707fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9717fdf9ef1SGreg Clayton { 972acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9737fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 9747fdf9ef1SGreg Clayton } 9757fdf9ef1SGreg Clayton else 9767fdf9ef1SGreg Clayton { 977c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 978c9858e4dSGreg Clayton if (log) 979c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get()); 9807fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9817fdf9ef1SGreg Clayton } 982e91b7957SGreg Clayton } 983e91b7957SGreg Clayton else 984e91b7957SGreg Clayton { 985e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 986e91b7957SGreg Clayton } 987e91b7957SGreg Clayton return ptr; 988e91b7957SGreg Clayton } 989e91b7957SGreg Clayton 990e91b7957SGreg Clayton size_t 99130fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 99230fdc8d8SChris Lattner { 99330fdc8d8SChris Lattner size_t bytes_written = 0; 99430fdc8d8SChris Lattner 9952d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 996acdbe816SGreg Clayton 997acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 998acdbe816SGreg Clayton 9994838131bSGreg Clayton if (log) 10004838131bSGreg Clayton { 1001*43e0af06SGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p))...", 1002acdbe816SGreg Clayton process_sp.get(), 10034838131bSGreg Clayton addr, 10044838131bSGreg Clayton src, 1005*43e0af06SGreg Clayton (uint64_t)src_len, 10064838131bSGreg Clayton sb_error.get()); 10074838131bSGreg Clayton } 10084838131bSGreg Clayton 1009acdbe816SGreg Clayton if (process_sp) 101030fdc8d8SChris Lattner { 10117fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10127fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10137fdf9ef1SGreg Clayton { 1014acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10157fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 10167fdf9ef1SGreg Clayton } 10177fdf9ef1SGreg Clayton else 10187fdf9ef1SGreg Clayton { 1019c9858e4dSGreg Clayton if (log) 1020c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get()); 10217fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10227fdf9ef1SGreg Clayton } 102330fdc8d8SChris Lattner } 102430fdc8d8SChris Lattner 10254838131bSGreg Clayton if (log) 10264838131bSGreg Clayton { 10274838131bSGreg Clayton SBStream sstr; 10284838131bSGreg Clayton sb_error.GetDescription (sstr); 1029*43e0af06SGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, src_len=%llu, SBError (%p): %s) => %llu", 1030acdbe816SGreg Clayton process_sp.get(), 10314838131bSGreg Clayton addr, 10324838131bSGreg Clayton src, 1033*43e0af06SGreg Clayton (uint64_t)src_len, 10344838131bSGreg Clayton sb_error.get(), 10354838131bSGreg Clayton sstr.GetData(), 1036*43e0af06SGreg Clayton (uint64_t)bytes_written); 10374838131bSGreg Clayton } 10384838131bSGreg Clayton 103930fdc8d8SChris Lattner return bytes_written; 104030fdc8d8SChris Lattner } 104130fdc8d8SChris Lattner 1042dde9cff3SCaroline Tice bool 1043dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1044dde9cff3SCaroline Tice { 1045da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1046da7bc7d0SGreg Clayton 1047acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1048acdbe816SGreg Clayton if (process_sp) 1049dde9cff3SCaroline Tice { 1050dde9cff3SCaroline Tice char path[PATH_MAX]; 1051dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1052acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 10531d273166SGreg Clayton const char *exe_name = NULL; 10541d273166SGreg Clayton if (exe_module) 10551d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 10561d273166SGreg Clayton 1057da7bc7d0SGreg Clayton strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s", 1058acdbe816SGreg Clayton process_sp->GetID(), 1059ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 10601d273166SGreg Clayton GetNumThreads(), 106105faeb71SGreg Clayton exe_name ? ", executable = " : "", 10621d273166SGreg Clayton exe_name ? exe_name : ""); 1063dde9cff3SCaroline Tice } 1064dde9cff3SCaroline Tice else 1065da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1066dde9cff3SCaroline Tice 1067dde9cff3SCaroline Tice return true; 1068dde9cff3SCaroline Tice } 10698f343b09SGreg Clayton 10708f343b09SGreg Clayton uint32_t 1071f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1072f9ef60d2SJohnny Chen { 1073f9ef60d2SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1074f9ef60d2SJohnny Chen 1075f9ef60d2SJohnny Chen uint32_t num = 0; 1076f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1077f9ef60d2SJohnny Chen if (process_sp) 1078f9ef60d2SJohnny Chen { 1079f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1080f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1081f9ef60d2SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1082f9ef60d2SJohnny Chen if (log) 1083f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1084f9ef60d2SJohnny Chen process_sp.get(), num); 1085f9ef60d2SJohnny Chen } 1086f9ef60d2SJohnny Chen else 1087f9ef60d2SJohnny Chen { 1088f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1089f9ef60d2SJohnny Chen } 1090f9ef60d2SJohnny Chen return num; 1091f9ef60d2SJohnny Chen } 1092f9ef60d2SJohnny Chen 1093f9ef60d2SJohnny Chen uint32_t 10948f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 10958f343b09SGreg Clayton { 1096acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1097acdbe816SGreg Clayton if (process_sp) 1098af67cecdSGreg Clayton { 10997fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11007fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11017fdf9ef1SGreg Clayton { 1102acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1103acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1104af67cecdSGreg Clayton } 11057fdf9ef1SGreg Clayton else 11067fdf9ef1SGreg Clayton { 1107c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1108c9858e4dSGreg Clayton if (log) 1109c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get()); 11107fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11117fdf9ef1SGreg Clayton } 11127fdf9ef1SGreg Clayton } 11138f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11148f343b09SGreg Clayton } 11158f343b09SGreg Clayton 11168f343b09SGreg Clayton lldb::SBError 11178f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 11188f343b09SGreg Clayton { 11198f343b09SGreg Clayton lldb::SBError sb_error; 1120acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1121acdbe816SGreg Clayton if (process_sp) 1122af67cecdSGreg Clayton { 11237fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11247fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11257fdf9ef1SGreg Clayton { 1126acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1127acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1128af67cecdSGreg Clayton } 11298f343b09SGreg Clayton else 11307fdf9ef1SGreg Clayton { 1131c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1132c9858e4dSGreg Clayton if (log) 1133c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get()); 11347fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11357fdf9ef1SGreg Clayton } 11367fdf9ef1SGreg Clayton } 11377fdf9ef1SGreg Clayton else 11388f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 11398f343b09SGreg Clayton return sb_error; 11408f343b09SGreg Clayton } 1141