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" 191f746071SGreg Clayton #include "lldb/Core/Module.h" 20f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h" 2130fdc8d8SChris Lattner #include "lldb/Core/State.h" 2230fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 23b9c1b51eSKate Stone #include "lldb/Interpreter/Args.h" 2426036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h" 2530fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2630fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 278c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h" 286611103cSGreg Clayton #include "lldb/Target/Target.h" 296611103cSGreg Clayton #include "lldb/Target/Thread.h" 30*6f9e6901SZachary Turner #include "lldb/Utility/Log.h" 31bf9a7730SZachary Turner #include "lldb/Utility/Stream.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" 42b9c1b51eSKate Stone #include "lldb/API/SBStream.h" 43b9c1b51eSKate 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 52b9c1b51eSKate Stone SBProcess::SBProcess() : m_opaque_wp() {} 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner //---------------------------------------------------------------------- 5530fdc8d8SChris Lattner // SBProcess constructor 5630fdc8d8SChris Lattner //---------------------------------------------------------------------- 5730fdc8d8SChris Lattner 58b9c1b51eSKate Stone SBProcess::SBProcess(const SBProcess &rhs) : m_opaque_wp(rhs.m_opaque_wp) {} 5930fdc8d8SChris Lattner 60b9c1b51eSKate Stone SBProcess::SBProcess(const lldb::ProcessSP &process_sp) 61b9c1b51eSKate Stone : m_opaque_wp(process_sp) {} 6230fdc8d8SChris Lattner 63b9c1b51eSKate 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 //---------------------------------------------------------------------- 72b9c1b51eSKate Stone SBProcess::~SBProcess() {} 7330fdc8d8SChris Lattner 74b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClassName() { 754bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 764bddaeb5SJim Ingham } 774bddaeb5SJim Ingham 78b9c1b51eSKate Stone const char *SBProcess::GetPluginName() { 79d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 80b9c1b51eSKate Stone if (process_sp) { 8157abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 82d7b30ef9SJim Ingham } 83d7b30ef9SJim Ingham return "<Unknown>"; 84d7b30ef9SJim Ingham } 85d7b30ef9SJim Ingham 86b9c1b51eSKate Stone const char *SBProcess::GetShortPluginName() { 87d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 88b9c1b51eSKate Stone if (process_sp) { 8957abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 90d7b30ef9SJim Ingham } 91d7b30ef9SJim Ingham return "<Unknown>"; 92d7b30ef9SJim Ingham } 93d7b30ef9SJim Ingham 94b9c1b51eSKate Stone lldb::ProcessSP SBProcess::GetSP() const { return m_opaque_wp.lock(); } 95d7b30ef9SJim Ingham 96b9c1b51eSKate Stone void SBProcess::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; } 97b9556accSGreg Clayton 98b9c1b51eSKate Stone void SBProcess::Clear() { m_opaque_wp.reset(); } 9930fdc8d8SChris Lattner 100b9c1b51eSKate 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 105b9c1b51eSKate Stone bool SBProcess::RemoteLaunch(char const **argv, char const **envp, 106b9c1b51eSKate Stone const char *stdin_path, const char *stdout_path, 1079631aae2SJames McIlree const char *stderr_path, 1089631aae2SJames McIlree const char *working_directory, 109b9c1b51eSKate Stone uint32_t launch_flags, bool stop_at_entry, 110b9c1b51eSKate Stone lldb::SBError &error) { 1115160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 112324a1036SSaleem Abdulrasool if (log) 113b9c1b51eSKate Stone log->Printf("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, " 114b9c1b51eSKate Stone "stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, " 115b9c1b51eSKate 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", 121b9c1b51eSKate Stone working_directory ? working_directory : "NULL", launch_flags, 122b9c1b51eSKate Stone stop_at_entry, static_cast<void *>(error.get())); 1239631aae2SJames McIlree 124acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 125b9c1b51eSKate Stone if (process_sp) { 126b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 127b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 128b9c1b51eSKate Stone if (process_sp->GetState() == eStateConnected) { 129982c9762SGreg Clayton if (stop_at_entry) 130982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 131b9c1b51eSKate Stone ProcessLaunchInfo launch_info( 132b9c1b51eSKate Stone FileSpec{stdin_path, false}, FileSpec{stdout_path, false}, 133b9c1b51eSKate 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)); 143b9c1b51eSKate Stone } else { 1449631aae2SJames McIlree error.SetErrorString("must be in eStateConnected to call RemoteLaunch"); 1459631aae2SJames McIlree } 146b9c1b51eSKate 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 161b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid, 162b9c1b51eSKate Stone lldb::SBError &error) { 163acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 164b9c1b51eSKate Stone if (process_sp) { 165b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 166b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 167b9c1b51eSKate 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)); 171b9c1b51eSKate Stone } else { 172b9c1b51eSKate Stone error.SetErrorString( 173b9c1b51eSKate Stone "must be in eStateConnected to call RemoteAttachToProcessWithID"); 1749631aae2SJames McIlree } 175b9c1b51eSKate 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); 183b9c1b51eSKate Stone log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 184b9c1b51eSKate 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 192b9c1b51eSKate 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()); 197b9c1b51eSKate Stone if (process_sp) { 1987fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1997fdf9ef1SGreg Clayton 2007fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 201b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 202b9c1b51eSKate 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 213b9c1b51eSKate 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()); 219b9c1b51eSKate Stone if (process_sp) { 220b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 221b9c1b51eSKate 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 234b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid, 235b9c1b51eSKate 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()); 241b9c1b51eSKate Stone if (process_sp) { 242b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 243b9c1b51eSKate 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) 249b9c1b51eSKate Stone log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 250b9c1b51eSKate 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 257b9c1b51eSKate 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()); 263b9c1b51eSKate 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 276b9c1b51eSKate 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()); 281b9c1b51eSKate 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) 287b9c1b51eSKate Stone log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 288b9c1b51eSKate Stone ") => %" PRIu64, 289324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), src, 290b9c1b51eSKate Stone static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val)); 291ceb6b139SCaroline Tice 292ceb6b139SCaroline Tice return ret_val; 29330fdc8d8SChris Lattner } 29430fdc8d8SChris Lattner 295b9c1b51eSKate 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()); 298b9c1b51eSKate 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) 305b9c1b51eSKate Stone log->Printf( 306b9c1b51eSKate Stone "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 307b9c1b51eSKate Stone ") => %" PRIu64, 308b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 309b9c1b51eSKate 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 314b9c1b51eSKate 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()); 317b9c1b51eSKate 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) 324b9c1b51eSKate Stone log->Printf( 325b9c1b51eSKate Stone "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 326b9c1b51eSKate Stone ") => %" PRIu64, 327b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 328b9c1b51eSKate 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 333b9c1b51eSKate 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()); 336b9c1b51eSKate 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) 343b9c1b51eSKate Stone log->Printf( 344b9c1b51eSKate Stone "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 345b9c1b51eSKate Stone ") => %" PRIu64, 346b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 347b9c1b51eSKate 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 352b9c1b51eSKate 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()); 357b9c1b51eSKate Stone if (process_sp) { 35830fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 35930fdc8d8SChris Lattner char message[1024]; 360b9c1b51eSKate Stone int message_len = ::snprintf( 361b9c1b51eSKate Stone message, sizeof(message), "Process %" PRIu64 " %s\n", 362b9c1b51eSKate 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 369b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event, 370b9c1b51eSKate Stone SBCommandReturnObject &result) { 371acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 372b9c1b51eSKate Stone if (process_sp) { 37330fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 37430fdc8d8SChris Lattner char message[1024]; 375b9c1b51eSKate Stone ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n", 376b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 37730fdc8d8SChris Lattner 37830fdc8d8SChris Lattner result.AppendMessage(message); 37930fdc8d8SChris Lattner } 38030fdc8d8SChris Lattner } 38130fdc8d8SChris Lattner 382b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) { 383acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 384b9c1b51eSKate Stone if (process_sp) { 385b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 386b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 387b9c1b51eSKate Stone return process_sp->GetThreadList().SetSelectedThreadByID( 388b9c1b51eSKate Stone thread.GetThreadID()); 389af67cecdSGreg Clayton } 39030fdc8d8SChris Lattner return false; 39130fdc8d8SChris Lattner } 39230fdc8d8SChris Lattner 393b9c1b51eSKate 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()); 398b9c1b51eSKate Stone if (process_sp) { 399b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 400b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 401acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid); 402af67cecdSGreg Clayton } 403ceb6b139SCaroline Tice 404ceb6b139SCaroline Tice if (log) 405b9c1b51eSKate Stone log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 406b9c1b51eSKate 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 413b9c1b51eSKate 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()); 418b9c1b51eSKate Stone if (process_sp) { 419b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 420b9c1b51eSKate 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 432b9c1b51eSKate 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()); 438b9c1b51eSKate Stone if (process_sp) { 4397fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4407fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 441b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 442b9c1b51eSKate 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 456b9c1b51eSKate 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()); 461b9c1b51eSKate Stone if (process_sp) { 4625e8dce4dSJason Molenda Process::StopLocker stop_locker; 463b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 464b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 465b9c1b51eSKate 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 477b9c1b51eSKate 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()); 483b9c1b51eSKate Stone if (process_sp) { 4845e8dce4dSJason Molenda Process::StopLocker stop_locker; 485b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 486b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 487b9c1b51eSKate 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 502b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) { 503bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 504b9c1b51eSKate Stone if (process_sp) { 505b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 506b9c1b51eSKate 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 515b9c1b51eSKate 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()); 521b9c1b51eSKate Stone if (process_sp) { 522b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 523b9c1b51eSKate 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) 529b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 530b9c1b51eSKate Stone ") => SBEvent(%p)", 531b9c1b51eSKate 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 537b9c1b51eSKate Stone StateType SBProcess::GetState() { 538ceb6b139SCaroline Tice 539ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 540acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 541b9c1b51eSKate Stone if (process_sp) { 542b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 543b9c1b51eSKate 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 556b9c1b51eSKate Stone int SBProcess::GetExitStatus() { 5574838131bSGreg Clayton int exit_status = 0; 558acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 559b9c1b51eSKate Stone if (process_sp) { 560b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 561b9c1b51eSKate 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 573b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() { 5744838131bSGreg Clayton const char *exit_desc = NULL; 575acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 576b9c1b51eSKate Stone if (process_sp) { 577b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 578b9c1b51eSKate 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 588b9c1b51eSKate 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 602b9c1b51eSKate 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 614b9c1b51eSKate 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 628b9c1b51eSKate 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 642b9c1b51eSKate 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 652b9c1b51eSKate Stone if (process_sp) { 653b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 654b9c1b51eSKate 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); 660b9c1b51eSKate Stone } else 66130fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 66230fdc8d8SChris Lattner 663b9c1b51eSKate 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 674b9c1b51eSKate Stone SBError SBProcess::Destroy() { 67530fdc8d8SChris Lattner SBError sb_error; 676acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 677b9c1b51eSKate Stone if (process_sp) { 678b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 679b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 680ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 681b9c1b51eSKate Stone } else 68230fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 68330fdc8d8SChris Lattner 6845160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 685b9c1b51eSKate 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 696b9c1b51eSKate Stone SBError SBProcess::Stop() { 69730fdc8d8SChris Lattner SBError sb_error; 698acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 699b9c1b51eSKate Stone if (process_sp) { 700b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 701b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 702acdbe816SGreg Clayton sb_error.SetError(process_sp->Halt()); 703b9c1b51eSKate Stone } else 70430fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 705ceb6b139SCaroline Tice 7065160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 707b9c1b51eSKate 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 718b9c1b51eSKate Stone SBError SBProcess::Kill() { 71930fdc8d8SChris Lattner SBError sb_error; 720acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 721b9c1b51eSKate Stone if (process_sp) { 722b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 723b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 724ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(true)); 725b9c1b51eSKate Stone } else 72630fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 727ceb6b139SCaroline Tice 7285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 729b9c1b51eSKate 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 740b9c1b51eSKate 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 746b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) { 74730fdc8d8SChris Lattner SBError sb_error; 748acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 749b9c1b51eSKate Stone if (process_sp) { 750b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 751b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 752acff8950SJim Ingham sb_error.SetError(process_sp->Detach(keep_stopped)); 753b9c1b51eSKate Stone } else 75430fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 75530fdc8d8SChris Lattner 75630fdc8d8SChris Lattner return sb_error; 75730fdc8d8SChris Lattner } 75830fdc8d8SChris Lattner 759b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) { 76030fdc8d8SChris Lattner SBError sb_error; 761acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 762b9c1b51eSKate Stone if (process_sp) { 763b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 764b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 765acdbe816SGreg Clayton sb_error.SetError(process_sp->Signal(signo)); 766b9c1b51eSKate Stone } else 76730fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 7685160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 769b9c1b51eSKate 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 779b9c1b51eSKate 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 786b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() { 787cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 788b9c1b51eSKate Stone if (process_sp) { 789cfc0935eSJim Ingham process_sp->SendAsyncInterrupt(); 790cfc0935eSJim Ingham } 791cfc0935eSJim Ingham } 792cfc0935eSJim Ingham 793b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) { 7944838131bSGreg Clayton SBThread sb_thread; 79517a6ad05SGreg Clayton ThreadSP thread_sp; 796acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 797b9c1b51eSKate Stone if (process_sp) { 7987fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7997fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 800b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 801b9c1b51eSKate 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) 808b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 809b9c1b51eSKate 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 816b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) { 81718b46896SJim Ingham SBThread sb_thread; 81818b46896SJim Ingham ThreadSP thread_sp; 81918b46896SJim Ingham ProcessSP process_sp(GetSP()); 820b9c1b51eSKate Stone if (process_sp) { 82118b46896SJim Ingham Process::StopLocker stop_locker; 82218b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 823b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 824b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 825b9c1b51eSKate Stone thread_sp = 826b9c1b51eSKate 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 839b9c1b51eSKate 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 852b9c1b51eSKate 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 864b9c1b51eSKate 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 * 869b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event, 870b9c1b51eSKate Stone size_t idx) { 8710161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 8720161b49cSJim Ingham } 8730161b49cSJim Ingham 874b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) { 87575930019STodd Fiala ProcessSP process_sp = 87675930019STodd Fiala Process::ProcessEventData::GetProcessFromEvent(event.get()); 877b9c1b51eSKate 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 886b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) { 88706d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 88806d2855fSIlia K } 88906d2855fSIlia K 89075930019STodd Fiala lldb::SBStructuredData 891b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) { 89275930019STodd Fiala return SBStructuredData(event.GetSP()); 89375930019STodd Fiala } 89475930019STodd Fiala 895b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) { 89675930019STodd Fiala return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) && 89775930019STodd Fiala !EventIsStructuredDataEvent(event); 89875930019STodd Fiala } 89975930019STodd Fiala 900b9c1b51eSKate 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; 903b9c1b51eSKate Stone return event_data && (event_data->GetFlavor() == 904b9c1b51eSKate Stone EventDataStructuredData::GetFlavorString()); 905e6bc6cb9SJim Ingham } 90630fdc8d8SChris Lattner 907b9c1b51eSKate 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 922b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() { 9234bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 9244bddaeb5SJim Ingham } 9254bddaeb5SJim Ingham 926b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len, 927b9c1b51eSKate 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) 935b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 936b9c1b51eSKate 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 941b9c1b51eSKate Stone if (process_sp) { 9427fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 943b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 944b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 945b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 9467fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref()); 947b9c1b51eSKate 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 } 953b9c1b51eSKate Stone } else { 95430fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 95530fdc8d8SChris Lattner } 95630fdc8d8SChris Lattner 957b9c1b51eSKate Stone if (log) { 95893aa84e8SGreg Clayton SBStream sstr; 95993aa84e8SGreg Clayton sb_error.GetDescription(sstr); 960b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 961b9c1b51eSKate 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 971b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size, 972b9c1b51eSKate Stone lldb::SBError &sb_error) { 973e91b7957SGreg Clayton size_t bytes_read = 0; 974acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 975b9c1b51eSKate Stone if (process_sp) { 9767fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 977b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 978b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 979b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 980b9c1b51eSKate Stone bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size, 981b9c1b51eSKate Stone sb_error.ref()); 982b9c1b51eSKate Stone } else { 9835160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 984c9858e4dSGreg Clayton if (log) 985b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process " 986b9c1b51eSKate Stone "is running", 987324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 9887fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9897fdf9ef1SGreg Clayton } 990b9c1b51eSKate Stone } else { 991e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 992e91b7957SGreg Clayton } 993e91b7957SGreg Clayton return bytes_read; 994e91b7957SGreg Clayton } 995e91b7957SGreg Clayton 996b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size, 997b9c1b51eSKate Stone lldb::SBError &sb_error) { 9987fdf9ef1SGreg Clayton uint64_t value = 0; 999acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1000b9c1b51eSKate Stone if (process_sp) { 10017fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1002b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1003b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1004b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1005b9c1b51eSKate Stone value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0, 1006b9c1b51eSKate Stone sb_error.ref()); 1007b9c1b51eSKate Stone } else { 10085160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1009c9858e4dSGreg Clayton if (log) 1010b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process " 1011b9c1b51eSKate Stone "is running", 1012324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10137fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10147fdf9ef1SGreg Clayton } 1015b9c1b51eSKate Stone } else { 1016e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1017e91b7957SGreg Clayton } 10187fdf9ef1SGreg Clayton return value; 1019e91b7957SGreg Clayton } 1020e91b7957SGreg Clayton 1021b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr, 1022b9c1b51eSKate Stone lldb::SBError &sb_error) { 1023e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1024acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1025b9c1b51eSKate Stone if (process_sp) { 10267fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1027b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1028b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1029b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 10307fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref()); 1031b9c1b51eSKate Stone } else { 10325160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1033c9858e4dSGreg Clayton if (log) 1034b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process " 1035b9c1b51eSKate Stone "is running", 1036324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10377fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10387fdf9ef1SGreg Clayton } 1039b9c1b51eSKate Stone } else { 1040e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1041e91b7957SGreg Clayton } 1042e91b7957SGreg Clayton return ptr; 1043e91b7957SGreg Clayton } 1044e91b7957SGreg Clayton 1045b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len, 1046b9c1b51eSKate 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) 1054b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1055b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1056324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1057b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1058324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 10594838131bSGreg Clayton 1060b9c1b51eSKate Stone if (process_sp) { 10617fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1062b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1063b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1064b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1065b9c1b51eSKate Stone bytes_written = 1066b9c1b51eSKate Stone process_sp->WriteMemory(addr, src, src_len, sb_error.ref()); 1067b9c1b51eSKate 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 1075b9c1b51eSKate Stone if (log) { 10764838131bSGreg Clayton SBStream sstr; 10774838131bSGreg Clayton sb_error.GetDescription(sstr); 1078b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1079b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1080324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1081b9c1b51eSKate 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 1089b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) { 1090da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1091da7bc7d0SGreg Clayton 1092acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1093b9c1b51eSKate 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", 1102b9c1b51eSKate Stone process_sp->GetID(), lldb_private::StateAsCString(GetState()), 1103b9c1b51eSKate Stone GetNumThreads(), exe_name ? ", executable = " : "", 11041d273166SGreg Clayton exe_name ? exe_name : ""); 1105b9c1b51eSKate Stone } else 1106da7bc7d0SGreg Clayton strm.PutCString("No value"); 1107dde9cff3SCaroline Tice 1108dde9cff3SCaroline Tice return true; 1109dde9cff3SCaroline Tice } 11108f343b09SGreg Clayton 11118f343b09SGreg Clayton uint32_t 1112b9c1b51eSKate 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()); 1117b9c1b51eSKate Stone if (process_sp) { 1118b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1119b9c1b51eSKate 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); 1124b9c1b51eSKate Stone } else { 1125f9ef60d2SJohnny Chen sb_error.SetErrorString("SBProcess is invalid"); 1126f9ef60d2SJohnny Chen } 1127f9ef60d2SJohnny Chen return num; 1128f9ef60d2SJohnny Chen } 1129f9ef60d2SJohnny Chen 1130b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec, 1131b9c1b51eSKate Stone lldb::SBError &sb_error) { 11324fbd67acSTamas Berghammer return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); 11334fbd67acSTamas Berghammer } 11344fbd67acSTamas Berghammer 1135b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec, 11364fbd67acSTamas Berghammer const lldb::SBFileSpec &sb_remote_image_spec, 1137b9c1b51eSKate Stone lldb::SBError &sb_error) { 1138acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1139b9c1b51eSKate Stone if (process_sp) { 11407fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1141b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1142b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1143b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 11443cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1145b9c1b51eSKate Stone return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec, 1146b9c1b51eSKate Stone *sb_remote_image_spec, sb_error.ref()); 1147b9c1b51eSKate 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 1158b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) { 11598f343b09SGreg Clayton lldb::SBError sb_error; 1160acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1161b9c1b51eSKate Stone if (process_sp) { 11627fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1163b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1164b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1165b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 11663cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1167b9c1b51eSKate Stone sb_error.SetError( 1168b9c1b51eSKate Stone platform_sp->UnloadImage(process_sp.get(), image_token)); 1169b9c1b51eSKate 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 } 1176b9c1b51eSKate Stone } else 11778f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 11788f343b09SGreg Clayton return sb_error; 11798f343b09SGreg Clayton } 11808c71337aSJason Molenda 1181b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) { 1182a332978bSJason Molenda lldb::SBError sb_error; 1183a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1184b9c1b51eSKate Stone if (process_sp) { 1185a332978bSJason Molenda Process::StopLocker stop_locker; 1186b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1187b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1188b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1189a332978bSJason Molenda sb_error.SetError(process_sp->SendEventData(event_data)); 1190b9c1b51eSKate Stone } else { 1191a332978bSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1192a332978bSJason Molenda if (log) 1193b9c1b51eSKate Stone log->Printf( 1194b9c1b51eSKate 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 } 1198b9c1b51eSKate Stone } else 1199a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1200a332978bSJason Molenda return sb_error; 1201a332978bSJason Molenda } 1202a332978bSJason Molenda 1203b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() { 12048c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1205b9c1b51eSKate 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 1212b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) { 12138c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1214b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 12158c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1216b9c1b51eSKate Stone const std::vector<ConstString> &names = 1217b9c1b51eSKate Stone runtime->GetExtendedBacktraceTypes(); 1218b9c1b51eSKate Stone if (idx < names.size()) { 12198c71337aSJason Molenda return names[idx].AsCString(); 1220b9c1b51eSKate Stone } else { 12218c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 12228c71337aSJason Molenda if (log) 1223b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => " 1224b9c1b51eSKate 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 1231b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) { 1232a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1233a51ea382SKuba Brecka SBThreadCollection threads; 1234b9c1b51eSKate Stone if (process_sp) { 1235a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1236a51ea382SKuba Brecka } 1237a51ea382SKuba Brecka return threads; 1238a51ea382SKuba Brecka } 123963927548SKuba Brecka 1240b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent( 1241b9c1b51eSKate Stone InstrumentationRuntimeType type) { 124263927548SKuba Brecka ProcessSP process_sp(GetSP()); 124363927548SKuba Brecka if (!process_sp) 124463927548SKuba Brecka return false; 124563927548SKuba Brecka 1246b9c1b51eSKate Stone InstrumentationRuntimeSP runtime_sp = 1247b9c1b51eSKate 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 1255b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) { 1256f7d1893fSAdrian McCarthy lldb::SBError error; 1257f7d1893fSAdrian McCarthy ProcessSP process_sp(GetSP()); 1258b9c1b51eSKate Stone if (!process_sp) { 1259f7d1893fSAdrian McCarthy error.SetErrorString("SBProcess is invalid"); 1260f7d1893fSAdrian McCarthy return error; 1261f7d1893fSAdrian McCarthy } 1262f7d1893fSAdrian McCarthy 1263b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1264b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1265f7d1893fSAdrian McCarthy 1266b9c1b51eSKate 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 1277b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr, 1278b9c1b51eSKate Stone SBMemoryRegionInfo &sb_region_info) { 127926036843SHoward Hellyer lldb::SBError sb_error; 128026036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1281b9c1b51eSKate Stone MemoryRegionInfoSP region_info_sp = 1282b9c1b51eSKate Stone std::make_shared<lldb_private::MemoryRegionInfo>(); 1283b9c1b51eSKate Stone if (process_sp) { 128426036843SHoward Hellyer Process::StopLocker stop_locker; 1285b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1286b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1287b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1288b9c1b51eSKate Stone sb_error.ref() = 1289b9c1b51eSKate 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 } 1293b9c1b51eSKate Stone } else { 129426036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 129526036843SHoward Hellyer if (log) 1296b9c1b51eSKate Stone log->Printf( 1297b9c1b51eSKate 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 } 1301b9c1b51eSKate Stone } else { 130226036843SHoward Hellyer sb_error.SetErrorString("SBProcess is invalid"); 130326036843SHoward Hellyer } 130426036843SHoward Hellyer return sb_error; 130526036843SHoward Hellyer } 130626036843SHoward Hellyer 1307b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() { 130826036843SHoward Hellyer lldb::SBError sb_error; 130926036843SHoward Hellyer lldb::SBMemoryRegionInfoList sb_region_list; 131026036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1311b9c1b51eSKate Stone if (process_sp) { 131226036843SHoward Hellyer Process::StopLocker stop_locker; 1313b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1314b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1315b9c1b51eSKate 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(); 1320b9c1b51eSKate Stone for (std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin(); 1321b9c1b51eSKate 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 } 1326b9c1b51eSKate Stone } else { 132726036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 132826036843SHoward Hellyer if (log) 1329b9c1b51eSKate Stone log->Printf( 1330b9c1b51eSKate 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 } 1334b9c1b51eSKate Stone } else { 133526036843SHoward Hellyer sb_error.SetErrorString("SBProcess is invalid"); 133626036843SHoward Hellyer } 133726036843SHoward Hellyer return sb_region_list; 133826036843SHoward Hellyer } 1339