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 12bdae3787SVirgile Bello // C Includes 13bdae3787SVirgile Bello #include <inttypes.h> 14bdae3787SVirgile Bello 1530fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1630fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1730fdc8d8SChris Lattner 185d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 19ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 201f746071SGreg Clayton #include "lldb/Core/Module.h" 21f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h" 2230fdc8d8SChris Lattner #include "lldb/Core/State.h" 2330fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2430fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 25*b9c1b51eSKate Stone #include "lldb/Interpreter/Args.h" 2626036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h" 2730fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2830fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 298c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h" 306611103cSGreg Clayton #include "lldb/Target/Target.h" 316611103cSGreg Clayton #include "lldb/Target/Thread.h" 3230fdc8d8SChris Lattner 3330fdc8d8SChris Lattner // Project includes 3430fdc8d8SChris Lattner 354c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 364c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 370e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 384c5de699SEli Friedman #include "lldb/API/SBEvent.h" 390e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 4026036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfo.h" 4126036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfoList.h" 42*b9c1b51eSKate Stone #include "lldb/API/SBStream.h" 43*b9c1b51eSKate Stone #include "lldb/API/SBStringList.h" 4475930019STodd Fiala #include "lldb/API/SBStructuredData.h" 454c5de699SEli Friedman #include "lldb/API/SBThread.h" 46a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h" 47802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h" 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner using namespace lldb; 5030fdc8d8SChris Lattner using namespace lldb_private; 5130fdc8d8SChris Lattner 52*b9c1b51eSKate Stone SBProcess::SBProcess() : m_opaque_wp() {} 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner //---------------------------------------------------------------------- 5530fdc8d8SChris Lattner // SBProcess constructor 5630fdc8d8SChris Lattner //---------------------------------------------------------------------- 5730fdc8d8SChris Lattner 58*b9c1b51eSKate Stone SBProcess::SBProcess(const SBProcess &rhs) : m_opaque_wp(rhs.m_opaque_wp) {} 5930fdc8d8SChris Lattner 60*b9c1b51eSKate Stone SBProcess::SBProcess(const lldb::ProcessSP &process_sp) 61*b9c1b51eSKate Stone : m_opaque_wp(process_sp) {} 6230fdc8d8SChris Lattner 63*b9c1b51eSKate Stone const SBProcess &SBProcess::operator=(const SBProcess &rhs) { 64efabb123SGreg Clayton if (this != &rhs) 654e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 66efabb123SGreg Clayton return *this; 67efabb123SGreg Clayton } 68efabb123SGreg Clayton 6930fdc8d8SChris Lattner //---------------------------------------------------------------------- 7030fdc8d8SChris Lattner // Destructor 7130fdc8d8SChris Lattner //---------------------------------------------------------------------- 72*b9c1b51eSKate Stone SBProcess::~SBProcess() {} 7330fdc8d8SChris Lattner 74*b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClassName() { 754bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 764bddaeb5SJim Ingham } 774bddaeb5SJim Ingham 78*b9c1b51eSKate Stone const char *SBProcess::GetPluginName() { 79d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 80*b9c1b51eSKate Stone if (process_sp) { 8157abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 82d7b30ef9SJim Ingham } 83d7b30ef9SJim Ingham return "<Unknown>"; 84d7b30ef9SJim Ingham } 85d7b30ef9SJim Ingham 86*b9c1b51eSKate Stone const char *SBProcess::GetShortPluginName() { 87d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 88*b9c1b51eSKate Stone if (process_sp) { 8957abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 90d7b30ef9SJim Ingham } 91d7b30ef9SJim Ingham return "<Unknown>"; 92d7b30ef9SJim Ingham } 93d7b30ef9SJim Ingham 94*b9c1b51eSKate Stone lldb::ProcessSP SBProcess::GetSP() const { return m_opaque_wp.lock(); } 95d7b30ef9SJim Ingham 96*b9c1b51eSKate Stone void SBProcess::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; } 97b9556accSGreg Clayton 98*b9c1b51eSKate Stone void SBProcess::Clear() { m_opaque_wp.reset(); } 9930fdc8d8SChris Lattner 100*b9c1b51eSKate Stone bool SBProcess::IsValid() const { 1014fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1024fc6cb9cSJim Ingham return ((bool)process_sp && process_sp->IsValid()); 10330fdc8d8SChris Lattner } 10430fdc8d8SChris Lattner 105*b9c1b51eSKate Stone bool SBProcess::RemoteLaunch(char const **argv, char const **envp, 106*b9c1b51eSKate Stone const char *stdin_path, const char *stdout_path, 1079631aae2SJames McIlree const char *stderr_path, 1089631aae2SJames McIlree const char *working_directory, 109*b9c1b51eSKate Stone uint32_t launch_flags, bool stop_at_entry, 110*b9c1b51eSKate Stone lldb::SBError &error) { 1115160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 112324a1036SSaleem Abdulrasool if (log) 113*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, " 114*b9c1b51eSKate Stone "stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, " 115*b9c1b51eSKate Stone "stop_at_entry=%i, &error (%p))...", 116324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_wp.lock().get()), 117324a1036SSaleem Abdulrasool static_cast<void *>(argv), static_cast<void *>(envp), 1189631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1199631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1209631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 121*b9c1b51eSKate Stone working_directory ? working_directory : "NULL", launch_flags, 122*b9c1b51eSKate Stone stop_at_entry, static_cast<void *>(error.get())); 1239631aae2SJames McIlree 124acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 125*b9c1b51eSKate Stone if (process_sp) { 126*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 127*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 128*b9c1b51eSKate Stone if (process_sp->GetState() == eStateConnected) { 129982c9762SGreg Clayton if (stop_at_entry) 130982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 131*b9c1b51eSKate Stone ProcessLaunchInfo launch_info( 132*b9c1b51eSKate Stone FileSpec{stdin_path, false}, FileSpec{stdout_path, false}, 133*b9c1b51eSKate Stone FileSpec{stderr_path, false}, FileSpec{working_directory, false}, 134982c9762SGreg Clayton launch_flags); 135acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 136982c9762SGreg Clayton if (exe_module) 13714715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 138982c9762SGreg Clayton if (argv) 139982c9762SGreg Clayton launch_info.GetArguments().AppendArguments(argv); 140982c9762SGreg Clayton if (envp) 141982c9762SGreg Clayton launch_info.GetEnvironmentEntries().SetArguments(envp); 142acdbe816SGreg Clayton error.SetError(process_sp->Launch(launch_info)); 143*b9c1b51eSKate Stone } else { 1449631aae2SJames McIlree error.SetErrorString("must be in eStateConnected to call RemoteLaunch"); 1459631aae2SJames McIlree } 146*b9c1b51eSKate Stone } else { 1479631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 1489631aae2SJames McIlree } 1499631aae2SJames McIlree 1509631aae2SJames McIlree if (log) { 1519631aae2SJames McIlree SBStream sstr; 1529631aae2SJames McIlree error.GetDescription(sstr); 153324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", 154324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 155324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), sstr.GetData()); 1569631aae2SJames McIlree } 1579631aae2SJames McIlree 1589631aae2SJames McIlree return error.Success(); 1599631aae2SJames McIlree } 1609631aae2SJames McIlree 161*b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid, 162*b9c1b51eSKate Stone lldb::SBError &error) { 163acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 164*b9c1b51eSKate Stone if (process_sp) { 165*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 166*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 167*b9c1b51eSKate Stone if (process_sp->GetState() == eStateConnected) { 168144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 169144f3a9cSGreg Clayton attach_info.SetProcessID(pid); 170acdbe816SGreg Clayton error.SetError(process_sp->Attach(attach_info)); 171*b9c1b51eSKate Stone } else { 172*b9c1b51eSKate Stone error.SetErrorString( 173*b9c1b51eSKate Stone "must be in eStateConnected to call RemoteAttachToProcessWithID"); 1749631aae2SJames McIlree } 175*b9c1b51eSKate Stone } else { 1769631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 1779631aae2SJames McIlree } 1789631aae2SJames McIlree 1795160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1809631aae2SJames McIlree if (log) { 1819631aae2SJames McIlree SBStream sstr; 1829631aae2SJames McIlree error.GetDescription(sstr); 183*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 184*b9c1b51eSKate Stone ") => SBError (%p): %s", 185324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), pid, 186324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), sstr.GetData()); 1879631aae2SJames McIlree } 1889631aae2SJames McIlree 1899631aae2SJames McIlree return error.Success(); 1909631aae2SJames McIlree } 1919631aae2SJames McIlree 192*b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() { 1935160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 194ceb6b139SCaroline Tice 195ceb6b139SCaroline Tice uint32_t num_threads = 0; 196acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 197*b9c1b51eSKate Stone if (process_sp) { 1987fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1997fdf9ef1SGreg Clayton 2007fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 201*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 202*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 203acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 20430fdc8d8SChris Lattner } 205ceb6b139SCaroline Tice 206ceb6b139SCaroline Tice if (log) 207324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetNumThreads () => %d", 208324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num_threads); 209ceb6b139SCaroline Tice 210ceb6b139SCaroline Tice return num_threads; 21130fdc8d8SChris Lattner } 21230fdc8d8SChris Lattner 213*b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const { 2145160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 215ceb6b139SCaroline Tice 21630fdc8d8SChris Lattner SBThread sb_thread; 21717a6ad05SGreg Clayton ThreadSP thread_sp; 218acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 219*b9c1b51eSKate Stone if (process_sp) { 220*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 221*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 222acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 22317a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 224af67cecdSGreg Clayton } 225ceb6b139SCaroline Tice 226ceb6b139SCaroline Tice if (log) 227324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", 228324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 229324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 230ceb6b139SCaroline Tice 23130fdc8d8SChris Lattner return sb_thread; 23230fdc8d8SChris Lattner } 23330fdc8d8SChris Lattner 234*b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid, 235*b9c1b51eSKate Stone lldb::addr_t context) { 2365160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 237a4d8747dSGreg Clayton 238a4d8747dSGreg Clayton SBThread sb_thread; 239a4d8747dSGreg Clayton ThreadSP thread_sp; 240a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 241*b9c1b51eSKate Stone if (process_sp) { 242*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 243*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 244a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 245a4d8747dSGreg Clayton sb_thread.SetThread(thread_sp); 246a4d8747dSGreg Clayton } 247a4d8747dSGreg Clayton 248a4d8747dSGreg Clayton if (log) 249*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 250*b9c1b51eSKate Stone ", context=0x%" PRIx64 ") => SBThread(%p)", 251324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, context, 252324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 253a4d8747dSGreg Clayton 254a4d8747dSGreg Clayton return sb_thread; 255a4d8747dSGreg Clayton } 256a4d8747dSGreg Clayton 257*b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const { 2585160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 259ceb6b139SCaroline Tice 26030fdc8d8SChris Lattner SBTarget sb_target; 261b9556accSGreg Clayton TargetSP target_sp; 262acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 263*b9c1b51eSKate Stone if (process_sp) { 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) 269324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)", 270324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 271324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get())); 272ceb6b139SCaroline Tice 27330fdc8d8SChris Lattner return sb_target; 27430fdc8d8SChris Lattner } 27530fdc8d8SChris Lattner 276*b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) { 2775160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 278ceb6b139SCaroline Tice 279ceb6b139SCaroline Tice size_t ret_val = 0; 280acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 281*b9c1b51eSKate Stone if (process_sp) { 28230fdc8d8SChris Lattner Error error; 283acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN(src, src_len, error); 28430fdc8d8SChris Lattner } 285ceb6b139SCaroline Tice 286ceb6b139SCaroline Tice if (log) 287*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 288*b9c1b51eSKate Stone ") => %" PRIu64, 289324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), src, 290*b9c1b51eSKate Stone static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val)); 291ceb6b139SCaroline Tice 292ceb6b139SCaroline Tice return ret_val; 29330fdc8d8SChris Lattner } 29430fdc8d8SChris Lattner 295*b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const { 296cfd1acedSGreg Clayton size_t bytes_read = 0; 297acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 298*b9c1b51eSKate Stone if (process_sp) { 29930fdc8d8SChris Lattner Error error; 300acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT(dst, dst_len, error); 30130fdc8d8SChris Lattner } 302ceb6b139SCaroline Tice 3035160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 304ceb6b139SCaroline Tice if (log) 305*b9c1b51eSKate Stone log->Printf( 306*b9c1b51eSKate Stone "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 307*b9c1b51eSKate Stone ") => %" PRIu64, 308*b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 309*b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 310ceb6b139SCaroline Tice 311cfd1acedSGreg Clayton return bytes_read; 31230fdc8d8SChris Lattner } 31330fdc8d8SChris Lattner 314*b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const { 315cfd1acedSGreg Clayton size_t bytes_read = 0; 316acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 317*b9c1b51eSKate Stone if (process_sp) { 31830fdc8d8SChris Lattner Error error; 319acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR(dst, dst_len, error); 32030fdc8d8SChris Lattner } 321ceb6b139SCaroline Tice 3225160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 323ceb6b139SCaroline Tice if (log) 324*b9c1b51eSKate Stone log->Printf( 325*b9c1b51eSKate Stone "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 326*b9c1b51eSKate Stone ") => %" PRIu64, 327*b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 328*b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 329ceb6b139SCaroline Tice 330cfd1acedSGreg Clayton return bytes_read; 33130fdc8d8SChris Lattner } 33230fdc8d8SChris Lattner 333*b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const { 334ab3b8b22SHan Ming Ong size_t bytes_read = 0; 335ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 336*b9c1b51eSKate Stone if (process_sp) { 337ab3b8b22SHan Ming Ong Error error; 338ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error); 339ab3b8b22SHan Ming Ong } 340ab3b8b22SHan Ming Ong 3415160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 342ab3b8b22SHan Ming Ong if (log) 343*b9c1b51eSKate Stone log->Printf( 344*b9c1b51eSKate Stone "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 345*b9c1b51eSKate Stone ") => %" PRIu64, 346*b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 347*b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 348ab3b8b22SHan Ming Ong 349ab3b8b22SHan Ming Ong return bytes_read; 350ab3b8b22SHan Ming Ong } 351ab3b8b22SHan Ming Ong 352*b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const { 35330fdc8d8SChris Lattner if (out == NULL) 35430fdc8d8SChris Lattner return; 35530fdc8d8SChris Lattner 356acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 357*b9c1b51eSKate Stone if (process_sp) { 35830fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 35930fdc8d8SChris Lattner char message[1024]; 360*b9c1b51eSKate Stone int message_len = ::snprintf( 361*b9c1b51eSKate Stone message, sizeof(message), "Process %" PRIu64 " %s\n", 362*b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 36330fdc8d8SChris Lattner 36430fdc8d8SChris Lattner if (message_len > 0) 36530fdc8d8SChris Lattner ::fwrite(message, 1, message_len, out); 36630fdc8d8SChris Lattner } 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner 369*b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event, 370*b9c1b51eSKate Stone SBCommandReturnObject &result) { 371acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 372*b9c1b51eSKate Stone if (process_sp) { 37330fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 37430fdc8d8SChris Lattner char message[1024]; 375*b9c1b51eSKate Stone ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n", 376*b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 37730fdc8d8SChris Lattner 37830fdc8d8SChris Lattner result.AppendMessage(message); 37930fdc8d8SChris Lattner } 38030fdc8d8SChris Lattner } 38130fdc8d8SChris Lattner 382*b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) { 383acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 384*b9c1b51eSKate Stone if (process_sp) { 385*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 386*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 387*b9c1b51eSKate Stone return process_sp->GetThreadList().SetSelectedThreadByID( 388*b9c1b51eSKate Stone thread.GetThreadID()); 389af67cecdSGreg Clayton } 39030fdc8d8SChris Lattner return false; 39130fdc8d8SChris Lattner } 39230fdc8d8SChris Lattner 393*b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) { 3945160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 395ceb6b139SCaroline Tice 396ceb6b139SCaroline Tice bool ret_val = false; 397acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 398*b9c1b51eSKate Stone if (process_sp) { 399*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 400*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 401acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid); 402af67cecdSGreg Clayton } 403ceb6b139SCaroline Tice 404ceb6b139SCaroline Tice if (log) 405*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 406*b9c1b51eSKate Stone ") => %s", 407324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, 408324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 409ceb6b139SCaroline Tice 410ceb6b139SCaroline Tice return ret_val; 41130fdc8d8SChris Lattner } 41230fdc8d8SChris Lattner 413*b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) { 4145160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 41518b46896SJim Ingham 41618b46896SJim Ingham bool ret_val = false; 41718b46896SJim Ingham ProcessSP process_sp(GetSP()); 418*b9c1b51eSKate Stone if (process_sp) { 419*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 420*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 42118b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id); 42218b46896SJim Ingham } 42318b46896SJim Ingham 42418b46896SJim Ingham if (log) 42518b46896SJim Ingham log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 426324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), index_id, 427324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 42818b46896SJim Ingham 42918b46896SJim Ingham return ret_val; 43018b46896SJim Ingham } 43118b46896SJim Ingham 432*b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) { 4335160ce5cSGreg Clayton Log *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()); 438*b9c1b51eSKate Stone if (process_sp) { 4397fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4407fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 441*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 442*b9c1b51eSKate Stone 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) 44893aa84e8SGreg Clayton log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 449324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 450324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 451324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 452ceb6b139SCaroline Tice 45317a6ad05SGreg Clayton return sb_thread; 45430fdc8d8SChris Lattner } 45530fdc8d8SChris Lattner 456*b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() { 4575e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4585e8dce4dSJason Molenda 4595e8dce4dSJason Molenda uint32_t num_queues = 0; 4605e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 461*b9c1b51eSKate Stone if (process_sp) { 4625e8dce4dSJason Molenda Process::StopLocker stop_locker; 463*b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 464*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 465*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 4665e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 4675e8dce4dSJason Molenda } 468a61d0a5bSGreg Clayton } 4695e8dce4dSJason Molenda 4705e8dce4dSJason Molenda if (log) 471324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetNumQueues () => %d", 472324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num_queues); 4735e8dce4dSJason Molenda 4745e8dce4dSJason Molenda return num_queues; 4755e8dce4dSJason Molenda } 4765e8dce4dSJason Molenda 477*b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) { 4785e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4795e8dce4dSJason Molenda 4805e8dce4dSJason Molenda SBQueue sb_queue; 4815e8dce4dSJason Molenda QueueSP queue_sp; 4825e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 483*b9c1b51eSKate Stone if (process_sp) { 4845e8dce4dSJason Molenda Process::StopLocker stop_locker; 485*b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 486*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 487*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 4885e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 4895e8dce4dSJason Molenda sb_queue.SetQueue(queue_sp); 4905e8dce4dSJason Molenda } 491a61d0a5bSGreg Clayton } 4925e8dce4dSJason Molenda 4935e8dce4dSJason Molenda if (log) 4945e8dce4dSJason Molenda log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", 495324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 496324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 497324a1036SSaleem Abdulrasool static_cast<void *>(queue_sp.get())); 4985e8dce4dSJason Molenda 4995e8dce4dSJason Molenda return sb_queue; 5005e8dce4dSJason Molenda } 5015e8dce4dSJason Molenda 502*b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) { 503bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 504*b9c1b51eSKate Stone if (process_sp) { 505*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 506*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 507bf2956a2SJim Ingham if (include_expression_stops) 508bf2956a2SJim Ingham return process_sp->GetStopID(); 509bf2956a2SJim Ingham else 510bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 511bf2956a2SJim Ingham } 512bf2956a2SJim Ingham return 0; 513bf2956a2SJim Ingham } 514bf2956a2SJim Ingham 515*b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) { 51638810f43SIlia K Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 51738810f43SIlia K 51838810f43SIlia K SBEvent sb_event; 51938810f43SIlia K EventSP event_sp; 52038810f43SIlia K ProcessSP process_sp(GetSP()); 521*b9c1b51eSKate Stone if (process_sp) { 522*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 523*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 52438810f43SIlia K event_sp = process_sp->GetStopEventForStopID(stop_id); 52538810f43SIlia K sb_event.reset(event_sp); 52638810f43SIlia K } 52738810f43SIlia K 52838810f43SIlia K if (log) 529*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 530*b9c1b51eSKate Stone ") => SBEvent(%p)", 531*b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), stop_id, 53238810f43SIlia K static_cast<void *>(event_sp.get())); 53338810f43SIlia K 53438810f43SIlia K return sb_event; 53538810f43SIlia K } 53638810f43SIlia K 537*b9c1b51eSKate Stone StateType SBProcess::GetState() { 538ceb6b139SCaroline Tice 539ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 540acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 541*b9c1b51eSKate Stone if (process_sp) { 542*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 543*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 544acdbe816SGreg Clayton ret_val = process_sp->GetState(); 545af67cecdSGreg Clayton } 546ceb6b139SCaroline Tice 5475160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 548ceb6b139SCaroline Tice if (log) 549cfd1acedSGreg Clayton log->Printf("SBProcess(%p)::GetState () => %s", 550324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 551750cd175SCaroline Tice lldb_private::StateAsCString(ret_val)); 552ceb6b139SCaroline Tice 553ceb6b139SCaroline Tice return ret_val; 55430fdc8d8SChris Lattner } 55530fdc8d8SChris Lattner 556*b9c1b51eSKate Stone int SBProcess::GetExitStatus() { 5574838131bSGreg Clayton int exit_status = 0; 558acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 559*b9c1b51eSKate Stone if (process_sp) { 560*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 561*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 562acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus(); 563af67cecdSGreg Clayton } 5645160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5654838131bSGreg Clayton if (log) 5664838131bSGreg Clayton log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 567324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), exit_status, 568324a1036SSaleem Abdulrasool exit_status); 5694838131bSGreg Clayton 5704838131bSGreg Clayton return exit_status; 57130fdc8d8SChris Lattner } 57230fdc8d8SChris Lattner 573*b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() { 5744838131bSGreg Clayton const char *exit_desc = NULL; 575acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 576*b9c1b51eSKate Stone if (process_sp) { 577*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 578*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 579acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription(); 580af67cecdSGreg Clayton } 5815160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5824838131bSGreg Clayton if (log) 5834838131bSGreg Clayton log->Printf("SBProcess(%p)::GetExitDescription () => %s", 584324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), exit_desc); 5854838131bSGreg Clayton return exit_desc; 58630fdc8d8SChris Lattner } 58730fdc8d8SChris Lattner 588*b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() { 589ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 590acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 591acdbe816SGreg Clayton if (process_sp) 592acdbe816SGreg Clayton ret_val = process_sp->GetID(); 593ceb6b139SCaroline Tice 5945160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 595ceb6b139SCaroline Tice if (log) 596324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64, 597324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), ret_val); 598ceb6b139SCaroline Tice 599ceb6b139SCaroline Tice return ret_val; 60030fdc8d8SChris Lattner } 60130fdc8d8SChris Lattner 602*b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() { 603949e8221SGreg Clayton uint32_t ret_val = 0; 604949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 605949e8221SGreg Clayton if (process_sp) 606949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 6075160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 608949e8221SGreg Clayton if (log) 609324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32, 610324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), ret_val); 611949e8221SGreg Clayton return ret_val; 612949e8221SGreg Clayton } 613949e8221SGreg Clayton 614*b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const { 615cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 616acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 617acdbe816SGreg Clayton if (process_sp) 618acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 619cf386e24SJohnny Chen 6205160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 621cf386e24SJohnny Chen if (log) 622324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetByteOrder () => %d", 623324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), byteOrder); 624cf386e24SJohnny Chen 625cf386e24SJohnny Chen return byteOrder; 626cf386e24SJohnny Chen } 627cf386e24SJohnny Chen 628*b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const { 629ceb6b139SCaroline Tice uint32_t size = 0; 630acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 631acdbe816SGreg Clayton if (process_sp) 632acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 633ceb6b139SCaroline Tice 6345160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 635ceb6b139SCaroline Tice if (log) 636324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetAddressByteSize () => %d", 637324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), size); 638ceb6b139SCaroline Tice 639ceb6b139SCaroline Tice return size; 64030fdc8d8SChris Lattner } 64130fdc8d8SChris Lattner 642*b9c1b51eSKate Stone SBError SBProcess::Continue() { 6435160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 644ceb6b139SCaroline Tice 64530fdc8d8SChris Lattner SBError sb_error; 646acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 6470c74e78dSGreg Clayton 648acdbe816SGreg Clayton if (log) 649324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::Continue ()...", 650324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 651acdbe816SGreg Clayton 652*b9c1b51eSKate Stone if (process_sp) { 653*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 654*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 655acdbe816SGreg Clayton 656dc6224e0SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution()) 657dc6224e0SGreg Clayton sb_error.ref() = process_sp->Resume(); 658dc6224e0SGreg Clayton else 659dc6224e0SGreg Clayton sb_error.ref() = process_sp->ResumeSynchronous(NULL); 660*b9c1b51eSKate Stone } else 66130fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 66230fdc8d8SChris Lattner 663*b9c1b51eSKate Stone if (log) { 664ceb6b139SCaroline Tice SBStream sstr; 665ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 666324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s", 667324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 668324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 669ceb6b139SCaroline Tice } 670ceb6b139SCaroline Tice 67130fdc8d8SChris Lattner return sb_error; 67230fdc8d8SChris Lattner } 67330fdc8d8SChris Lattner 674*b9c1b51eSKate Stone SBError SBProcess::Destroy() { 67530fdc8d8SChris Lattner SBError sb_error; 676acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 677*b9c1b51eSKate Stone if (process_sp) { 678*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 679*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 680ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 681*b9c1b51eSKate Stone } else 68230fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 68330fdc8d8SChris Lattner 6845160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 685*b9c1b51eSKate Stone if (log) { 6864838131bSGreg Clayton SBStream sstr; 6874838131bSGreg Clayton sb_error.GetDescription(sstr); 6886779606aSGreg Clayton log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s", 689324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 690324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 6914838131bSGreg Clayton } 6924838131bSGreg Clayton 69330fdc8d8SChris Lattner return sb_error; 69430fdc8d8SChris Lattner } 69530fdc8d8SChris Lattner 696*b9c1b51eSKate Stone SBError SBProcess::Stop() { 69730fdc8d8SChris Lattner SBError sb_error; 698acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 699*b9c1b51eSKate Stone if (process_sp) { 700*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 701*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 702acdbe816SGreg Clayton sb_error.SetError(process_sp->Halt()); 703*b9c1b51eSKate Stone } else 70430fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 705ceb6b139SCaroline Tice 7065160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 707*b9c1b51eSKate Stone if (log) { 708ceb6b139SCaroline Tice SBStream sstr; 709ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 71093aa84e8SGreg Clayton log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s", 711324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 712324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 713ceb6b139SCaroline Tice } 714ceb6b139SCaroline Tice 71530fdc8d8SChris Lattner return sb_error; 71630fdc8d8SChris Lattner } 71730fdc8d8SChris Lattner 718*b9c1b51eSKate Stone SBError SBProcess::Kill() { 71930fdc8d8SChris Lattner SBError sb_error; 720acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 721*b9c1b51eSKate Stone if (process_sp) { 722*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 723*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 724ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(true)); 725*b9c1b51eSKate Stone } else 72630fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 727ceb6b139SCaroline Tice 7285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 729*b9c1b51eSKate Stone if (log) { 730ceb6b139SCaroline Tice SBStream sstr; 731ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 73293aa84e8SGreg Clayton log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s", 733324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 734324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 735ceb6b139SCaroline Tice } 736ceb6b139SCaroline Tice 73730fdc8d8SChris Lattner return sb_error; 73830fdc8d8SChris Lattner } 73930fdc8d8SChris Lattner 740*b9c1b51eSKate Stone SBError SBProcess::Detach() { 741acff8950SJim Ingham // FIXME: This should come from a process default. 742acff8950SJim Ingham bool keep_stopped = false; 743acff8950SJim Ingham return Detach(keep_stopped); 744acff8950SJim Ingham } 745acff8950SJim Ingham 746*b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) { 74730fdc8d8SChris Lattner SBError sb_error; 748acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 749*b9c1b51eSKate Stone if (process_sp) { 750*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 751*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 752acff8950SJim Ingham sb_error.SetError(process_sp->Detach(keep_stopped)); 753*b9c1b51eSKate Stone } else 75430fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 75530fdc8d8SChris Lattner 75630fdc8d8SChris Lattner return sb_error; 75730fdc8d8SChris Lattner } 75830fdc8d8SChris Lattner 759*b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) { 76030fdc8d8SChris Lattner SBError sb_error; 761acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 762*b9c1b51eSKate Stone if (process_sp) { 763*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 764*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 765acdbe816SGreg Clayton sb_error.SetError(process_sp->Signal(signo)); 766*b9c1b51eSKate Stone } else 76730fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 7685160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 769*b9c1b51eSKate Stone if (log) { 7704838131bSGreg Clayton SBStream sstr; 7714838131bSGreg Clayton sb_error.GetDescription(sstr); 7724838131bSGreg Clayton log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 773324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), signo, 774324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 7754838131bSGreg Clayton } 77630fdc8d8SChris Lattner return sb_error; 77730fdc8d8SChris Lattner } 77830fdc8d8SChris Lattner 779*b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() { 78098d0a4b3SChaoren Lin if (auto process_sp = GetSP()) 78198d0a4b3SChaoren Lin return SBUnixSignals{process_sp}; 782802dc402STodd Fiala 78398d0a4b3SChaoren Lin return {}; 784802dc402STodd Fiala } 785802dc402STodd Fiala 786*b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() { 787cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 788*b9c1b51eSKate Stone if (process_sp) { 789cfc0935eSJim Ingham process_sp->SendAsyncInterrupt(); 790cfc0935eSJim Ingham } 791cfc0935eSJim Ingham } 792cfc0935eSJim Ingham 793*b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) { 7944838131bSGreg Clayton SBThread sb_thread; 79517a6ad05SGreg Clayton ThreadSP thread_sp; 796acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 797*b9c1b51eSKate Stone if (process_sp) { 7987fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7997fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 800*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 801*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 8027fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update); 80317a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 804af67cecdSGreg Clayton } 8054838131bSGreg Clayton 8065160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 8074838131bSGreg Clayton if (log) 808*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 809*b9c1b51eSKate Stone ") => SBThread (%p)", 810324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, 811324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 8124838131bSGreg Clayton 8134838131bSGreg Clayton return sb_thread; 81430fdc8d8SChris Lattner } 81530fdc8d8SChris Lattner 816*b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) { 81718b46896SJim Ingham SBThread sb_thread; 81818b46896SJim Ingham ThreadSP thread_sp; 81918b46896SJim Ingham ProcessSP process_sp(GetSP()); 820*b9c1b51eSKate Stone if (process_sp) { 82118b46896SJim Ingham Process::StopLocker stop_locker; 82218b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 823*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 824*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 825*b9c1b51eSKate Stone thread_sp = 826*b9c1b51eSKate Stone process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update); 82718b46896SJim Ingham sb_thread.SetThread(thread_sp); 82818b46896SJim Ingham } 82918b46896SJim Ingham 8305160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 83118b46896SJim Ingham if (log) 83218b46896SJim Ingham log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 833324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), index_id, 834324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 83518b46896SJim Ingham 83618b46896SJim Ingham return sb_thread; 83718b46896SJim Ingham } 83818b46896SJim Ingham 839*b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) { 8405160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 841ceb6b139SCaroline Tice 842ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get()); 843ceb6b139SCaroline Tice 844ceb6b139SCaroline Tice if (log) 845324a1036SSaleem Abdulrasool log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s", 846324a1036SSaleem Abdulrasool static_cast<void *>(event.get()), 847750cd175SCaroline Tice lldb_private::StateAsCString(ret_val)); 848ceb6b139SCaroline Tice 849ceb6b139SCaroline Tice return ret_val; 85030fdc8d8SChris Lattner } 85130fdc8d8SChris Lattner 852*b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) { 853ea2cc5e0SPavel Labath Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 854ea2cc5e0SPavel Labath 855ea2cc5e0SPavel Labath bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get()); 856ea2cc5e0SPavel Labath 857ea2cc5e0SPavel Labath if (log) 858400e1809SHans Wennborg log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__, 859400e1809SHans Wennborg static_cast<void *>(event.get()), ret_val); 860ea2cc5e0SPavel Labath 861ea2cc5e0SPavel Labath return ret_val; 86230fdc8d8SChris Lattner } 86330fdc8d8SChris Lattner 864*b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) { 8650161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 8660161b49cSJim Ingham } 8670161b49cSJim Ingham 8680161b49cSJim Ingham const char * 869*b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event, 870*b9c1b51eSKate Stone size_t idx) { 8710161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 8720161b49cSJim Ingham } 8730161b49cSJim Ingham 874*b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) { 87575930019STodd Fiala ProcessSP process_sp = 87675930019STodd Fiala Process::ProcessEventData::GetProcessFromEvent(event.get()); 877*b9c1b51eSKate Stone if (!process_sp) { 87875930019STodd Fiala // StructuredData events also know the process they come from. 87975930019STodd Fiala // Try that. 88075930019STodd Fiala process_sp = EventDataStructuredData::GetProcessFromEvent(event.get()); 88175930019STodd Fiala } 88275930019STodd Fiala 88375930019STodd Fiala return SBProcess(process_sp); 88430fdc8d8SChris Lattner } 88530fdc8d8SChris Lattner 886*b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) { 88706d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 88806d2855fSIlia K } 88906d2855fSIlia K 89075930019STodd Fiala lldb::SBStructuredData 891*b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) { 89275930019STodd Fiala return SBStructuredData(event.GetSP()); 89375930019STodd Fiala } 89475930019STodd Fiala 895*b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) { 89675930019STodd Fiala return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) && 89775930019STodd Fiala !EventIsStructuredDataEvent(event); 89875930019STodd Fiala } 89975930019STodd Fiala 900*b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) { 90175930019STodd Fiala EventSP event_sp = event.GetSP(); 90275930019STodd Fiala EventData *event_data = event_sp ? event_sp->GetData() : nullptr; 903*b9c1b51eSKate Stone return event_data && (event_data->GetFlavor() == 904*b9c1b51eSKate Stone EventDataStructuredData::GetFlavorString()); 905e6bc6cb9SJim Ingham } 90630fdc8d8SChris Lattner 907*b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const { 9085160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 909ceb6b139SCaroline Tice 910acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 911acdbe816SGreg Clayton 912acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 913ceb6b139SCaroline Tice 914ceb6b139SCaroline Tice if (log) 915324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", 916324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 917324a1036SSaleem Abdulrasool static_cast<void *>(broadcaster.get())); 918ceb6b139SCaroline Tice 91930fdc8d8SChris Lattner return broadcaster; 92030fdc8d8SChris Lattner } 92130fdc8d8SChris Lattner 922*b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() { 9234bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 9244bddaeb5SJim Ingham } 9254bddaeb5SJim Ingham 926*b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len, 927*b9c1b51eSKate Stone SBError &sb_error) { 9285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 929ceb6b139SCaroline Tice 93030fdc8d8SChris Lattner size_t bytes_read = 0; 93130fdc8d8SChris Lattner 932acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 933acdbe816SGreg Clayton 9344838131bSGreg Clayton if (log) 935*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 936*b9c1b51eSKate Stone ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 937324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 938324a1036SSaleem Abdulrasool static_cast<void *>(dst), static_cast<uint64_t>(dst_len), 939324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 9404838131bSGreg Clayton 941*b9c1b51eSKate Stone if (process_sp) { 9427fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 943*b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 944*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 945*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 9467fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref()); 947*b9c1b51eSKate Stone } else { 948c9858e4dSGreg Clayton if (log) 949324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::ReadMemory() => error: process is running", 950324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 9517fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9527fdf9ef1SGreg Clayton } 953*b9c1b51eSKate Stone } else { 95430fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 95530fdc8d8SChris Lattner } 95630fdc8d8SChris Lattner 957*b9c1b51eSKate Stone if (log) { 95893aa84e8SGreg Clayton SBStream sstr; 95993aa84e8SGreg Clayton sb_error.GetDescription(sstr); 960*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 961*b9c1b51eSKate Stone ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 962324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 963324a1036SSaleem Abdulrasool static_cast<void *>(dst), static_cast<uint64_t>(dst_len), 964324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData(), 965324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 96693aa84e8SGreg Clayton } 967ceb6b139SCaroline Tice 96830fdc8d8SChris Lattner return bytes_read; 96930fdc8d8SChris Lattner } 97030fdc8d8SChris Lattner 971*b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size, 972*b9c1b51eSKate Stone lldb::SBError &sb_error) { 973e91b7957SGreg Clayton size_t bytes_read = 0; 974acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 975*b9c1b51eSKate Stone if (process_sp) { 9767fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 977*b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 978*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 979*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 980*b9c1b51eSKate Stone bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size, 981*b9c1b51eSKate Stone sb_error.ref()); 982*b9c1b51eSKate Stone } else { 9835160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 984c9858e4dSGreg Clayton if (log) 985*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process " 986*b9c1b51eSKate Stone "is running", 987324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 9887fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9897fdf9ef1SGreg Clayton } 990*b9c1b51eSKate Stone } else { 991e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 992e91b7957SGreg Clayton } 993e91b7957SGreg Clayton return bytes_read; 994e91b7957SGreg Clayton } 995e91b7957SGreg Clayton 996*b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size, 997*b9c1b51eSKate Stone lldb::SBError &sb_error) { 9987fdf9ef1SGreg Clayton uint64_t value = 0; 999acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1000*b9c1b51eSKate Stone if (process_sp) { 10017fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1002*b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1003*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1004*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1005*b9c1b51eSKate Stone value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0, 1006*b9c1b51eSKate Stone sb_error.ref()); 1007*b9c1b51eSKate Stone } else { 10085160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1009c9858e4dSGreg Clayton if (log) 1010*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process " 1011*b9c1b51eSKate Stone "is running", 1012324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10137fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10147fdf9ef1SGreg Clayton } 1015*b9c1b51eSKate Stone } else { 1016e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1017e91b7957SGreg Clayton } 10187fdf9ef1SGreg Clayton return value; 1019e91b7957SGreg Clayton } 1020e91b7957SGreg Clayton 1021*b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr, 1022*b9c1b51eSKate Stone lldb::SBError &sb_error) { 1023e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1024acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1025*b9c1b51eSKate Stone if (process_sp) { 10267fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1027*b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1028*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1029*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 10307fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref()); 1031*b9c1b51eSKate Stone } else { 10325160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1033c9858e4dSGreg Clayton if (log) 1034*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process " 1035*b9c1b51eSKate Stone "is running", 1036324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10377fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10387fdf9ef1SGreg Clayton } 1039*b9c1b51eSKate Stone } else { 1040e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1041e91b7957SGreg Clayton } 1042e91b7957SGreg Clayton return ptr; 1043e91b7957SGreg Clayton } 1044e91b7957SGreg Clayton 1045*b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len, 1046*b9c1b51eSKate Stone SBError &sb_error) { 104730fdc8d8SChris Lattner size_t bytes_written = 0; 104830fdc8d8SChris Lattner 10495160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1050acdbe816SGreg Clayton 1051acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1052acdbe816SGreg Clayton 10534838131bSGreg Clayton if (log) 1054*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1055*b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1056324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1057*b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1058324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 10594838131bSGreg Clayton 1060*b9c1b51eSKate Stone if (process_sp) { 10617fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1062*b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1063*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1064*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1065*b9c1b51eSKate Stone bytes_written = 1066*b9c1b51eSKate Stone process_sp->WriteMemory(addr, src, src_len, sb_error.ref()); 1067*b9c1b51eSKate Stone } else { 1068c9858e4dSGreg Clayton if (log) 1069324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::WriteMemory() => error: process is running", 1070324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10717fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10727fdf9ef1SGreg Clayton } 107330fdc8d8SChris Lattner } 107430fdc8d8SChris Lattner 1075*b9c1b51eSKate Stone if (log) { 10764838131bSGreg Clayton SBStream sstr; 10774838131bSGreg Clayton sb_error.GetDescription(sstr); 1078*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1079*b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1080324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1081*b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1082324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData(), 1083324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_written)); 10844838131bSGreg Clayton } 10854838131bSGreg Clayton 108630fdc8d8SChris Lattner return bytes_written; 108730fdc8d8SChris Lattner } 108830fdc8d8SChris Lattner 1089*b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) { 1090da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1091da7bc7d0SGreg Clayton 1092acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1093*b9c1b51eSKate Stone if (process_sp) { 1094dde9cff3SCaroline Tice char path[PATH_MAX]; 1095dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath(path, sizeof(path)); 1096acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 10971d273166SGreg Clayton const char *exe_name = NULL; 10981d273166SGreg Clayton if (exe_module) 10991d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 11001d273166SGreg Clayton 1101d01b2953SDaniel Malea strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1102*b9c1b51eSKate Stone process_sp->GetID(), lldb_private::StateAsCString(GetState()), 1103*b9c1b51eSKate Stone GetNumThreads(), exe_name ? ", executable = " : "", 11041d273166SGreg Clayton exe_name ? exe_name : ""); 1105*b9c1b51eSKate Stone } else 1106da7bc7d0SGreg Clayton strm.PutCString("No value"); 1107dde9cff3SCaroline Tice 1108dde9cff3SCaroline Tice return true; 1109dde9cff3SCaroline Tice } 11108f343b09SGreg Clayton 11118f343b09SGreg Clayton uint32_t 1112*b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const { 11135160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1114f9ef60d2SJohnny Chen 1115f9ef60d2SJohnny Chen uint32_t num = 0; 1116f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1117*b9c1b51eSKate Stone if (process_sp) { 1118*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1119*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1120f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo(num)); 1121f9ef60d2SJohnny Chen if (log) 1122f9ef60d2SJohnny Chen log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1123324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num); 1124*b9c1b51eSKate Stone } else { 1125f9ef60d2SJohnny Chen sb_error.SetErrorString("SBProcess is invalid"); 1126f9ef60d2SJohnny Chen } 1127f9ef60d2SJohnny Chen return num; 1128f9ef60d2SJohnny Chen } 1129f9ef60d2SJohnny Chen 1130*b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec, 1131*b9c1b51eSKate Stone lldb::SBError &sb_error) { 11324fbd67acSTamas Berghammer return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); 11334fbd67acSTamas Berghammer } 11344fbd67acSTamas Berghammer 1135*b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec, 11364fbd67acSTamas Berghammer const lldb::SBFileSpec &sb_remote_image_spec, 1137*b9c1b51eSKate Stone lldb::SBError &sb_error) { 1138acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1139*b9c1b51eSKate Stone if (process_sp) { 11407fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1141*b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1142*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1143*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 11443cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1145*b9c1b51eSKate Stone return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec, 1146*b9c1b51eSKate Stone *sb_remote_image_spec, sb_error.ref()); 1147*b9c1b51eSKate Stone } else { 11485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1149c9858e4dSGreg Clayton if (log) 1150324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::LoadImage() => error: process is running", 1151324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 11527fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11537fdf9ef1SGreg Clayton } 11547fdf9ef1SGreg Clayton } 11558f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11568f343b09SGreg Clayton } 11578f343b09SGreg Clayton 1158*b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) { 11598f343b09SGreg Clayton lldb::SBError sb_error; 1160acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1161*b9c1b51eSKate Stone if (process_sp) { 11627fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1163*b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1164*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1165*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 11663cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1167*b9c1b51eSKate Stone sb_error.SetError( 1168*b9c1b51eSKate Stone platform_sp->UnloadImage(process_sp.get(), image_token)); 1169*b9c1b51eSKate Stone } else { 11705160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1171c9858e4dSGreg Clayton if (log) 1172324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::UnloadImage() => error: process is running", 1173324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 11747fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11757fdf9ef1SGreg Clayton } 1176*b9c1b51eSKate Stone } else 11778f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 11788f343b09SGreg Clayton return sb_error; 11798f343b09SGreg Clayton } 11808c71337aSJason Molenda 1181*b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) { 1182a332978bSJason Molenda lldb::SBError sb_error; 1183a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1184*b9c1b51eSKate Stone if (process_sp) { 1185a332978bSJason Molenda Process::StopLocker stop_locker; 1186*b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1187*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1188*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1189a332978bSJason Molenda sb_error.SetError(process_sp->SendEventData(event_data)); 1190*b9c1b51eSKate Stone } else { 1191a332978bSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1192a332978bSJason Molenda if (log) 1193*b9c1b51eSKate Stone log->Printf( 1194*b9c1b51eSKate Stone "SBProcess(%p)::SendEventData() => error: process is running", 1195324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 1196a332978bSJason Molenda sb_error.SetErrorString("process is running"); 1197a332978bSJason Molenda } 1198*b9c1b51eSKate Stone } else 1199a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1200a332978bSJason Molenda return sb_error; 1201a332978bSJason Molenda } 1202a332978bSJason Molenda 1203*b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() { 12048c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1205*b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 12068c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 120795d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 12088c71337aSJason Molenda } 12098c71337aSJason Molenda return 0; 12108c71337aSJason Molenda } 12118c71337aSJason Molenda 1212*b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) { 12138c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1214*b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 12158c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1216*b9c1b51eSKate Stone const std::vector<ConstString> &names = 1217*b9c1b51eSKate Stone runtime->GetExtendedBacktraceTypes(); 1218*b9c1b51eSKate Stone if (idx < names.size()) { 12198c71337aSJason Molenda return names[idx].AsCString(); 1220*b9c1b51eSKate Stone } else { 12218c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 12228c71337aSJason Molenda if (log) 1223*b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => " 1224*b9c1b51eSKate Stone "error: requested extended backtrace name out of bounds", 1225324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 12268c71337aSJason Molenda } 12278c71337aSJason Molenda } 12288c71337aSJason Molenda return NULL; 12298c71337aSJason Molenda } 1230a51ea382SKuba Brecka 1231*b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) { 1232a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1233a51ea382SKuba Brecka SBThreadCollection threads; 1234*b9c1b51eSKate Stone if (process_sp) { 1235a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1236a51ea382SKuba Brecka } 1237a51ea382SKuba Brecka return threads; 1238a51ea382SKuba Brecka } 123963927548SKuba Brecka 1240*b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent( 1241*b9c1b51eSKate Stone InstrumentationRuntimeType type) { 124263927548SKuba Brecka ProcessSP process_sp(GetSP()); 124363927548SKuba Brecka if (!process_sp) 124463927548SKuba Brecka return false; 124563927548SKuba Brecka 1246*b9c1b51eSKate Stone InstrumentationRuntimeSP runtime_sp = 1247*b9c1b51eSKate Stone process_sp->GetInstrumentationRuntime(type); 124863927548SKuba Brecka 124963927548SKuba Brecka if (!runtime_sp.get()) 125063927548SKuba Brecka return false; 125163927548SKuba Brecka 125263927548SKuba Brecka return runtime_sp->IsActive(); 125363927548SKuba Brecka } 1254f7d1893fSAdrian McCarthy 1255*b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) { 1256f7d1893fSAdrian McCarthy lldb::SBError error; 1257f7d1893fSAdrian McCarthy ProcessSP process_sp(GetSP()); 1258*b9c1b51eSKate Stone if (!process_sp) { 1259f7d1893fSAdrian McCarthy error.SetErrorString("SBProcess is invalid"); 1260f7d1893fSAdrian McCarthy return error; 1261f7d1893fSAdrian McCarthy } 1262f7d1893fSAdrian McCarthy 1263*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1264*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1265f7d1893fSAdrian McCarthy 1266*b9c1b51eSKate Stone if (process_sp->GetState() != eStateStopped) { 1267f7d1893fSAdrian McCarthy error.SetErrorString("the process is not stopped"); 1268f7d1893fSAdrian McCarthy return error; 1269f7d1893fSAdrian McCarthy } 1270f7d1893fSAdrian McCarthy 1271f7d1893fSAdrian McCarthy FileSpec core_file(file_name, false); 1272f7d1893fSAdrian McCarthy error.ref() = PluginManager::SaveCore(process_sp, core_file); 1273f7d1893fSAdrian McCarthy return error; 1274f7d1893fSAdrian McCarthy } 127526036843SHoward Hellyer 127626036843SHoward Hellyer lldb::SBError 1277*b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr, 1278*b9c1b51eSKate Stone SBMemoryRegionInfo &sb_region_info) { 127926036843SHoward Hellyer lldb::SBError sb_error; 128026036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1281*b9c1b51eSKate Stone MemoryRegionInfoSP region_info_sp = 1282*b9c1b51eSKate Stone std::make_shared<lldb_private::MemoryRegionInfo>(); 1283*b9c1b51eSKate Stone if (process_sp) { 128426036843SHoward Hellyer Process::StopLocker stop_locker; 1285*b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1286*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1287*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1288*b9c1b51eSKate Stone sb_error.ref() = 1289*b9c1b51eSKate Stone process_sp->GetMemoryRegionInfo(load_addr, *region_info_sp); 129026036843SHoward Hellyer if (sb_error.Success()) { 129126036843SHoward Hellyer sb_region_info.ref() = *region_info_sp; 129226036843SHoward Hellyer } 1293*b9c1b51eSKate Stone } else { 129426036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 129526036843SHoward Hellyer if (log) 1296*b9c1b51eSKate Stone log->Printf( 1297*b9c1b51eSKate Stone "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 129826036843SHoward Hellyer static_cast<void *>(process_sp.get())); 129926036843SHoward Hellyer sb_error.SetErrorString("process is running"); 130026036843SHoward Hellyer } 1301*b9c1b51eSKate Stone } else { 130226036843SHoward Hellyer sb_error.SetErrorString("SBProcess is invalid"); 130326036843SHoward Hellyer } 130426036843SHoward Hellyer return sb_error; 130526036843SHoward Hellyer } 130626036843SHoward Hellyer 1307*b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() { 130826036843SHoward Hellyer lldb::SBError sb_error; 130926036843SHoward Hellyer lldb::SBMemoryRegionInfoList sb_region_list; 131026036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1311*b9c1b51eSKate Stone if (process_sp) { 131226036843SHoward Hellyer Process::StopLocker stop_locker; 1313*b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1314*b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1315*b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 131626036843SHoward Hellyer std::vector<MemoryRegionInfoSP> region_list; 131726036843SHoward Hellyer sb_error.ref() = process_sp->GetMemoryRegions(region_list); 131826036843SHoward Hellyer if (sb_error.Success()) { 131926036843SHoward Hellyer std::vector<MemoryRegionInfoSP>::iterator end = region_list.end(); 1320*b9c1b51eSKate Stone for (std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin(); 1321*b9c1b51eSKate Stone it != end; it++) { 132226036843SHoward Hellyer SBMemoryRegionInfo sb_region_info(it->get()); 132326036843SHoward Hellyer sb_region_list.Append(sb_region_info); 132426036843SHoward Hellyer } 132526036843SHoward Hellyer } 1326*b9c1b51eSKate Stone } else { 132726036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 132826036843SHoward Hellyer if (log) 1329*b9c1b51eSKate Stone log->Printf( 1330*b9c1b51eSKate Stone "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 133126036843SHoward Hellyer static_cast<void *>(process_sp.get())); 133226036843SHoward Hellyer sb_error.SetErrorString("process is running"); 133326036843SHoward Hellyer } 1334*b9c1b51eSKate Stone } else { 133526036843SHoward Hellyer sb_error.SetErrorString("SBProcess is invalid"); 133626036843SHoward Hellyer } 133726036843SHoward Hellyer return sb_region_list; 133826036843SHoward Hellyer } 1339