130fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 104c5de699SEli Friedman #include "lldb/API/SBProcess.h" 1130fdc8d8SChris Lattner 12bdae3787SVirgile Bello // C Includes 13bdae3787SVirgile Bello #include <inttypes.h> 14bdae3787SVirgile Bello 1530fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1630fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1730fdc8d8SChris Lattner 185d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 191f746071SGreg Clayton #include "lldb/Core/Module.h" 20f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h" 2130fdc8d8SChris Lattner #include "lldb/Core/State.h" 2230fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2326036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h" 2430fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2530fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 268c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h" 276611103cSGreg Clayton #include "lldb/Target/Target.h" 286611103cSGreg Clayton #include "lldb/Target/Thread.h" 29145d95c9SPavel Labath #include "lldb/Utility/Args.h" 306f9e6901SZachary Turner #include "lldb/Utility/Log.h" 31bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 3230fdc8d8SChris Lattner 3330fdc8d8SChris Lattner // Project includes 3430fdc8d8SChris Lattner 354c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 364c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 370e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 384c5de699SEli Friedman #include "lldb/API/SBEvent.h" 390e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 4026036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfo.h" 4126036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfoList.h" 42b9c1b51eSKate Stone #include "lldb/API/SBStream.h" 43b9c1b51eSKate Stone #include "lldb/API/SBStringList.h" 4475930019STodd Fiala #include "lldb/API/SBStructuredData.h" 454c5de699SEli Friedman #include "lldb/API/SBThread.h" 46a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h" 47d5d8d91cSRavitheja Addepally #include "lldb/API/SBTrace.h" 48d5d8d91cSRavitheja Addepally #include "lldb/API/SBTraceOptions.h" 49802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h" 5030fdc8d8SChris Lattner 5130fdc8d8SChris Lattner using namespace lldb; 5230fdc8d8SChris Lattner using namespace lldb_private; 5330fdc8d8SChris Lattner 54b9c1b51eSKate Stone SBProcess::SBProcess() : m_opaque_wp() {} 5530fdc8d8SChris Lattner 5630fdc8d8SChris Lattner //---------------------------------------------------------------------- 5730fdc8d8SChris Lattner // SBProcess constructor 5830fdc8d8SChris Lattner //---------------------------------------------------------------------- 5930fdc8d8SChris Lattner 60b9c1b51eSKate Stone SBProcess::SBProcess(const SBProcess &rhs) : m_opaque_wp(rhs.m_opaque_wp) {} 6130fdc8d8SChris Lattner 62b9c1b51eSKate Stone SBProcess::SBProcess(const lldb::ProcessSP &process_sp) 63b9c1b51eSKate Stone : m_opaque_wp(process_sp) {} 6430fdc8d8SChris Lattner 65b9c1b51eSKate Stone const SBProcess &SBProcess::operator=(const SBProcess &rhs) { 66efabb123SGreg Clayton if (this != &rhs) 674e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 68efabb123SGreg Clayton return *this; 69efabb123SGreg Clayton } 70efabb123SGreg Clayton 7130fdc8d8SChris Lattner //---------------------------------------------------------------------- 7230fdc8d8SChris Lattner // Destructor 7330fdc8d8SChris Lattner //---------------------------------------------------------------------- 74b9c1b51eSKate Stone SBProcess::~SBProcess() {} 7530fdc8d8SChris Lattner 76b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClassName() { 774bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 784bddaeb5SJim Ingham } 794bddaeb5SJim Ingham 80b9c1b51eSKate Stone const char *SBProcess::GetPluginName() { 81d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 82b9c1b51eSKate Stone if (process_sp) { 8357abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 84d7b30ef9SJim Ingham } 85d7b30ef9SJim Ingham return "<Unknown>"; 86d7b30ef9SJim Ingham } 87d7b30ef9SJim Ingham 88b9c1b51eSKate Stone const char *SBProcess::GetShortPluginName() { 89d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 90b9c1b51eSKate Stone if (process_sp) { 9157abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 92d7b30ef9SJim Ingham } 93d7b30ef9SJim Ingham return "<Unknown>"; 94d7b30ef9SJim Ingham } 95d7b30ef9SJim Ingham 96b9c1b51eSKate Stone lldb::ProcessSP SBProcess::GetSP() const { return m_opaque_wp.lock(); } 97d7b30ef9SJim Ingham 98b9c1b51eSKate Stone void SBProcess::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; } 99b9556accSGreg Clayton 100b9c1b51eSKate Stone void SBProcess::Clear() { m_opaque_wp.reset(); } 10130fdc8d8SChris Lattner 102b9c1b51eSKate Stone bool SBProcess::IsValid() const { 1034fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1044fc6cb9cSJim Ingham return ((bool)process_sp && process_sp->IsValid()); 10530fdc8d8SChris Lattner } 10630fdc8d8SChris Lattner 107b9c1b51eSKate Stone bool SBProcess::RemoteLaunch(char const **argv, char const **envp, 108b9c1b51eSKate Stone const char *stdin_path, const char *stdout_path, 1099631aae2SJames McIlree const char *stderr_path, 1109631aae2SJames McIlree const char *working_directory, 111b9c1b51eSKate Stone uint32_t launch_flags, bool stop_at_entry, 112b9c1b51eSKate Stone lldb::SBError &error) { 1135160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 114324a1036SSaleem Abdulrasool if (log) 115b9c1b51eSKate Stone log->Printf("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, " 116b9c1b51eSKate Stone "stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, " 117b9c1b51eSKate Stone "stop_at_entry=%i, &error (%p))...", 118324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_wp.lock().get()), 119324a1036SSaleem Abdulrasool static_cast<void *>(argv), static_cast<void *>(envp), 1209631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1219631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1229631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 123b9c1b51eSKate Stone working_directory ? working_directory : "NULL", launch_flags, 124b9c1b51eSKate Stone stop_at_entry, static_cast<void *>(error.get())); 1259631aae2SJames McIlree 126acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 127b9c1b51eSKate Stone if (process_sp) { 128b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 129b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 130b9c1b51eSKate Stone if (process_sp->GetState() == eStateConnected) { 131982c9762SGreg Clayton if (stop_at_entry) 132982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 133b9c1b51eSKate Stone ProcessLaunchInfo launch_info( 134b9c1b51eSKate Stone FileSpec{stdin_path, false}, FileSpec{stdout_path, false}, 135b9c1b51eSKate Stone FileSpec{stderr_path, false}, FileSpec{working_directory, false}, 136982c9762SGreg Clayton launch_flags); 137acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 138982c9762SGreg Clayton if (exe_module) 13914715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 140982c9762SGreg Clayton if (argv) 141982c9762SGreg Clayton launch_info.GetArguments().AppendArguments(argv); 142982c9762SGreg Clayton if (envp) 14362930e57SPavel Labath launch_info.GetEnvironment() = Environment(envp); 144acdbe816SGreg Clayton error.SetError(process_sp->Launch(launch_info)); 145b9c1b51eSKate Stone } else { 1469631aae2SJames McIlree error.SetErrorString("must be in eStateConnected to call RemoteLaunch"); 1479631aae2SJames McIlree } 148b9c1b51eSKate Stone } else { 1499631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 1509631aae2SJames McIlree } 1519631aae2SJames McIlree 1529631aae2SJames McIlree if (log) { 1539631aae2SJames McIlree SBStream sstr; 1549631aae2SJames McIlree error.GetDescription(sstr); 155324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", 156324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 157324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), sstr.GetData()); 1589631aae2SJames McIlree } 1599631aae2SJames McIlree 1609631aae2SJames McIlree return error.Success(); 1619631aae2SJames McIlree } 1629631aae2SJames McIlree 163b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid, 164b9c1b51eSKate Stone lldb::SBError &error) { 165acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 166b9c1b51eSKate Stone if (process_sp) { 167b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 168b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 169b9c1b51eSKate Stone if (process_sp->GetState() == eStateConnected) { 170144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 171144f3a9cSGreg Clayton attach_info.SetProcessID(pid); 172acdbe816SGreg Clayton error.SetError(process_sp->Attach(attach_info)); 173b9c1b51eSKate Stone } else { 174b9c1b51eSKate Stone error.SetErrorString( 175b9c1b51eSKate Stone "must be in eStateConnected to call RemoteAttachToProcessWithID"); 1769631aae2SJames McIlree } 177b9c1b51eSKate Stone } else { 1789631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 1799631aae2SJames McIlree } 1809631aae2SJames McIlree 1815160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1829631aae2SJames McIlree if (log) { 1839631aae2SJames McIlree SBStream sstr; 1849631aae2SJames McIlree error.GetDescription(sstr); 185b9c1b51eSKate Stone log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 186b9c1b51eSKate Stone ") => SBError (%p): %s", 187324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), pid, 188324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), sstr.GetData()); 1899631aae2SJames McIlree } 1909631aae2SJames McIlree 1919631aae2SJames McIlree return error.Success(); 1929631aae2SJames McIlree } 1939631aae2SJames McIlree 194b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() { 1955160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 196ceb6b139SCaroline Tice 197ceb6b139SCaroline Tice uint32_t num_threads = 0; 198acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 199b9c1b51eSKate Stone if (process_sp) { 2007fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2017fdf9ef1SGreg Clayton 2027fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 203b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 204b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 205acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 20630fdc8d8SChris Lattner } 207ceb6b139SCaroline Tice 208ceb6b139SCaroline Tice if (log) 209324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetNumThreads () => %d", 210324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num_threads); 211ceb6b139SCaroline Tice 212ceb6b139SCaroline Tice return num_threads; 21330fdc8d8SChris Lattner } 21430fdc8d8SChris Lattner 215b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const { 2165160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 217ceb6b139SCaroline Tice 21830fdc8d8SChris Lattner SBThread sb_thread; 21917a6ad05SGreg Clayton ThreadSP thread_sp; 220acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 221b9c1b51eSKate Stone if (process_sp) { 222b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 223b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 224acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 22517a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 226af67cecdSGreg Clayton } 227ceb6b139SCaroline Tice 228ceb6b139SCaroline Tice if (log) 229324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", 230324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 231324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 232ceb6b139SCaroline Tice 23330fdc8d8SChris Lattner return sb_thread; 23430fdc8d8SChris Lattner } 23530fdc8d8SChris Lattner 236b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid, 237b9c1b51eSKate Stone lldb::addr_t context) { 2385160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 239a4d8747dSGreg Clayton 240a4d8747dSGreg Clayton SBThread sb_thread; 241a4d8747dSGreg Clayton ThreadSP thread_sp; 242a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 243b9c1b51eSKate Stone if (process_sp) { 244b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 245b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 246a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 247a4d8747dSGreg Clayton sb_thread.SetThread(thread_sp); 248a4d8747dSGreg Clayton } 249a4d8747dSGreg Clayton 250a4d8747dSGreg Clayton if (log) 251b9c1b51eSKate Stone log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 252b9c1b51eSKate Stone ", context=0x%" PRIx64 ") => SBThread(%p)", 253324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, context, 254324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 255a4d8747dSGreg Clayton 256a4d8747dSGreg Clayton return sb_thread; 257a4d8747dSGreg Clayton } 258a4d8747dSGreg Clayton 259b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const { 2605160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 261ceb6b139SCaroline Tice 26230fdc8d8SChris Lattner SBTarget sb_target; 263b9556accSGreg Clayton TargetSP target_sp; 264acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 265b9c1b51eSKate Stone if (process_sp) { 266acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 267b9556accSGreg Clayton sb_target.SetSP(target_sp); 268b9556accSGreg Clayton } 269ceb6b139SCaroline Tice 270ceb6b139SCaroline Tice if (log) 271324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)", 272324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 273324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get())); 274ceb6b139SCaroline Tice 27530fdc8d8SChris Lattner return sb_target; 27630fdc8d8SChris Lattner } 27730fdc8d8SChris Lattner 278b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) { 2795160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 280ceb6b139SCaroline Tice 281ceb6b139SCaroline Tice size_t ret_val = 0; 282acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 283b9c1b51eSKate Stone if (process_sp) { 28497206d57SZachary Turner Status error; 285acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN(src, src_len, error); 28630fdc8d8SChris Lattner } 287ceb6b139SCaroline Tice 288ceb6b139SCaroline Tice if (log) 289b9c1b51eSKate Stone log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 290b9c1b51eSKate Stone ") => %" PRIu64, 291324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), src, 292b9c1b51eSKate Stone static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val)); 293ceb6b139SCaroline Tice 294ceb6b139SCaroline Tice return ret_val; 29530fdc8d8SChris Lattner } 29630fdc8d8SChris Lattner 297b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const { 298cfd1acedSGreg Clayton size_t bytes_read = 0; 299acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 300b9c1b51eSKate Stone if (process_sp) { 30197206d57SZachary Turner Status error; 302acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT(dst, dst_len, error); 30330fdc8d8SChris Lattner } 304ceb6b139SCaroline Tice 3055160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 306ceb6b139SCaroline Tice if (log) 307b9c1b51eSKate Stone log->Printf( 308b9c1b51eSKate Stone "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 309b9c1b51eSKate Stone ") => %" PRIu64, 310b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 311b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 312ceb6b139SCaroline Tice 313cfd1acedSGreg Clayton return bytes_read; 31430fdc8d8SChris Lattner } 31530fdc8d8SChris Lattner 316b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const { 317cfd1acedSGreg Clayton size_t bytes_read = 0; 318acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 319b9c1b51eSKate Stone if (process_sp) { 32097206d57SZachary Turner Status error; 321acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR(dst, dst_len, error); 32230fdc8d8SChris Lattner } 323ceb6b139SCaroline Tice 3245160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 325ceb6b139SCaroline Tice if (log) 326b9c1b51eSKate Stone log->Printf( 327b9c1b51eSKate Stone "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 328b9c1b51eSKate Stone ") => %" PRIu64, 329b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 330b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 331ceb6b139SCaroline Tice 332cfd1acedSGreg Clayton return bytes_read; 33330fdc8d8SChris Lattner } 33430fdc8d8SChris Lattner 335b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const { 336ab3b8b22SHan Ming Ong size_t bytes_read = 0; 337ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 338b9c1b51eSKate Stone if (process_sp) { 33997206d57SZachary Turner Status error; 340ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error); 341ab3b8b22SHan Ming Ong } 342ab3b8b22SHan Ming Ong 3435160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 344ab3b8b22SHan Ming Ong if (log) 345b9c1b51eSKate Stone log->Printf( 346b9c1b51eSKate Stone "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 347b9c1b51eSKate Stone ") => %" PRIu64, 348b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 349b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 350ab3b8b22SHan Ming Ong 351ab3b8b22SHan Ming Ong return bytes_read; 352ab3b8b22SHan Ming Ong } 353ab3b8b22SHan Ming Ong 354d5d8d91cSRavitheja Addepally lldb::SBTrace SBProcess::StartTrace(SBTraceOptions &options, 355d5d8d91cSRavitheja Addepally lldb::SBError &error) { 356d5d8d91cSRavitheja Addepally Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 357d5d8d91cSRavitheja Addepally ProcessSP process_sp(GetSP()); 358d5d8d91cSRavitheja Addepally error.Clear(); 359d5d8d91cSRavitheja Addepally SBTrace trace_instance; 360d5d8d91cSRavitheja Addepally trace_instance.SetSP(process_sp); 361d5d8d91cSRavitheja Addepally lldb::user_id_t uid = LLDB_INVALID_UID; 362d5d8d91cSRavitheja Addepally 363d5d8d91cSRavitheja Addepally if (!process_sp) { 364d5d8d91cSRavitheja Addepally error.SetErrorString("invalid process"); 365d5d8d91cSRavitheja Addepally } else { 366e714c4f5SRavitheja Addepally uid = process_sp->StartTrace(*(options.m_traceoptions_sp), error.ref()); 367d5d8d91cSRavitheja Addepally trace_instance.SetTraceUID(uid); 368e714c4f5SRavitheja Addepally LLDB_LOG(log, "SBProcess::returned uid - {0}", uid); 369d5d8d91cSRavitheja Addepally } 370d5d8d91cSRavitheja Addepally return trace_instance; 371d5d8d91cSRavitheja Addepally } 372d5d8d91cSRavitheja Addepally 373b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const { 37430fdc8d8SChris Lattner if (out == NULL) 37530fdc8d8SChris Lattner return; 37630fdc8d8SChris Lattner 377acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 378b9c1b51eSKate Stone if (process_sp) { 37930fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 38030fdc8d8SChris Lattner char message[1024]; 381b9c1b51eSKate Stone int message_len = ::snprintf( 382b9c1b51eSKate Stone message, sizeof(message), "Process %" PRIu64 " %s\n", 383b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 38430fdc8d8SChris Lattner 38530fdc8d8SChris Lattner if (message_len > 0) 38630fdc8d8SChris Lattner ::fwrite(message, 1, message_len, out); 38730fdc8d8SChris Lattner } 38830fdc8d8SChris Lattner } 38930fdc8d8SChris Lattner 390b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event, 391b9c1b51eSKate Stone SBCommandReturnObject &result) { 392acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 393b9c1b51eSKate Stone if (process_sp) { 39430fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 39530fdc8d8SChris Lattner char message[1024]; 396b9c1b51eSKate Stone ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n", 397b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 39830fdc8d8SChris Lattner 39930fdc8d8SChris Lattner result.AppendMessage(message); 40030fdc8d8SChris Lattner } 40130fdc8d8SChris Lattner } 40230fdc8d8SChris Lattner 403b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) { 404acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 405b9c1b51eSKate Stone if (process_sp) { 406b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 407b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 408b9c1b51eSKate Stone return process_sp->GetThreadList().SetSelectedThreadByID( 409b9c1b51eSKate Stone thread.GetThreadID()); 410af67cecdSGreg Clayton } 41130fdc8d8SChris Lattner return false; 41230fdc8d8SChris Lattner } 41330fdc8d8SChris Lattner 414b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) { 4155160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 416ceb6b139SCaroline Tice 417ceb6b139SCaroline Tice bool ret_val = false; 418acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 419b9c1b51eSKate Stone if (process_sp) { 420b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 421b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 422acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid); 423af67cecdSGreg Clayton } 424ceb6b139SCaroline Tice 425ceb6b139SCaroline Tice if (log) 426b9c1b51eSKate Stone log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 427b9c1b51eSKate Stone ") => %s", 428324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, 429324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 430ceb6b139SCaroline Tice 431ceb6b139SCaroline Tice return ret_val; 43230fdc8d8SChris Lattner } 43330fdc8d8SChris Lattner 434b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) { 4355160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 43618b46896SJim Ingham 43718b46896SJim Ingham bool ret_val = false; 43818b46896SJim Ingham ProcessSP process_sp(GetSP()); 439b9c1b51eSKate Stone if (process_sp) { 440b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 441b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 44218b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id); 44318b46896SJim Ingham } 44418b46896SJim Ingham 44518b46896SJim Ingham if (log) 44618b46896SJim Ingham log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 447324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), index_id, 448324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 44918b46896SJim Ingham 45018b46896SJim Ingham return ret_val; 45118b46896SJim Ingham } 45218b46896SJim Ingham 453b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) { 4545160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 455ceb6b139SCaroline Tice 45617a6ad05SGreg Clayton SBThread sb_thread; 45717a6ad05SGreg Clayton ThreadSP thread_sp; 458acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 459b9c1b51eSKate Stone if (process_sp) { 4607fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4617fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 462b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 463b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 4647fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 46517a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 466af67cecdSGreg Clayton } 467ceb6b139SCaroline Tice 468ceb6b139SCaroline Tice if (log) 46993aa84e8SGreg Clayton log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 470324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 471324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 472324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 473ceb6b139SCaroline Tice 47417a6ad05SGreg Clayton return sb_thread; 47530fdc8d8SChris Lattner } 47630fdc8d8SChris Lattner 477b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() { 4785e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4795e8dce4dSJason Molenda 4805e8dce4dSJason Molenda uint32_t num_queues = 0; 4815e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 482b9c1b51eSKate Stone if (process_sp) { 4835e8dce4dSJason Molenda Process::StopLocker stop_locker; 484b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 485b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 486b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 4875e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 4885e8dce4dSJason Molenda } 489a61d0a5bSGreg Clayton } 4905e8dce4dSJason Molenda 4915e8dce4dSJason Molenda if (log) 492324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetNumQueues () => %d", 493324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num_queues); 4945e8dce4dSJason Molenda 4955e8dce4dSJason Molenda return num_queues; 4965e8dce4dSJason Molenda } 4975e8dce4dSJason Molenda 498b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) { 4995e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5005e8dce4dSJason Molenda 5015e8dce4dSJason Molenda SBQueue sb_queue; 5025e8dce4dSJason Molenda QueueSP queue_sp; 5035e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 504b9c1b51eSKate Stone if (process_sp) { 5055e8dce4dSJason Molenda Process::StopLocker stop_locker; 506b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 507b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 508b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 5095e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 5105e8dce4dSJason Molenda sb_queue.SetQueue(queue_sp); 5115e8dce4dSJason Molenda } 512a61d0a5bSGreg Clayton } 5135e8dce4dSJason Molenda 5145e8dce4dSJason Molenda if (log) 5155e8dce4dSJason Molenda log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", 516324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 517324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 518324a1036SSaleem Abdulrasool static_cast<void *>(queue_sp.get())); 5195e8dce4dSJason Molenda 5205e8dce4dSJason Molenda return sb_queue; 5215e8dce4dSJason Molenda } 5225e8dce4dSJason Molenda 523b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) { 524bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 525b9c1b51eSKate Stone if (process_sp) { 526b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 527b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 528bf2956a2SJim Ingham if (include_expression_stops) 529bf2956a2SJim Ingham return process_sp->GetStopID(); 530bf2956a2SJim Ingham else 531bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 532bf2956a2SJim Ingham } 533bf2956a2SJim Ingham return 0; 534bf2956a2SJim Ingham } 535bf2956a2SJim Ingham 536b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) { 53738810f43SIlia K Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 53838810f43SIlia K 53938810f43SIlia K SBEvent sb_event; 54038810f43SIlia K EventSP event_sp; 54138810f43SIlia K ProcessSP process_sp(GetSP()); 542b9c1b51eSKate Stone if (process_sp) { 543b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 544b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 54538810f43SIlia K event_sp = process_sp->GetStopEventForStopID(stop_id); 54638810f43SIlia K sb_event.reset(event_sp); 54738810f43SIlia K } 54838810f43SIlia K 54938810f43SIlia K if (log) 550b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 551b9c1b51eSKate Stone ") => SBEvent(%p)", 552b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), stop_id, 55338810f43SIlia K static_cast<void *>(event_sp.get())); 55438810f43SIlia K 55538810f43SIlia K return sb_event; 55638810f43SIlia K } 55738810f43SIlia K 558b9c1b51eSKate Stone StateType SBProcess::GetState() { 559ceb6b139SCaroline Tice 560ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 561acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 562b9c1b51eSKate Stone if (process_sp) { 563b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 564b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 565acdbe816SGreg Clayton ret_val = process_sp->GetState(); 566af67cecdSGreg Clayton } 567ceb6b139SCaroline Tice 5685160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 569ceb6b139SCaroline Tice if (log) 570cfd1acedSGreg Clayton log->Printf("SBProcess(%p)::GetState () => %s", 571324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 572750cd175SCaroline Tice lldb_private::StateAsCString(ret_val)); 573ceb6b139SCaroline Tice 574ceb6b139SCaroline Tice return ret_val; 57530fdc8d8SChris Lattner } 57630fdc8d8SChris Lattner 577b9c1b51eSKate Stone int SBProcess::GetExitStatus() { 5784838131bSGreg Clayton int exit_status = 0; 579acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 580b9c1b51eSKate Stone if (process_sp) { 581b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 582b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 583acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus(); 584af67cecdSGreg Clayton } 5855160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5864838131bSGreg Clayton if (log) 5874838131bSGreg Clayton log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 588324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), exit_status, 589324a1036SSaleem Abdulrasool exit_status); 5904838131bSGreg Clayton 5914838131bSGreg Clayton return exit_status; 59230fdc8d8SChris Lattner } 59330fdc8d8SChris Lattner 594b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() { 5954838131bSGreg Clayton const char *exit_desc = NULL; 596acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 597b9c1b51eSKate Stone if (process_sp) { 598b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 599b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 600acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription(); 601af67cecdSGreg Clayton } 6025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6034838131bSGreg Clayton if (log) 6044838131bSGreg Clayton log->Printf("SBProcess(%p)::GetExitDescription () => %s", 605324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), exit_desc); 6064838131bSGreg Clayton return exit_desc; 60730fdc8d8SChris Lattner } 60830fdc8d8SChris Lattner 609b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() { 610ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 611acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 612acdbe816SGreg Clayton if (process_sp) 613acdbe816SGreg Clayton ret_val = process_sp->GetID(); 614ceb6b139SCaroline Tice 6155160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 616ceb6b139SCaroline Tice if (log) 617324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64, 618324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), ret_val); 619ceb6b139SCaroline Tice 620ceb6b139SCaroline Tice return ret_val; 62130fdc8d8SChris Lattner } 62230fdc8d8SChris Lattner 623b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() { 624949e8221SGreg Clayton uint32_t ret_val = 0; 625949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 626949e8221SGreg Clayton if (process_sp) 627949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 6285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 629949e8221SGreg Clayton if (log) 630324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32, 631324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), ret_val); 632949e8221SGreg Clayton return ret_val; 633949e8221SGreg Clayton } 634949e8221SGreg Clayton 635b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const { 636cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 637acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 638acdbe816SGreg Clayton if (process_sp) 639acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 640cf386e24SJohnny Chen 6415160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 642cf386e24SJohnny Chen if (log) 643324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetByteOrder () => %d", 644324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), byteOrder); 645cf386e24SJohnny Chen 646cf386e24SJohnny Chen return byteOrder; 647cf386e24SJohnny Chen } 648cf386e24SJohnny Chen 649b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const { 650ceb6b139SCaroline Tice uint32_t size = 0; 651acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 652acdbe816SGreg Clayton if (process_sp) 653acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 654ceb6b139SCaroline Tice 6555160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 656ceb6b139SCaroline Tice if (log) 657324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetAddressByteSize () => %d", 658324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), size); 659ceb6b139SCaroline Tice 660ceb6b139SCaroline Tice return size; 66130fdc8d8SChris Lattner } 66230fdc8d8SChris Lattner 663b9c1b51eSKate Stone SBError SBProcess::Continue() { 6645160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 665ceb6b139SCaroline Tice 66630fdc8d8SChris Lattner SBError sb_error; 667acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 6680c74e78dSGreg Clayton 669acdbe816SGreg Clayton if (log) 670324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::Continue ()...", 671324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 672acdbe816SGreg Clayton 673b9c1b51eSKate Stone if (process_sp) { 674b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 675b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 676acdbe816SGreg Clayton 677dc6224e0SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution()) 678dc6224e0SGreg Clayton sb_error.ref() = process_sp->Resume(); 679dc6224e0SGreg Clayton else 680dc6224e0SGreg Clayton sb_error.ref() = process_sp->ResumeSynchronous(NULL); 681b9c1b51eSKate Stone } else 68230fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 68330fdc8d8SChris Lattner 684b9c1b51eSKate Stone if (log) { 685ceb6b139SCaroline Tice SBStream sstr; 686ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 687324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s", 688324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 689324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 690ceb6b139SCaroline Tice } 691ceb6b139SCaroline Tice 69230fdc8d8SChris Lattner return sb_error; 69330fdc8d8SChris Lattner } 69430fdc8d8SChris Lattner 695b9c1b51eSKate Stone SBError SBProcess::Destroy() { 69630fdc8d8SChris Lattner SBError sb_error; 697acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 698b9c1b51eSKate Stone if (process_sp) { 699b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 700b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 701ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 702b9c1b51eSKate Stone } else 70330fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 70430fdc8d8SChris Lattner 7055160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 706b9c1b51eSKate Stone if (log) { 7074838131bSGreg Clayton SBStream sstr; 7084838131bSGreg Clayton sb_error.GetDescription(sstr); 7096779606aSGreg Clayton log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s", 710324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 711324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 7124838131bSGreg Clayton } 7134838131bSGreg Clayton 71430fdc8d8SChris Lattner return sb_error; 71530fdc8d8SChris Lattner } 71630fdc8d8SChris Lattner 717b9c1b51eSKate Stone SBError SBProcess::Stop() { 71830fdc8d8SChris Lattner SBError sb_error; 719acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 720b9c1b51eSKate Stone if (process_sp) { 721b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 722b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 723acdbe816SGreg Clayton sb_error.SetError(process_sp->Halt()); 724b9c1b51eSKate Stone } else 72530fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 726ceb6b139SCaroline Tice 7275160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 728b9c1b51eSKate Stone if (log) { 729ceb6b139SCaroline Tice SBStream sstr; 730ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 73193aa84e8SGreg Clayton log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s", 732324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 733324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 734ceb6b139SCaroline Tice } 735ceb6b139SCaroline Tice 73630fdc8d8SChris Lattner return sb_error; 73730fdc8d8SChris Lattner } 73830fdc8d8SChris Lattner 739b9c1b51eSKate Stone SBError SBProcess::Kill() { 74030fdc8d8SChris Lattner SBError sb_error; 741acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 742b9c1b51eSKate Stone if (process_sp) { 743b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 744b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 745ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(true)); 746b9c1b51eSKate Stone } else 74730fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 748ceb6b139SCaroline Tice 7495160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 750b9c1b51eSKate Stone if (log) { 751ceb6b139SCaroline Tice SBStream sstr; 752ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 75393aa84e8SGreg Clayton log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s", 754324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 755324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 756ceb6b139SCaroline Tice } 757ceb6b139SCaroline Tice 75830fdc8d8SChris Lattner return sb_error; 75930fdc8d8SChris Lattner } 76030fdc8d8SChris Lattner 761b9c1b51eSKate Stone SBError SBProcess::Detach() { 762acff8950SJim Ingham // FIXME: This should come from a process default. 763acff8950SJim Ingham bool keep_stopped = false; 764acff8950SJim Ingham return Detach(keep_stopped); 765acff8950SJim Ingham } 766acff8950SJim Ingham 767b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) { 76830fdc8d8SChris Lattner SBError sb_error; 769acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 770b9c1b51eSKate Stone if (process_sp) { 771b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 772b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 773acff8950SJim Ingham sb_error.SetError(process_sp->Detach(keep_stopped)); 774b9c1b51eSKate Stone } else 77530fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 77630fdc8d8SChris Lattner 77730fdc8d8SChris Lattner return sb_error; 77830fdc8d8SChris Lattner } 77930fdc8d8SChris Lattner 780b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) { 78130fdc8d8SChris Lattner SBError sb_error; 782acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 783b9c1b51eSKate Stone if (process_sp) { 784b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 785b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 786acdbe816SGreg Clayton sb_error.SetError(process_sp->Signal(signo)); 787b9c1b51eSKate Stone } else 78830fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 7895160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 790b9c1b51eSKate Stone if (log) { 7914838131bSGreg Clayton SBStream sstr; 7924838131bSGreg Clayton sb_error.GetDescription(sstr); 7934838131bSGreg Clayton log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 794324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), signo, 795324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 7964838131bSGreg Clayton } 79730fdc8d8SChris Lattner return sb_error; 79830fdc8d8SChris Lattner } 79930fdc8d8SChris Lattner 800b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() { 80198d0a4b3SChaoren Lin if (auto process_sp = GetSP()) 80298d0a4b3SChaoren Lin return SBUnixSignals{process_sp}; 803802dc402STodd Fiala 80498d0a4b3SChaoren Lin return {}; 805802dc402STodd Fiala } 806802dc402STodd Fiala 807b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() { 808cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 809b9c1b51eSKate Stone if (process_sp) { 810cfc0935eSJim Ingham process_sp->SendAsyncInterrupt(); 811cfc0935eSJim Ingham } 812cfc0935eSJim Ingham } 813cfc0935eSJim Ingham 814b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) { 8154838131bSGreg Clayton SBThread sb_thread; 81617a6ad05SGreg Clayton ThreadSP thread_sp; 817acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 818b9c1b51eSKate Stone if (process_sp) { 8197fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8207fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 821b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 822b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 8237fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update); 82417a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 825af67cecdSGreg Clayton } 8264838131bSGreg Clayton 8275160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 8284838131bSGreg Clayton if (log) 829b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 830b9c1b51eSKate Stone ") => SBThread (%p)", 831324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, 832324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 8334838131bSGreg Clayton 8344838131bSGreg Clayton return sb_thread; 83530fdc8d8SChris Lattner } 83630fdc8d8SChris Lattner 837b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) { 83818b46896SJim Ingham SBThread sb_thread; 83918b46896SJim Ingham ThreadSP thread_sp; 84018b46896SJim Ingham ProcessSP process_sp(GetSP()); 841b9c1b51eSKate Stone if (process_sp) { 84218b46896SJim Ingham Process::StopLocker stop_locker; 84318b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 844b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 845b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 846b9c1b51eSKate Stone thread_sp = 847b9c1b51eSKate Stone process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update); 84818b46896SJim Ingham sb_thread.SetThread(thread_sp); 84918b46896SJim Ingham } 85018b46896SJim Ingham 8515160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 85218b46896SJim Ingham if (log) 85318b46896SJim Ingham log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 854324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), index_id, 855324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 85618b46896SJim Ingham 85718b46896SJim Ingham return sb_thread; 85818b46896SJim Ingham } 85918b46896SJim Ingham 860b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) { 8615160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 862ceb6b139SCaroline Tice 863ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get()); 864ceb6b139SCaroline Tice 865ceb6b139SCaroline Tice if (log) 866324a1036SSaleem Abdulrasool log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s", 867324a1036SSaleem Abdulrasool static_cast<void *>(event.get()), 868750cd175SCaroline Tice lldb_private::StateAsCString(ret_val)); 869ceb6b139SCaroline Tice 870ceb6b139SCaroline Tice return ret_val; 87130fdc8d8SChris Lattner } 87230fdc8d8SChris Lattner 873b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) { 874ea2cc5e0SPavel Labath Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 875ea2cc5e0SPavel Labath 876ea2cc5e0SPavel Labath bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get()); 877ea2cc5e0SPavel Labath 878ea2cc5e0SPavel Labath if (log) 879400e1809SHans Wennborg log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__, 880400e1809SHans Wennborg static_cast<void *>(event.get()), ret_val); 881ea2cc5e0SPavel Labath 882ea2cc5e0SPavel Labath return ret_val; 88330fdc8d8SChris Lattner } 88430fdc8d8SChris Lattner 885b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) { 8860161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 8870161b49cSJim Ingham } 8880161b49cSJim Ingham 8890161b49cSJim Ingham const char * 890b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event, 891b9c1b51eSKate Stone size_t idx) { 8920161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 8930161b49cSJim Ingham } 8940161b49cSJim Ingham 895b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) { 89675930019STodd Fiala ProcessSP process_sp = 89775930019STodd Fiala Process::ProcessEventData::GetProcessFromEvent(event.get()); 898b9c1b51eSKate Stone if (!process_sp) { 89905097246SAdrian Prantl // StructuredData events also know the process they come from. Try that. 90075930019STodd Fiala process_sp = EventDataStructuredData::GetProcessFromEvent(event.get()); 90175930019STodd Fiala } 90275930019STodd Fiala 90375930019STodd Fiala return SBProcess(process_sp); 90430fdc8d8SChris Lattner } 90530fdc8d8SChris Lattner 906b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) { 90706d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 90806d2855fSIlia K } 90906d2855fSIlia K 91075930019STodd Fiala lldb::SBStructuredData 911b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) { 91275930019STodd Fiala return SBStructuredData(event.GetSP()); 91375930019STodd Fiala } 91475930019STodd Fiala 915b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) { 91675930019STodd Fiala return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) && 91775930019STodd Fiala !EventIsStructuredDataEvent(event); 91875930019STodd Fiala } 91975930019STodd Fiala 920b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) { 92175930019STodd Fiala EventSP event_sp = event.GetSP(); 92275930019STodd Fiala EventData *event_data = event_sp ? event_sp->GetData() : nullptr; 923b9c1b51eSKate Stone return event_data && (event_data->GetFlavor() == 924b9c1b51eSKate Stone EventDataStructuredData::GetFlavorString()); 925e6bc6cb9SJim Ingham } 92630fdc8d8SChris Lattner 927b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const { 9285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 929ceb6b139SCaroline Tice 930acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 931acdbe816SGreg Clayton 932acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 933ceb6b139SCaroline Tice 934ceb6b139SCaroline Tice if (log) 935324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", 936324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 937324a1036SSaleem Abdulrasool static_cast<void *>(broadcaster.get())); 938ceb6b139SCaroline Tice 93930fdc8d8SChris Lattner return broadcaster; 94030fdc8d8SChris Lattner } 94130fdc8d8SChris Lattner 942b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() { 9434bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 9444bddaeb5SJim Ingham } 9454bddaeb5SJim Ingham 946b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len, 947b9c1b51eSKate Stone SBError &sb_error) { 9485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 949ceb6b139SCaroline Tice 95030fdc8d8SChris Lattner size_t bytes_read = 0; 95130fdc8d8SChris Lattner 952acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 953acdbe816SGreg Clayton 9544838131bSGreg Clayton if (log) 955b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 956b9c1b51eSKate Stone ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 957324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 958324a1036SSaleem Abdulrasool static_cast<void *>(dst), static_cast<uint64_t>(dst_len), 959324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 9604838131bSGreg Clayton 961b9c1b51eSKate Stone if (process_sp) { 9627fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 963b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 964b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 965b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 9667fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref()); 967b9c1b51eSKate Stone } else { 968c9858e4dSGreg Clayton if (log) 969324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::ReadMemory() => error: process is running", 970324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 9717fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9727fdf9ef1SGreg Clayton } 973b9c1b51eSKate Stone } else { 97430fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 97530fdc8d8SChris Lattner } 97630fdc8d8SChris Lattner 977b9c1b51eSKate Stone if (log) { 97893aa84e8SGreg Clayton SBStream sstr; 97993aa84e8SGreg Clayton sb_error.GetDescription(sstr); 980b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 981b9c1b51eSKate Stone ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 982324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 983324a1036SSaleem Abdulrasool static_cast<void *>(dst), static_cast<uint64_t>(dst_len), 984324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData(), 985324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 98693aa84e8SGreg Clayton } 987ceb6b139SCaroline Tice 98830fdc8d8SChris Lattner return bytes_read; 98930fdc8d8SChris Lattner } 99030fdc8d8SChris Lattner 991b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size, 992b9c1b51eSKate Stone lldb::SBError &sb_error) { 993e91b7957SGreg Clayton size_t bytes_read = 0; 994acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 995b9c1b51eSKate Stone if (process_sp) { 9967fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 997b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 998b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 999b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1000b9c1b51eSKate Stone bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size, 1001b9c1b51eSKate Stone sb_error.ref()); 1002b9c1b51eSKate Stone } else { 10035160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1004c9858e4dSGreg Clayton if (log) 1005b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process " 1006b9c1b51eSKate Stone "is running", 1007324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10087fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10097fdf9ef1SGreg Clayton } 1010b9c1b51eSKate Stone } else { 1011e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1012e91b7957SGreg Clayton } 1013e91b7957SGreg Clayton return bytes_read; 1014e91b7957SGreg Clayton } 1015e91b7957SGreg Clayton 1016b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size, 1017b9c1b51eSKate Stone lldb::SBError &sb_error) { 10187fdf9ef1SGreg Clayton uint64_t value = 0; 1019acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1020b9c1b51eSKate Stone if (process_sp) { 10217fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1022b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1023b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1024b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1025b9c1b51eSKate Stone value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0, 1026b9c1b51eSKate Stone sb_error.ref()); 1027b9c1b51eSKate Stone } else { 10285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1029c9858e4dSGreg Clayton if (log) 1030b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process " 1031b9c1b51eSKate Stone "is running", 1032324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10337fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10347fdf9ef1SGreg Clayton } 1035b9c1b51eSKate Stone } else { 1036e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1037e91b7957SGreg Clayton } 10387fdf9ef1SGreg Clayton return value; 1039e91b7957SGreg Clayton } 1040e91b7957SGreg Clayton 1041b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr, 1042b9c1b51eSKate Stone lldb::SBError &sb_error) { 1043e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1044acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1045b9c1b51eSKate Stone if (process_sp) { 10467fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1047b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1048b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1049b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 10507fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref()); 1051b9c1b51eSKate Stone } else { 10525160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1053c9858e4dSGreg Clayton if (log) 1054b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process " 1055b9c1b51eSKate Stone "is running", 1056324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10577fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10587fdf9ef1SGreg Clayton } 1059b9c1b51eSKate Stone } else { 1060e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1061e91b7957SGreg Clayton } 1062e91b7957SGreg Clayton return ptr; 1063e91b7957SGreg Clayton } 1064e91b7957SGreg Clayton 1065b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len, 1066b9c1b51eSKate Stone SBError &sb_error) { 106730fdc8d8SChris Lattner size_t bytes_written = 0; 106830fdc8d8SChris Lattner 10695160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1070acdbe816SGreg Clayton 1071acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1072acdbe816SGreg Clayton 10734838131bSGreg Clayton if (log) 1074b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1075b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1076324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1077b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1078324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 10794838131bSGreg Clayton 1080b9c1b51eSKate Stone if (process_sp) { 10817fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1082b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1083b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1084b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1085b9c1b51eSKate Stone bytes_written = 1086b9c1b51eSKate Stone process_sp->WriteMemory(addr, src, src_len, sb_error.ref()); 1087b9c1b51eSKate Stone } else { 1088c9858e4dSGreg Clayton if (log) 1089324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::WriteMemory() => error: process is running", 1090324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10917fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10927fdf9ef1SGreg Clayton } 109330fdc8d8SChris Lattner } 109430fdc8d8SChris Lattner 1095b9c1b51eSKate Stone if (log) { 10964838131bSGreg Clayton SBStream sstr; 10974838131bSGreg Clayton sb_error.GetDescription(sstr); 1098b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1099b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1100324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1101b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1102324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData(), 1103324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_written)); 11044838131bSGreg Clayton } 11054838131bSGreg Clayton 110630fdc8d8SChris Lattner return bytes_written; 110730fdc8d8SChris Lattner } 110830fdc8d8SChris Lattner 1109b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) { 1110da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1111da7bc7d0SGreg Clayton 1112acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1113b9c1b51eSKate Stone if (process_sp) { 1114dde9cff3SCaroline Tice char path[PATH_MAX]; 1115dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath(path, sizeof(path)); 1116acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 11171d273166SGreg Clayton const char *exe_name = NULL; 11181d273166SGreg Clayton if (exe_module) 11191d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 11201d273166SGreg Clayton 1121d01b2953SDaniel Malea strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1122b9c1b51eSKate Stone process_sp->GetID(), lldb_private::StateAsCString(GetState()), 1123b9c1b51eSKate Stone GetNumThreads(), exe_name ? ", executable = " : "", 11241d273166SGreg Clayton exe_name ? exe_name : ""); 1125b9c1b51eSKate Stone } else 1126da7bc7d0SGreg Clayton strm.PutCString("No value"); 1127dde9cff3SCaroline Tice 1128dde9cff3SCaroline Tice return true; 1129dde9cff3SCaroline Tice } 11308f343b09SGreg Clayton 11318f343b09SGreg Clayton uint32_t 1132b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const { 11335160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1134f9ef60d2SJohnny Chen 1135f9ef60d2SJohnny Chen uint32_t num = 0; 1136f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1137b9c1b51eSKate Stone if (process_sp) { 1138b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1139b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1140f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo(num)); 1141f9ef60d2SJohnny Chen if (log) 1142f9ef60d2SJohnny Chen log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1143324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num); 1144b9c1b51eSKate Stone } else { 1145f9ef60d2SJohnny Chen sb_error.SetErrorString("SBProcess is invalid"); 1146f9ef60d2SJohnny Chen } 1147f9ef60d2SJohnny Chen return num; 1148f9ef60d2SJohnny Chen } 1149f9ef60d2SJohnny Chen 1150b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec, 1151b9c1b51eSKate Stone lldb::SBError &sb_error) { 11524fbd67acSTamas Berghammer return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); 11534fbd67acSTamas Berghammer } 11544fbd67acSTamas Berghammer 1155b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec, 11564fbd67acSTamas Berghammer const lldb::SBFileSpec &sb_remote_image_spec, 1157b9c1b51eSKate Stone lldb::SBError &sb_error) { 1158abc5d72fSJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1159acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1160b9c1b51eSKate Stone if (process_sp) { 11617fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1162b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1163abc5d72fSJim Ingham if (log) 1164abc5d72fSJim Ingham log->Printf("SBProcess(%p)::LoadImage() => calling Platform::LoadImage" 1165abc5d72fSJim Ingham "for: %s", 1166abc5d72fSJim Ingham static_cast<void *>(process_sp.get()), 1167abc5d72fSJim Ingham sb_local_image_spec.GetFilename()); 1168abc5d72fSJim Ingham 1169b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1170b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 11713cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1172b9c1b51eSKate Stone return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec, 1173b9c1b51eSKate Stone *sb_remote_image_spec, sb_error.ref()); 1174b9c1b51eSKate Stone } else { 1175c9858e4dSGreg Clayton if (log) 1176324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::LoadImage() => error: process is running", 1177324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 11787fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11797fdf9ef1SGreg Clayton } 1180abc5d72fSJim Ingham } else { 1181abc5d72fSJim Ingham if (log) 1182abc5d72fSJim Ingham log->Printf("SBProcess(%p)::LoadImage() => error: called with invalid" 1183abc5d72fSJim Ingham " process", 1184abc5d72fSJim Ingham static_cast<void *>(process_sp.get())); 1185abc5d72fSJim Ingham sb_error.SetErrorString("process is invalid"); 11867fdf9ef1SGreg Clayton } 11878f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11888f343b09SGreg Clayton } 11898f343b09SGreg Clayton 1190*0d231f71SJim Ingham uint32_t SBProcess::LoadImageUsingPaths(const lldb::SBFileSpec &image_spec, 1191*0d231f71SJim Ingham SBStringList &paths, 1192*0d231f71SJim Ingham lldb::SBFileSpec &loaded_path, 1193*0d231f71SJim Ingham lldb::SBError &error) { 1194*0d231f71SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1195*0d231f71SJim Ingham ProcessSP process_sp(GetSP()); 1196*0d231f71SJim Ingham if (process_sp) { 1197*0d231f71SJim Ingham Process::StopLocker stop_locker; 1198*0d231f71SJim Ingham if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1199*0d231f71SJim Ingham if (log) 1200*0d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => " 1201*0d231f71SJim Ingham "calling Platform::LoadImageUsingPaths for: %s", 1202*0d231f71SJim Ingham static_cast<void *>(process_sp.get()), 1203*0d231f71SJim Ingham image_spec.GetFilename()); 1204*0d231f71SJim Ingham 1205*0d231f71SJim Ingham std::lock_guard<std::recursive_mutex> guard( 1206*0d231f71SJim Ingham process_sp->GetTarget().GetAPIMutex()); 1207*0d231f71SJim Ingham PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1208*0d231f71SJim Ingham size_t num_paths = paths.GetSize(); 1209*0d231f71SJim Ingham std::vector<std::string> paths_vec; 1210*0d231f71SJim Ingham paths_vec.reserve(num_paths); 1211*0d231f71SJim Ingham for (size_t i = 0; i < num_paths; i++) 1212*0d231f71SJim Ingham paths_vec.push_back(paths.GetStringAtIndex(i)); 1213*0d231f71SJim Ingham FileSpec loaded_spec; 1214*0d231f71SJim Ingham 1215*0d231f71SJim Ingham uint32_t token = platform_sp->LoadImageUsingPaths(process_sp.get(), 1216*0d231f71SJim Ingham *image_spec, 1217*0d231f71SJim Ingham paths_vec, 1218*0d231f71SJim Ingham error.ref(), 1219*0d231f71SJim Ingham &loaded_spec); 1220*0d231f71SJim Ingham if (token != LLDB_INVALID_IMAGE_TOKEN) 1221*0d231f71SJim Ingham loaded_path = loaded_spec; 1222*0d231f71SJim Ingham return token; 1223*0d231f71SJim Ingham } else { 1224*0d231f71SJim Ingham if (log) 1225*0d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: " 1226*0d231f71SJim Ingham "process is running", 1227*0d231f71SJim Ingham static_cast<void *>(process_sp.get())); 1228*0d231f71SJim Ingham error.SetErrorString("process is running"); 1229*0d231f71SJim Ingham } 1230*0d231f71SJim Ingham } else { 1231*0d231f71SJim Ingham if (log) 1232*0d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: " 1233*0d231f71SJim Ingham "called with invalid process", 1234*0d231f71SJim Ingham static_cast<void *>(process_sp.get())); 1235*0d231f71SJim Ingham error.SetErrorString("process is invalid"); 1236*0d231f71SJim Ingham } 1237*0d231f71SJim Ingham 1238*0d231f71SJim Ingham return LLDB_INVALID_IMAGE_TOKEN; 1239*0d231f71SJim Ingham } 1240*0d231f71SJim Ingham 1241b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) { 12428f343b09SGreg Clayton lldb::SBError sb_error; 1243acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1244b9c1b51eSKate Stone if (process_sp) { 12457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1246b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1247b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1248b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 12493cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1250b9c1b51eSKate Stone sb_error.SetError( 1251b9c1b51eSKate Stone platform_sp->UnloadImage(process_sp.get(), image_token)); 1252b9c1b51eSKate Stone } else { 12535160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1254c9858e4dSGreg Clayton if (log) 1255324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::UnloadImage() => error: process is running", 1256324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 12577fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12587fdf9ef1SGreg Clayton } 1259b9c1b51eSKate Stone } else 12608f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 12618f343b09SGreg Clayton return sb_error; 12628f343b09SGreg Clayton } 12638c71337aSJason Molenda 1264b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) { 1265a332978bSJason Molenda lldb::SBError sb_error; 1266a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1267b9c1b51eSKate Stone if (process_sp) { 1268a332978bSJason Molenda Process::StopLocker stop_locker; 1269b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1270b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1271b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1272a332978bSJason Molenda sb_error.SetError(process_sp->SendEventData(event_data)); 1273b9c1b51eSKate Stone } else { 1274a332978bSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1275a332978bSJason Molenda if (log) 1276b9c1b51eSKate Stone log->Printf( 1277b9c1b51eSKate Stone "SBProcess(%p)::SendEventData() => error: process is running", 1278324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 1279a332978bSJason Molenda sb_error.SetErrorString("process is running"); 1280a332978bSJason Molenda } 1281b9c1b51eSKate Stone } else 1282a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1283a332978bSJason Molenda return sb_error; 1284a332978bSJason Molenda } 1285a332978bSJason Molenda 1286b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() { 12878c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1288b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 12898c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 129095d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 12918c71337aSJason Molenda } 12928c71337aSJason Molenda return 0; 12938c71337aSJason Molenda } 12948c71337aSJason Molenda 1295b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) { 12968c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1297b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 12988c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1299b9c1b51eSKate Stone const std::vector<ConstString> &names = 1300b9c1b51eSKate Stone runtime->GetExtendedBacktraceTypes(); 1301b9c1b51eSKate Stone if (idx < names.size()) { 13028c71337aSJason Molenda return names[idx].AsCString(); 1303b9c1b51eSKate Stone } else { 13048c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 13058c71337aSJason Molenda if (log) 1306b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => " 1307b9c1b51eSKate Stone "error: requested extended backtrace name out of bounds", 1308324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 13098c71337aSJason Molenda } 13108c71337aSJason Molenda } 13118c71337aSJason Molenda return NULL; 13128c71337aSJason Molenda } 1313a51ea382SKuba Brecka 1314b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) { 1315a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1316a51ea382SKuba Brecka SBThreadCollection threads; 1317b9c1b51eSKate Stone if (process_sp) { 1318a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1319a51ea382SKuba Brecka } 1320a51ea382SKuba Brecka return threads; 1321a51ea382SKuba Brecka } 132263927548SKuba Brecka 1323b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent( 1324b9c1b51eSKate Stone InstrumentationRuntimeType type) { 132563927548SKuba Brecka ProcessSP process_sp(GetSP()); 132663927548SKuba Brecka if (!process_sp) 132763927548SKuba Brecka return false; 132863927548SKuba Brecka 1329b9c1b51eSKate Stone InstrumentationRuntimeSP runtime_sp = 1330b9c1b51eSKate Stone process_sp->GetInstrumentationRuntime(type); 133163927548SKuba Brecka 133263927548SKuba Brecka if (!runtime_sp.get()) 133363927548SKuba Brecka return false; 133463927548SKuba Brecka 133563927548SKuba Brecka return runtime_sp->IsActive(); 133663927548SKuba Brecka } 1337f7d1893fSAdrian McCarthy 1338b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) { 1339f7d1893fSAdrian McCarthy lldb::SBError error; 1340f7d1893fSAdrian McCarthy ProcessSP process_sp(GetSP()); 1341b9c1b51eSKate Stone if (!process_sp) { 1342f7d1893fSAdrian McCarthy error.SetErrorString("SBProcess is invalid"); 1343f7d1893fSAdrian McCarthy return error; 1344f7d1893fSAdrian McCarthy } 1345f7d1893fSAdrian McCarthy 1346b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1347b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1348f7d1893fSAdrian McCarthy 1349b9c1b51eSKate Stone if (process_sp->GetState() != eStateStopped) { 1350f7d1893fSAdrian McCarthy error.SetErrorString("the process is not stopped"); 1351f7d1893fSAdrian McCarthy return error; 1352f7d1893fSAdrian McCarthy } 1353f7d1893fSAdrian McCarthy 1354f7d1893fSAdrian McCarthy FileSpec core_file(file_name, false); 1355f7d1893fSAdrian McCarthy error.ref() = PluginManager::SaveCore(process_sp, core_file); 1356f7d1893fSAdrian McCarthy return error; 1357f7d1893fSAdrian McCarthy } 135826036843SHoward Hellyer 135926036843SHoward Hellyer lldb::SBError 1360b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr, 1361b9c1b51eSKate Stone SBMemoryRegionInfo &sb_region_info) { 136226036843SHoward Hellyer lldb::SBError sb_error; 136326036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1364b9c1b51eSKate Stone MemoryRegionInfoSP region_info_sp = 1365b9c1b51eSKate Stone std::make_shared<lldb_private::MemoryRegionInfo>(); 1366b9c1b51eSKate Stone if (process_sp) { 136726036843SHoward Hellyer Process::StopLocker stop_locker; 1368b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1369b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1370b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1371b9c1b51eSKate Stone sb_error.ref() = 1372b9c1b51eSKate Stone process_sp->GetMemoryRegionInfo(load_addr, *region_info_sp); 137326036843SHoward Hellyer if (sb_error.Success()) { 137426036843SHoward Hellyer sb_region_info.ref() = *region_info_sp; 137526036843SHoward Hellyer } 1376b9c1b51eSKate Stone } else { 137726036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 137826036843SHoward Hellyer if (log) 1379b9c1b51eSKate Stone log->Printf( 1380b9c1b51eSKate Stone "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 138126036843SHoward Hellyer static_cast<void *>(process_sp.get())); 138226036843SHoward Hellyer sb_error.SetErrorString("process is running"); 138326036843SHoward Hellyer } 1384b9c1b51eSKate Stone } else { 138526036843SHoward Hellyer sb_error.SetErrorString("SBProcess is invalid"); 138626036843SHoward Hellyer } 138726036843SHoward Hellyer return sb_error; 138826036843SHoward Hellyer } 138926036843SHoward Hellyer 1390b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() { 139126036843SHoward Hellyer lldb::SBError sb_error; 139226036843SHoward Hellyer lldb::SBMemoryRegionInfoList sb_region_list; 139326036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1394b9c1b51eSKate Stone if (process_sp) { 139526036843SHoward Hellyer Process::StopLocker stop_locker; 1396b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1397b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1398b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 139926036843SHoward Hellyer std::vector<MemoryRegionInfoSP> region_list; 140026036843SHoward Hellyer sb_error.ref() = process_sp->GetMemoryRegions(region_list); 140126036843SHoward Hellyer if (sb_error.Success()) { 140226036843SHoward Hellyer std::vector<MemoryRegionInfoSP>::iterator end = region_list.end(); 1403b9c1b51eSKate Stone for (std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin(); 1404b9c1b51eSKate Stone it != end; it++) { 140526036843SHoward Hellyer SBMemoryRegionInfo sb_region_info(it->get()); 140626036843SHoward Hellyer sb_region_list.Append(sb_region_info); 140726036843SHoward Hellyer } 140826036843SHoward Hellyer } 1409b9c1b51eSKate Stone } else { 141026036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 141126036843SHoward Hellyer if (log) 1412b9c1b51eSKate Stone log->Printf( 1413b9c1b51eSKate Stone "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 141426036843SHoward Hellyer static_cast<void *>(process_sp.get())); 141526036843SHoward Hellyer sb_error.SetErrorString("process is running"); 141626036843SHoward Hellyer } 1417b9c1b51eSKate Stone } else { 141826036843SHoward Hellyer sb_error.SetErrorString("SBProcess is invalid"); 141926036843SHoward Hellyer } 142026036843SHoward Hellyer return sb_region_list; 142126036843SHoward Hellyer } 1422141a6263SVadim Macagon 1423141a6263SVadim Macagon lldb::SBProcessInfo SBProcess::GetProcessInfo() { 1424141a6263SVadim Macagon lldb::SBProcessInfo sb_proc_info; 1425141a6263SVadim Macagon ProcessSP process_sp(GetSP()); 1426141a6263SVadim Macagon ProcessInstanceInfo proc_info; 1427141a6263SVadim Macagon if (process_sp && process_sp->GetProcessInfo(proc_info)) { 1428141a6263SVadim Macagon sb_proc_info.SetProcessInfo(proc_info); 1429141a6263SVadim Macagon } 1430141a6263SVadim Macagon return sb_proc_info; 1431141a6263SVadim Macagon } 1432