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" 18*1f746071SGreg 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) 313cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu", 314acdbe816SGreg Clayton process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 315ceb6b139SCaroline Tice 316cfd1acedSGreg Clayton return bytes_read; 31730fdc8d8SChris Lattner } 31830fdc8d8SChris Lattner 31930fdc8d8SChris Lattner size_t 32030fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 32130fdc8d8SChris Lattner { 322cfd1acedSGreg Clayton size_t bytes_read = 0; 323acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 324acdbe816SGreg Clayton if (process_sp) 32530fdc8d8SChris Lattner { 32630fdc8d8SChris Lattner Error error; 327acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 32830fdc8d8SChris Lattner } 329ceb6b139SCaroline Tice 3302d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 331ceb6b139SCaroline Tice if (log) 332cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu", 333acdbe816SGreg Clayton process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 334ceb6b139SCaroline Tice 335cfd1acedSGreg Clayton return bytes_read; 33630fdc8d8SChris Lattner } 33730fdc8d8SChris Lattner 33830fdc8d8SChris Lattner void 3392976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 34030fdc8d8SChris Lattner { 34130fdc8d8SChris Lattner if (out == NULL) 34230fdc8d8SChris Lattner return; 34330fdc8d8SChris Lattner 344acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 345acdbe816SGreg Clayton if (process_sp) 34630fdc8d8SChris Lattner { 34730fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 34830fdc8d8SChris Lattner char message[1024]; 34930fdc8d8SChris Lattner int message_len = ::snprintf (message, 35030fdc8d8SChris Lattner sizeof (message), 35181c22f61SGreg Clayton "Process %llu %s\n", 352acdbe816SGreg Clayton process_sp->GetID(), 35330fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 35430fdc8d8SChris Lattner 35530fdc8d8SChris Lattner if (message_len > 0) 35630fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 35730fdc8d8SChris Lattner } 35830fdc8d8SChris Lattner } 35930fdc8d8SChris Lattner 36030fdc8d8SChris Lattner void 3612976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 36230fdc8d8SChris Lattner { 363acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 364acdbe816SGreg Clayton if (process_sp) 36530fdc8d8SChris Lattner { 36630fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 36730fdc8d8SChris Lattner char message[1024]; 36830fdc8d8SChris Lattner ::snprintf (message, 36930fdc8d8SChris Lattner sizeof (message), 37081c22f61SGreg Clayton "Process %llu %s\n", 371acdbe816SGreg Clayton process_sp->GetID(), 37230fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 37330fdc8d8SChris Lattner 37430fdc8d8SChris Lattner result.AppendMessage (message); 37530fdc8d8SChris Lattner } 37630fdc8d8SChris Lattner } 37730fdc8d8SChris Lattner 37830fdc8d8SChris Lattner bool 3792976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 38030fdc8d8SChris Lattner { 381acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 382acdbe816SGreg Clayton if (process_sp) 383af67cecdSGreg Clayton { 384acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 385acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 386af67cecdSGreg Clayton } 38730fdc8d8SChris Lattner return false; 38830fdc8d8SChris Lattner } 38930fdc8d8SChris Lattner 39030fdc8d8SChris Lattner bool 3912976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 39230fdc8d8SChris Lattner { 3932d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 394ceb6b139SCaroline Tice 395ceb6b139SCaroline Tice bool ret_val = false; 396acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 397acdbe816SGreg Clayton if (process_sp) 398af67cecdSGreg Clayton { 399acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 400acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 401af67cecdSGreg Clayton } 402ceb6b139SCaroline Tice 403ceb6b139SCaroline Tice if (log) 404cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s", 405acdbe816SGreg Clayton process_sp.get(), tid, (ret_val ? "true" : "false")); 406ceb6b139SCaroline Tice 407ceb6b139SCaroline Tice return ret_val; 40830fdc8d8SChris Lattner } 40930fdc8d8SChris Lattner 41018b46896SJim Ingham bool 41118b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 41218b46896SJim Ingham { 41318b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 41418b46896SJim Ingham 41518b46896SJim Ingham bool ret_val = false; 41618b46896SJim Ingham ProcessSP process_sp(GetSP()); 41718b46896SJim Ingham if (process_sp) 41818b46896SJim Ingham { 41918b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 42018b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 42118b46896SJim Ingham } 42218b46896SJim Ingham 42318b46896SJim Ingham if (log) 42418b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 42518b46896SJim Ingham process_sp.get(), index_id, (ret_val ? "true" : "false")); 42618b46896SJim Ingham 42718b46896SJim Ingham return ret_val; 42818b46896SJim Ingham } 42918b46896SJim Ingham 43030fdc8d8SChris Lattner SBThread 43130fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 43230fdc8d8SChris Lattner { 4332d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 434ceb6b139SCaroline Tice 43517a6ad05SGreg Clayton SBThread sb_thread; 43617a6ad05SGreg Clayton ThreadSP thread_sp; 437acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 438acdbe816SGreg Clayton if (process_sp) 439af67cecdSGreg Clayton { 4407fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4417fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 442acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 4437fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 44417a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 445af67cecdSGreg Clayton } 446ceb6b139SCaroline Tice 447ceb6b139SCaroline Tice if (log) 448ceb6b139SCaroline Tice { 44993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 450acdbe816SGreg Clayton process_sp.get(), (uint32_t) index, thread_sp.get()); 451ceb6b139SCaroline Tice } 452ceb6b139SCaroline Tice 45317a6ad05SGreg Clayton return sb_thread; 45430fdc8d8SChris Lattner } 45530fdc8d8SChris Lattner 45630fdc8d8SChris Lattner StateType 45730fdc8d8SChris Lattner SBProcess::GetState () 45830fdc8d8SChris Lattner { 459ceb6b139SCaroline Tice 460ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 461acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 462acdbe816SGreg Clayton if (process_sp) 463af67cecdSGreg Clayton { 464acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 465acdbe816SGreg Clayton ret_val = process_sp->GetState(); 466af67cecdSGreg Clayton } 467ceb6b139SCaroline Tice 4682d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 469ceb6b139SCaroline Tice if (log) 470cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 471acdbe816SGreg Clayton process_sp.get(), 472750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 473ceb6b139SCaroline Tice 474ceb6b139SCaroline Tice return ret_val; 47530fdc8d8SChris Lattner } 47630fdc8d8SChris Lattner 47730fdc8d8SChris Lattner 47830fdc8d8SChris Lattner int 47930fdc8d8SChris Lattner SBProcess::GetExitStatus () 48030fdc8d8SChris Lattner { 4814838131bSGreg Clayton int exit_status = 0; 482acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 483acdbe816SGreg Clayton if (process_sp) 484af67cecdSGreg Clayton { 485acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 486acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 487af67cecdSGreg Clayton } 4882d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4894838131bSGreg Clayton if (log) 4904838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 491acdbe816SGreg Clayton process_sp.get(), exit_status, exit_status); 4924838131bSGreg Clayton 4934838131bSGreg Clayton return exit_status; 49430fdc8d8SChris Lattner } 49530fdc8d8SChris Lattner 49630fdc8d8SChris Lattner const char * 49730fdc8d8SChris Lattner SBProcess::GetExitDescription () 49830fdc8d8SChris Lattner { 4994838131bSGreg Clayton const char *exit_desc = NULL; 500acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 501acdbe816SGreg Clayton if (process_sp) 502af67cecdSGreg Clayton { 503acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 504acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 505af67cecdSGreg Clayton } 5062d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5074838131bSGreg Clayton if (log) 5084838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 509acdbe816SGreg Clayton process_sp.get(), exit_desc); 5104838131bSGreg Clayton return exit_desc; 51130fdc8d8SChris Lattner } 51230fdc8d8SChris Lattner 51330fdc8d8SChris Lattner lldb::pid_t 51430fdc8d8SChris Lattner SBProcess::GetProcessID () 51530fdc8d8SChris Lattner { 516ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 517acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 518acdbe816SGreg Clayton if (process_sp) 519acdbe816SGreg Clayton ret_val = process_sp->GetID(); 520ceb6b139SCaroline Tice 5212d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 522ceb6b139SCaroline Tice if (log) 523acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val); 524ceb6b139SCaroline Tice 525ceb6b139SCaroline Tice return ret_val; 52630fdc8d8SChris Lattner } 52730fdc8d8SChris Lattner 528cf386e24SJohnny Chen ByteOrder 529cf386e24SJohnny Chen SBProcess::GetByteOrder () const 530cf386e24SJohnny Chen { 531cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 532acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 533acdbe816SGreg Clayton if (process_sp) 534acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 535cf386e24SJohnny Chen 536cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 537cf386e24SJohnny Chen if (log) 538acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder); 539cf386e24SJohnny Chen 540cf386e24SJohnny Chen return byteOrder; 541cf386e24SJohnny Chen } 542cf386e24SJohnny Chen 54330fdc8d8SChris Lattner uint32_t 54430fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 54530fdc8d8SChris Lattner { 546ceb6b139SCaroline Tice uint32_t size = 0; 547acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 548acdbe816SGreg Clayton if (process_sp) 549acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 550ceb6b139SCaroline Tice 5512d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 552ceb6b139SCaroline Tice if (log) 553acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size); 554ceb6b139SCaroline Tice 555ceb6b139SCaroline Tice return size; 55630fdc8d8SChris Lattner } 55730fdc8d8SChris Lattner 55830fdc8d8SChris Lattner SBError 55930fdc8d8SChris Lattner SBProcess::Continue () 56030fdc8d8SChris Lattner { 5612d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 562ceb6b139SCaroline Tice 56330fdc8d8SChris Lattner SBError sb_error; 564acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 5650c74e78dSGreg Clayton 566acdbe816SGreg Clayton if (log) 567acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get()); 568acdbe816SGreg Clayton 569acdbe816SGreg Clayton if (process_sp) 570acdbe816SGreg Clayton { 571acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 572acdbe816SGreg Clayton 573acdbe816SGreg Clayton Error error (process_sp->Resume()); 5745d5028b5SGreg Clayton if (error.Success()) 5755d5028b5SGreg Clayton { 576acdbe816SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 5774838131bSGreg Clayton { 5784838131bSGreg Clayton if (log) 579acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get()); 580acdbe816SGreg Clayton process_sp->WaitForProcessToStop (NULL); 5815d5028b5SGreg Clayton } 5824838131bSGreg Clayton } 5835d5028b5SGreg Clayton sb_error.SetError(error); 5845d5028b5SGreg Clayton } 58530fdc8d8SChris Lattner else 58630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 58730fdc8d8SChris Lattner 588ceb6b139SCaroline Tice if (log) 589ceb6b139SCaroline Tice { 590ceb6b139SCaroline Tice SBStream sstr; 591ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 592acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData()); 593ceb6b139SCaroline Tice } 594ceb6b139SCaroline Tice 59530fdc8d8SChris Lattner return sb_error; 59630fdc8d8SChris Lattner } 59730fdc8d8SChris Lattner 59830fdc8d8SChris Lattner 59930fdc8d8SChris Lattner SBError 60030fdc8d8SChris Lattner SBProcess::Destroy () 60130fdc8d8SChris Lattner { 60230fdc8d8SChris Lattner SBError sb_error; 603acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 604acdbe816SGreg Clayton if (process_sp) 6056779606aSGreg Clayton { 606acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 607acdbe816SGreg Clayton sb_error.SetError(process_sp->Destroy()); 6086779606aSGreg Clayton } 60930fdc8d8SChris Lattner else 61030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 61130fdc8d8SChris Lattner 6122d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6134838131bSGreg Clayton if (log) 6144838131bSGreg Clayton { 6154838131bSGreg Clayton SBStream sstr; 6164838131bSGreg Clayton sb_error.GetDescription (sstr); 6176779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 618acdbe816SGreg Clayton process_sp.get(), 6196779606aSGreg Clayton sb_error.get(), 6206779606aSGreg Clayton sstr.GetData()); 6214838131bSGreg Clayton } 6224838131bSGreg Clayton 62330fdc8d8SChris Lattner return sb_error; 62430fdc8d8SChris Lattner } 62530fdc8d8SChris Lattner 62630fdc8d8SChris Lattner 62730fdc8d8SChris Lattner SBError 62830fdc8d8SChris Lattner SBProcess::Stop () 62930fdc8d8SChris Lattner { 63030fdc8d8SChris Lattner SBError sb_error; 631acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 632acdbe816SGreg Clayton if (process_sp) 633af67cecdSGreg Clayton { 634acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 635acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 636af67cecdSGreg Clayton } 63730fdc8d8SChris Lattner else 63830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 639ceb6b139SCaroline Tice 6402d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 641ceb6b139SCaroline Tice if (log) 642ceb6b139SCaroline Tice { 643ceb6b139SCaroline Tice SBStream sstr; 644ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 64593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 646acdbe816SGreg Clayton process_sp.get(), 64793aa84e8SGreg Clayton sb_error.get(), 648750cd175SCaroline Tice sstr.GetData()); 649ceb6b139SCaroline Tice } 650ceb6b139SCaroline Tice 65130fdc8d8SChris Lattner return sb_error; 65230fdc8d8SChris Lattner } 65330fdc8d8SChris Lattner 65430fdc8d8SChris Lattner SBError 65530fdc8d8SChris Lattner SBProcess::Kill () 65630fdc8d8SChris Lattner { 65730fdc8d8SChris Lattner SBError sb_error; 658acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 659acdbe816SGreg Clayton if (process_sp) 660af67cecdSGreg Clayton { 661acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 662acdbe816SGreg Clayton sb_error.SetError (process_sp->Destroy()); 663af67cecdSGreg Clayton } 66430fdc8d8SChris Lattner else 66530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 666ceb6b139SCaroline Tice 6672d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 668ceb6b139SCaroline Tice if (log) 669ceb6b139SCaroline Tice { 670ceb6b139SCaroline Tice SBStream sstr; 671ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 67293aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 673acdbe816SGreg Clayton process_sp.get(), 67493aa84e8SGreg Clayton sb_error.get(), 675750cd175SCaroline Tice sstr.GetData()); 676ceb6b139SCaroline Tice } 677ceb6b139SCaroline Tice 67830fdc8d8SChris Lattner return sb_error; 67930fdc8d8SChris Lattner } 68030fdc8d8SChris Lattner 68130fdc8d8SChris Lattner SBError 68230fdc8d8SChris Lattner SBProcess::Detach () 68330fdc8d8SChris Lattner { 68430fdc8d8SChris Lattner SBError sb_error; 685acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 686acdbe816SGreg Clayton if (process_sp) 687af67cecdSGreg Clayton { 688acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 689acdbe816SGreg Clayton sb_error.SetError (process_sp->Detach()); 690af67cecdSGreg Clayton } 69130fdc8d8SChris Lattner else 69230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 69330fdc8d8SChris Lattner 69430fdc8d8SChris Lattner return sb_error; 69530fdc8d8SChris Lattner } 69630fdc8d8SChris Lattner 69730fdc8d8SChris Lattner SBError 6984838131bSGreg Clayton SBProcess::Signal (int signo) 69930fdc8d8SChris Lattner { 70030fdc8d8SChris Lattner SBError sb_error; 701acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 702acdbe816SGreg Clayton if (process_sp) 703af67cecdSGreg Clayton { 704acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 705acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 706af67cecdSGreg Clayton } 70730fdc8d8SChris Lattner else 70830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 7092d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7104838131bSGreg Clayton if (log) 7114838131bSGreg Clayton { 7124838131bSGreg Clayton SBStream sstr; 7134838131bSGreg Clayton sb_error.GetDescription (sstr); 7144838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 715acdbe816SGreg Clayton process_sp.get(), 7164838131bSGreg Clayton signo, 7174838131bSGreg Clayton sb_error.get(), 7184838131bSGreg Clayton sstr.GetData()); 7194838131bSGreg Clayton } 72030fdc8d8SChris Lattner return sb_error; 72130fdc8d8SChris Lattner } 72230fdc8d8SChris Lattner 723cfc0935eSJim Ingham void 724cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 725cfc0935eSJim Ingham { 726cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 727cfc0935eSJim Ingham if (process_sp) 728cfc0935eSJim Ingham { 729cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 730cfc0935eSJim Ingham } 731cfc0935eSJim Ingham } 732cfc0935eSJim Ingham 73330fdc8d8SChris Lattner SBThread 7344838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 73530fdc8d8SChris Lattner { 7364838131bSGreg Clayton SBThread sb_thread; 73717a6ad05SGreg Clayton ThreadSP thread_sp; 738acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 739acdbe816SGreg Clayton if (process_sp) 740af67cecdSGreg Clayton { 741acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 7427fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7437fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 7447fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 74517a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 746af67cecdSGreg Clayton } 7474838131bSGreg Clayton 7482d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7494838131bSGreg Clayton if (log) 7504838131bSGreg Clayton { 75161e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)", 752acdbe816SGreg Clayton process_sp.get(), 7534838131bSGreg Clayton tid, 75417a6ad05SGreg Clayton thread_sp.get()); 7554838131bSGreg Clayton } 7564838131bSGreg Clayton 7574838131bSGreg Clayton return sb_thread; 75830fdc8d8SChris Lattner } 75930fdc8d8SChris Lattner 76018b46896SJim Ingham SBThread 76118b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 76218b46896SJim Ingham { 76318b46896SJim Ingham SBThread sb_thread; 76418b46896SJim Ingham ThreadSP thread_sp; 76518b46896SJim Ingham ProcessSP process_sp(GetSP()); 76618b46896SJim Ingham if (process_sp) 76718b46896SJim Ingham { 76818b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 76918b46896SJim Ingham Process::StopLocker stop_locker; 77018b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 77118b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 77218b46896SJim Ingham sb_thread.SetThread (thread_sp); 77318b46896SJim Ingham } 77418b46896SJim Ingham 77518b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 77618b46896SJim Ingham if (log) 77718b46896SJim Ingham { 77818b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 77918b46896SJim Ingham process_sp.get(), 78018b46896SJim Ingham index_id, 78118b46896SJim Ingham thread_sp.get()); 78218b46896SJim Ingham } 78318b46896SJim Ingham 78418b46896SJim Ingham return sb_thread; 78518b46896SJim Ingham } 78618b46896SJim Ingham 78730fdc8d8SChris Lattner StateType 78830fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 78930fdc8d8SChris Lattner { 7902d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 791ceb6b139SCaroline Tice 792ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 793ceb6b139SCaroline Tice 794ceb6b139SCaroline Tice if (log) 795cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 796750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 797ceb6b139SCaroline Tice 798ceb6b139SCaroline Tice return ret_val; 79930fdc8d8SChris Lattner } 80030fdc8d8SChris Lattner 80130fdc8d8SChris Lattner bool 80230fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 80330fdc8d8SChris Lattner { 8046611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 80530fdc8d8SChris Lattner } 80630fdc8d8SChris Lattner 80730fdc8d8SChris Lattner SBProcess 80830fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 80930fdc8d8SChris Lattner { 8106611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 81130fdc8d8SChris Lattner return process; 81230fdc8d8SChris Lattner } 81330fdc8d8SChris Lattner 814e6bc6cb9SJim Ingham bool 815e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 816e6bc6cb9SJim Ingham { 8174bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 818e6bc6cb9SJim Ingham } 81930fdc8d8SChris Lattner 82030fdc8d8SChris Lattner SBBroadcaster 82130fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 82230fdc8d8SChris Lattner { 8232d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 824ceb6b139SCaroline Tice 825acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 826acdbe816SGreg Clayton 827acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 828ceb6b139SCaroline Tice 829ceb6b139SCaroline Tice if (log) 830acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 831750cd175SCaroline Tice broadcaster.get()); 832ceb6b139SCaroline Tice 83330fdc8d8SChris Lattner return broadcaster; 83430fdc8d8SChris Lattner } 83530fdc8d8SChris Lattner 8364bddaeb5SJim Ingham const char * 8374bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 8384bddaeb5SJim Ingham { 8394bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 8404bddaeb5SJim Ingham } 8414bddaeb5SJim Ingham 84230fdc8d8SChris Lattner size_t 84330fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 84430fdc8d8SChris Lattner { 8452d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 846ceb6b139SCaroline Tice 84730fdc8d8SChris Lattner size_t bytes_read = 0; 84830fdc8d8SChris Lattner 849acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 850acdbe816SGreg Clayton 8514838131bSGreg Clayton if (log) 8524838131bSGreg Clayton { 8534838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...", 854acdbe816SGreg Clayton process_sp.get(), 8554838131bSGreg Clayton addr, 8564838131bSGreg Clayton dst, 857c91d804aSGreg Clayton dst_len, 8584838131bSGreg Clayton sb_error.get()); 8594838131bSGreg Clayton } 8604838131bSGreg Clayton 861acdbe816SGreg Clayton if (process_sp) 86230fdc8d8SChris Lattner { 8637fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8647fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 8657fdf9ef1SGreg Clayton { 866acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 8677fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 8687fdf9ef1SGreg Clayton } 8697fdf9ef1SGreg Clayton else 8707fdf9ef1SGreg Clayton { 871c9858e4dSGreg Clayton if (log) 872c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get()); 8737fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 8747fdf9ef1SGreg Clayton } 87530fdc8d8SChris Lattner } 87630fdc8d8SChris Lattner else 87730fdc8d8SChris Lattner { 87830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 87930fdc8d8SChris Lattner } 88030fdc8d8SChris Lattner 881ceb6b139SCaroline Tice if (log) 88293aa84e8SGreg Clayton { 88393aa84e8SGreg Clayton SBStream sstr; 88493aa84e8SGreg Clayton sb_error.GetDescription (sstr); 885c91d804aSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu", 886acdbe816SGreg Clayton process_sp.get(), 88793aa84e8SGreg Clayton addr, 88893aa84e8SGreg Clayton dst, 889c91d804aSGreg Clayton dst_len, 89093aa84e8SGreg Clayton sb_error.get(), 89193aa84e8SGreg Clayton sstr.GetData(), 892c91d804aSGreg Clayton bytes_read); 89393aa84e8SGreg Clayton } 894ceb6b139SCaroline Tice 89530fdc8d8SChris Lattner return bytes_read; 89630fdc8d8SChris Lattner } 89730fdc8d8SChris Lattner 89830fdc8d8SChris Lattner size_t 899e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 900e91b7957SGreg Clayton { 901e91b7957SGreg Clayton size_t bytes_read = 0; 902acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 903acdbe816SGreg Clayton if (process_sp) 904e91b7957SGreg Clayton { 9057fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9067fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9077fdf9ef1SGreg Clayton { 908acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9097fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 9107fdf9ef1SGreg Clayton } 9117fdf9ef1SGreg Clayton else 9127fdf9ef1SGreg Clayton { 913c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 914c9858e4dSGreg Clayton if (log) 915c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get()); 9167fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9177fdf9ef1SGreg Clayton } 918e91b7957SGreg Clayton } 919e91b7957SGreg Clayton else 920e91b7957SGreg Clayton { 921e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 922e91b7957SGreg Clayton } 923e91b7957SGreg Clayton return bytes_read; 924e91b7957SGreg Clayton } 925e91b7957SGreg Clayton 926e91b7957SGreg Clayton uint64_t 927e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 928e91b7957SGreg Clayton { 9297fdf9ef1SGreg Clayton uint64_t value = 0; 930acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 931acdbe816SGreg Clayton if (process_sp) 932e91b7957SGreg Clayton { 9337fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9347fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9357fdf9ef1SGreg Clayton { 936acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9377fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 9387fdf9ef1SGreg Clayton } 9397fdf9ef1SGreg Clayton else 9407fdf9ef1SGreg Clayton { 941c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 942c9858e4dSGreg Clayton if (log) 943c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get()); 9447fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9457fdf9ef1SGreg Clayton } 946e91b7957SGreg Clayton } 947e91b7957SGreg Clayton else 948e91b7957SGreg Clayton { 949e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 950e91b7957SGreg Clayton } 9517fdf9ef1SGreg Clayton return value; 952e91b7957SGreg Clayton } 953e91b7957SGreg Clayton 954e91b7957SGreg Clayton lldb::addr_t 955e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 956e91b7957SGreg Clayton { 957e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 958acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 959acdbe816SGreg Clayton if (process_sp) 960e91b7957SGreg Clayton { 9617fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9627fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9637fdf9ef1SGreg Clayton { 964acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9657fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 9667fdf9ef1SGreg Clayton } 9677fdf9ef1SGreg Clayton else 9687fdf9ef1SGreg Clayton { 969c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 970c9858e4dSGreg Clayton if (log) 971c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get()); 9727fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9737fdf9ef1SGreg Clayton } 974e91b7957SGreg Clayton } 975e91b7957SGreg Clayton else 976e91b7957SGreg Clayton { 977e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 978e91b7957SGreg Clayton } 979e91b7957SGreg Clayton return ptr; 980e91b7957SGreg Clayton } 981e91b7957SGreg Clayton 982e91b7957SGreg Clayton size_t 98330fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 98430fdc8d8SChris Lattner { 98530fdc8d8SChris Lattner size_t bytes_written = 0; 98630fdc8d8SChris Lattner 9872d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 988acdbe816SGreg Clayton 989acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 990acdbe816SGreg Clayton 9914838131bSGreg Clayton if (log) 9924838131bSGreg Clayton { 9934838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...", 994acdbe816SGreg Clayton process_sp.get(), 9954838131bSGreg Clayton addr, 9964838131bSGreg Clayton src, 997c91d804aSGreg Clayton src_len, 9984838131bSGreg Clayton sb_error.get()); 9994838131bSGreg Clayton } 10004838131bSGreg Clayton 1001acdbe816SGreg Clayton if (process_sp) 100230fdc8d8SChris Lattner { 10037fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10047fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10057fdf9ef1SGreg Clayton { 1006acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10077fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 10087fdf9ef1SGreg Clayton } 10097fdf9ef1SGreg Clayton else 10107fdf9ef1SGreg Clayton { 1011c9858e4dSGreg Clayton if (log) 1012c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get()); 10137fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10147fdf9ef1SGreg Clayton } 101530fdc8d8SChris Lattner } 101630fdc8d8SChris Lattner 10174838131bSGreg Clayton if (log) 10184838131bSGreg Clayton { 10194838131bSGreg Clayton SBStream sstr; 10204838131bSGreg Clayton sb_error.GetDescription (sstr); 1021c91d804aSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu", 1022acdbe816SGreg Clayton process_sp.get(), 10234838131bSGreg Clayton addr, 10244838131bSGreg Clayton src, 1025c91d804aSGreg Clayton src_len, 10264838131bSGreg Clayton sb_error.get(), 10274838131bSGreg Clayton sstr.GetData(), 1028c91d804aSGreg Clayton bytes_written); 10294838131bSGreg Clayton } 10304838131bSGreg Clayton 103130fdc8d8SChris Lattner return bytes_written; 103230fdc8d8SChris Lattner } 103330fdc8d8SChris Lattner 1034dde9cff3SCaroline Tice bool 1035dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1036dde9cff3SCaroline Tice { 1037da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1038da7bc7d0SGreg Clayton 1039acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1040acdbe816SGreg Clayton if (process_sp) 1041dde9cff3SCaroline Tice { 1042dde9cff3SCaroline Tice char path[PATH_MAX]; 1043dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1044acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 10451d273166SGreg Clayton const char *exe_name = NULL; 10461d273166SGreg Clayton if (exe_module) 10471d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 10481d273166SGreg Clayton 1049da7bc7d0SGreg Clayton strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s", 1050acdbe816SGreg Clayton process_sp->GetID(), 1051ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 10521d273166SGreg Clayton GetNumThreads(), 105305faeb71SGreg Clayton exe_name ? ", executable = " : "", 10541d273166SGreg Clayton exe_name ? exe_name : ""); 1055dde9cff3SCaroline Tice } 1056dde9cff3SCaroline Tice else 1057da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1058dde9cff3SCaroline Tice 1059dde9cff3SCaroline Tice return true; 1060dde9cff3SCaroline Tice } 10618f343b09SGreg Clayton 10628f343b09SGreg Clayton uint32_t 1063f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1064f9ef60d2SJohnny Chen { 1065f9ef60d2SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1066f9ef60d2SJohnny Chen 1067f9ef60d2SJohnny Chen uint32_t num = 0; 1068f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1069f9ef60d2SJohnny Chen if (process_sp) 1070f9ef60d2SJohnny Chen { 1071f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1072f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1073f9ef60d2SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1074f9ef60d2SJohnny Chen if (log) 1075f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1076f9ef60d2SJohnny Chen process_sp.get(), num); 1077f9ef60d2SJohnny Chen } 1078f9ef60d2SJohnny Chen else 1079f9ef60d2SJohnny Chen { 1080f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1081f9ef60d2SJohnny Chen } 1082f9ef60d2SJohnny Chen return num; 1083f9ef60d2SJohnny Chen } 1084f9ef60d2SJohnny Chen 1085f9ef60d2SJohnny Chen uint32_t 10868f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 10878f343b09SGreg Clayton { 1088acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1089acdbe816SGreg Clayton if (process_sp) 1090af67cecdSGreg Clayton { 10917fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10927fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10937fdf9ef1SGreg Clayton { 1094acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1095acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1096af67cecdSGreg Clayton } 10977fdf9ef1SGreg Clayton else 10987fdf9ef1SGreg Clayton { 1099c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1100c9858e4dSGreg Clayton if (log) 1101c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get()); 11027fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11037fdf9ef1SGreg Clayton } 11047fdf9ef1SGreg Clayton } 11058f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11068f343b09SGreg Clayton } 11078f343b09SGreg Clayton 11088f343b09SGreg Clayton lldb::SBError 11098f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 11108f343b09SGreg Clayton { 11118f343b09SGreg Clayton lldb::SBError sb_error; 1112acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1113acdbe816SGreg Clayton if (process_sp) 1114af67cecdSGreg Clayton { 11157fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11167fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11177fdf9ef1SGreg Clayton { 1118acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1119acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1120af67cecdSGreg Clayton } 11218f343b09SGreg Clayton else 11227fdf9ef1SGreg Clayton { 1123c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1124c9858e4dSGreg Clayton if (log) 1125c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get()); 11267fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11277fdf9ef1SGreg Clayton } 11287fdf9ef1SGreg Clayton } 11297fdf9ef1SGreg Clayton else 11308f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 11318f343b09SGreg Clayton return sb_error; 11328f343b09SGreg Clayton } 1133