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 #include <inttypes.h> 13bdae3787SVirgile Bello 1430fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner 175d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 181f746071SGreg Clayton #include "lldb/Core/Module.h" 19f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h" 2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2126036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h" 2230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 248c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h" 256611103cSGreg Clayton #include "lldb/Target/Target.h" 266611103cSGreg Clayton #include "lldb/Target/Thread.h" 27145d95c9SPavel Labath #include "lldb/Utility/Args.h" 286f9e6901SZachary Turner #include "lldb/Utility/Log.h" 29d821c997SPavel Labath #include "lldb/Utility/State.h" 30bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner 334c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 344c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 350e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 364c5de699SEli Friedman #include "lldb/API/SBEvent.h" 370e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 3826036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfo.h" 3926036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfoList.h" 40b9c1b51eSKate Stone #include "lldb/API/SBStream.h" 41b9c1b51eSKate Stone #include "lldb/API/SBStringList.h" 4275930019STodd Fiala #include "lldb/API/SBStructuredData.h" 434c5de699SEli Friedman #include "lldb/API/SBThread.h" 44a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h" 45d5d8d91cSRavitheja Addepally #include "lldb/API/SBTrace.h" 46d5d8d91cSRavitheja Addepally #include "lldb/API/SBTraceOptions.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; 1318f3be7a3SJonas Devlieghere ProcessLaunchInfo launch_info(FileSpec(stdin_path), FileSpec(stdout_path), 1328f3be7a3SJonas Devlieghere FileSpec(stderr_path), 1338f3be7a3SJonas Devlieghere FileSpec(working_directory), launch_flags); 134acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 135982c9762SGreg Clayton if (exe_module) 13614715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 137982c9762SGreg Clayton if (argv) 138982c9762SGreg Clayton launch_info.GetArguments().AppendArguments(argv); 139982c9762SGreg Clayton if (envp) 14062930e57SPavel Labath launch_info.GetEnvironment() = Environment(envp); 141acdbe816SGreg Clayton error.SetError(process_sp->Launch(launch_info)); 142b9c1b51eSKate Stone } else { 1439631aae2SJames McIlree error.SetErrorString("must be in eStateConnected to call RemoteLaunch"); 1449631aae2SJames McIlree } 145b9c1b51eSKate Stone } else { 1469631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 1479631aae2SJames McIlree } 1489631aae2SJames McIlree 1499631aae2SJames McIlree if (log) { 1509631aae2SJames McIlree SBStream sstr; 1519631aae2SJames McIlree error.GetDescription(sstr); 152324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", 153324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 154324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), sstr.GetData()); 1559631aae2SJames McIlree } 1569631aae2SJames McIlree 1579631aae2SJames McIlree return error.Success(); 1589631aae2SJames McIlree } 1599631aae2SJames McIlree 160b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid, 161b9c1b51eSKate Stone lldb::SBError &error) { 162acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 163b9c1b51eSKate Stone if (process_sp) { 164b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 165b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 166b9c1b51eSKate Stone if (process_sp->GetState() == eStateConnected) { 167144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 168144f3a9cSGreg Clayton attach_info.SetProcessID(pid); 169acdbe816SGreg Clayton error.SetError(process_sp->Attach(attach_info)); 170b9c1b51eSKate Stone } else { 171b9c1b51eSKate Stone error.SetErrorString( 172b9c1b51eSKate Stone "must be in eStateConnected to call RemoteAttachToProcessWithID"); 1739631aae2SJames McIlree } 174b9c1b51eSKate Stone } else { 1759631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 1769631aae2SJames McIlree } 1779631aae2SJames McIlree 1785160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1799631aae2SJames McIlree if (log) { 1809631aae2SJames McIlree SBStream sstr; 1819631aae2SJames McIlree error.GetDescription(sstr); 182b9c1b51eSKate Stone log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 183b9c1b51eSKate Stone ") => SBError (%p): %s", 184324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), pid, 185324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), sstr.GetData()); 1869631aae2SJames McIlree } 1879631aae2SJames McIlree 1889631aae2SJames McIlree return error.Success(); 1899631aae2SJames McIlree } 1909631aae2SJames McIlree 191b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() { 1925160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 193ceb6b139SCaroline Tice 194ceb6b139SCaroline Tice uint32_t num_threads = 0; 195acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 196b9c1b51eSKate Stone if (process_sp) { 1977fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1987fdf9ef1SGreg Clayton 1997fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 200b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 201b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 202acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 20330fdc8d8SChris Lattner } 204ceb6b139SCaroline Tice 205ceb6b139SCaroline Tice if (log) 206324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetNumThreads () => %d", 207324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num_threads); 208ceb6b139SCaroline Tice 209ceb6b139SCaroline Tice return num_threads; 21030fdc8d8SChris Lattner } 21130fdc8d8SChris Lattner 212b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const { 2135160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 214ceb6b139SCaroline Tice 21530fdc8d8SChris Lattner SBThread sb_thread; 21617a6ad05SGreg Clayton ThreadSP thread_sp; 217acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 218b9c1b51eSKate Stone if (process_sp) { 219b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 220b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 221acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 22217a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 223af67cecdSGreg Clayton } 224ceb6b139SCaroline Tice 225ceb6b139SCaroline Tice if (log) 226324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", 227324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 228324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 229ceb6b139SCaroline Tice 23030fdc8d8SChris Lattner return sb_thread; 23130fdc8d8SChris Lattner } 23230fdc8d8SChris Lattner 233b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid, 234b9c1b51eSKate Stone lldb::addr_t context) { 2355160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 236a4d8747dSGreg Clayton 237a4d8747dSGreg Clayton SBThread sb_thread; 238a4d8747dSGreg Clayton ThreadSP thread_sp; 239a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 240b9c1b51eSKate Stone if (process_sp) { 241b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 242b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 243a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 244a4d8747dSGreg Clayton sb_thread.SetThread(thread_sp); 245a4d8747dSGreg Clayton } 246a4d8747dSGreg Clayton 247a4d8747dSGreg Clayton if (log) 248b9c1b51eSKate Stone log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 249b9c1b51eSKate Stone ", context=0x%" PRIx64 ") => SBThread(%p)", 250324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, context, 251324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 252a4d8747dSGreg Clayton 253a4d8747dSGreg Clayton return sb_thread; 254a4d8747dSGreg Clayton } 255a4d8747dSGreg Clayton 256b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const { 2575160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 258ceb6b139SCaroline Tice 25930fdc8d8SChris Lattner SBTarget sb_target; 260b9556accSGreg Clayton TargetSP target_sp; 261acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 262b9c1b51eSKate Stone if (process_sp) { 263acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 264b9556accSGreg Clayton sb_target.SetSP(target_sp); 265b9556accSGreg Clayton } 266ceb6b139SCaroline Tice 267ceb6b139SCaroline Tice if (log) 268324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)", 269324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 270324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get())); 271ceb6b139SCaroline Tice 27230fdc8d8SChris Lattner return sb_target; 27330fdc8d8SChris Lattner } 27430fdc8d8SChris Lattner 275b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) { 2765160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 277ceb6b139SCaroline Tice 278ceb6b139SCaroline Tice size_t ret_val = 0; 279acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 280b9c1b51eSKate Stone if (process_sp) { 28197206d57SZachary Turner Status error; 282acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN(src, src_len, error); 28330fdc8d8SChris Lattner } 284ceb6b139SCaroline Tice 285ceb6b139SCaroline Tice if (log) 286b9c1b51eSKate Stone log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 287b9c1b51eSKate Stone ") => %" PRIu64, 288324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), src, 289b9c1b51eSKate Stone static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val)); 290ceb6b139SCaroline Tice 291ceb6b139SCaroline Tice return ret_val; 29230fdc8d8SChris Lattner } 29330fdc8d8SChris Lattner 294b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const { 295cfd1acedSGreg Clayton size_t bytes_read = 0; 296acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 297b9c1b51eSKate Stone if (process_sp) { 29897206d57SZachary Turner Status error; 299acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT(dst, dst_len, error); 30030fdc8d8SChris Lattner } 301ceb6b139SCaroline Tice 3025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 303ceb6b139SCaroline Tice if (log) 304b9c1b51eSKate Stone log->Printf( 305b9c1b51eSKate Stone "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 306b9c1b51eSKate Stone ") => %" PRIu64, 307b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 308b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 309ceb6b139SCaroline Tice 310cfd1acedSGreg Clayton return bytes_read; 31130fdc8d8SChris Lattner } 31230fdc8d8SChris Lattner 313b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const { 314cfd1acedSGreg Clayton size_t bytes_read = 0; 315acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 316b9c1b51eSKate Stone if (process_sp) { 31797206d57SZachary Turner Status error; 318acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR(dst, dst_len, error); 31930fdc8d8SChris Lattner } 320ceb6b139SCaroline Tice 3215160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 322ceb6b139SCaroline Tice if (log) 323b9c1b51eSKate Stone log->Printf( 324b9c1b51eSKate Stone "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 325b9c1b51eSKate Stone ") => %" PRIu64, 326b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 327b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 328ceb6b139SCaroline Tice 329cfd1acedSGreg Clayton return bytes_read; 33030fdc8d8SChris Lattner } 33130fdc8d8SChris Lattner 332b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const { 333ab3b8b22SHan Ming Ong size_t bytes_read = 0; 334ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 335b9c1b51eSKate Stone if (process_sp) { 33697206d57SZachary Turner Status error; 337ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error); 338ab3b8b22SHan Ming Ong } 339ab3b8b22SHan Ming Ong 3405160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 341ab3b8b22SHan Ming Ong if (log) 342b9c1b51eSKate Stone log->Printf( 343b9c1b51eSKate Stone "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 344b9c1b51eSKate Stone ") => %" PRIu64, 345b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 346b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 347ab3b8b22SHan Ming Ong 348ab3b8b22SHan Ming Ong return bytes_read; 349ab3b8b22SHan Ming Ong } 350ab3b8b22SHan Ming Ong 351d5d8d91cSRavitheja Addepally lldb::SBTrace SBProcess::StartTrace(SBTraceOptions &options, 352d5d8d91cSRavitheja Addepally lldb::SBError &error) { 353d5d8d91cSRavitheja Addepally Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 354d5d8d91cSRavitheja Addepally ProcessSP process_sp(GetSP()); 355d5d8d91cSRavitheja Addepally error.Clear(); 356d5d8d91cSRavitheja Addepally SBTrace trace_instance; 357d5d8d91cSRavitheja Addepally trace_instance.SetSP(process_sp); 358d5d8d91cSRavitheja Addepally lldb::user_id_t uid = LLDB_INVALID_UID; 359d5d8d91cSRavitheja Addepally 360d5d8d91cSRavitheja Addepally if (!process_sp) { 361d5d8d91cSRavitheja Addepally error.SetErrorString("invalid process"); 362d5d8d91cSRavitheja Addepally } else { 363e714c4f5SRavitheja Addepally uid = process_sp->StartTrace(*(options.m_traceoptions_sp), error.ref()); 364d5d8d91cSRavitheja Addepally trace_instance.SetTraceUID(uid); 365e714c4f5SRavitheja Addepally LLDB_LOG(log, "SBProcess::returned uid - {0}", uid); 366d5d8d91cSRavitheja Addepally } 367d5d8d91cSRavitheja Addepally return trace_instance; 368d5d8d91cSRavitheja Addepally } 369d5d8d91cSRavitheja Addepally 370b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const { 37130fdc8d8SChris Lattner if (out == NULL) 37230fdc8d8SChris Lattner return; 37330fdc8d8SChris Lattner 374acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 375b9c1b51eSKate Stone if (process_sp) { 37630fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 37730fdc8d8SChris Lattner char message[1024]; 378b9c1b51eSKate Stone int message_len = ::snprintf( 379b9c1b51eSKate Stone message, sizeof(message), "Process %" PRIu64 " %s\n", 380b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 38130fdc8d8SChris Lattner 38230fdc8d8SChris Lattner if (message_len > 0) 38330fdc8d8SChris Lattner ::fwrite(message, 1, message_len, out); 38430fdc8d8SChris Lattner } 38530fdc8d8SChris Lattner } 38630fdc8d8SChris Lattner 387b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event, 388b9c1b51eSKate Stone SBCommandReturnObject &result) { 389acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 390b9c1b51eSKate Stone if (process_sp) { 39130fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 39230fdc8d8SChris Lattner char message[1024]; 393b9c1b51eSKate Stone ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n", 394b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 39530fdc8d8SChris Lattner 39630fdc8d8SChris Lattner result.AppendMessage(message); 39730fdc8d8SChris Lattner } 39830fdc8d8SChris Lattner } 39930fdc8d8SChris Lattner 400b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) { 401acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 402b9c1b51eSKate Stone if (process_sp) { 403b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 404b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 405b9c1b51eSKate Stone return process_sp->GetThreadList().SetSelectedThreadByID( 406b9c1b51eSKate Stone thread.GetThreadID()); 407af67cecdSGreg Clayton } 40830fdc8d8SChris Lattner return false; 40930fdc8d8SChris Lattner } 41030fdc8d8SChris Lattner 411b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) { 4125160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 413ceb6b139SCaroline Tice 414ceb6b139SCaroline Tice bool ret_val = false; 415acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 416b9c1b51eSKate Stone if (process_sp) { 417b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 418b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 419acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid); 420af67cecdSGreg Clayton } 421ceb6b139SCaroline Tice 422ceb6b139SCaroline Tice if (log) 423b9c1b51eSKate Stone log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 424b9c1b51eSKate Stone ") => %s", 425324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, 426324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 427ceb6b139SCaroline Tice 428ceb6b139SCaroline Tice return ret_val; 42930fdc8d8SChris Lattner } 43030fdc8d8SChris Lattner 431b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) { 4325160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 43318b46896SJim Ingham 43418b46896SJim Ingham bool ret_val = false; 43518b46896SJim Ingham ProcessSP process_sp(GetSP()); 436b9c1b51eSKate Stone if (process_sp) { 437b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 438b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 43918b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id); 44018b46896SJim Ingham } 44118b46896SJim Ingham 44218b46896SJim Ingham if (log) 44318b46896SJim Ingham log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 444324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), index_id, 445324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 44618b46896SJim Ingham 44718b46896SJim Ingham return ret_val; 44818b46896SJim Ingham } 44918b46896SJim Ingham 450b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) { 4515160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 452ceb6b139SCaroline Tice 45317a6ad05SGreg Clayton SBThread sb_thread; 45417a6ad05SGreg Clayton ThreadSP thread_sp; 455acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 456b9c1b51eSKate Stone if (process_sp) { 4577fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4587fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 459b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 460b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 4617fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 46217a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 463af67cecdSGreg Clayton } 464ceb6b139SCaroline Tice 465ceb6b139SCaroline Tice if (log) 46693aa84e8SGreg Clayton log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 467324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 468324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 469324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 470ceb6b139SCaroline Tice 47117a6ad05SGreg Clayton return sb_thread; 47230fdc8d8SChris Lattner } 47330fdc8d8SChris Lattner 474b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() { 4755e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4765e8dce4dSJason Molenda 4775e8dce4dSJason Molenda uint32_t num_queues = 0; 4785e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 479b9c1b51eSKate Stone if (process_sp) { 4805e8dce4dSJason Molenda Process::StopLocker stop_locker; 481b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 482b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 483b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 4845e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 4855e8dce4dSJason Molenda } 486a61d0a5bSGreg Clayton } 4875e8dce4dSJason Molenda 4885e8dce4dSJason Molenda if (log) 489324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetNumQueues () => %d", 490324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num_queues); 4915e8dce4dSJason Molenda 4925e8dce4dSJason Molenda return num_queues; 4935e8dce4dSJason Molenda } 4945e8dce4dSJason Molenda 495b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) { 4965e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4975e8dce4dSJason Molenda 4985e8dce4dSJason Molenda SBQueue sb_queue; 4995e8dce4dSJason Molenda QueueSP queue_sp; 5005e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 501b9c1b51eSKate Stone if (process_sp) { 5025e8dce4dSJason Molenda Process::StopLocker stop_locker; 503b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 504b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 505b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 5065e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 5075e8dce4dSJason Molenda sb_queue.SetQueue(queue_sp); 5085e8dce4dSJason Molenda } 509a61d0a5bSGreg Clayton } 5105e8dce4dSJason Molenda 5115e8dce4dSJason Molenda if (log) 5125e8dce4dSJason Molenda log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", 513324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 514324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 515324a1036SSaleem Abdulrasool static_cast<void *>(queue_sp.get())); 5165e8dce4dSJason Molenda 5175e8dce4dSJason Molenda return sb_queue; 5185e8dce4dSJason Molenda } 5195e8dce4dSJason Molenda 520b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) { 521bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 522b9c1b51eSKate Stone if (process_sp) { 523b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 524b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 525bf2956a2SJim Ingham if (include_expression_stops) 526bf2956a2SJim Ingham return process_sp->GetStopID(); 527bf2956a2SJim Ingham else 528bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 529bf2956a2SJim Ingham } 530bf2956a2SJim Ingham return 0; 531bf2956a2SJim Ingham } 532bf2956a2SJim Ingham 533b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) { 53438810f43SIlia K Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 53538810f43SIlia K 53638810f43SIlia K SBEvent sb_event; 53738810f43SIlia K EventSP event_sp; 53838810f43SIlia K ProcessSP process_sp(GetSP()); 539b9c1b51eSKate Stone if (process_sp) { 540b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 541b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 54238810f43SIlia K event_sp = process_sp->GetStopEventForStopID(stop_id); 54338810f43SIlia K sb_event.reset(event_sp); 54438810f43SIlia K } 54538810f43SIlia K 54638810f43SIlia K if (log) 547b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 548b9c1b51eSKate Stone ") => SBEvent(%p)", 549b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), stop_id, 55038810f43SIlia K static_cast<void *>(event_sp.get())); 55138810f43SIlia K 55238810f43SIlia K return sb_event; 55338810f43SIlia K } 55438810f43SIlia K 555b9c1b51eSKate Stone StateType SBProcess::GetState() { 556ceb6b139SCaroline Tice 557ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 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 ret_val = process_sp->GetState(); 563af67cecdSGreg Clayton } 564ceb6b139SCaroline Tice 5655160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 566ceb6b139SCaroline Tice if (log) 567cfd1acedSGreg Clayton log->Printf("SBProcess(%p)::GetState () => %s", 568324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 569750cd175SCaroline Tice lldb_private::StateAsCString(ret_val)); 570ceb6b139SCaroline Tice 571ceb6b139SCaroline Tice return ret_val; 57230fdc8d8SChris Lattner } 57330fdc8d8SChris Lattner 574b9c1b51eSKate Stone int SBProcess::GetExitStatus() { 5754838131bSGreg Clayton int exit_status = 0; 576acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 577b9c1b51eSKate Stone if (process_sp) { 578b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 579b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 580acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus(); 581af67cecdSGreg Clayton } 5825160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5834838131bSGreg Clayton if (log) 5844838131bSGreg Clayton log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 585324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), exit_status, 586324a1036SSaleem Abdulrasool exit_status); 5874838131bSGreg Clayton 5884838131bSGreg Clayton return exit_status; 58930fdc8d8SChris Lattner } 59030fdc8d8SChris Lattner 591b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() { 5924838131bSGreg Clayton const char *exit_desc = NULL; 593acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 594b9c1b51eSKate Stone if (process_sp) { 595b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 596b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 597acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription(); 598af67cecdSGreg Clayton } 5995160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6004838131bSGreg Clayton if (log) 6014838131bSGreg Clayton log->Printf("SBProcess(%p)::GetExitDescription () => %s", 602324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), exit_desc); 6034838131bSGreg Clayton return exit_desc; 60430fdc8d8SChris Lattner } 60530fdc8d8SChris Lattner 606b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() { 607ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 608acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 609acdbe816SGreg Clayton if (process_sp) 610acdbe816SGreg Clayton ret_val = process_sp->GetID(); 611ceb6b139SCaroline Tice 6125160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 613ceb6b139SCaroline Tice if (log) 614324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64, 615324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), ret_val); 616ceb6b139SCaroline Tice 617ceb6b139SCaroline Tice return ret_val; 61830fdc8d8SChris Lattner } 61930fdc8d8SChris Lattner 620b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() { 621949e8221SGreg Clayton uint32_t ret_val = 0; 622949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 623949e8221SGreg Clayton if (process_sp) 624949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 6255160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 626949e8221SGreg Clayton if (log) 627324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32, 628324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), ret_val); 629949e8221SGreg Clayton return ret_val; 630949e8221SGreg Clayton } 631949e8221SGreg Clayton 632b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const { 633cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 634acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 635acdbe816SGreg Clayton if (process_sp) 636acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 637cf386e24SJohnny Chen 6385160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 639cf386e24SJohnny Chen if (log) 640324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetByteOrder () => %d", 641324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), byteOrder); 642cf386e24SJohnny Chen 643cf386e24SJohnny Chen return byteOrder; 644cf386e24SJohnny Chen } 645cf386e24SJohnny Chen 646b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const { 647ceb6b139SCaroline Tice uint32_t size = 0; 648acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 649acdbe816SGreg Clayton if (process_sp) 650acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 651ceb6b139SCaroline Tice 6525160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 653ceb6b139SCaroline Tice if (log) 654324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetAddressByteSize () => %d", 655324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), size); 656ceb6b139SCaroline Tice 657ceb6b139SCaroline Tice return size; 65830fdc8d8SChris Lattner } 65930fdc8d8SChris Lattner 660b9c1b51eSKate Stone SBError SBProcess::Continue() { 6615160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 662ceb6b139SCaroline Tice 66330fdc8d8SChris Lattner SBError sb_error; 664acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 6650c74e78dSGreg Clayton 666acdbe816SGreg Clayton if (log) 667324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::Continue ()...", 668324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 669acdbe816SGreg Clayton 670b9c1b51eSKate Stone if (process_sp) { 671b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 672b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 673acdbe816SGreg Clayton 674dc6224e0SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution()) 675dc6224e0SGreg Clayton sb_error.ref() = process_sp->Resume(); 676dc6224e0SGreg Clayton else 677dc6224e0SGreg Clayton sb_error.ref() = process_sp->ResumeSynchronous(NULL); 678b9c1b51eSKate Stone } else 67930fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 68030fdc8d8SChris Lattner 681b9c1b51eSKate Stone if (log) { 682ceb6b139SCaroline Tice SBStream sstr; 683ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 684324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s", 685324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 686324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 687ceb6b139SCaroline Tice } 688ceb6b139SCaroline Tice 68930fdc8d8SChris Lattner return sb_error; 69030fdc8d8SChris Lattner } 69130fdc8d8SChris Lattner 692b9c1b51eSKate Stone SBError SBProcess::Destroy() { 69330fdc8d8SChris Lattner SBError sb_error; 694acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 695b9c1b51eSKate Stone if (process_sp) { 696b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 697b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 698ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 699b9c1b51eSKate Stone } else 70030fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 70130fdc8d8SChris Lattner 7025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 703b9c1b51eSKate Stone if (log) { 7044838131bSGreg Clayton SBStream sstr; 7054838131bSGreg Clayton sb_error.GetDescription(sstr); 7066779606aSGreg Clayton log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s", 707324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 708324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 7094838131bSGreg Clayton } 7104838131bSGreg Clayton 71130fdc8d8SChris Lattner return sb_error; 71230fdc8d8SChris Lattner } 71330fdc8d8SChris Lattner 714b9c1b51eSKate Stone SBError SBProcess::Stop() { 71530fdc8d8SChris Lattner SBError sb_error; 716acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 717b9c1b51eSKate Stone if (process_sp) { 718b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 719b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 720acdbe816SGreg Clayton sb_error.SetError(process_sp->Halt()); 721b9c1b51eSKate Stone } else 72230fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 723ceb6b139SCaroline Tice 7245160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 725b9c1b51eSKate Stone if (log) { 726ceb6b139SCaroline Tice SBStream sstr; 727ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 72893aa84e8SGreg Clayton log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s", 729324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 730324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 731ceb6b139SCaroline Tice } 732ceb6b139SCaroline Tice 73330fdc8d8SChris Lattner return sb_error; 73430fdc8d8SChris Lattner } 73530fdc8d8SChris Lattner 736b9c1b51eSKate Stone SBError SBProcess::Kill() { 73730fdc8d8SChris Lattner SBError sb_error; 738acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 739b9c1b51eSKate Stone if (process_sp) { 740b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 741b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 742ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(true)); 743b9c1b51eSKate Stone } else 74430fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 745ceb6b139SCaroline Tice 7465160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 747b9c1b51eSKate Stone if (log) { 748ceb6b139SCaroline Tice SBStream sstr; 749ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 75093aa84e8SGreg Clayton log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s", 751324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 752324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 753ceb6b139SCaroline Tice } 754ceb6b139SCaroline Tice 75530fdc8d8SChris Lattner return sb_error; 75630fdc8d8SChris Lattner } 75730fdc8d8SChris Lattner 758b9c1b51eSKate Stone SBError SBProcess::Detach() { 759acff8950SJim Ingham // FIXME: This should come from a process default. 760acff8950SJim Ingham bool keep_stopped = false; 761acff8950SJim Ingham return Detach(keep_stopped); 762acff8950SJim Ingham } 763acff8950SJim Ingham 764b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) { 76530fdc8d8SChris Lattner SBError sb_error; 766acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 767b9c1b51eSKate Stone if (process_sp) { 768b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 769b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 770acff8950SJim Ingham sb_error.SetError(process_sp->Detach(keep_stopped)); 771b9c1b51eSKate Stone } else 77230fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 77330fdc8d8SChris Lattner 77430fdc8d8SChris Lattner return sb_error; 77530fdc8d8SChris Lattner } 77630fdc8d8SChris Lattner 777b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) { 77830fdc8d8SChris Lattner SBError sb_error; 779acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 780b9c1b51eSKate Stone if (process_sp) { 781b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 782b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 783acdbe816SGreg Clayton sb_error.SetError(process_sp->Signal(signo)); 784b9c1b51eSKate Stone } else 78530fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 7865160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 787b9c1b51eSKate Stone if (log) { 7884838131bSGreg Clayton SBStream sstr; 7894838131bSGreg Clayton sb_error.GetDescription(sstr); 7904838131bSGreg Clayton log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 791324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), signo, 792324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 7934838131bSGreg Clayton } 79430fdc8d8SChris Lattner return sb_error; 79530fdc8d8SChris Lattner } 79630fdc8d8SChris Lattner 797b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() { 79898d0a4b3SChaoren Lin if (auto process_sp = GetSP()) 79998d0a4b3SChaoren Lin return SBUnixSignals{process_sp}; 800802dc402STodd Fiala 80198d0a4b3SChaoren Lin return {}; 802802dc402STodd Fiala } 803802dc402STodd Fiala 804b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() { 805cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 806b9c1b51eSKate Stone if (process_sp) { 807cfc0935eSJim Ingham process_sp->SendAsyncInterrupt(); 808cfc0935eSJim Ingham } 809cfc0935eSJim Ingham } 810cfc0935eSJim Ingham 811b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) { 8124838131bSGreg Clayton SBThread sb_thread; 81317a6ad05SGreg Clayton ThreadSP thread_sp; 814acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 815b9c1b51eSKate Stone if (process_sp) { 8167fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8177fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 818b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 819b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 8207fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update); 82117a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 822af67cecdSGreg Clayton } 8234838131bSGreg Clayton 8245160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 8254838131bSGreg Clayton if (log) 826b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 827b9c1b51eSKate Stone ") => SBThread (%p)", 828324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, 829324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 8304838131bSGreg Clayton 8314838131bSGreg Clayton return sb_thread; 83230fdc8d8SChris Lattner } 83330fdc8d8SChris Lattner 834b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) { 83518b46896SJim Ingham SBThread sb_thread; 83618b46896SJim Ingham ThreadSP thread_sp; 83718b46896SJim Ingham ProcessSP process_sp(GetSP()); 838b9c1b51eSKate Stone if (process_sp) { 83918b46896SJim Ingham Process::StopLocker stop_locker; 84018b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 841b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 842b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 843b9c1b51eSKate Stone thread_sp = 844b9c1b51eSKate Stone process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update); 84518b46896SJim Ingham sb_thread.SetThread(thread_sp); 84618b46896SJim Ingham } 84718b46896SJim Ingham 8485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 84918b46896SJim Ingham if (log) 85018b46896SJim Ingham log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 851324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), index_id, 852324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 85318b46896SJim Ingham 85418b46896SJim Ingham return sb_thread; 85518b46896SJim Ingham } 85618b46896SJim Ingham 857b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) { 8585160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 859ceb6b139SCaroline Tice 860ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get()); 861ceb6b139SCaroline Tice 862ceb6b139SCaroline Tice if (log) 863324a1036SSaleem Abdulrasool log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s", 864324a1036SSaleem Abdulrasool static_cast<void *>(event.get()), 865750cd175SCaroline Tice lldb_private::StateAsCString(ret_val)); 866ceb6b139SCaroline Tice 867ceb6b139SCaroline Tice return ret_val; 86830fdc8d8SChris Lattner } 86930fdc8d8SChris Lattner 870b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) { 871ea2cc5e0SPavel Labath Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 872ea2cc5e0SPavel Labath 873ea2cc5e0SPavel Labath bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get()); 874ea2cc5e0SPavel Labath 875ea2cc5e0SPavel Labath if (log) 876400e1809SHans Wennborg log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__, 877400e1809SHans Wennborg static_cast<void *>(event.get()), ret_val); 878ea2cc5e0SPavel Labath 879ea2cc5e0SPavel Labath return ret_val; 88030fdc8d8SChris Lattner } 88130fdc8d8SChris Lattner 882b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) { 8830161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 8840161b49cSJim Ingham } 8850161b49cSJim Ingham 8860161b49cSJim Ingham const char * 887b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event, 888b9c1b51eSKate Stone size_t idx) { 8890161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 8900161b49cSJim Ingham } 8910161b49cSJim Ingham 892b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) { 89375930019STodd Fiala ProcessSP process_sp = 89475930019STodd Fiala Process::ProcessEventData::GetProcessFromEvent(event.get()); 895b9c1b51eSKate Stone if (!process_sp) { 89605097246SAdrian Prantl // StructuredData events also know the process they come from. Try that. 89775930019STodd Fiala process_sp = EventDataStructuredData::GetProcessFromEvent(event.get()); 89875930019STodd Fiala } 89975930019STodd Fiala 90075930019STodd Fiala return SBProcess(process_sp); 90130fdc8d8SChris Lattner } 90230fdc8d8SChris Lattner 903b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) { 90406d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 90506d2855fSIlia K } 90606d2855fSIlia K 90775930019STodd Fiala lldb::SBStructuredData 908b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) { 90975930019STodd Fiala return SBStructuredData(event.GetSP()); 91075930019STodd Fiala } 91175930019STodd Fiala 912b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) { 91375930019STodd Fiala return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) && 91475930019STodd Fiala !EventIsStructuredDataEvent(event); 91575930019STodd Fiala } 91675930019STodd Fiala 917b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) { 91875930019STodd Fiala EventSP event_sp = event.GetSP(); 91975930019STodd Fiala EventData *event_data = event_sp ? event_sp->GetData() : nullptr; 920b9c1b51eSKate Stone return event_data && (event_data->GetFlavor() == 921b9c1b51eSKate Stone EventDataStructuredData::GetFlavorString()); 922e6bc6cb9SJim Ingham } 92330fdc8d8SChris Lattner 924b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const { 9255160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 926ceb6b139SCaroline Tice 927acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 928acdbe816SGreg Clayton 929acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 930ceb6b139SCaroline Tice 931ceb6b139SCaroline Tice if (log) 932324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", 933324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 934324a1036SSaleem Abdulrasool static_cast<void *>(broadcaster.get())); 935ceb6b139SCaroline Tice 93630fdc8d8SChris Lattner return broadcaster; 93730fdc8d8SChris Lattner } 93830fdc8d8SChris Lattner 939b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() { 9404bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 9414bddaeb5SJim Ingham } 9424bddaeb5SJim Ingham 943b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len, 944b9c1b51eSKate Stone SBError &sb_error) { 9455160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 946ceb6b139SCaroline Tice 94730fdc8d8SChris Lattner size_t bytes_read = 0; 94830fdc8d8SChris Lattner 949acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 950acdbe816SGreg Clayton 9514838131bSGreg Clayton if (log) 952b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 953b9c1b51eSKate Stone ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 954324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 955324a1036SSaleem Abdulrasool static_cast<void *>(dst), static_cast<uint64_t>(dst_len), 956324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 9574838131bSGreg Clayton 958b9c1b51eSKate Stone if (process_sp) { 9597fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 960b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 961b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 962b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 9637fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref()); 964b9c1b51eSKate Stone } else { 965c9858e4dSGreg Clayton if (log) 966324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::ReadMemory() => error: process is running", 967324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 9687fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9697fdf9ef1SGreg Clayton } 970b9c1b51eSKate Stone } else { 97130fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 97230fdc8d8SChris Lattner } 97330fdc8d8SChris Lattner 974b9c1b51eSKate Stone if (log) { 97593aa84e8SGreg Clayton SBStream sstr; 97693aa84e8SGreg Clayton sb_error.GetDescription(sstr); 977b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 978b9c1b51eSKate Stone ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 979324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 980324a1036SSaleem Abdulrasool static_cast<void *>(dst), static_cast<uint64_t>(dst_len), 981324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData(), 982324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 98393aa84e8SGreg Clayton } 984ceb6b139SCaroline Tice 98530fdc8d8SChris Lattner return bytes_read; 98630fdc8d8SChris Lattner } 98730fdc8d8SChris Lattner 988b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size, 989b9c1b51eSKate Stone lldb::SBError &sb_error) { 990e91b7957SGreg Clayton size_t bytes_read = 0; 991acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 992b9c1b51eSKate Stone if (process_sp) { 9937fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 994b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 995b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 996b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 997b9c1b51eSKate Stone bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size, 998b9c1b51eSKate Stone sb_error.ref()); 999b9c1b51eSKate Stone } else { 10005160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1001c9858e4dSGreg Clayton if (log) 1002b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process " 1003b9c1b51eSKate Stone "is running", 1004324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10057fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10067fdf9ef1SGreg Clayton } 1007b9c1b51eSKate Stone } else { 1008e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1009e91b7957SGreg Clayton } 1010e91b7957SGreg Clayton return bytes_read; 1011e91b7957SGreg Clayton } 1012e91b7957SGreg Clayton 1013b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size, 1014b9c1b51eSKate Stone lldb::SBError &sb_error) { 10157fdf9ef1SGreg Clayton uint64_t value = 0; 1016acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1017b9c1b51eSKate Stone if (process_sp) { 10187fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1019b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1020b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1021b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1022b9c1b51eSKate Stone value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0, 1023b9c1b51eSKate Stone sb_error.ref()); 1024b9c1b51eSKate Stone } else { 10255160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1026c9858e4dSGreg Clayton if (log) 1027b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process " 1028b9c1b51eSKate Stone "is running", 1029324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10307fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10317fdf9ef1SGreg Clayton } 1032b9c1b51eSKate Stone } else { 1033e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1034e91b7957SGreg Clayton } 10357fdf9ef1SGreg Clayton return value; 1036e91b7957SGreg Clayton } 1037e91b7957SGreg Clayton 1038b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr, 1039b9c1b51eSKate Stone lldb::SBError &sb_error) { 1040e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1041acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1042b9c1b51eSKate Stone if (process_sp) { 10437fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1044b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1045b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1046b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 10477fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref()); 1048b9c1b51eSKate Stone } else { 10495160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1050c9858e4dSGreg Clayton if (log) 1051b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process " 1052b9c1b51eSKate Stone "is running", 1053324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10547fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10557fdf9ef1SGreg Clayton } 1056b9c1b51eSKate Stone } else { 1057e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1058e91b7957SGreg Clayton } 1059e91b7957SGreg Clayton return ptr; 1060e91b7957SGreg Clayton } 1061e91b7957SGreg Clayton 1062b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len, 1063b9c1b51eSKate Stone SBError &sb_error) { 106430fdc8d8SChris Lattner size_t bytes_written = 0; 106530fdc8d8SChris Lattner 10665160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1067acdbe816SGreg Clayton 1068acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1069acdbe816SGreg Clayton 10704838131bSGreg Clayton if (log) 1071b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1072b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1073324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1074b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1075324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 10764838131bSGreg Clayton 1077b9c1b51eSKate Stone if (process_sp) { 10787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1079b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1080b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1081b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1082b9c1b51eSKate Stone bytes_written = 1083b9c1b51eSKate Stone process_sp->WriteMemory(addr, src, src_len, sb_error.ref()); 1084b9c1b51eSKate Stone } else { 1085c9858e4dSGreg Clayton if (log) 1086324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::WriteMemory() => error: process is running", 1087324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10887fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10897fdf9ef1SGreg Clayton } 109030fdc8d8SChris Lattner } 109130fdc8d8SChris Lattner 1092b9c1b51eSKate Stone if (log) { 10934838131bSGreg Clayton SBStream sstr; 10944838131bSGreg Clayton sb_error.GetDescription(sstr); 1095b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1096b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1097324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1098b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1099324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData(), 1100324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_written)); 11014838131bSGreg Clayton } 11024838131bSGreg Clayton 110330fdc8d8SChris Lattner return bytes_written; 110430fdc8d8SChris Lattner } 110530fdc8d8SChris Lattner 1106b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) { 1107da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1108da7bc7d0SGreg Clayton 1109acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1110b9c1b51eSKate Stone if (process_sp) { 1111dde9cff3SCaroline Tice char path[PATH_MAX]; 1112dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath(path, sizeof(path)); 1113acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 11141d273166SGreg Clayton const char *exe_name = NULL; 11151d273166SGreg Clayton if (exe_module) 11161d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 11171d273166SGreg Clayton 1118d01b2953SDaniel Malea strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1119b9c1b51eSKate Stone process_sp->GetID(), lldb_private::StateAsCString(GetState()), 1120b9c1b51eSKate Stone GetNumThreads(), exe_name ? ", executable = " : "", 11211d273166SGreg Clayton exe_name ? exe_name : ""); 1122b9c1b51eSKate Stone } else 1123da7bc7d0SGreg Clayton strm.PutCString("No value"); 1124dde9cff3SCaroline Tice 1125dde9cff3SCaroline Tice return true; 1126dde9cff3SCaroline Tice } 11278f343b09SGreg Clayton 11288f343b09SGreg Clayton uint32_t 1129b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const { 11305160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1131f9ef60d2SJohnny Chen 1132f9ef60d2SJohnny Chen uint32_t num = 0; 1133f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1134b9c1b51eSKate Stone if (process_sp) { 1135b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1136b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1137f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo(num)); 1138f9ef60d2SJohnny Chen if (log) 1139f9ef60d2SJohnny Chen log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1140324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num); 1141b9c1b51eSKate Stone } else { 1142f9ef60d2SJohnny Chen sb_error.SetErrorString("SBProcess is invalid"); 1143f9ef60d2SJohnny Chen } 1144f9ef60d2SJohnny Chen return num; 1145f9ef60d2SJohnny Chen } 1146f9ef60d2SJohnny Chen 1147b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec, 1148b9c1b51eSKate Stone lldb::SBError &sb_error) { 11494fbd67acSTamas Berghammer return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); 11504fbd67acSTamas Berghammer } 11514fbd67acSTamas Berghammer 1152b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec, 11534fbd67acSTamas Berghammer const lldb::SBFileSpec &sb_remote_image_spec, 1154b9c1b51eSKate Stone lldb::SBError &sb_error) { 1155abc5d72fSJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1156acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1157b9c1b51eSKate Stone if (process_sp) { 11587fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1159b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1160abc5d72fSJim Ingham if (log) 1161abc5d72fSJim Ingham log->Printf("SBProcess(%p)::LoadImage() => calling Platform::LoadImage" 1162abc5d72fSJim Ingham "for: %s", 1163abc5d72fSJim Ingham static_cast<void *>(process_sp.get()), 1164abc5d72fSJim Ingham sb_local_image_spec.GetFilename()); 1165abc5d72fSJim Ingham 1166b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1167b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 11683cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1169b9c1b51eSKate Stone return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec, 1170b9c1b51eSKate Stone *sb_remote_image_spec, sb_error.ref()); 1171b9c1b51eSKate Stone } else { 1172c9858e4dSGreg Clayton if (log) 1173324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::LoadImage() => error: process is running", 1174324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 11757fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11767fdf9ef1SGreg Clayton } 1177abc5d72fSJim Ingham } else { 1178abc5d72fSJim Ingham if (log) 1179abc5d72fSJim Ingham log->Printf("SBProcess(%p)::LoadImage() => error: called with invalid" 1180abc5d72fSJim Ingham " process", 1181abc5d72fSJim Ingham static_cast<void *>(process_sp.get())); 1182abc5d72fSJim Ingham sb_error.SetErrorString("process is invalid"); 11837fdf9ef1SGreg Clayton } 11848f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11858f343b09SGreg Clayton } 11868f343b09SGreg Clayton 11870d231f71SJim Ingham uint32_t SBProcess::LoadImageUsingPaths(const lldb::SBFileSpec &image_spec, 11880d231f71SJim Ingham SBStringList &paths, 11890d231f71SJim Ingham lldb::SBFileSpec &loaded_path, 11900d231f71SJim Ingham lldb::SBError &error) { 11910d231f71SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 11920d231f71SJim Ingham ProcessSP process_sp(GetSP()); 11930d231f71SJim Ingham if (process_sp) { 11940d231f71SJim Ingham Process::StopLocker stop_locker; 11950d231f71SJim Ingham if (stop_locker.TryLock(&process_sp->GetRunLock())) { 11960d231f71SJim Ingham if (log) 11970d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => " 11980d231f71SJim Ingham "calling Platform::LoadImageUsingPaths for: %s", 11990d231f71SJim Ingham static_cast<void *>(process_sp.get()), 12000d231f71SJim Ingham image_spec.GetFilename()); 12010d231f71SJim Ingham 12020d231f71SJim Ingham std::lock_guard<std::recursive_mutex> guard( 12030d231f71SJim Ingham process_sp->GetTarget().GetAPIMutex()); 12040d231f71SJim Ingham PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 12050d231f71SJim Ingham size_t num_paths = paths.GetSize(); 12060d231f71SJim Ingham std::vector<std::string> paths_vec; 12070d231f71SJim Ingham paths_vec.reserve(num_paths); 12080d231f71SJim Ingham for (size_t i = 0; i < num_paths; i++) 12090d231f71SJim Ingham paths_vec.push_back(paths.GetStringAtIndex(i)); 12100d231f71SJim Ingham FileSpec loaded_spec; 12110d231f71SJim Ingham 12120d231f71SJim Ingham uint32_t token = platform_sp->LoadImageUsingPaths(process_sp.get(), 12130d231f71SJim Ingham *image_spec, 12140d231f71SJim Ingham paths_vec, 12150d231f71SJim Ingham error.ref(), 12160d231f71SJim Ingham &loaded_spec); 12170d231f71SJim Ingham if (token != LLDB_INVALID_IMAGE_TOKEN) 12180d231f71SJim Ingham loaded_path = loaded_spec; 12190d231f71SJim Ingham return token; 12200d231f71SJim Ingham } else { 12210d231f71SJim Ingham if (log) 12220d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: " 12230d231f71SJim Ingham "process is running", 12240d231f71SJim Ingham static_cast<void *>(process_sp.get())); 12250d231f71SJim Ingham error.SetErrorString("process is running"); 12260d231f71SJim Ingham } 12270d231f71SJim Ingham } else { 12280d231f71SJim Ingham if (log) 12290d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: " 12300d231f71SJim Ingham "called with invalid process", 12310d231f71SJim Ingham static_cast<void *>(process_sp.get())); 12320d231f71SJim Ingham error.SetErrorString("process is invalid"); 12330d231f71SJim Ingham } 12340d231f71SJim Ingham 12350d231f71SJim Ingham return LLDB_INVALID_IMAGE_TOKEN; 12360d231f71SJim Ingham } 12370d231f71SJim Ingham 1238b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) { 12398f343b09SGreg Clayton lldb::SBError sb_error; 1240acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1241b9c1b51eSKate Stone if (process_sp) { 12427fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1243b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1244b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1245b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 12463cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1247b9c1b51eSKate Stone sb_error.SetError( 1248b9c1b51eSKate Stone platform_sp->UnloadImage(process_sp.get(), image_token)); 1249b9c1b51eSKate Stone } else { 12505160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1251c9858e4dSGreg Clayton if (log) 1252324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::UnloadImage() => error: process is running", 1253324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 12547fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12557fdf9ef1SGreg Clayton } 1256b9c1b51eSKate Stone } else 12578f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 12588f343b09SGreg Clayton return sb_error; 12598f343b09SGreg Clayton } 12608c71337aSJason Molenda 1261b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) { 1262a332978bSJason Molenda lldb::SBError sb_error; 1263a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1264b9c1b51eSKate Stone if (process_sp) { 1265a332978bSJason Molenda Process::StopLocker stop_locker; 1266b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1267b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1268b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1269a332978bSJason Molenda sb_error.SetError(process_sp->SendEventData(event_data)); 1270b9c1b51eSKate Stone } else { 1271a332978bSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1272a332978bSJason Molenda if (log) 1273b9c1b51eSKate Stone log->Printf( 1274b9c1b51eSKate Stone "SBProcess(%p)::SendEventData() => error: process is running", 1275324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 1276a332978bSJason Molenda sb_error.SetErrorString("process is running"); 1277a332978bSJason Molenda } 1278b9c1b51eSKate Stone } else 1279a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1280a332978bSJason Molenda return sb_error; 1281a332978bSJason Molenda } 1282a332978bSJason Molenda 1283b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() { 12848c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1285b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 12868c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 128795d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 12888c71337aSJason Molenda } 12898c71337aSJason Molenda return 0; 12908c71337aSJason Molenda } 12918c71337aSJason Molenda 1292b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) { 12938c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1294b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 12958c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1296b9c1b51eSKate Stone const std::vector<ConstString> &names = 1297b9c1b51eSKate Stone runtime->GetExtendedBacktraceTypes(); 1298b9c1b51eSKate Stone if (idx < names.size()) { 12998c71337aSJason Molenda return names[idx].AsCString(); 1300b9c1b51eSKate Stone } else { 13018c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 13028c71337aSJason Molenda if (log) 1303b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => " 1304b9c1b51eSKate Stone "error: requested extended backtrace name out of bounds", 1305324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 13068c71337aSJason Molenda } 13078c71337aSJason Molenda } 13088c71337aSJason Molenda return NULL; 13098c71337aSJason Molenda } 1310a51ea382SKuba Brecka 1311b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) { 1312a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1313a51ea382SKuba Brecka SBThreadCollection threads; 1314b9c1b51eSKate Stone if (process_sp) { 1315a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1316a51ea382SKuba Brecka } 1317a51ea382SKuba Brecka return threads; 1318a51ea382SKuba Brecka } 131963927548SKuba Brecka 1320b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent( 1321b9c1b51eSKate Stone InstrumentationRuntimeType type) { 132263927548SKuba Brecka ProcessSP process_sp(GetSP()); 132363927548SKuba Brecka if (!process_sp) 132463927548SKuba Brecka return false; 132563927548SKuba Brecka 1326b9c1b51eSKate Stone InstrumentationRuntimeSP runtime_sp = 1327b9c1b51eSKate Stone process_sp->GetInstrumentationRuntime(type); 132863927548SKuba Brecka 132963927548SKuba Brecka if (!runtime_sp.get()) 133063927548SKuba Brecka return false; 133163927548SKuba Brecka 133263927548SKuba Brecka return runtime_sp->IsActive(); 133363927548SKuba Brecka } 1334f7d1893fSAdrian McCarthy 1335b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) { 1336f7d1893fSAdrian McCarthy lldb::SBError error; 1337f7d1893fSAdrian McCarthy ProcessSP process_sp(GetSP()); 1338b9c1b51eSKate Stone if (!process_sp) { 1339f7d1893fSAdrian McCarthy error.SetErrorString("SBProcess is invalid"); 1340f7d1893fSAdrian McCarthy return error; 1341f7d1893fSAdrian McCarthy } 1342f7d1893fSAdrian McCarthy 1343b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1344b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1345f7d1893fSAdrian McCarthy 1346b9c1b51eSKate Stone if (process_sp->GetState() != eStateStopped) { 1347f7d1893fSAdrian McCarthy error.SetErrorString("the process is not stopped"); 1348f7d1893fSAdrian McCarthy return error; 1349f7d1893fSAdrian McCarthy } 1350f7d1893fSAdrian McCarthy 13518f3be7a3SJonas Devlieghere FileSpec core_file(file_name); 1352f7d1893fSAdrian McCarthy error.ref() = PluginManager::SaveCore(process_sp, core_file); 1353f7d1893fSAdrian McCarthy return error; 1354f7d1893fSAdrian McCarthy } 135526036843SHoward Hellyer 135626036843SHoward Hellyer lldb::SBError 1357b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr, 1358b9c1b51eSKate Stone SBMemoryRegionInfo &sb_region_info) { 135926036843SHoward Hellyer lldb::SBError sb_error; 136026036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1361b9c1b51eSKate Stone if (process_sp) { 136226036843SHoward Hellyer Process::StopLocker stop_locker; 1363b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1364b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1365b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1366*36788bbbSTatyana Krasnukha 1367b9c1b51eSKate Stone sb_error.ref() = 1368*36788bbbSTatyana Krasnukha process_sp->GetMemoryRegionInfo(load_addr, sb_region_info.ref()); 1369b9c1b51eSKate Stone } else { 137026036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 137126036843SHoward Hellyer if (log) 1372b9c1b51eSKate Stone log->Printf( 1373b9c1b51eSKate Stone "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 137426036843SHoward Hellyer static_cast<void *>(process_sp.get())); 137526036843SHoward Hellyer sb_error.SetErrorString("process is running"); 137626036843SHoward Hellyer } 1377b9c1b51eSKate Stone } else { 137826036843SHoward Hellyer sb_error.SetErrorString("SBProcess is invalid"); 137926036843SHoward Hellyer } 138026036843SHoward Hellyer return sb_error; 138126036843SHoward Hellyer } 138226036843SHoward Hellyer 1383b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() { 138426036843SHoward Hellyer lldb::SBMemoryRegionInfoList sb_region_list; 1385*36788bbbSTatyana Krasnukha 138626036843SHoward Hellyer ProcessSP process_sp(GetSP()); 138726036843SHoward Hellyer Process::StopLocker stop_locker; 1388*36788bbbSTatyana Krasnukha if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) { 1389b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1390b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1391*36788bbbSTatyana Krasnukha 1392*36788bbbSTatyana Krasnukha process_sp->GetMemoryRegions(sb_region_list.ref()); 1393b9c1b51eSKate Stone } else { 139426036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 139526036843SHoward Hellyer if (log) 1396b9c1b51eSKate Stone log->Printf( 1397b9c1b51eSKate Stone "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 139826036843SHoward Hellyer static_cast<void *>(process_sp.get())); 139926036843SHoward Hellyer } 1400*36788bbbSTatyana Krasnukha 140126036843SHoward Hellyer return sb_region_list; 140226036843SHoward Hellyer } 1403141a6263SVadim Macagon 1404141a6263SVadim Macagon lldb::SBProcessInfo SBProcess::GetProcessInfo() { 1405141a6263SVadim Macagon lldb::SBProcessInfo sb_proc_info; 1406141a6263SVadim Macagon ProcessSP process_sp(GetSP()); 1407141a6263SVadim Macagon ProcessInstanceInfo proc_info; 1408141a6263SVadim Macagon if (process_sp && process_sp->GetProcessInfo(proc_info)) { 1409141a6263SVadim Macagon sb_proc_info.SetProcessInfo(proc_info); 1410141a6263SVadim Macagon } 1411141a6263SVadim Macagon return sb_proc_info; 1412141a6263SVadim Macagon } 1413