130fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 94c5de699SEli Friedman #include "lldb/API/SBProcess.h" 1030fdc8d8SChris Lattner 11bdae3787SVirgile Bello #include <inttypes.h> 12bdae3787SVirgile Bello 1330fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1430fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1530fdc8d8SChris Lattner 165d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 171f746071SGreg Clayton #include "lldb/Core/Module.h" 18f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h" 1930fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2026036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h" 2130fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2230fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 238c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h" 246611103cSGreg Clayton #include "lldb/Target/Target.h" 256611103cSGreg Clayton #include "lldb/Target/Thread.h" 26145d95c9SPavel Labath #include "lldb/Utility/Args.h" 276f9e6901SZachary Turner #include "lldb/Utility/Log.h" 28d821c997SPavel Labath #include "lldb/Utility/State.h" 29bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 3030fdc8d8SChris Lattner 3130fdc8d8SChris Lattner 324c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 334c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 340e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 354c5de699SEli Friedman #include "lldb/API/SBEvent.h" 360e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 3726036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfo.h" 3826036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfoList.h" 39b9c1b51eSKate Stone #include "lldb/API/SBStream.h" 40b9c1b51eSKate Stone #include "lldb/API/SBStringList.h" 4175930019STodd Fiala #include "lldb/API/SBStructuredData.h" 424c5de699SEli Friedman #include "lldb/API/SBThread.h" 43a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h" 44d5d8d91cSRavitheja Addepally #include "lldb/API/SBTrace.h" 45d5d8d91cSRavitheja Addepally #include "lldb/API/SBTraceOptions.h" 46802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h" 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner using namespace lldb; 4930fdc8d8SChris Lattner using namespace lldb_private; 5030fdc8d8SChris Lattner 51b9c1b51eSKate Stone SBProcess::SBProcess() : m_opaque_wp() {} 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner //---------------------------------------------------------------------- 5430fdc8d8SChris Lattner // SBProcess constructor 5530fdc8d8SChris Lattner //---------------------------------------------------------------------- 5630fdc8d8SChris Lattner 57b9c1b51eSKate Stone SBProcess::SBProcess(const SBProcess &rhs) : m_opaque_wp(rhs.m_opaque_wp) {} 5830fdc8d8SChris Lattner 59b9c1b51eSKate Stone SBProcess::SBProcess(const lldb::ProcessSP &process_sp) 60b9c1b51eSKate Stone : m_opaque_wp(process_sp) {} 6130fdc8d8SChris Lattner 62b9c1b51eSKate Stone const SBProcess &SBProcess::operator=(const SBProcess &rhs) { 63efabb123SGreg Clayton if (this != &rhs) 644e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 65efabb123SGreg Clayton return *this; 66efabb123SGreg Clayton } 67efabb123SGreg Clayton 6830fdc8d8SChris Lattner //---------------------------------------------------------------------- 6930fdc8d8SChris Lattner // Destructor 7030fdc8d8SChris Lattner //---------------------------------------------------------------------- 71b9c1b51eSKate Stone SBProcess::~SBProcess() {} 7230fdc8d8SChris Lattner 73b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClassName() { 744bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 754bddaeb5SJim Ingham } 764bddaeb5SJim Ingham 77b9c1b51eSKate Stone const char *SBProcess::GetPluginName() { 78d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 79b9c1b51eSKate Stone if (process_sp) { 8057abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 81d7b30ef9SJim Ingham } 82d7b30ef9SJim Ingham return "<Unknown>"; 83d7b30ef9SJim Ingham } 84d7b30ef9SJim Ingham 85b9c1b51eSKate Stone const char *SBProcess::GetShortPluginName() { 86d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 87b9c1b51eSKate Stone if (process_sp) { 8857abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 89d7b30ef9SJim Ingham } 90d7b30ef9SJim Ingham return "<Unknown>"; 91d7b30ef9SJim Ingham } 92d7b30ef9SJim Ingham 93b9c1b51eSKate Stone lldb::ProcessSP SBProcess::GetSP() const { return m_opaque_wp.lock(); } 94d7b30ef9SJim Ingham 95b9c1b51eSKate Stone void SBProcess::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; } 96b9556accSGreg Clayton 97b9c1b51eSKate Stone void SBProcess::Clear() { m_opaque_wp.reset(); } 9830fdc8d8SChris Lattner 99b9c1b51eSKate Stone bool SBProcess::IsValid() const { 1004fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1014fc6cb9cSJim Ingham return ((bool)process_sp && process_sp->IsValid()); 10230fdc8d8SChris Lattner } 10330fdc8d8SChris Lattner 104b9c1b51eSKate Stone bool SBProcess::RemoteLaunch(char const **argv, char const **envp, 105b9c1b51eSKate Stone const char *stdin_path, const char *stdout_path, 1069631aae2SJames McIlree const char *stderr_path, 1079631aae2SJames McIlree const char *working_directory, 108b9c1b51eSKate Stone uint32_t launch_flags, bool stop_at_entry, 109b9c1b51eSKate Stone lldb::SBError &error) { 1105160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 111324a1036SSaleem Abdulrasool if (log) 112b9c1b51eSKate Stone log->Printf("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, " 113b9c1b51eSKate Stone "stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, " 114b9c1b51eSKate Stone "stop_at_entry=%i, &error (%p))...", 115324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_wp.lock().get()), 116324a1036SSaleem Abdulrasool static_cast<void *>(argv), static_cast<void *>(envp), 1179631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1189631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1199631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 120b9c1b51eSKate Stone working_directory ? working_directory : "NULL", launch_flags, 121b9c1b51eSKate Stone stop_at_entry, static_cast<void *>(error.get())); 1229631aae2SJames McIlree 123acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 124b9c1b51eSKate Stone if (process_sp) { 125b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 126b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 127b9c1b51eSKate Stone if (process_sp->GetState() == eStateConnected) { 128982c9762SGreg Clayton if (stop_at_entry) 129982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 1308f3be7a3SJonas Devlieghere ProcessLaunchInfo launch_info(FileSpec(stdin_path), FileSpec(stdout_path), 1318f3be7a3SJonas Devlieghere FileSpec(stderr_path), 1328f3be7a3SJonas Devlieghere FileSpec(working_directory), launch_flags); 133acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 134982c9762SGreg Clayton if (exe_module) 13514715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 136982c9762SGreg Clayton if (argv) 137982c9762SGreg Clayton launch_info.GetArguments().AppendArguments(argv); 138982c9762SGreg Clayton if (envp) 13962930e57SPavel Labath launch_info.GetEnvironment() = Environment(envp); 140acdbe816SGreg Clayton error.SetError(process_sp->Launch(launch_info)); 141b9c1b51eSKate Stone } else { 1429631aae2SJames McIlree error.SetErrorString("must be in eStateConnected to call RemoteLaunch"); 1439631aae2SJames McIlree } 144b9c1b51eSKate Stone } else { 1459631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 1469631aae2SJames McIlree } 1479631aae2SJames McIlree 1489631aae2SJames McIlree if (log) { 1499631aae2SJames McIlree SBStream sstr; 1509631aae2SJames McIlree error.GetDescription(sstr); 151324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", 152324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 153324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), sstr.GetData()); 1549631aae2SJames McIlree } 1559631aae2SJames McIlree 1569631aae2SJames McIlree return error.Success(); 1579631aae2SJames McIlree } 1589631aae2SJames McIlree 159b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid, 160b9c1b51eSKate Stone lldb::SBError &error) { 161acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 162b9c1b51eSKate Stone if (process_sp) { 163b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 164b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 165b9c1b51eSKate Stone if (process_sp->GetState() == eStateConnected) { 166144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 167144f3a9cSGreg Clayton attach_info.SetProcessID(pid); 168acdbe816SGreg Clayton error.SetError(process_sp->Attach(attach_info)); 169b9c1b51eSKate Stone } else { 170b9c1b51eSKate Stone error.SetErrorString( 171b9c1b51eSKate Stone "must be in eStateConnected to call RemoteAttachToProcessWithID"); 1729631aae2SJames McIlree } 173b9c1b51eSKate Stone } else { 1749631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 1759631aae2SJames McIlree } 1769631aae2SJames McIlree 1775160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1789631aae2SJames McIlree if (log) { 1799631aae2SJames McIlree SBStream sstr; 1809631aae2SJames McIlree error.GetDescription(sstr); 181b9c1b51eSKate Stone log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 182b9c1b51eSKate Stone ") => SBError (%p): %s", 183324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), pid, 184324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), sstr.GetData()); 1859631aae2SJames McIlree } 1869631aae2SJames McIlree 1879631aae2SJames McIlree return error.Success(); 1889631aae2SJames McIlree } 1899631aae2SJames McIlree 190b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() { 1915160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 192ceb6b139SCaroline Tice 193ceb6b139SCaroline Tice uint32_t num_threads = 0; 194acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 195b9c1b51eSKate Stone if (process_sp) { 1967fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1977fdf9ef1SGreg Clayton 1987fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 199b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 200b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 201acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 20230fdc8d8SChris Lattner } 203ceb6b139SCaroline Tice 204ceb6b139SCaroline Tice if (log) 205324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetNumThreads () => %d", 206324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num_threads); 207ceb6b139SCaroline Tice 208ceb6b139SCaroline Tice return num_threads; 20930fdc8d8SChris Lattner } 21030fdc8d8SChris Lattner 211b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const { 2125160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 213ceb6b139SCaroline Tice 21430fdc8d8SChris Lattner SBThread sb_thread; 21517a6ad05SGreg Clayton ThreadSP thread_sp; 216acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 217b9c1b51eSKate Stone if (process_sp) { 218b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 219b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 220acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 22117a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 222af67cecdSGreg Clayton } 223ceb6b139SCaroline Tice 224ceb6b139SCaroline Tice if (log) 225324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", 226324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 227324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 228ceb6b139SCaroline Tice 22930fdc8d8SChris Lattner return sb_thread; 23030fdc8d8SChris Lattner } 23130fdc8d8SChris Lattner 232b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid, 233b9c1b51eSKate Stone lldb::addr_t context) { 2345160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 235a4d8747dSGreg Clayton 236a4d8747dSGreg Clayton SBThread sb_thread; 237a4d8747dSGreg Clayton ThreadSP thread_sp; 238a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 239b9c1b51eSKate Stone if (process_sp) { 240b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 241b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 242a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 243a4d8747dSGreg Clayton sb_thread.SetThread(thread_sp); 244a4d8747dSGreg Clayton } 245a4d8747dSGreg Clayton 246a4d8747dSGreg Clayton if (log) 247b9c1b51eSKate Stone log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 248b9c1b51eSKate Stone ", context=0x%" PRIx64 ") => SBThread(%p)", 249324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, context, 250324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 251a4d8747dSGreg Clayton 252a4d8747dSGreg Clayton return sb_thread; 253a4d8747dSGreg Clayton } 254a4d8747dSGreg Clayton 255b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const { 2565160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 257ceb6b139SCaroline Tice 25830fdc8d8SChris Lattner SBTarget sb_target; 259b9556accSGreg Clayton TargetSP target_sp; 260acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 261b9c1b51eSKate Stone if (process_sp) { 262acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 263b9556accSGreg Clayton sb_target.SetSP(target_sp); 264b9556accSGreg Clayton } 265ceb6b139SCaroline Tice 266ceb6b139SCaroline Tice if (log) 267324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)", 268324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 269324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get())); 270ceb6b139SCaroline Tice 27130fdc8d8SChris Lattner return sb_target; 27230fdc8d8SChris Lattner } 27330fdc8d8SChris Lattner 274b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) { 2755160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 276ceb6b139SCaroline Tice 277ceb6b139SCaroline Tice size_t ret_val = 0; 278acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 279b9c1b51eSKate Stone if (process_sp) { 28097206d57SZachary Turner Status error; 281acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN(src, src_len, error); 28230fdc8d8SChris Lattner } 283ceb6b139SCaroline Tice 284ceb6b139SCaroline Tice if (log) 285b9c1b51eSKate Stone log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 286b9c1b51eSKate Stone ") => %" PRIu64, 287324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), src, 288b9c1b51eSKate Stone static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val)); 289ceb6b139SCaroline Tice 290ceb6b139SCaroline Tice return ret_val; 29130fdc8d8SChris Lattner } 29230fdc8d8SChris Lattner 293b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const { 294cfd1acedSGreg Clayton size_t bytes_read = 0; 295acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 296b9c1b51eSKate Stone if (process_sp) { 29797206d57SZachary Turner Status error; 298acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT(dst, dst_len, error); 29930fdc8d8SChris Lattner } 300ceb6b139SCaroline Tice 3015160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 302ceb6b139SCaroline Tice if (log) 303b9c1b51eSKate Stone log->Printf( 304b9c1b51eSKate Stone "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 305b9c1b51eSKate Stone ") => %" PRIu64, 306b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 307b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 308ceb6b139SCaroline Tice 309cfd1acedSGreg Clayton return bytes_read; 31030fdc8d8SChris Lattner } 31130fdc8d8SChris Lattner 312b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const { 313cfd1acedSGreg Clayton size_t bytes_read = 0; 314acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 315b9c1b51eSKate Stone if (process_sp) { 31697206d57SZachary Turner Status error; 317acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR(dst, dst_len, error); 31830fdc8d8SChris Lattner } 319ceb6b139SCaroline Tice 3205160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 321ceb6b139SCaroline Tice if (log) 322b9c1b51eSKate Stone log->Printf( 323b9c1b51eSKate Stone "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 324b9c1b51eSKate Stone ") => %" PRIu64, 325b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 326b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 327ceb6b139SCaroline Tice 328cfd1acedSGreg Clayton return bytes_read; 32930fdc8d8SChris Lattner } 33030fdc8d8SChris Lattner 331b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const { 332ab3b8b22SHan Ming Ong size_t bytes_read = 0; 333ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 334b9c1b51eSKate Stone if (process_sp) { 33597206d57SZachary Turner Status error; 336ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error); 337ab3b8b22SHan Ming Ong } 338ab3b8b22SHan Ming Ong 3395160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 340ab3b8b22SHan Ming Ong if (log) 341b9c1b51eSKate Stone log->Printf( 342b9c1b51eSKate Stone "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 343b9c1b51eSKate Stone ") => %" PRIu64, 344b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 345b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 346ab3b8b22SHan Ming Ong 347ab3b8b22SHan Ming Ong return bytes_read; 348ab3b8b22SHan Ming Ong } 349ab3b8b22SHan Ming Ong 350d5d8d91cSRavitheja Addepally lldb::SBTrace SBProcess::StartTrace(SBTraceOptions &options, 351d5d8d91cSRavitheja Addepally lldb::SBError &error) { 352d5d8d91cSRavitheja Addepally Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 353d5d8d91cSRavitheja Addepally ProcessSP process_sp(GetSP()); 354d5d8d91cSRavitheja Addepally error.Clear(); 355d5d8d91cSRavitheja Addepally SBTrace trace_instance; 356d5d8d91cSRavitheja Addepally trace_instance.SetSP(process_sp); 357d5d8d91cSRavitheja Addepally lldb::user_id_t uid = LLDB_INVALID_UID; 358d5d8d91cSRavitheja Addepally 359d5d8d91cSRavitheja Addepally if (!process_sp) { 360d5d8d91cSRavitheja Addepally error.SetErrorString("invalid process"); 361d5d8d91cSRavitheja Addepally } else { 362e714c4f5SRavitheja Addepally uid = process_sp->StartTrace(*(options.m_traceoptions_sp), error.ref()); 363d5d8d91cSRavitheja Addepally trace_instance.SetTraceUID(uid); 364e714c4f5SRavitheja Addepally LLDB_LOG(log, "SBProcess::returned uid - {0}", uid); 365d5d8d91cSRavitheja Addepally } 366d5d8d91cSRavitheja Addepally return trace_instance; 367d5d8d91cSRavitheja Addepally } 368d5d8d91cSRavitheja Addepally 369b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const { 37030fdc8d8SChris Lattner if (out == NULL) 37130fdc8d8SChris Lattner return; 37230fdc8d8SChris Lattner 373acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 374b9c1b51eSKate Stone if (process_sp) { 37530fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 37630fdc8d8SChris Lattner char message[1024]; 377b9c1b51eSKate Stone int message_len = ::snprintf( 378b9c1b51eSKate Stone message, sizeof(message), "Process %" PRIu64 " %s\n", 379b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 38030fdc8d8SChris Lattner 38130fdc8d8SChris Lattner if (message_len > 0) 38230fdc8d8SChris Lattner ::fwrite(message, 1, message_len, out); 38330fdc8d8SChris Lattner } 38430fdc8d8SChris Lattner } 38530fdc8d8SChris Lattner 386b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event, 387b9c1b51eSKate Stone SBCommandReturnObject &result) { 388acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 389b9c1b51eSKate Stone if (process_sp) { 39030fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 39130fdc8d8SChris Lattner char message[1024]; 392b9c1b51eSKate Stone ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n", 393b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 39430fdc8d8SChris Lattner 39530fdc8d8SChris Lattner result.AppendMessage(message); 39630fdc8d8SChris Lattner } 39730fdc8d8SChris Lattner } 39830fdc8d8SChris Lattner 399b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) { 400acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 401b9c1b51eSKate Stone if (process_sp) { 402b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 403b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 404b9c1b51eSKate Stone return process_sp->GetThreadList().SetSelectedThreadByID( 405b9c1b51eSKate Stone thread.GetThreadID()); 406af67cecdSGreg Clayton } 40730fdc8d8SChris Lattner return false; 40830fdc8d8SChris Lattner } 40930fdc8d8SChris Lattner 410b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) { 4115160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 412ceb6b139SCaroline Tice 413ceb6b139SCaroline Tice bool ret_val = false; 414acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 415b9c1b51eSKate Stone if (process_sp) { 416b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 417b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 418acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid); 419af67cecdSGreg Clayton } 420ceb6b139SCaroline Tice 421ceb6b139SCaroline Tice if (log) 422b9c1b51eSKate Stone log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 423b9c1b51eSKate Stone ") => %s", 424324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, 425324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 426ceb6b139SCaroline Tice 427ceb6b139SCaroline Tice return ret_val; 42830fdc8d8SChris Lattner } 42930fdc8d8SChris Lattner 430b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) { 4315160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 43218b46896SJim Ingham 43318b46896SJim Ingham bool ret_val = false; 43418b46896SJim Ingham ProcessSP process_sp(GetSP()); 435b9c1b51eSKate Stone if (process_sp) { 436b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 437b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 43818b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id); 43918b46896SJim Ingham } 44018b46896SJim Ingham 44118b46896SJim Ingham if (log) 44218b46896SJim Ingham log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 443324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), index_id, 444324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 44518b46896SJim Ingham 44618b46896SJim Ingham return ret_val; 44718b46896SJim Ingham } 44818b46896SJim Ingham 449b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) { 4505160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 451ceb6b139SCaroline Tice 45217a6ad05SGreg Clayton SBThread sb_thread; 45317a6ad05SGreg Clayton ThreadSP thread_sp; 454acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 455b9c1b51eSKate Stone if (process_sp) { 4567fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4577fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 458b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 459b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 4607fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 46117a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 462af67cecdSGreg Clayton } 463ceb6b139SCaroline Tice 464ceb6b139SCaroline Tice if (log) 46593aa84e8SGreg Clayton log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 466324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 467324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 468324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 469ceb6b139SCaroline Tice 47017a6ad05SGreg Clayton return sb_thread; 47130fdc8d8SChris Lattner } 47230fdc8d8SChris Lattner 473b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() { 4745e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4755e8dce4dSJason Molenda 4765e8dce4dSJason Molenda uint32_t num_queues = 0; 4775e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 478b9c1b51eSKate Stone if (process_sp) { 4795e8dce4dSJason Molenda Process::StopLocker stop_locker; 480b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 481b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 482b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 4835e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 4845e8dce4dSJason Molenda } 485a61d0a5bSGreg Clayton } 4865e8dce4dSJason Molenda 4875e8dce4dSJason Molenda if (log) 488324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetNumQueues () => %d", 489324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num_queues); 4905e8dce4dSJason Molenda 4915e8dce4dSJason Molenda return num_queues; 4925e8dce4dSJason Molenda } 4935e8dce4dSJason Molenda 494b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) { 4955e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4965e8dce4dSJason Molenda 4975e8dce4dSJason Molenda SBQueue sb_queue; 4985e8dce4dSJason Molenda QueueSP queue_sp; 4995e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 500b9c1b51eSKate Stone if (process_sp) { 5015e8dce4dSJason Molenda Process::StopLocker stop_locker; 502b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 503b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 504b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 5055e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 5065e8dce4dSJason Molenda sb_queue.SetQueue(queue_sp); 5075e8dce4dSJason Molenda } 508a61d0a5bSGreg Clayton } 5095e8dce4dSJason Molenda 5105e8dce4dSJason Molenda if (log) 5115e8dce4dSJason Molenda log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", 512324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 513324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 514324a1036SSaleem Abdulrasool static_cast<void *>(queue_sp.get())); 5155e8dce4dSJason Molenda 5165e8dce4dSJason Molenda return sb_queue; 5175e8dce4dSJason Molenda } 5185e8dce4dSJason Molenda 519b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) { 520bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 521b9c1b51eSKate Stone if (process_sp) { 522b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 523b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 524bf2956a2SJim Ingham if (include_expression_stops) 525bf2956a2SJim Ingham return process_sp->GetStopID(); 526bf2956a2SJim Ingham else 527bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 528bf2956a2SJim Ingham } 529bf2956a2SJim Ingham return 0; 530bf2956a2SJim Ingham } 531bf2956a2SJim Ingham 532b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) { 53338810f43SIlia K Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 53438810f43SIlia K 53538810f43SIlia K SBEvent sb_event; 53638810f43SIlia K EventSP event_sp; 53738810f43SIlia K ProcessSP process_sp(GetSP()); 538b9c1b51eSKate Stone if (process_sp) { 539b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 540b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 54138810f43SIlia K event_sp = process_sp->GetStopEventForStopID(stop_id); 54238810f43SIlia K sb_event.reset(event_sp); 54338810f43SIlia K } 54438810f43SIlia K 54538810f43SIlia K if (log) 546b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 547b9c1b51eSKate Stone ") => SBEvent(%p)", 548b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), stop_id, 54938810f43SIlia K static_cast<void *>(event_sp.get())); 55038810f43SIlia K 55138810f43SIlia K return sb_event; 55238810f43SIlia K } 55338810f43SIlia K 554b9c1b51eSKate Stone StateType SBProcess::GetState() { 555ceb6b139SCaroline Tice 556ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 557acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 558b9c1b51eSKate Stone if (process_sp) { 559b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 560b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 561acdbe816SGreg Clayton ret_val = process_sp->GetState(); 562af67cecdSGreg Clayton } 563ceb6b139SCaroline Tice 5645160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 565ceb6b139SCaroline Tice if (log) 566cfd1acedSGreg Clayton log->Printf("SBProcess(%p)::GetState () => %s", 567324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 568750cd175SCaroline Tice lldb_private::StateAsCString(ret_val)); 569ceb6b139SCaroline Tice 570ceb6b139SCaroline Tice return ret_val; 57130fdc8d8SChris Lattner } 57230fdc8d8SChris Lattner 573b9c1b51eSKate Stone int SBProcess::GetExitStatus() { 5744838131bSGreg Clayton int exit_status = 0; 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_status = process_sp->GetExitStatus(); 580af67cecdSGreg Clayton } 5815160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5824838131bSGreg Clayton if (log) 5834838131bSGreg Clayton log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 584324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), exit_status, 585324a1036SSaleem Abdulrasool exit_status); 5864838131bSGreg Clayton 5874838131bSGreg Clayton return exit_status; 58830fdc8d8SChris Lattner } 58930fdc8d8SChris Lattner 590b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() { 5914838131bSGreg Clayton const char *exit_desc = NULL; 592acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 593b9c1b51eSKate Stone if (process_sp) { 594b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 595b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 596acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription(); 597af67cecdSGreg Clayton } 5985160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5994838131bSGreg Clayton if (log) 6004838131bSGreg Clayton log->Printf("SBProcess(%p)::GetExitDescription () => %s", 601324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), exit_desc); 6024838131bSGreg Clayton return exit_desc; 60330fdc8d8SChris Lattner } 60430fdc8d8SChris Lattner 605b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() { 606ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 607acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 608acdbe816SGreg Clayton if (process_sp) 609acdbe816SGreg Clayton ret_val = process_sp->GetID(); 610ceb6b139SCaroline Tice 6115160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 612ceb6b139SCaroline Tice if (log) 613324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64, 614324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), ret_val); 615ceb6b139SCaroline Tice 616ceb6b139SCaroline Tice return ret_val; 61730fdc8d8SChris Lattner } 61830fdc8d8SChris Lattner 619b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() { 620949e8221SGreg Clayton uint32_t ret_val = 0; 621949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 622949e8221SGreg Clayton if (process_sp) 623949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 6245160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 625949e8221SGreg Clayton if (log) 626324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32, 627324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), ret_val); 628949e8221SGreg Clayton return ret_val; 629949e8221SGreg Clayton } 630949e8221SGreg Clayton 631b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const { 632cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 633acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 634acdbe816SGreg Clayton if (process_sp) 635acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 636cf386e24SJohnny Chen 6375160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 638cf386e24SJohnny Chen if (log) 639324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetByteOrder () => %d", 640324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), byteOrder); 641cf386e24SJohnny Chen 642cf386e24SJohnny Chen return byteOrder; 643cf386e24SJohnny Chen } 644cf386e24SJohnny Chen 645b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const { 646ceb6b139SCaroline Tice uint32_t size = 0; 647acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 648acdbe816SGreg Clayton if (process_sp) 649acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 650ceb6b139SCaroline Tice 6515160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 652ceb6b139SCaroline Tice if (log) 653324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetAddressByteSize () => %d", 654324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), size); 655ceb6b139SCaroline Tice 656ceb6b139SCaroline Tice return size; 65730fdc8d8SChris Lattner } 65830fdc8d8SChris Lattner 659b9c1b51eSKate Stone SBError SBProcess::Continue() { 6605160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 661ceb6b139SCaroline Tice 66230fdc8d8SChris Lattner SBError sb_error; 663acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 6640c74e78dSGreg Clayton 665acdbe816SGreg Clayton if (log) 666324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::Continue ()...", 667324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 668acdbe816SGreg Clayton 669b9c1b51eSKate Stone if (process_sp) { 670b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 671b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 672acdbe816SGreg Clayton 673dc6224e0SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution()) 674dc6224e0SGreg Clayton sb_error.ref() = process_sp->Resume(); 675dc6224e0SGreg Clayton else 676dc6224e0SGreg Clayton sb_error.ref() = process_sp->ResumeSynchronous(NULL); 677b9c1b51eSKate Stone } else 67830fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 67930fdc8d8SChris Lattner 680b9c1b51eSKate Stone if (log) { 681ceb6b139SCaroline Tice SBStream sstr; 682ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 683324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s", 684324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 685324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 686ceb6b139SCaroline Tice } 687ceb6b139SCaroline Tice 68830fdc8d8SChris Lattner return sb_error; 68930fdc8d8SChris Lattner } 69030fdc8d8SChris Lattner 691b9c1b51eSKate Stone SBError SBProcess::Destroy() { 69230fdc8d8SChris Lattner SBError sb_error; 693acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 694b9c1b51eSKate Stone if (process_sp) { 695b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 696b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 697ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 698b9c1b51eSKate Stone } else 69930fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 70030fdc8d8SChris Lattner 7015160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 702b9c1b51eSKate Stone if (log) { 7034838131bSGreg Clayton SBStream sstr; 7044838131bSGreg Clayton sb_error.GetDescription(sstr); 7056779606aSGreg Clayton log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s", 706324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 707324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 7084838131bSGreg Clayton } 7094838131bSGreg Clayton 71030fdc8d8SChris Lattner return sb_error; 71130fdc8d8SChris Lattner } 71230fdc8d8SChris Lattner 713b9c1b51eSKate Stone SBError SBProcess::Stop() { 71430fdc8d8SChris Lattner SBError sb_error; 715acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 716b9c1b51eSKate Stone if (process_sp) { 717b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 718b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 719acdbe816SGreg Clayton sb_error.SetError(process_sp->Halt()); 720b9c1b51eSKate Stone } else 72130fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 722ceb6b139SCaroline Tice 7235160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 724b9c1b51eSKate Stone if (log) { 725ceb6b139SCaroline Tice SBStream sstr; 726ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 72793aa84e8SGreg Clayton log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s", 728324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 729324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 730ceb6b139SCaroline Tice } 731ceb6b139SCaroline Tice 73230fdc8d8SChris Lattner return sb_error; 73330fdc8d8SChris Lattner } 73430fdc8d8SChris Lattner 735b9c1b51eSKate Stone SBError SBProcess::Kill() { 73630fdc8d8SChris Lattner SBError sb_error; 737acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 738b9c1b51eSKate Stone if (process_sp) { 739b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 740b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 741ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(true)); 742b9c1b51eSKate Stone } else 74330fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 744ceb6b139SCaroline Tice 7455160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 746b9c1b51eSKate Stone if (log) { 747ceb6b139SCaroline Tice SBStream sstr; 748ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 74993aa84e8SGreg Clayton log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s", 750324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 751324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 752ceb6b139SCaroline Tice } 753ceb6b139SCaroline Tice 75430fdc8d8SChris Lattner return sb_error; 75530fdc8d8SChris Lattner } 75630fdc8d8SChris Lattner 757b9c1b51eSKate Stone SBError SBProcess::Detach() { 758acff8950SJim Ingham // FIXME: This should come from a process default. 759acff8950SJim Ingham bool keep_stopped = false; 760acff8950SJim Ingham return Detach(keep_stopped); 761acff8950SJim Ingham } 762acff8950SJim Ingham 763b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) { 76430fdc8d8SChris Lattner SBError sb_error; 765acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 766b9c1b51eSKate Stone if (process_sp) { 767b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 768b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 769acff8950SJim Ingham sb_error.SetError(process_sp->Detach(keep_stopped)); 770b9c1b51eSKate Stone } else 77130fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 77230fdc8d8SChris Lattner 77330fdc8d8SChris Lattner return sb_error; 77430fdc8d8SChris Lattner } 77530fdc8d8SChris Lattner 776b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) { 77730fdc8d8SChris Lattner SBError sb_error; 778acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 779b9c1b51eSKate Stone if (process_sp) { 780b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 781b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 782acdbe816SGreg Clayton sb_error.SetError(process_sp->Signal(signo)); 783b9c1b51eSKate Stone } else 78430fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 7855160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 786b9c1b51eSKate Stone if (log) { 7874838131bSGreg Clayton SBStream sstr; 7884838131bSGreg Clayton sb_error.GetDescription(sstr); 7894838131bSGreg Clayton log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 790324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), signo, 791324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 7924838131bSGreg Clayton } 79330fdc8d8SChris Lattner return sb_error; 79430fdc8d8SChris Lattner } 79530fdc8d8SChris Lattner 796b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() { 79798d0a4b3SChaoren Lin if (auto process_sp = GetSP()) 79898d0a4b3SChaoren Lin return SBUnixSignals{process_sp}; 799802dc402STodd Fiala 80098d0a4b3SChaoren Lin return {}; 801802dc402STodd Fiala } 802802dc402STodd Fiala 803b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() { 804cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 805b9c1b51eSKate Stone if (process_sp) { 806cfc0935eSJim Ingham process_sp->SendAsyncInterrupt(); 807cfc0935eSJim Ingham } 808cfc0935eSJim Ingham } 809cfc0935eSJim Ingham 810b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) { 8114838131bSGreg Clayton SBThread sb_thread; 81217a6ad05SGreg Clayton ThreadSP thread_sp; 813acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 814b9c1b51eSKate Stone if (process_sp) { 8157fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8167fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 817b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 818b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 8197fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update); 82017a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 821af67cecdSGreg Clayton } 8224838131bSGreg Clayton 8235160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 8244838131bSGreg Clayton if (log) 825b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 826b9c1b51eSKate Stone ") => SBThread (%p)", 827324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, 828324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 8294838131bSGreg Clayton 8304838131bSGreg Clayton return sb_thread; 83130fdc8d8SChris Lattner } 83230fdc8d8SChris Lattner 833b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) { 83418b46896SJim Ingham SBThread sb_thread; 83518b46896SJim Ingham ThreadSP thread_sp; 83618b46896SJim Ingham ProcessSP process_sp(GetSP()); 837b9c1b51eSKate Stone if (process_sp) { 83818b46896SJim Ingham Process::StopLocker stop_locker; 83918b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 840b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 841b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 842b9c1b51eSKate Stone thread_sp = 843b9c1b51eSKate Stone process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update); 84418b46896SJim Ingham sb_thread.SetThread(thread_sp); 84518b46896SJim Ingham } 84618b46896SJim Ingham 8475160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 84818b46896SJim Ingham if (log) 84918b46896SJim Ingham log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 850324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), index_id, 851324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 85218b46896SJim Ingham 85318b46896SJim Ingham return sb_thread; 85418b46896SJim Ingham } 85518b46896SJim Ingham 856b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) { 8575160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 858ceb6b139SCaroline Tice 859ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get()); 860ceb6b139SCaroline Tice 861ceb6b139SCaroline Tice if (log) 862324a1036SSaleem Abdulrasool log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s", 863324a1036SSaleem Abdulrasool static_cast<void *>(event.get()), 864750cd175SCaroline Tice lldb_private::StateAsCString(ret_val)); 865ceb6b139SCaroline Tice 866ceb6b139SCaroline Tice return ret_val; 86730fdc8d8SChris Lattner } 86830fdc8d8SChris Lattner 869b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) { 870ea2cc5e0SPavel Labath Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 871ea2cc5e0SPavel Labath 872ea2cc5e0SPavel Labath bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get()); 873ea2cc5e0SPavel Labath 874ea2cc5e0SPavel Labath if (log) 875400e1809SHans Wennborg log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__, 876400e1809SHans Wennborg static_cast<void *>(event.get()), ret_val); 877ea2cc5e0SPavel Labath 878ea2cc5e0SPavel Labath return ret_val; 87930fdc8d8SChris Lattner } 88030fdc8d8SChris Lattner 881b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) { 8820161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 8830161b49cSJim Ingham } 8840161b49cSJim Ingham 8850161b49cSJim Ingham const char * 886b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event, 887b9c1b51eSKate Stone size_t idx) { 8880161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 8890161b49cSJim Ingham } 8900161b49cSJim Ingham 891b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) { 89275930019STodd Fiala ProcessSP process_sp = 89375930019STodd Fiala Process::ProcessEventData::GetProcessFromEvent(event.get()); 894b9c1b51eSKate Stone if (!process_sp) { 89505097246SAdrian Prantl // StructuredData events also know the process they come from. Try that. 89675930019STodd Fiala process_sp = EventDataStructuredData::GetProcessFromEvent(event.get()); 89775930019STodd Fiala } 89875930019STodd Fiala 89975930019STodd Fiala return SBProcess(process_sp); 90030fdc8d8SChris Lattner } 90130fdc8d8SChris Lattner 902b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) { 90306d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 90406d2855fSIlia K } 90506d2855fSIlia K 90675930019STodd Fiala lldb::SBStructuredData 907b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) { 90875930019STodd Fiala return SBStructuredData(event.GetSP()); 90975930019STodd Fiala } 91075930019STodd Fiala 911b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) { 91275930019STodd Fiala return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) && 91375930019STodd Fiala !EventIsStructuredDataEvent(event); 91475930019STodd Fiala } 91575930019STodd Fiala 916b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) { 91775930019STodd Fiala EventSP event_sp = event.GetSP(); 91875930019STodd Fiala EventData *event_data = event_sp ? event_sp->GetData() : nullptr; 919b9c1b51eSKate Stone return event_data && (event_data->GetFlavor() == 920b9c1b51eSKate Stone EventDataStructuredData::GetFlavorString()); 921e6bc6cb9SJim Ingham } 92230fdc8d8SChris Lattner 923b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const { 9245160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 925ceb6b139SCaroline Tice 926acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 927acdbe816SGreg Clayton 928acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 929ceb6b139SCaroline Tice 930ceb6b139SCaroline Tice if (log) 931324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", 932324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 933324a1036SSaleem Abdulrasool static_cast<void *>(broadcaster.get())); 934ceb6b139SCaroline Tice 93530fdc8d8SChris Lattner return broadcaster; 93630fdc8d8SChris Lattner } 93730fdc8d8SChris Lattner 938b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() { 9394bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 9404bddaeb5SJim Ingham } 9414bddaeb5SJim Ingham 942b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len, 943b9c1b51eSKate Stone SBError &sb_error) { 9445160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 945ceb6b139SCaroline Tice 94630fdc8d8SChris Lattner size_t bytes_read = 0; 94730fdc8d8SChris Lattner 948acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 949acdbe816SGreg Clayton 9504838131bSGreg Clayton if (log) 951b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 952b9c1b51eSKate Stone ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 953324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 954324a1036SSaleem Abdulrasool static_cast<void *>(dst), static_cast<uint64_t>(dst_len), 955324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 9564838131bSGreg Clayton 957b9c1b51eSKate Stone if (process_sp) { 9587fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 959b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 960b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 961b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 9627fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref()); 963b9c1b51eSKate Stone } else { 964c9858e4dSGreg Clayton if (log) 965324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::ReadMemory() => error: process is running", 966324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 9677fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9687fdf9ef1SGreg Clayton } 969b9c1b51eSKate Stone } else { 97030fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 97130fdc8d8SChris Lattner } 97230fdc8d8SChris Lattner 973b9c1b51eSKate Stone if (log) { 97493aa84e8SGreg Clayton SBStream sstr; 97593aa84e8SGreg Clayton sb_error.GetDescription(sstr); 976b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 977b9c1b51eSKate Stone ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 978324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 979324a1036SSaleem Abdulrasool static_cast<void *>(dst), static_cast<uint64_t>(dst_len), 980324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData(), 981324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 98293aa84e8SGreg Clayton } 983ceb6b139SCaroline Tice 98430fdc8d8SChris Lattner return bytes_read; 98530fdc8d8SChris Lattner } 98630fdc8d8SChris Lattner 987b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size, 988b9c1b51eSKate Stone lldb::SBError &sb_error) { 989e91b7957SGreg Clayton size_t bytes_read = 0; 990acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 991b9c1b51eSKate Stone if (process_sp) { 9927fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 993b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 994b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 995b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 996b9c1b51eSKate Stone bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size, 997b9c1b51eSKate Stone sb_error.ref()); 998b9c1b51eSKate Stone } else { 9995160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1000c9858e4dSGreg Clayton if (log) 1001b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process " 1002b9c1b51eSKate Stone "is running", 1003324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10047fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10057fdf9ef1SGreg Clayton } 1006b9c1b51eSKate Stone } else { 1007e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1008e91b7957SGreg Clayton } 1009e91b7957SGreg Clayton return bytes_read; 1010e91b7957SGreg Clayton } 1011e91b7957SGreg Clayton 1012b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size, 1013b9c1b51eSKate Stone lldb::SBError &sb_error) { 10147fdf9ef1SGreg Clayton uint64_t value = 0; 1015acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1016b9c1b51eSKate Stone if (process_sp) { 10177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1018b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1019b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1020b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1021b9c1b51eSKate Stone value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0, 1022b9c1b51eSKate Stone sb_error.ref()); 1023b9c1b51eSKate Stone } else { 10245160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1025c9858e4dSGreg Clayton if (log) 1026b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process " 1027b9c1b51eSKate Stone "is running", 1028324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10297fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10307fdf9ef1SGreg Clayton } 1031b9c1b51eSKate Stone } else { 1032e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1033e91b7957SGreg Clayton } 10347fdf9ef1SGreg Clayton return value; 1035e91b7957SGreg Clayton } 1036e91b7957SGreg Clayton 1037b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr, 1038b9c1b51eSKate Stone lldb::SBError &sb_error) { 1039e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1040acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1041b9c1b51eSKate Stone if (process_sp) { 10427fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1043b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1044b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1045b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 10467fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref()); 1047b9c1b51eSKate Stone } else { 10485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1049c9858e4dSGreg Clayton if (log) 1050b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process " 1051b9c1b51eSKate Stone "is running", 1052324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10537fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10547fdf9ef1SGreg Clayton } 1055b9c1b51eSKate Stone } else { 1056e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1057e91b7957SGreg Clayton } 1058e91b7957SGreg Clayton return ptr; 1059e91b7957SGreg Clayton } 1060e91b7957SGreg Clayton 1061b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len, 1062b9c1b51eSKate Stone SBError &sb_error) { 106330fdc8d8SChris Lattner size_t bytes_written = 0; 106430fdc8d8SChris Lattner 10655160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1066acdbe816SGreg Clayton 1067acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1068acdbe816SGreg Clayton 10694838131bSGreg Clayton if (log) 1070b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1071b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1072324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1073b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1074324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 10754838131bSGreg Clayton 1076b9c1b51eSKate Stone if (process_sp) { 10777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1078b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1079b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1080b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1081b9c1b51eSKate Stone bytes_written = 1082b9c1b51eSKate Stone process_sp->WriteMemory(addr, src, src_len, sb_error.ref()); 1083b9c1b51eSKate Stone } else { 1084c9858e4dSGreg Clayton if (log) 1085324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::WriteMemory() => error: process is running", 1086324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10877fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10887fdf9ef1SGreg Clayton } 108930fdc8d8SChris Lattner } 109030fdc8d8SChris Lattner 1091b9c1b51eSKate Stone if (log) { 10924838131bSGreg Clayton SBStream sstr; 10934838131bSGreg Clayton sb_error.GetDescription(sstr); 1094b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1095b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1096324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1097b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1098324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData(), 1099324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_written)); 11004838131bSGreg Clayton } 11014838131bSGreg Clayton 110230fdc8d8SChris Lattner return bytes_written; 110330fdc8d8SChris Lattner } 110430fdc8d8SChris Lattner 1105b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) { 1106da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1107da7bc7d0SGreg Clayton 1108acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1109b9c1b51eSKate Stone if (process_sp) { 1110dde9cff3SCaroline Tice char path[PATH_MAX]; 1111dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath(path, sizeof(path)); 1112acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 11131d273166SGreg Clayton const char *exe_name = NULL; 11141d273166SGreg Clayton if (exe_module) 11151d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 11161d273166SGreg Clayton 1117d01b2953SDaniel Malea strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1118b9c1b51eSKate Stone process_sp->GetID(), lldb_private::StateAsCString(GetState()), 1119b9c1b51eSKate Stone GetNumThreads(), exe_name ? ", executable = " : "", 11201d273166SGreg Clayton exe_name ? exe_name : ""); 1121b9c1b51eSKate Stone } else 1122da7bc7d0SGreg Clayton strm.PutCString("No value"); 1123dde9cff3SCaroline Tice 1124dde9cff3SCaroline Tice return true; 1125dde9cff3SCaroline Tice } 11268f343b09SGreg Clayton 11278f343b09SGreg Clayton uint32_t 1128b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const { 11295160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1130f9ef60d2SJohnny Chen 1131f9ef60d2SJohnny Chen uint32_t num = 0; 1132f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1133b9c1b51eSKate Stone if (process_sp) { 1134b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1135b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1136f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo(num)); 1137f9ef60d2SJohnny Chen if (log) 1138f9ef60d2SJohnny Chen log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1139324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num); 1140b9c1b51eSKate Stone } else { 1141f9ef60d2SJohnny Chen sb_error.SetErrorString("SBProcess is invalid"); 1142f9ef60d2SJohnny Chen } 1143f9ef60d2SJohnny Chen return num; 1144f9ef60d2SJohnny Chen } 1145f9ef60d2SJohnny Chen 1146b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec, 1147b9c1b51eSKate Stone lldb::SBError &sb_error) { 11484fbd67acSTamas Berghammer return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); 11494fbd67acSTamas Berghammer } 11504fbd67acSTamas Berghammer 1151b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec, 11524fbd67acSTamas Berghammer const lldb::SBFileSpec &sb_remote_image_spec, 1153b9c1b51eSKate Stone lldb::SBError &sb_error) { 1154abc5d72fSJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1155acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1156b9c1b51eSKate Stone if (process_sp) { 11577fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1158b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1159abc5d72fSJim Ingham if (log) 1160abc5d72fSJim Ingham log->Printf("SBProcess(%p)::LoadImage() => calling Platform::LoadImage" 1161abc5d72fSJim Ingham "for: %s", 1162abc5d72fSJim Ingham static_cast<void *>(process_sp.get()), 1163abc5d72fSJim Ingham sb_local_image_spec.GetFilename()); 1164abc5d72fSJim Ingham 1165b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1166b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 11673cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1168b9c1b51eSKate Stone return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec, 1169b9c1b51eSKate Stone *sb_remote_image_spec, sb_error.ref()); 1170b9c1b51eSKate Stone } else { 1171c9858e4dSGreg Clayton if (log) 1172324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::LoadImage() => error: process is running", 1173324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 11747fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11757fdf9ef1SGreg Clayton } 1176abc5d72fSJim Ingham } else { 1177abc5d72fSJim Ingham if (log) 1178abc5d72fSJim Ingham log->Printf("SBProcess(%p)::LoadImage() => error: called with invalid" 1179abc5d72fSJim Ingham " process", 1180abc5d72fSJim Ingham static_cast<void *>(process_sp.get())); 1181abc5d72fSJim Ingham sb_error.SetErrorString("process is invalid"); 11827fdf9ef1SGreg Clayton } 11838f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11848f343b09SGreg Clayton } 11858f343b09SGreg Clayton 11860d231f71SJim Ingham uint32_t SBProcess::LoadImageUsingPaths(const lldb::SBFileSpec &image_spec, 11870d231f71SJim Ingham SBStringList &paths, 11880d231f71SJim Ingham lldb::SBFileSpec &loaded_path, 11890d231f71SJim Ingham lldb::SBError &error) { 11900d231f71SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 11910d231f71SJim Ingham ProcessSP process_sp(GetSP()); 11920d231f71SJim Ingham if (process_sp) { 11930d231f71SJim Ingham Process::StopLocker stop_locker; 11940d231f71SJim Ingham if (stop_locker.TryLock(&process_sp->GetRunLock())) { 11950d231f71SJim Ingham if (log) 11960d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => " 11970d231f71SJim Ingham "calling Platform::LoadImageUsingPaths for: %s", 11980d231f71SJim Ingham static_cast<void *>(process_sp.get()), 11990d231f71SJim Ingham image_spec.GetFilename()); 12000d231f71SJim Ingham 12010d231f71SJim Ingham std::lock_guard<std::recursive_mutex> guard( 12020d231f71SJim Ingham process_sp->GetTarget().GetAPIMutex()); 12030d231f71SJim Ingham PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 12040d231f71SJim Ingham size_t num_paths = paths.GetSize(); 12050d231f71SJim Ingham std::vector<std::string> paths_vec; 12060d231f71SJim Ingham paths_vec.reserve(num_paths); 12070d231f71SJim Ingham for (size_t i = 0; i < num_paths; i++) 12080d231f71SJim Ingham paths_vec.push_back(paths.GetStringAtIndex(i)); 12090d231f71SJim Ingham FileSpec loaded_spec; 12100d231f71SJim Ingham 12110d231f71SJim Ingham uint32_t token = platform_sp->LoadImageUsingPaths(process_sp.get(), 12120d231f71SJim Ingham *image_spec, 12130d231f71SJim Ingham paths_vec, 12140d231f71SJim Ingham error.ref(), 12150d231f71SJim Ingham &loaded_spec); 12160d231f71SJim Ingham if (token != LLDB_INVALID_IMAGE_TOKEN) 12170d231f71SJim Ingham loaded_path = loaded_spec; 12180d231f71SJim Ingham return token; 12190d231f71SJim Ingham } else { 12200d231f71SJim Ingham if (log) 12210d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: " 12220d231f71SJim Ingham "process is running", 12230d231f71SJim Ingham static_cast<void *>(process_sp.get())); 12240d231f71SJim Ingham error.SetErrorString("process is running"); 12250d231f71SJim Ingham } 12260d231f71SJim Ingham } else { 12270d231f71SJim Ingham if (log) 12280d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: " 12290d231f71SJim Ingham "called with invalid process", 12300d231f71SJim Ingham static_cast<void *>(process_sp.get())); 12310d231f71SJim Ingham error.SetErrorString("process is invalid"); 12320d231f71SJim Ingham } 12330d231f71SJim Ingham 12340d231f71SJim Ingham return LLDB_INVALID_IMAGE_TOKEN; 12350d231f71SJim Ingham } 12360d231f71SJim Ingham 1237b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) { 12388f343b09SGreg Clayton lldb::SBError sb_error; 1239acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1240b9c1b51eSKate Stone if (process_sp) { 12417fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1242b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1243b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1244b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 12453cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1246b9c1b51eSKate Stone sb_error.SetError( 1247b9c1b51eSKate Stone platform_sp->UnloadImage(process_sp.get(), image_token)); 1248b9c1b51eSKate Stone } else { 12495160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1250c9858e4dSGreg Clayton if (log) 1251324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::UnloadImage() => error: process is running", 1252324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 12537fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12547fdf9ef1SGreg Clayton } 1255b9c1b51eSKate Stone } else 12568f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 12578f343b09SGreg Clayton return sb_error; 12588f343b09SGreg Clayton } 12598c71337aSJason Molenda 1260b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) { 1261a332978bSJason Molenda lldb::SBError sb_error; 1262a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1263b9c1b51eSKate Stone if (process_sp) { 1264a332978bSJason Molenda Process::StopLocker stop_locker; 1265b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1266b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1267b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1268a332978bSJason Molenda sb_error.SetError(process_sp->SendEventData(event_data)); 1269b9c1b51eSKate Stone } else { 1270a332978bSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1271a332978bSJason Molenda if (log) 1272b9c1b51eSKate Stone log->Printf( 1273b9c1b51eSKate Stone "SBProcess(%p)::SendEventData() => error: process is running", 1274324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 1275a332978bSJason Molenda sb_error.SetErrorString("process is running"); 1276a332978bSJason Molenda } 1277b9c1b51eSKate Stone } else 1278a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1279a332978bSJason Molenda return sb_error; 1280a332978bSJason Molenda } 1281a332978bSJason Molenda 1282b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() { 12838c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1284b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 12858c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 128695d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 12878c71337aSJason Molenda } 12888c71337aSJason Molenda return 0; 12898c71337aSJason Molenda } 12908c71337aSJason Molenda 1291b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) { 12928c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1293b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 12948c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1295b9c1b51eSKate Stone const std::vector<ConstString> &names = 1296b9c1b51eSKate Stone runtime->GetExtendedBacktraceTypes(); 1297b9c1b51eSKate Stone if (idx < names.size()) { 12988c71337aSJason Molenda return names[idx].AsCString(); 1299b9c1b51eSKate Stone } else { 13008c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 13018c71337aSJason Molenda if (log) 1302b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => " 1303b9c1b51eSKate Stone "error: requested extended backtrace name out of bounds", 1304324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 13058c71337aSJason Molenda } 13068c71337aSJason Molenda } 13078c71337aSJason Molenda return NULL; 13088c71337aSJason Molenda } 1309a51ea382SKuba Brecka 1310b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) { 1311a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1312a51ea382SKuba Brecka SBThreadCollection threads; 1313b9c1b51eSKate Stone if (process_sp) { 1314a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1315a51ea382SKuba Brecka } 1316a51ea382SKuba Brecka return threads; 1317a51ea382SKuba Brecka } 131863927548SKuba Brecka 1319b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent( 1320b9c1b51eSKate Stone InstrumentationRuntimeType type) { 132163927548SKuba Brecka ProcessSP process_sp(GetSP()); 132263927548SKuba Brecka if (!process_sp) 132363927548SKuba Brecka return false; 132463927548SKuba Brecka 1325b9c1b51eSKate Stone InstrumentationRuntimeSP runtime_sp = 1326b9c1b51eSKate Stone process_sp->GetInstrumentationRuntime(type); 132763927548SKuba Brecka 132863927548SKuba Brecka if (!runtime_sp.get()) 132963927548SKuba Brecka return false; 133063927548SKuba Brecka 133163927548SKuba Brecka return runtime_sp->IsActive(); 133263927548SKuba Brecka } 1333f7d1893fSAdrian McCarthy 1334b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) { 1335f7d1893fSAdrian McCarthy lldb::SBError error; 1336f7d1893fSAdrian McCarthy ProcessSP process_sp(GetSP()); 1337b9c1b51eSKate Stone if (!process_sp) { 1338f7d1893fSAdrian McCarthy error.SetErrorString("SBProcess is invalid"); 1339f7d1893fSAdrian McCarthy return error; 1340f7d1893fSAdrian McCarthy } 1341f7d1893fSAdrian McCarthy 1342b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1343b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1344f7d1893fSAdrian McCarthy 1345b9c1b51eSKate Stone if (process_sp->GetState() != eStateStopped) { 1346f7d1893fSAdrian McCarthy error.SetErrorString("the process is not stopped"); 1347f7d1893fSAdrian McCarthy return error; 1348f7d1893fSAdrian McCarthy } 1349f7d1893fSAdrian McCarthy 13508f3be7a3SJonas Devlieghere FileSpec core_file(file_name); 1351f7d1893fSAdrian McCarthy error.ref() = PluginManager::SaveCore(process_sp, core_file); 1352f7d1893fSAdrian McCarthy return error; 1353f7d1893fSAdrian McCarthy } 135426036843SHoward Hellyer 135526036843SHoward Hellyer lldb::SBError 1356b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr, 1357b9c1b51eSKate Stone SBMemoryRegionInfo &sb_region_info) { 135826036843SHoward Hellyer lldb::SBError sb_error; 135926036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1360b9c1b51eSKate Stone if (process_sp) { 136126036843SHoward Hellyer Process::StopLocker stop_locker; 1362b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1363b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1364b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 136536788bbbSTatyana Krasnukha 1366b9c1b51eSKate Stone sb_error.ref() = 136736788bbbSTatyana Krasnukha process_sp->GetMemoryRegionInfo(load_addr, sb_region_info.ref()); 1368b9c1b51eSKate Stone } else { 136926036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 137026036843SHoward Hellyer if (log) 1371b9c1b51eSKate Stone log->Printf( 1372b9c1b51eSKate Stone "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 137326036843SHoward Hellyer static_cast<void *>(process_sp.get())); 137426036843SHoward Hellyer sb_error.SetErrorString("process is running"); 137526036843SHoward Hellyer } 1376b9c1b51eSKate Stone } else { 137726036843SHoward Hellyer sb_error.SetErrorString("SBProcess is invalid"); 137826036843SHoward Hellyer } 137926036843SHoward Hellyer return sb_error; 138026036843SHoward Hellyer } 138126036843SHoward Hellyer 1382b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() { 138326036843SHoward Hellyer lldb::SBMemoryRegionInfoList sb_region_list; 138436788bbbSTatyana Krasnukha 138526036843SHoward Hellyer ProcessSP process_sp(GetSP()); 138626036843SHoward Hellyer Process::StopLocker stop_locker; 138736788bbbSTatyana Krasnukha if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) { 1388b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1389b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 139036788bbbSTatyana Krasnukha 139136788bbbSTatyana Krasnukha process_sp->GetMemoryRegions(sb_region_list.ref()); 1392b9c1b51eSKate Stone } else { 139326036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 139426036843SHoward Hellyer if (log) 1395b9c1b51eSKate Stone log->Printf( 1396b9c1b51eSKate Stone "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 139726036843SHoward Hellyer static_cast<void *>(process_sp.get())); 139826036843SHoward Hellyer } 139936788bbbSTatyana Krasnukha 140026036843SHoward Hellyer return sb_region_list; 140126036843SHoward Hellyer } 1402141a6263SVadim Macagon 1403141a6263SVadim Macagon lldb::SBProcessInfo SBProcess::GetProcessInfo() { 1404141a6263SVadim Macagon lldb::SBProcessInfo sb_proc_info; 1405141a6263SVadim Macagon ProcessSP process_sp(GetSP()); 1406141a6263SVadim Macagon ProcessInstanceInfo proc_info; 1407141a6263SVadim Macagon if (process_sp && process_sp->GetProcessInfo(proc_info)) { 1408141a6263SVadim Macagon sb_proc_info.SetProcessInfo(proc_info); 1409141a6263SVadim Macagon } 1410141a6263SVadim Macagon return sb_proc_info; 1411141a6263SVadim Macagon } 1412