130fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 104c5de699SEli Friedman #include "lldb/API/SBProcess.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1330fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1430fdc8d8SChris Lattner 1540af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 165d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 17ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 1830fdc8d8SChris Lattner #include "lldb/Core/State.h" 1930fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2130fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2230fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 236611103cSGreg Clayton #include "lldb/Target/Target.h" 246611103cSGreg Clayton #include "lldb/Target/Thread.h" 2530fdc8d8SChris Lattner 2630fdc8d8SChris Lattner // Project includes 2730fdc8d8SChris Lattner 284c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 294c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 300e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 314c5de699SEli Friedman #include "lldb/API/SBEvent.h" 320e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 334c5de699SEli Friedman #include "lldb/API/SBThread.h" 34dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 354c5de699SEli Friedman #include "lldb/API/SBStringList.h" 3630fdc8d8SChris Lattner 3730fdc8d8SChris Lattner using namespace lldb; 3830fdc8d8SChris Lattner using namespace lldb_private; 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner SBProcess::SBProcess () : 424e0fe8abSGreg Clayton m_opaque_wp() 4330fdc8d8SChris Lattner { 4430fdc8d8SChris Lattner } 4530fdc8d8SChris Lattner 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner //---------------------------------------------------------------------- 4830fdc8d8SChris Lattner // SBProcess constructor 4930fdc8d8SChris Lattner //---------------------------------------------------------------------- 5030fdc8d8SChris Lattner 5130fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 524e0fe8abSGreg Clayton m_opaque_wp (rhs.m_opaque_wp) 5330fdc8d8SChris Lattner { 5430fdc8d8SChris Lattner } 5530fdc8d8SChris Lattner 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 584e0fe8abSGreg Clayton m_opaque_wp (process_sp) 5930fdc8d8SChris Lattner { 6030fdc8d8SChris Lattner } 6130fdc8d8SChris Lattner 62efabb123SGreg Clayton const SBProcess& 63efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 64efabb123SGreg Clayton { 65efabb123SGreg Clayton if (this != &rhs) 664e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 67efabb123SGreg Clayton return *this; 68efabb123SGreg Clayton } 69efabb123SGreg Clayton 7030fdc8d8SChris Lattner //---------------------------------------------------------------------- 7130fdc8d8SChris Lattner // Destructor 7230fdc8d8SChris Lattner //---------------------------------------------------------------------- 7330fdc8d8SChris Lattner SBProcess::~SBProcess() 7430fdc8d8SChris Lattner { 7530fdc8d8SChris Lattner } 7630fdc8d8SChris Lattner 774bddaeb5SJim Ingham const char * 784bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName () 794bddaeb5SJim Ingham { 804bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 814bddaeb5SJim Ingham } 824bddaeb5SJim Ingham 83b9556accSGreg Clayton lldb::ProcessSP 84b9556accSGreg Clayton SBProcess::GetSP() const 85b9556accSGreg Clayton { 864e0fe8abSGreg Clayton return m_opaque_wp.lock(); 87b9556accSGreg Clayton } 88b9556accSGreg Clayton 8930fdc8d8SChris Lattner void 90b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 9130fdc8d8SChris Lattner { 924e0fe8abSGreg Clayton m_opaque_wp = process_sp; 9330fdc8d8SChris Lattner } 9430fdc8d8SChris Lattner 9530fdc8d8SChris Lattner void 9630fdc8d8SChris Lattner SBProcess::Clear () 9730fdc8d8SChris Lattner { 984e0fe8abSGreg Clayton m_opaque_wp.reset(); 9930fdc8d8SChris Lattner } 10030fdc8d8SChris Lattner 10130fdc8d8SChris Lattner 10230fdc8d8SChris Lattner bool 10330fdc8d8SChris Lattner SBProcess::IsValid() const 10430fdc8d8SChris Lattner { 1054e0fe8abSGreg Clayton return m_opaque_wp.lock().get() != NULL; 10630fdc8d8SChris Lattner } 10730fdc8d8SChris Lattner 1089631aae2SJames McIlree bool 1099631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1109631aae2SJames McIlree char const **envp, 1119631aae2SJames McIlree const char *stdin_path, 1129631aae2SJames McIlree const char *stdout_path, 1139631aae2SJames McIlree const char *stderr_path, 1149631aae2SJames McIlree const char *working_directory, 1159631aae2SJames McIlree uint32_t launch_flags, 1169631aae2SJames McIlree bool stop_at_entry, 1179631aae2SJames McIlree lldb::SBError& error) 1189631aae2SJames McIlree { 1199631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1209631aae2SJames McIlree if (log) { 1219631aae2SJames McIlree log->Printf ("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, stop_at_entry=%i, &error (%p))...", 1224e0fe8abSGreg Clayton m_opaque_wp.lock().get(), 1239631aae2SJames McIlree argv, 1249631aae2SJames McIlree envp, 1259631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1269631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1279631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1289631aae2SJames McIlree working_directory ? working_directory : "NULL", 1299631aae2SJames McIlree launch_flags, 1309631aae2SJames McIlree stop_at_entry, 1319631aae2SJames McIlree error.get()); 1329631aae2SJames McIlree } 1339631aae2SJames McIlree 134acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 135acdbe816SGreg Clayton if (process_sp) 1369631aae2SJames McIlree { 137acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 138acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1399631aae2SJames McIlree { 140982c9762SGreg Clayton if (stop_at_entry) 141982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 142982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 143982c9762SGreg Clayton stdout_path, 144982c9762SGreg Clayton stderr_path, 145982c9762SGreg Clayton working_directory, 146982c9762SGreg Clayton launch_flags); 147acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 148982c9762SGreg Clayton if (exe_module) 149982c9762SGreg Clayton launch_info.SetExecutableFile(exe_module->GetFileSpec(), true); 150982c9762SGreg Clayton if (argv) 151982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 152982c9762SGreg Clayton if (envp) 153982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 154acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1559631aae2SJames McIlree } 1569631aae2SJames McIlree else 1579631aae2SJames McIlree { 1589631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1599631aae2SJames McIlree } 1609631aae2SJames McIlree } 1619631aae2SJames McIlree else 1629631aae2SJames McIlree { 1639631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1649631aae2SJames McIlree } 1659631aae2SJames McIlree 1669631aae2SJames McIlree if (log) { 1679631aae2SJames McIlree SBStream sstr; 1689631aae2SJames McIlree error.GetDescription (sstr); 169acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData()); 1709631aae2SJames McIlree } 1719631aae2SJames McIlree 1729631aae2SJames McIlree return error.Success(); 1739631aae2SJames McIlree } 1749631aae2SJames McIlree 1759631aae2SJames McIlree bool 1769631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 1779631aae2SJames McIlree { 178acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 179acdbe816SGreg Clayton if (process_sp) 1809631aae2SJames McIlree { 181acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 182acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1839631aae2SJames McIlree { 184144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 185144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 186acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 1879631aae2SJames McIlree } 1889631aae2SJames McIlree else 1899631aae2SJames McIlree { 1909631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 1919631aae2SJames McIlree } 1929631aae2SJames McIlree } 1939631aae2SJames McIlree else 1949631aae2SJames McIlree { 1959631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1969631aae2SJames McIlree } 1979631aae2SJames McIlree 1989631aae2SJames McIlree LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1999631aae2SJames McIlree if (log) { 2009631aae2SJames McIlree SBStream sstr; 2019631aae2SJames McIlree error.GetDescription (sstr); 202acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData()); 2039631aae2SJames McIlree } 2049631aae2SJames McIlree 2059631aae2SJames McIlree return error.Success(); 2069631aae2SJames McIlree } 2079631aae2SJames McIlree 20830fdc8d8SChris Lattner 20930fdc8d8SChris Lattner uint32_t 21030fdc8d8SChris Lattner SBProcess::GetNumThreads () 21130fdc8d8SChris Lattner { 2122d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 213ceb6b139SCaroline Tice 214ceb6b139SCaroline Tice uint32_t num_threads = 0; 215acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 216acdbe816SGreg Clayton if (process_sp) 21730fdc8d8SChris Lattner { 2187fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2197fdf9ef1SGreg Clayton 2207fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 221acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 222acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 22330fdc8d8SChris Lattner } 224ceb6b139SCaroline Tice 225ceb6b139SCaroline Tice if (log) 226acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads); 227ceb6b139SCaroline Tice 228ceb6b139SCaroline Tice return num_threads; 22930fdc8d8SChris Lattner } 23030fdc8d8SChris Lattner 23130fdc8d8SChris Lattner SBThread 2322976d00aSJim Ingham SBProcess::GetSelectedThread () const 23330fdc8d8SChris Lattner { 2342d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 235ceb6b139SCaroline Tice 23630fdc8d8SChris Lattner SBThread sb_thread; 23717a6ad05SGreg Clayton ThreadSP thread_sp; 238acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 239acdbe816SGreg Clayton if (process_sp) 240af67cecdSGreg Clayton { 241acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 242acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 24317a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 244af67cecdSGreg Clayton } 245ceb6b139SCaroline Tice 246ceb6b139SCaroline Tice if (log) 247ceb6b139SCaroline Tice { 248acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get()); 249ceb6b139SCaroline Tice } 250ceb6b139SCaroline Tice 25130fdc8d8SChris Lattner return sb_thread; 25230fdc8d8SChris Lattner } 25330fdc8d8SChris Lattner 25430fdc8d8SChris Lattner SBTarget 25530fdc8d8SChris Lattner SBProcess::GetTarget() const 25630fdc8d8SChris Lattner { 2572d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 258ceb6b139SCaroline Tice 25930fdc8d8SChris Lattner SBTarget sb_target; 260b9556accSGreg Clayton TargetSP target_sp; 261acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 262acdbe816SGreg Clayton if (process_sp) 263b9556accSGreg Clayton { 264acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 265b9556accSGreg Clayton sb_target.SetSP (target_sp); 266b9556accSGreg Clayton } 267ceb6b139SCaroline Tice 268ceb6b139SCaroline Tice if (log) 269acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get()); 270ceb6b139SCaroline Tice 27130fdc8d8SChris Lattner return sb_target; 27230fdc8d8SChris Lattner } 27330fdc8d8SChris Lattner 27430fdc8d8SChris Lattner 27530fdc8d8SChris Lattner size_t 27630fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 27730fdc8d8SChris Lattner { 2782d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 279ceb6b139SCaroline Tice 280ceb6b139SCaroline Tice size_t ret_val = 0; 281acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 282acdbe816SGreg Clayton if (process_sp) 28330fdc8d8SChris Lattner { 28430fdc8d8SChris Lattner Error error; 285acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 28630fdc8d8SChris Lattner } 287ceb6b139SCaroline Tice 288ceb6b139SCaroline Tice if (log) 289fd54b368SJason Molenda log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu", 290acdbe816SGreg Clayton process_sp.get(), 29193aa84e8SGreg Clayton src, 29293aa84e8SGreg Clayton (uint32_t) src_len, 29393aa84e8SGreg Clayton ret_val); 294ceb6b139SCaroline Tice 295ceb6b139SCaroline Tice return ret_val; 29630fdc8d8SChris Lattner } 29730fdc8d8SChris Lattner 29830fdc8d8SChris Lattner size_t 29930fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 30030fdc8d8SChris Lattner { 301cfd1acedSGreg Clayton size_t bytes_read = 0; 302acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 303acdbe816SGreg Clayton if (process_sp) 30430fdc8d8SChris Lattner { 30530fdc8d8SChris Lattner Error error; 306acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 30730fdc8d8SChris Lattner } 308ceb6b139SCaroline Tice 3092d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 310ceb6b139SCaroline Tice if (log) 311cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu", 312acdbe816SGreg Clayton process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 313ceb6b139SCaroline Tice 314cfd1acedSGreg Clayton return bytes_read; 31530fdc8d8SChris Lattner } 31630fdc8d8SChris Lattner 31730fdc8d8SChris Lattner size_t 31830fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 31930fdc8d8SChris Lattner { 320cfd1acedSGreg Clayton size_t bytes_read = 0; 321acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 322acdbe816SGreg Clayton if (process_sp) 32330fdc8d8SChris Lattner { 32430fdc8d8SChris Lattner Error error; 325acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 32630fdc8d8SChris Lattner } 327ceb6b139SCaroline Tice 3282d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 329ceb6b139SCaroline Tice if (log) 330cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu", 331acdbe816SGreg Clayton process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read); 332ceb6b139SCaroline Tice 333cfd1acedSGreg Clayton return bytes_read; 33430fdc8d8SChris Lattner } 33530fdc8d8SChris Lattner 33630fdc8d8SChris Lattner void 3372976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 33830fdc8d8SChris Lattner { 33930fdc8d8SChris Lattner if (out == NULL) 34030fdc8d8SChris Lattner return; 34130fdc8d8SChris Lattner 342acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 343acdbe816SGreg Clayton if (process_sp) 34430fdc8d8SChris Lattner { 34530fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 34630fdc8d8SChris Lattner char message[1024]; 34730fdc8d8SChris Lattner int message_len = ::snprintf (message, 34830fdc8d8SChris Lattner sizeof (message), 34981c22f61SGreg Clayton "Process %llu %s\n", 350acdbe816SGreg Clayton process_sp->GetID(), 35130fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 35230fdc8d8SChris Lattner 35330fdc8d8SChris Lattner if (message_len > 0) 35430fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 35530fdc8d8SChris Lattner } 35630fdc8d8SChris Lattner } 35730fdc8d8SChris Lattner 35830fdc8d8SChris Lattner void 3592976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 36030fdc8d8SChris Lattner { 361acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 362acdbe816SGreg Clayton if (process_sp) 36330fdc8d8SChris Lattner { 36430fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 36530fdc8d8SChris Lattner char message[1024]; 36630fdc8d8SChris Lattner ::snprintf (message, 36730fdc8d8SChris Lattner sizeof (message), 36881c22f61SGreg Clayton "Process %llu %s\n", 369acdbe816SGreg Clayton process_sp->GetID(), 37030fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 37130fdc8d8SChris Lattner 37230fdc8d8SChris Lattner result.AppendMessage (message); 37330fdc8d8SChris Lattner } 37430fdc8d8SChris Lattner } 37530fdc8d8SChris Lattner 37630fdc8d8SChris Lattner bool 3772976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 37830fdc8d8SChris Lattner { 379acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 380acdbe816SGreg Clayton if (process_sp) 381af67cecdSGreg Clayton { 382acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 383acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 384af67cecdSGreg Clayton } 38530fdc8d8SChris Lattner return false; 38630fdc8d8SChris Lattner } 38730fdc8d8SChris Lattner 38830fdc8d8SChris Lattner bool 3892976d00aSJim Ingham SBProcess::SetSelectedThreadByID (uint32_t tid) 39030fdc8d8SChris Lattner { 3912d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 392ceb6b139SCaroline Tice 393ceb6b139SCaroline Tice bool ret_val = false; 394acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 395acdbe816SGreg Clayton if (process_sp) 396af67cecdSGreg Clayton { 397acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 398acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 399af67cecdSGreg Clayton } 400ceb6b139SCaroline Tice 401ceb6b139SCaroline Tice if (log) 402cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s", 403acdbe816SGreg Clayton process_sp.get(), tid, (ret_val ? "true" : "false")); 404ceb6b139SCaroline Tice 405ceb6b139SCaroline Tice return ret_val; 40630fdc8d8SChris Lattner } 40730fdc8d8SChris Lattner 408*18b46896SJim Ingham bool 409*18b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 410*18b46896SJim Ingham { 411*18b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 412*18b46896SJim Ingham 413*18b46896SJim Ingham bool ret_val = false; 414*18b46896SJim Ingham ProcessSP process_sp(GetSP()); 415*18b46896SJim Ingham if (process_sp) 416*18b46896SJim Ingham { 417*18b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 418*18b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 419*18b46896SJim Ingham } 420*18b46896SJim Ingham 421*18b46896SJim Ingham if (log) 422*18b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 423*18b46896SJim Ingham process_sp.get(), index_id, (ret_val ? "true" : "false")); 424*18b46896SJim Ingham 425*18b46896SJim Ingham return ret_val; 426*18b46896SJim Ingham } 427*18b46896SJim Ingham 42830fdc8d8SChris Lattner SBThread 42930fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 43030fdc8d8SChris Lattner { 4312d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 432ceb6b139SCaroline Tice 43317a6ad05SGreg Clayton SBThread sb_thread; 43417a6ad05SGreg Clayton ThreadSP thread_sp; 435acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 436acdbe816SGreg Clayton if (process_sp) 437af67cecdSGreg Clayton { 4387fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4397fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 440acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 4417fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 44217a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 443af67cecdSGreg Clayton } 444ceb6b139SCaroline Tice 445ceb6b139SCaroline Tice if (log) 446ceb6b139SCaroline Tice { 44793aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 448acdbe816SGreg Clayton process_sp.get(), (uint32_t) index, thread_sp.get()); 449ceb6b139SCaroline Tice } 450ceb6b139SCaroline Tice 45117a6ad05SGreg Clayton return sb_thread; 45230fdc8d8SChris Lattner } 45330fdc8d8SChris Lattner 45430fdc8d8SChris Lattner StateType 45530fdc8d8SChris Lattner SBProcess::GetState () 45630fdc8d8SChris Lattner { 457ceb6b139SCaroline Tice 458ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 459acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 460acdbe816SGreg Clayton if (process_sp) 461af67cecdSGreg Clayton { 462acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 463acdbe816SGreg Clayton ret_val = process_sp->GetState(); 464af67cecdSGreg Clayton } 465ceb6b139SCaroline Tice 4662d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 467ceb6b139SCaroline Tice if (log) 468cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 469acdbe816SGreg Clayton process_sp.get(), 470750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 471ceb6b139SCaroline Tice 472ceb6b139SCaroline Tice return ret_val; 47330fdc8d8SChris Lattner } 47430fdc8d8SChris Lattner 47530fdc8d8SChris Lattner 47630fdc8d8SChris Lattner int 47730fdc8d8SChris Lattner SBProcess::GetExitStatus () 47830fdc8d8SChris Lattner { 4794838131bSGreg Clayton int exit_status = 0; 480acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 481acdbe816SGreg Clayton if (process_sp) 482af67cecdSGreg Clayton { 483acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 484acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 485af67cecdSGreg Clayton } 4862d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4874838131bSGreg Clayton if (log) 4884838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 489acdbe816SGreg Clayton process_sp.get(), exit_status, exit_status); 4904838131bSGreg Clayton 4914838131bSGreg Clayton return exit_status; 49230fdc8d8SChris Lattner } 49330fdc8d8SChris Lattner 49430fdc8d8SChris Lattner const char * 49530fdc8d8SChris Lattner SBProcess::GetExitDescription () 49630fdc8d8SChris Lattner { 4974838131bSGreg Clayton const char *exit_desc = NULL; 498acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 499acdbe816SGreg Clayton if (process_sp) 500af67cecdSGreg Clayton { 501acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 502acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 503af67cecdSGreg Clayton } 5042d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5054838131bSGreg Clayton if (log) 5064838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 507acdbe816SGreg Clayton process_sp.get(), exit_desc); 5084838131bSGreg Clayton return exit_desc; 50930fdc8d8SChris Lattner } 51030fdc8d8SChris Lattner 51130fdc8d8SChris Lattner lldb::pid_t 51230fdc8d8SChris Lattner SBProcess::GetProcessID () 51330fdc8d8SChris Lattner { 514ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 515acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 516acdbe816SGreg Clayton if (process_sp) 517acdbe816SGreg Clayton ret_val = process_sp->GetID(); 518ceb6b139SCaroline Tice 5192d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 520ceb6b139SCaroline Tice if (log) 521acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val); 522ceb6b139SCaroline Tice 523ceb6b139SCaroline Tice return ret_val; 52430fdc8d8SChris Lattner } 52530fdc8d8SChris Lattner 526cf386e24SJohnny Chen ByteOrder 527cf386e24SJohnny Chen SBProcess::GetByteOrder () const 528cf386e24SJohnny Chen { 529cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 530acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 531acdbe816SGreg Clayton if (process_sp) 532acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 533cf386e24SJohnny Chen 534cf386e24SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 535cf386e24SJohnny Chen if (log) 536acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder); 537cf386e24SJohnny Chen 538cf386e24SJohnny Chen return byteOrder; 539cf386e24SJohnny Chen } 540cf386e24SJohnny Chen 54130fdc8d8SChris Lattner uint32_t 54230fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 54330fdc8d8SChris Lattner { 544ceb6b139SCaroline Tice uint32_t size = 0; 545acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 546acdbe816SGreg Clayton if (process_sp) 547acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 548ceb6b139SCaroline Tice 5492d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 550ceb6b139SCaroline Tice if (log) 551acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size); 552ceb6b139SCaroline Tice 553ceb6b139SCaroline Tice return size; 55430fdc8d8SChris Lattner } 55530fdc8d8SChris Lattner 55630fdc8d8SChris Lattner SBError 55730fdc8d8SChris Lattner SBProcess::Continue () 55830fdc8d8SChris Lattner { 5592d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 560ceb6b139SCaroline Tice 56130fdc8d8SChris Lattner SBError sb_error; 562acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 5630c74e78dSGreg Clayton 564acdbe816SGreg Clayton if (log) 565acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get()); 566acdbe816SGreg Clayton 567acdbe816SGreg Clayton if (process_sp) 568acdbe816SGreg Clayton { 569acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 570acdbe816SGreg Clayton 571acdbe816SGreg Clayton Error error (process_sp->Resume()); 5725d5028b5SGreg Clayton if (error.Success()) 5735d5028b5SGreg Clayton { 574acdbe816SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 5754838131bSGreg Clayton { 5764838131bSGreg Clayton if (log) 577acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get()); 578acdbe816SGreg Clayton process_sp->WaitForProcessToStop (NULL); 5795d5028b5SGreg Clayton } 5804838131bSGreg Clayton } 5815d5028b5SGreg Clayton sb_error.SetError(error); 5825d5028b5SGreg Clayton } 58330fdc8d8SChris Lattner else 58430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 58530fdc8d8SChris Lattner 586ceb6b139SCaroline Tice if (log) 587ceb6b139SCaroline Tice { 588ceb6b139SCaroline Tice SBStream sstr; 589ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 590acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData()); 591ceb6b139SCaroline Tice } 592ceb6b139SCaroline Tice 59330fdc8d8SChris Lattner return sb_error; 59430fdc8d8SChris Lattner } 59530fdc8d8SChris Lattner 59630fdc8d8SChris Lattner 59730fdc8d8SChris Lattner SBError 59830fdc8d8SChris Lattner SBProcess::Destroy () 59930fdc8d8SChris Lattner { 60030fdc8d8SChris Lattner SBError sb_error; 601acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 602acdbe816SGreg Clayton if (process_sp) 6036779606aSGreg Clayton { 604acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 605acdbe816SGreg Clayton sb_error.SetError(process_sp->Destroy()); 6066779606aSGreg Clayton } 60730fdc8d8SChris Lattner else 60830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 60930fdc8d8SChris Lattner 6102d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6114838131bSGreg Clayton if (log) 6124838131bSGreg Clayton { 6134838131bSGreg Clayton SBStream sstr; 6144838131bSGreg Clayton sb_error.GetDescription (sstr); 6156779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 616acdbe816SGreg Clayton process_sp.get(), 6176779606aSGreg Clayton sb_error.get(), 6186779606aSGreg Clayton sstr.GetData()); 6194838131bSGreg Clayton } 6204838131bSGreg Clayton 62130fdc8d8SChris Lattner return sb_error; 62230fdc8d8SChris Lattner } 62330fdc8d8SChris Lattner 62430fdc8d8SChris Lattner 62530fdc8d8SChris Lattner SBError 62630fdc8d8SChris Lattner SBProcess::Stop () 62730fdc8d8SChris Lattner { 62830fdc8d8SChris Lattner SBError sb_error; 629acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 630acdbe816SGreg Clayton if (process_sp) 631af67cecdSGreg Clayton { 632acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 633acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 634af67cecdSGreg Clayton } 63530fdc8d8SChris Lattner else 63630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 637ceb6b139SCaroline Tice 6382d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 639ceb6b139SCaroline Tice if (log) 640ceb6b139SCaroline Tice { 641ceb6b139SCaroline Tice SBStream sstr; 642ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 64393aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 644acdbe816SGreg Clayton process_sp.get(), 64593aa84e8SGreg Clayton sb_error.get(), 646750cd175SCaroline Tice sstr.GetData()); 647ceb6b139SCaroline Tice } 648ceb6b139SCaroline Tice 64930fdc8d8SChris Lattner return sb_error; 65030fdc8d8SChris Lattner } 65130fdc8d8SChris Lattner 65230fdc8d8SChris Lattner SBError 65330fdc8d8SChris Lattner SBProcess::Kill () 65430fdc8d8SChris Lattner { 65530fdc8d8SChris Lattner SBError sb_error; 656acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 657acdbe816SGreg Clayton if (process_sp) 658af67cecdSGreg Clayton { 659acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 660acdbe816SGreg Clayton sb_error.SetError (process_sp->Destroy()); 661af67cecdSGreg Clayton } 66230fdc8d8SChris Lattner else 66330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 664ceb6b139SCaroline Tice 6652d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 666ceb6b139SCaroline Tice if (log) 667ceb6b139SCaroline Tice { 668ceb6b139SCaroline Tice SBStream sstr; 669ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 67093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 671acdbe816SGreg Clayton process_sp.get(), 67293aa84e8SGreg Clayton sb_error.get(), 673750cd175SCaroline Tice sstr.GetData()); 674ceb6b139SCaroline Tice } 675ceb6b139SCaroline Tice 67630fdc8d8SChris Lattner return sb_error; 67730fdc8d8SChris Lattner } 67830fdc8d8SChris Lattner 67930fdc8d8SChris Lattner SBError 68030fdc8d8SChris Lattner SBProcess::Detach () 68130fdc8d8SChris Lattner { 68230fdc8d8SChris Lattner SBError sb_error; 683acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 684acdbe816SGreg Clayton if (process_sp) 685af67cecdSGreg Clayton { 686acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 687acdbe816SGreg Clayton sb_error.SetError (process_sp->Detach()); 688af67cecdSGreg Clayton } 68930fdc8d8SChris Lattner else 69030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 69130fdc8d8SChris Lattner 69230fdc8d8SChris Lattner return sb_error; 69330fdc8d8SChris Lattner } 69430fdc8d8SChris Lattner 69530fdc8d8SChris Lattner SBError 6964838131bSGreg Clayton SBProcess::Signal (int signo) 69730fdc8d8SChris Lattner { 69830fdc8d8SChris Lattner SBError sb_error; 699acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 700acdbe816SGreg Clayton if (process_sp) 701af67cecdSGreg Clayton { 702acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 703acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 704af67cecdSGreg Clayton } 70530fdc8d8SChris Lattner else 70630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 7072d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7084838131bSGreg Clayton if (log) 7094838131bSGreg Clayton { 7104838131bSGreg Clayton SBStream sstr; 7114838131bSGreg Clayton sb_error.GetDescription (sstr); 7124838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 713acdbe816SGreg Clayton process_sp.get(), 7144838131bSGreg Clayton signo, 7154838131bSGreg Clayton sb_error.get(), 7164838131bSGreg Clayton sstr.GetData()); 7174838131bSGreg Clayton } 71830fdc8d8SChris Lattner return sb_error; 71930fdc8d8SChris Lattner } 72030fdc8d8SChris Lattner 72130fdc8d8SChris Lattner SBThread 7224838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 72330fdc8d8SChris Lattner { 7244838131bSGreg Clayton SBThread sb_thread; 72517a6ad05SGreg Clayton ThreadSP thread_sp; 726acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 727acdbe816SGreg Clayton if (process_sp) 728af67cecdSGreg Clayton { 729acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 7307fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7317fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 7327fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 73317a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 734af67cecdSGreg Clayton } 7354838131bSGreg Clayton 7362d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7374838131bSGreg Clayton if (log) 7384838131bSGreg Clayton { 73961e7a58cSGreg Clayton log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)", 740acdbe816SGreg Clayton process_sp.get(), 7414838131bSGreg Clayton tid, 74217a6ad05SGreg Clayton thread_sp.get()); 7434838131bSGreg Clayton } 7444838131bSGreg Clayton 7454838131bSGreg Clayton return sb_thread; 74630fdc8d8SChris Lattner } 74730fdc8d8SChris Lattner 748*18b46896SJim Ingham SBThread 749*18b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 750*18b46896SJim Ingham { 751*18b46896SJim Ingham SBThread sb_thread; 752*18b46896SJim Ingham ThreadSP thread_sp; 753*18b46896SJim Ingham ProcessSP process_sp(GetSP()); 754*18b46896SJim Ingham if (process_sp) 755*18b46896SJim Ingham { 756*18b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 757*18b46896SJim Ingham Process::StopLocker stop_locker; 758*18b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 759*18b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 760*18b46896SJim Ingham sb_thread.SetThread (thread_sp); 761*18b46896SJim Ingham } 762*18b46896SJim Ingham 763*18b46896SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 764*18b46896SJim Ingham if (log) 765*18b46896SJim Ingham { 766*18b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 767*18b46896SJim Ingham process_sp.get(), 768*18b46896SJim Ingham index_id, 769*18b46896SJim Ingham thread_sp.get()); 770*18b46896SJim Ingham } 771*18b46896SJim Ingham 772*18b46896SJim Ingham return sb_thread; 773*18b46896SJim Ingham } 774*18b46896SJim Ingham 77530fdc8d8SChris Lattner StateType 77630fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 77730fdc8d8SChris Lattner { 7782d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 779ceb6b139SCaroline Tice 780ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 781ceb6b139SCaroline Tice 782ceb6b139SCaroline Tice if (log) 783cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 784750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 785ceb6b139SCaroline Tice 786ceb6b139SCaroline Tice return ret_val; 78730fdc8d8SChris Lattner } 78830fdc8d8SChris Lattner 78930fdc8d8SChris Lattner bool 79030fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 79130fdc8d8SChris Lattner { 7926611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 79330fdc8d8SChris Lattner } 79430fdc8d8SChris Lattner 79530fdc8d8SChris Lattner SBProcess 79630fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 79730fdc8d8SChris Lattner { 7986611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 79930fdc8d8SChris Lattner return process; 80030fdc8d8SChris Lattner } 80130fdc8d8SChris Lattner 802e6bc6cb9SJim Ingham bool 803e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 804e6bc6cb9SJim Ingham { 8054bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 806e6bc6cb9SJim Ingham } 80730fdc8d8SChris Lattner 80830fdc8d8SChris Lattner SBBroadcaster 80930fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 81030fdc8d8SChris Lattner { 8112d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 812ceb6b139SCaroline Tice 813acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 814acdbe816SGreg Clayton 815acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 816ceb6b139SCaroline Tice 817ceb6b139SCaroline Tice if (log) 818acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 819750cd175SCaroline Tice broadcaster.get()); 820ceb6b139SCaroline Tice 82130fdc8d8SChris Lattner return broadcaster; 82230fdc8d8SChris Lattner } 82330fdc8d8SChris Lattner 8244bddaeb5SJim Ingham const char * 8254bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 8264bddaeb5SJim Ingham { 8274bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 8284bddaeb5SJim Ingham } 8294bddaeb5SJim Ingham 83030fdc8d8SChris Lattner size_t 83130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 83230fdc8d8SChris Lattner { 8332d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 834ceb6b139SCaroline Tice 83530fdc8d8SChris Lattner size_t bytes_read = 0; 83630fdc8d8SChris Lattner 837acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 838acdbe816SGreg Clayton 8394838131bSGreg Clayton if (log) 8404838131bSGreg Clayton { 8414838131bSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...", 842acdbe816SGreg Clayton process_sp.get(), 8434838131bSGreg Clayton addr, 8444838131bSGreg Clayton dst, 845c91d804aSGreg Clayton dst_len, 8464838131bSGreg Clayton sb_error.get()); 8474838131bSGreg Clayton } 8484838131bSGreg Clayton 849acdbe816SGreg Clayton if (process_sp) 85030fdc8d8SChris Lattner { 8517fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8527fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 8537fdf9ef1SGreg Clayton { 854acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 8557fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 8567fdf9ef1SGreg Clayton } 8577fdf9ef1SGreg Clayton else 8587fdf9ef1SGreg Clayton { 859c9858e4dSGreg Clayton if (log) 860c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get()); 8617fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 8627fdf9ef1SGreg Clayton } 86330fdc8d8SChris Lattner } 86430fdc8d8SChris Lattner else 86530fdc8d8SChris Lattner { 86630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 86730fdc8d8SChris Lattner } 86830fdc8d8SChris Lattner 869ceb6b139SCaroline Tice if (log) 87093aa84e8SGreg Clayton { 87193aa84e8SGreg Clayton SBStream sstr; 87293aa84e8SGreg Clayton sb_error.GetDescription (sstr); 873c91d804aSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu", 874acdbe816SGreg Clayton process_sp.get(), 87593aa84e8SGreg Clayton addr, 87693aa84e8SGreg Clayton dst, 877c91d804aSGreg Clayton dst_len, 87893aa84e8SGreg Clayton sb_error.get(), 87993aa84e8SGreg Clayton sstr.GetData(), 880c91d804aSGreg Clayton bytes_read); 88193aa84e8SGreg Clayton } 882ceb6b139SCaroline Tice 88330fdc8d8SChris Lattner return bytes_read; 88430fdc8d8SChris Lattner } 88530fdc8d8SChris Lattner 88630fdc8d8SChris Lattner size_t 887e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 888e91b7957SGreg Clayton { 889e91b7957SGreg Clayton size_t bytes_read = 0; 890acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 891acdbe816SGreg Clayton if (process_sp) 892e91b7957SGreg Clayton { 8937fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8947fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 8957fdf9ef1SGreg Clayton { 896acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 8977fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 8987fdf9ef1SGreg Clayton } 8997fdf9ef1SGreg Clayton else 9007fdf9ef1SGreg Clayton { 901c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 902c9858e4dSGreg Clayton if (log) 903c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get()); 9047fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9057fdf9ef1SGreg Clayton } 906e91b7957SGreg Clayton } 907e91b7957SGreg Clayton else 908e91b7957SGreg Clayton { 909e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 910e91b7957SGreg Clayton } 911e91b7957SGreg Clayton return bytes_read; 912e91b7957SGreg Clayton } 913e91b7957SGreg Clayton 914e91b7957SGreg Clayton uint64_t 915e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 916e91b7957SGreg Clayton { 9177fdf9ef1SGreg Clayton uint64_t value = 0; 918acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 919acdbe816SGreg Clayton if (process_sp) 920e91b7957SGreg Clayton { 9217fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9227fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9237fdf9ef1SGreg Clayton { 924acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9257fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 9267fdf9ef1SGreg Clayton } 9277fdf9ef1SGreg Clayton else 9287fdf9ef1SGreg Clayton { 929c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 930c9858e4dSGreg Clayton if (log) 931c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get()); 9327fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9337fdf9ef1SGreg Clayton } 934e91b7957SGreg Clayton } 935e91b7957SGreg Clayton else 936e91b7957SGreg Clayton { 937e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 938e91b7957SGreg Clayton } 9397fdf9ef1SGreg Clayton return value; 940e91b7957SGreg Clayton } 941e91b7957SGreg Clayton 942e91b7957SGreg Clayton lldb::addr_t 943e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 944e91b7957SGreg Clayton { 945e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 946acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 947acdbe816SGreg Clayton if (process_sp) 948e91b7957SGreg Clayton { 9497fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9507fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9517fdf9ef1SGreg Clayton { 952acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9537fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 9547fdf9ef1SGreg Clayton } 9557fdf9ef1SGreg Clayton else 9567fdf9ef1SGreg Clayton { 957c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 958c9858e4dSGreg Clayton if (log) 959c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get()); 9607fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9617fdf9ef1SGreg Clayton } 962e91b7957SGreg Clayton } 963e91b7957SGreg Clayton else 964e91b7957SGreg Clayton { 965e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 966e91b7957SGreg Clayton } 967e91b7957SGreg Clayton return ptr; 968e91b7957SGreg Clayton } 969e91b7957SGreg Clayton 970e91b7957SGreg Clayton size_t 97130fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 97230fdc8d8SChris Lattner { 97330fdc8d8SChris Lattner size_t bytes_written = 0; 97430fdc8d8SChris Lattner 9752d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 976acdbe816SGreg Clayton 977acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 978acdbe816SGreg Clayton 9794838131bSGreg Clayton if (log) 9804838131bSGreg Clayton { 9814838131bSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...", 982acdbe816SGreg Clayton process_sp.get(), 9834838131bSGreg Clayton addr, 9844838131bSGreg Clayton src, 985c91d804aSGreg Clayton src_len, 9864838131bSGreg Clayton sb_error.get()); 9874838131bSGreg Clayton } 9884838131bSGreg Clayton 989acdbe816SGreg Clayton if (process_sp) 99030fdc8d8SChris Lattner { 9917fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9927fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9937fdf9ef1SGreg Clayton { 994acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9957fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 9967fdf9ef1SGreg Clayton } 9977fdf9ef1SGreg Clayton else 9987fdf9ef1SGreg Clayton { 999c9858e4dSGreg Clayton if (log) 1000c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get()); 10017fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10027fdf9ef1SGreg Clayton } 100330fdc8d8SChris Lattner } 100430fdc8d8SChris Lattner 10054838131bSGreg Clayton if (log) 10064838131bSGreg Clayton { 10074838131bSGreg Clayton SBStream sstr; 10084838131bSGreg Clayton sb_error.GetDescription (sstr); 1009c91d804aSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu", 1010acdbe816SGreg Clayton process_sp.get(), 10114838131bSGreg Clayton addr, 10124838131bSGreg Clayton src, 1013c91d804aSGreg Clayton src_len, 10144838131bSGreg Clayton sb_error.get(), 10154838131bSGreg Clayton sstr.GetData(), 1016c91d804aSGreg Clayton bytes_written); 10174838131bSGreg Clayton } 10184838131bSGreg Clayton 101930fdc8d8SChris Lattner return bytes_written; 102030fdc8d8SChris Lattner } 102130fdc8d8SChris Lattner 1022dde9cff3SCaroline Tice bool 1023dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1024dde9cff3SCaroline Tice { 1025da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1026da7bc7d0SGreg Clayton 1027acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1028acdbe816SGreg Clayton if (process_sp) 1029dde9cff3SCaroline Tice { 1030dde9cff3SCaroline Tice char path[PATH_MAX]; 1031dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1032acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 10331d273166SGreg Clayton const char *exe_name = NULL; 10341d273166SGreg Clayton if (exe_module) 10351d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 10361d273166SGreg Clayton 1037da7bc7d0SGreg Clayton strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s", 1038acdbe816SGreg Clayton process_sp->GetID(), 1039ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 10401d273166SGreg Clayton GetNumThreads(), 104105faeb71SGreg Clayton exe_name ? ", executable = " : "", 10421d273166SGreg Clayton exe_name ? exe_name : ""); 1043dde9cff3SCaroline Tice } 1044dde9cff3SCaroline Tice else 1045da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1046dde9cff3SCaroline Tice 1047dde9cff3SCaroline Tice return true; 1048dde9cff3SCaroline Tice } 10498f343b09SGreg Clayton 10508f343b09SGreg Clayton uint32_t 1051f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1052f9ef60d2SJohnny Chen { 1053f9ef60d2SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1054f9ef60d2SJohnny Chen 1055f9ef60d2SJohnny Chen uint32_t num = 0; 1056f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1057f9ef60d2SJohnny Chen if (process_sp) 1058f9ef60d2SJohnny Chen { 1059f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1060f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1061f9ef60d2SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1062f9ef60d2SJohnny Chen if (log) 1063f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1064f9ef60d2SJohnny Chen process_sp.get(), num); 1065f9ef60d2SJohnny Chen } 1066f9ef60d2SJohnny Chen else 1067f9ef60d2SJohnny Chen { 1068f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1069f9ef60d2SJohnny Chen } 1070f9ef60d2SJohnny Chen return num; 1071f9ef60d2SJohnny Chen } 1072f9ef60d2SJohnny Chen 1073f9ef60d2SJohnny Chen uint32_t 10748f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 10758f343b09SGreg Clayton { 1076acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1077acdbe816SGreg Clayton if (process_sp) 1078af67cecdSGreg Clayton { 10797fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10807fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10817fdf9ef1SGreg Clayton { 1082acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1083acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1084af67cecdSGreg Clayton } 10857fdf9ef1SGreg Clayton else 10867fdf9ef1SGreg Clayton { 1087c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1088c9858e4dSGreg Clayton if (log) 1089c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get()); 10907fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10917fdf9ef1SGreg Clayton } 10927fdf9ef1SGreg Clayton } 10938f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 10948f343b09SGreg Clayton } 10958f343b09SGreg Clayton 10968f343b09SGreg Clayton lldb::SBError 10978f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 10988f343b09SGreg Clayton { 10998f343b09SGreg Clayton lldb::SBError sb_error; 1100acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1101acdbe816SGreg Clayton if (process_sp) 1102af67cecdSGreg Clayton { 11037fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11047fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11057fdf9ef1SGreg Clayton { 1106acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1107acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1108af67cecdSGreg Clayton } 11098f343b09SGreg Clayton else 11107fdf9ef1SGreg Clayton { 1111c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1112c9858e4dSGreg Clayton if (log) 1113c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get()); 11147fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11157fdf9ef1SGreg Clayton } 11167fdf9ef1SGreg Clayton } 11177fdf9ef1SGreg Clayton else 11188f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 11198f343b09SGreg Clayton return sb_error; 11208f343b09SGreg Clayton } 1121