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/StreamFile.h" 2226036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h" 2330fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2430fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 258c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h" 266611103cSGreg Clayton #include "lldb/Target/Target.h" 276611103cSGreg Clayton #include "lldb/Target/Thread.h" 28145d95c9SPavel Labath #include "lldb/Utility/Args.h" 296f9e6901SZachary Turner #include "lldb/Utility/Log.h" 30d821c997SPavel Labath #include "lldb/Utility/State.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; 133*8f3be7a3SJonas Devlieghere ProcessLaunchInfo launch_info(FileSpec(stdin_path), FileSpec(stdout_path), 134*8f3be7a3SJonas Devlieghere FileSpec(stderr_path), 135*8f3be7a3SJonas Devlieghere FileSpec(working_directory), launch_flags); 136acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 137982c9762SGreg Clayton if (exe_module) 13814715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 139982c9762SGreg Clayton if (argv) 140982c9762SGreg Clayton launch_info.GetArguments().AppendArguments(argv); 141982c9762SGreg Clayton if (envp) 14262930e57SPavel Labath launch_info.GetEnvironment() = Environment(envp); 143acdbe816SGreg Clayton error.SetError(process_sp->Launch(launch_info)); 144b9c1b51eSKate Stone } else { 1459631aae2SJames McIlree error.SetErrorString("must be in eStateConnected to call RemoteLaunch"); 1469631aae2SJames McIlree } 147b9c1b51eSKate Stone } else { 1489631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 1499631aae2SJames McIlree } 1509631aae2SJames McIlree 1519631aae2SJames McIlree if (log) { 1529631aae2SJames McIlree SBStream sstr; 1539631aae2SJames McIlree error.GetDescription(sstr); 154324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", 155324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 156324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), sstr.GetData()); 1579631aae2SJames McIlree } 1589631aae2SJames McIlree 1599631aae2SJames McIlree return error.Success(); 1609631aae2SJames McIlree } 1619631aae2SJames McIlree 162b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid, 163b9c1b51eSKate Stone lldb::SBError &error) { 164acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 165b9c1b51eSKate Stone if (process_sp) { 166b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 167b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 168b9c1b51eSKate Stone if (process_sp->GetState() == eStateConnected) { 169144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 170144f3a9cSGreg Clayton attach_info.SetProcessID(pid); 171acdbe816SGreg Clayton error.SetError(process_sp->Attach(attach_info)); 172b9c1b51eSKate Stone } else { 173b9c1b51eSKate Stone error.SetErrorString( 174b9c1b51eSKate Stone "must be in eStateConnected to call RemoteAttachToProcessWithID"); 1759631aae2SJames McIlree } 176b9c1b51eSKate Stone } else { 1779631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 1789631aae2SJames McIlree } 1799631aae2SJames McIlree 1805160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1819631aae2SJames McIlree if (log) { 1829631aae2SJames McIlree SBStream sstr; 1839631aae2SJames McIlree error.GetDescription(sstr); 184b9c1b51eSKate Stone log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 185b9c1b51eSKate Stone ") => SBError (%p): %s", 186324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), pid, 187324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), sstr.GetData()); 1889631aae2SJames McIlree } 1899631aae2SJames McIlree 1909631aae2SJames McIlree return error.Success(); 1919631aae2SJames McIlree } 1929631aae2SJames McIlree 193b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() { 1945160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 195ceb6b139SCaroline Tice 196ceb6b139SCaroline Tice uint32_t num_threads = 0; 197acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 198b9c1b51eSKate Stone if (process_sp) { 1997fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2007fdf9ef1SGreg Clayton 2017fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 202b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 203b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 204acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 20530fdc8d8SChris Lattner } 206ceb6b139SCaroline Tice 207ceb6b139SCaroline Tice if (log) 208324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetNumThreads () => %d", 209324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num_threads); 210ceb6b139SCaroline Tice 211ceb6b139SCaroline Tice return num_threads; 21230fdc8d8SChris Lattner } 21330fdc8d8SChris Lattner 214b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const { 2155160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 216ceb6b139SCaroline Tice 21730fdc8d8SChris Lattner SBThread sb_thread; 21817a6ad05SGreg Clayton ThreadSP thread_sp; 219acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 220b9c1b51eSKate Stone if (process_sp) { 221b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 222b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 223acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 22417a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 225af67cecdSGreg Clayton } 226ceb6b139SCaroline Tice 227ceb6b139SCaroline Tice if (log) 228324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", 229324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 230324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 231ceb6b139SCaroline Tice 23230fdc8d8SChris Lattner return sb_thread; 23330fdc8d8SChris Lattner } 23430fdc8d8SChris Lattner 235b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid, 236b9c1b51eSKate Stone lldb::addr_t context) { 2375160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 238a4d8747dSGreg Clayton 239a4d8747dSGreg Clayton SBThread sb_thread; 240a4d8747dSGreg Clayton ThreadSP thread_sp; 241a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 242b9c1b51eSKate Stone if (process_sp) { 243b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 244b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 245a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 246a4d8747dSGreg Clayton sb_thread.SetThread(thread_sp); 247a4d8747dSGreg Clayton } 248a4d8747dSGreg Clayton 249a4d8747dSGreg Clayton if (log) 250b9c1b51eSKate Stone log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 251b9c1b51eSKate Stone ", context=0x%" PRIx64 ") => SBThread(%p)", 252324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, context, 253324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 254a4d8747dSGreg Clayton 255a4d8747dSGreg Clayton return sb_thread; 256a4d8747dSGreg Clayton } 257a4d8747dSGreg Clayton 258b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const { 2595160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 260ceb6b139SCaroline Tice 26130fdc8d8SChris Lattner SBTarget sb_target; 262b9556accSGreg Clayton TargetSP target_sp; 263acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 264b9c1b51eSKate Stone if (process_sp) { 265acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 266b9556accSGreg Clayton sb_target.SetSP(target_sp); 267b9556accSGreg Clayton } 268ceb6b139SCaroline Tice 269ceb6b139SCaroline Tice if (log) 270324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)", 271324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 272324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get())); 273ceb6b139SCaroline Tice 27430fdc8d8SChris Lattner return sb_target; 27530fdc8d8SChris Lattner } 27630fdc8d8SChris Lattner 277b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) { 2785160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 279ceb6b139SCaroline Tice 280ceb6b139SCaroline Tice size_t ret_val = 0; 281acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 282b9c1b51eSKate Stone if (process_sp) { 28397206d57SZachary Turner Status error; 284acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN(src, src_len, error); 28530fdc8d8SChris Lattner } 286ceb6b139SCaroline Tice 287ceb6b139SCaroline Tice if (log) 288b9c1b51eSKate Stone log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 289b9c1b51eSKate Stone ") => %" PRIu64, 290324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), src, 291b9c1b51eSKate Stone static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val)); 292ceb6b139SCaroline Tice 293ceb6b139SCaroline Tice return ret_val; 29430fdc8d8SChris Lattner } 29530fdc8d8SChris Lattner 296b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const { 297cfd1acedSGreg Clayton size_t bytes_read = 0; 298acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 299b9c1b51eSKate Stone if (process_sp) { 30097206d57SZachary Turner Status error; 301acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT(dst, dst_len, error); 30230fdc8d8SChris Lattner } 303ceb6b139SCaroline Tice 3045160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 305ceb6b139SCaroline Tice if (log) 306b9c1b51eSKate Stone log->Printf( 307b9c1b51eSKate Stone "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 308b9c1b51eSKate Stone ") => %" PRIu64, 309b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 310b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 311ceb6b139SCaroline Tice 312cfd1acedSGreg Clayton return bytes_read; 31330fdc8d8SChris Lattner } 31430fdc8d8SChris Lattner 315b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const { 316cfd1acedSGreg Clayton size_t bytes_read = 0; 317acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 318b9c1b51eSKate Stone if (process_sp) { 31997206d57SZachary Turner Status error; 320acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR(dst, dst_len, error); 32130fdc8d8SChris Lattner } 322ceb6b139SCaroline Tice 3235160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 324ceb6b139SCaroline Tice if (log) 325b9c1b51eSKate Stone log->Printf( 326b9c1b51eSKate Stone "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 327b9c1b51eSKate Stone ") => %" PRIu64, 328b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 329b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 330ceb6b139SCaroline Tice 331cfd1acedSGreg Clayton return bytes_read; 33230fdc8d8SChris Lattner } 33330fdc8d8SChris Lattner 334b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const { 335ab3b8b22SHan Ming Ong size_t bytes_read = 0; 336ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 337b9c1b51eSKate Stone if (process_sp) { 33897206d57SZachary Turner Status error; 339ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error); 340ab3b8b22SHan Ming Ong } 341ab3b8b22SHan Ming Ong 3425160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 343ab3b8b22SHan Ming Ong if (log) 344b9c1b51eSKate Stone log->Printf( 345b9c1b51eSKate Stone "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 346b9c1b51eSKate Stone ") => %" PRIu64, 347b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 348b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 349ab3b8b22SHan Ming Ong 350ab3b8b22SHan Ming Ong return bytes_read; 351ab3b8b22SHan Ming Ong } 352ab3b8b22SHan Ming Ong 353d5d8d91cSRavitheja Addepally lldb::SBTrace SBProcess::StartTrace(SBTraceOptions &options, 354d5d8d91cSRavitheja Addepally lldb::SBError &error) { 355d5d8d91cSRavitheja Addepally Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 356d5d8d91cSRavitheja Addepally ProcessSP process_sp(GetSP()); 357d5d8d91cSRavitheja Addepally error.Clear(); 358d5d8d91cSRavitheja Addepally SBTrace trace_instance; 359d5d8d91cSRavitheja Addepally trace_instance.SetSP(process_sp); 360d5d8d91cSRavitheja Addepally lldb::user_id_t uid = LLDB_INVALID_UID; 361d5d8d91cSRavitheja Addepally 362d5d8d91cSRavitheja Addepally if (!process_sp) { 363d5d8d91cSRavitheja Addepally error.SetErrorString("invalid process"); 364d5d8d91cSRavitheja Addepally } else { 365e714c4f5SRavitheja Addepally uid = process_sp->StartTrace(*(options.m_traceoptions_sp), error.ref()); 366d5d8d91cSRavitheja Addepally trace_instance.SetTraceUID(uid); 367e714c4f5SRavitheja Addepally LLDB_LOG(log, "SBProcess::returned uid - {0}", uid); 368d5d8d91cSRavitheja Addepally } 369d5d8d91cSRavitheja Addepally return trace_instance; 370d5d8d91cSRavitheja Addepally } 371d5d8d91cSRavitheja Addepally 372b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const { 37330fdc8d8SChris Lattner if (out == NULL) 37430fdc8d8SChris Lattner return; 37530fdc8d8SChris Lattner 376acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 377b9c1b51eSKate Stone if (process_sp) { 37830fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 37930fdc8d8SChris Lattner char message[1024]; 380b9c1b51eSKate Stone int message_len = ::snprintf( 381b9c1b51eSKate Stone message, sizeof(message), "Process %" PRIu64 " %s\n", 382b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 38330fdc8d8SChris Lattner 38430fdc8d8SChris Lattner if (message_len > 0) 38530fdc8d8SChris Lattner ::fwrite(message, 1, message_len, out); 38630fdc8d8SChris Lattner } 38730fdc8d8SChris Lattner } 38830fdc8d8SChris Lattner 389b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event, 390b9c1b51eSKate Stone SBCommandReturnObject &result) { 391acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 392b9c1b51eSKate Stone if (process_sp) { 39330fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 39430fdc8d8SChris Lattner char message[1024]; 395b9c1b51eSKate Stone ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n", 396b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 39730fdc8d8SChris Lattner 39830fdc8d8SChris Lattner result.AppendMessage(message); 39930fdc8d8SChris Lattner } 40030fdc8d8SChris Lattner } 40130fdc8d8SChris Lattner 402b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) { 403acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 404b9c1b51eSKate Stone if (process_sp) { 405b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 406b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 407b9c1b51eSKate Stone return process_sp->GetThreadList().SetSelectedThreadByID( 408b9c1b51eSKate Stone thread.GetThreadID()); 409af67cecdSGreg Clayton } 41030fdc8d8SChris Lattner return false; 41130fdc8d8SChris Lattner } 41230fdc8d8SChris Lattner 413b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) { 4145160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 415ceb6b139SCaroline Tice 416ceb6b139SCaroline Tice bool ret_val = false; 417acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 418b9c1b51eSKate Stone if (process_sp) { 419b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 420b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 421acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid); 422af67cecdSGreg Clayton } 423ceb6b139SCaroline Tice 424ceb6b139SCaroline Tice if (log) 425b9c1b51eSKate Stone log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 426b9c1b51eSKate Stone ") => %s", 427324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, 428324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 429ceb6b139SCaroline Tice 430ceb6b139SCaroline Tice return ret_val; 43130fdc8d8SChris Lattner } 43230fdc8d8SChris Lattner 433b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) { 4345160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 43518b46896SJim Ingham 43618b46896SJim Ingham bool ret_val = false; 43718b46896SJim Ingham ProcessSP process_sp(GetSP()); 438b9c1b51eSKate Stone if (process_sp) { 439b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 440b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 44118b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id); 44218b46896SJim Ingham } 44318b46896SJim Ingham 44418b46896SJim Ingham if (log) 44518b46896SJim Ingham log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 446324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), index_id, 447324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 44818b46896SJim Ingham 44918b46896SJim Ingham return ret_val; 45018b46896SJim Ingham } 45118b46896SJim Ingham 452b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) { 4535160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 454ceb6b139SCaroline Tice 45517a6ad05SGreg Clayton SBThread sb_thread; 45617a6ad05SGreg Clayton ThreadSP thread_sp; 457acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 458b9c1b51eSKate Stone if (process_sp) { 4597fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4607fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 461b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 462b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 4637fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 46417a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 465af67cecdSGreg Clayton } 466ceb6b139SCaroline Tice 467ceb6b139SCaroline Tice if (log) 46893aa84e8SGreg Clayton log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 469324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 470324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 471324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 472ceb6b139SCaroline Tice 47317a6ad05SGreg Clayton return sb_thread; 47430fdc8d8SChris Lattner } 47530fdc8d8SChris Lattner 476b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() { 4775e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4785e8dce4dSJason Molenda 4795e8dce4dSJason Molenda uint32_t num_queues = 0; 4805e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 481b9c1b51eSKate Stone if (process_sp) { 4825e8dce4dSJason Molenda Process::StopLocker stop_locker; 483b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 484b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 485b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 4865e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 4875e8dce4dSJason Molenda } 488a61d0a5bSGreg Clayton } 4895e8dce4dSJason Molenda 4905e8dce4dSJason Molenda if (log) 491324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetNumQueues () => %d", 492324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num_queues); 4935e8dce4dSJason Molenda 4945e8dce4dSJason Molenda return num_queues; 4955e8dce4dSJason Molenda } 4965e8dce4dSJason Molenda 497b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) { 4985e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4995e8dce4dSJason Molenda 5005e8dce4dSJason Molenda SBQueue sb_queue; 5015e8dce4dSJason Molenda QueueSP queue_sp; 5025e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 503b9c1b51eSKate Stone if (process_sp) { 5045e8dce4dSJason Molenda Process::StopLocker stop_locker; 505b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 506b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 507b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 5085e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 5095e8dce4dSJason Molenda sb_queue.SetQueue(queue_sp); 5105e8dce4dSJason Molenda } 511a61d0a5bSGreg Clayton } 5125e8dce4dSJason Molenda 5135e8dce4dSJason Molenda if (log) 5145e8dce4dSJason Molenda log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", 515324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 516324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 517324a1036SSaleem Abdulrasool static_cast<void *>(queue_sp.get())); 5185e8dce4dSJason Molenda 5195e8dce4dSJason Molenda return sb_queue; 5205e8dce4dSJason Molenda } 5215e8dce4dSJason Molenda 522b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) { 523bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 524b9c1b51eSKate Stone if (process_sp) { 525b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 526b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 527bf2956a2SJim Ingham if (include_expression_stops) 528bf2956a2SJim Ingham return process_sp->GetStopID(); 529bf2956a2SJim Ingham else 530bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 531bf2956a2SJim Ingham } 532bf2956a2SJim Ingham return 0; 533bf2956a2SJim Ingham } 534bf2956a2SJim Ingham 535b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) { 53638810f43SIlia K Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 53738810f43SIlia K 53838810f43SIlia K SBEvent sb_event; 53938810f43SIlia K EventSP event_sp; 54038810f43SIlia K ProcessSP process_sp(GetSP()); 541b9c1b51eSKate Stone if (process_sp) { 542b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 543b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 54438810f43SIlia K event_sp = process_sp->GetStopEventForStopID(stop_id); 54538810f43SIlia K sb_event.reset(event_sp); 54638810f43SIlia K } 54738810f43SIlia K 54838810f43SIlia K if (log) 549b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 550b9c1b51eSKate Stone ") => SBEvent(%p)", 551b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), stop_id, 55238810f43SIlia K static_cast<void *>(event_sp.get())); 55338810f43SIlia K 55438810f43SIlia K return sb_event; 55538810f43SIlia K } 55638810f43SIlia K 557b9c1b51eSKate Stone StateType SBProcess::GetState() { 558ceb6b139SCaroline Tice 559ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 560acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 561b9c1b51eSKate Stone if (process_sp) { 562b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 563b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 564acdbe816SGreg Clayton ret_val = process_sp->GetState(); 565af67cecdSGreg Clayton } 566ceb6b139SCaroline Tice 5675160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 568ceb6b139SCaroline Tice if (log) 569cfd1acedSGreg Clayton log->Printf("SBProcess(%p)::GetState () => %s", 570324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 571750cd175SCaroline Tice lldb_private::StateAsCString(ret_val)); 572ceb6b139SCaroline Tice 573ceb6b139SCaroline Tice return ret_val; 57430fdc8d8SChris Lattner } 57530fdc8d8SChris Lattner 576b9c1b51eSKate Stone int SBProcess::GetExitStatus() { 5774838131bSGreg Clayton int exit_status = 0; 578acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 579b9c1b51eSKate Stone if (process_sp) { 580b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 581b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 582acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus(); 583af67cecdSGreg Clayton } 5845160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5854838131bSGreg Clayton if (log) 5864838131bSGreg Clayton log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 587324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), exit_status, 588324a1036SSaleem Abdulrasool exit_status); 5894838131bSGreg Clayton 5904838131bSGreg Clayton return exit_status; 59130fdc8d8SChris Lattner } 59230fdc8d8SChris Lattner 593b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() { 5944838131bSGreg Clayton const char *exit_desc = NULL; 595acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 596b9c1b51eSKate Stone if (process_sp) { 597b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 598b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 599acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription(); 600af67cecdSGreg Clayton } 6015160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6024838131bSGreg Clayton if (log) 6034838131bSGreg Clayton log->Printf("SBProcess(%p)::GetExitDescription () => %s", 604324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), exit_desc); 6054838131bSGreg Clayton return exit_desc; 60630fdc8d8SChris Lattner } 60730fdc8d8SChris Lattner 608b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() { 609ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 610acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 611acdbe816SGreg Clayton if (process_sp) 612acdbe816SGreg Clayton ret_val = process_sp->GetID(); 613ceb6b139SCaroline Tice 6145160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 615ceb6b139SCaroline Tice if (log) 616324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64, 617324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), ret_val); 618ceb6b139SCaroline Tice 619ceb6b139SCaroline Tice return ret_val; 62030fdc8d8SChris Lattner } 62130fdc8d8SChris Lattner 622b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() { 623949e8221SGreg Clayton uint32_t ret_val = 0; 624949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 625949e8221SGreg Clayton if (process_sp) 626949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 6275160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 628949e8221SGreg Clayton if (log) 629324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32, 630324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), ret_val); 631949e8221SGreg Clayton return ret_val; 632949e8221SGreg Clayton } 633949e8221SGreg Clayton 634b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const { 635cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 636acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 637acdbe816SGreg Clayton if (process_sp) 638acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 639cf386e24SJohnny Chen 6405160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 641cf386e24SJohnny Chen if (log) 642324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetByteOrder () => %d", 643324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), byteOrder); 644cf386e24SJohnny Chen 645cf386e24SJohnny Chen return byteOrder; 646cf386e24SJohnny Chen } 647cf386e24SJohnny Chen 648b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const { 649ceb6b139SCaroline Tice uint32_t size = 0; 650acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 651acdbe816SGreg Clayton if (process_sp) 652acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 653ceb6b139SCaroline Tice 6545160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 655ceb6b139SCaroline Tice if (log) 656324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetAddressByteSize () => %d", 657324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), size); 658ceb6b139SCaroline Tice 659ceb6b139SCaroline Tice return size; 66030fdc8d8SChris Lattner } 66130fdc8d8SChris Lattner 662b9c1b51eSKate Stone SBError SBProcess::Continue() { 6635160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 664ceb6b139SCaroline Tice 66530fdc8d8SChris Lattner SBError sb_error; 666acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 6670c74e78dSGreg Clayton 668acdbe816SGreg Clayton if (log) 669324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::Continue ()...", 670324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 671acdbe816SGreg Clayton 672b9c1b51eSKate Stone if (process_sp) { 673b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 674b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 675acdbe816SGreg Clayton 676dc6224e0SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution()) 677dc6224e0SGreg Clayton sb_error.ref() = process_sp->Resume(); 678dc6224e0SGreg Clayton else 679dc6224e0SGreg Clayton sb_error.ref() = process_sp->ResumeSynchronous(NULL); 680b9c1b51eSKate Stone } else 68130fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 68230fdc8d8SChris Lattner 683b9c1b51eSKate Stone if (log) { 684ceb6b139SCaroline Tice SBStream sstr; 685ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 686324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s", 687324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 688324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 689ceb6b139SCaroline Tice } 690ceb6b139SCaroline Tice 69130fdc8d8SChris Lattner return sb_error; 69230fdc8d8SChris Lattner } 69330fdc8d8SChris Lattner 694b9c1b51eSKate Stone SBError SBProcess::Destroy() { 69530fdc8d8SChris Lattner SBError sb_error; 696acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 697b9c1b51eSKate Stone if (process_sp) { 698b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 699b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 700ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 701b9c1b51eSKate Stone } else 70230fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 70330fdc8d8SChris Lattner 7045160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 705b9c1b51eSKate Stone if (log) { 7064838131bSGreg Clayton SBStream sstr; 7074838131bSGreg Clayton sb_error.GetDescription(sstr); 7086779606aSGreg Clayton log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s", 709324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 710324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 7114838131bSGreg Clayton } 7124838131bSGreg Clayton 71330fdc8d8SChris Lattner return sb_error; 71430fdc8d8SChris Lattner } 71530fdc8d8SChris Lattner 716b9c1b51eSKate Stone SBError SBProcess::Stop() { 71730fdc8d8SChris Lattner SBError sb_error; 718acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 719b9c1b51eSKate Stone if (process_sp) { 720b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 721b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 722acdbe816SGreg Clayton sb_error.SetError(process_sp->Halt()); 723b9c1b51eSKate Stone } else 72430fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 725ceb6b139SCaroline Tice 7265160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 727b9c1b51eSKate Stone if (log) { 728ceb6b139SCaroline Tice SBStream sstr; 729ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 73093aa84e8SGreg Clayton log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s", 731324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 732324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 733ceb6b139SCaroline Tice } 734ceb6b139SCaroline Tice 73530fdc8d8SChris Lattner return sb_error; 73630fdc8d8SChris Lattner } 73730fdc8d8SChris Lattner 738b9c1b51eSKate Stone SBError SBProcess::Kill() { 73930fdc8d8SChris Lattner SBError sb_error; 740acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 741b9c1b51eSKate Stone if (process_sp) { 742b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 743b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 744ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(true)); 745b9c1b51eSKate Stone } else 74630fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 747ceb6b139SCaroline Tice 7485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 749b9c1b51eSKate Stone if (log) { 750ceb6b139SCaroline Tice SBStream sstr; 751ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 75293aa84e8SGreg Clayton log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s", 753324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 754324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 755ceb6b139SCaroline Tice } 756ceb6b139SCaroline Tice 75730fdc8d8SChris Lattner return sb_error; 75830fdc8d8SChris Lattner } 75930fdc8d8SChris Lattner 760b9c1b51eSKate Stone SBError SBProcess::Detach() { 761acff8950SJim Ingham // FIXME: This should come from a process default. 762acff8950SJim Ingham bool keep_stopped = false; 763acff8950SJim Ingham return Detach(keep_stopped); 764acff8950SJim Ingham } 765acff8950SJim Ingham 766b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) { 76730fdc8d8SChris Lattner SBError sb_error; 768acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 769b9c1b51eSKate Stone if (process_sp) { 770b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 771b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 772acff8950SJim Ingham sb_error.SetError(process_sp->Detach(keep_stopped)); 773b9c1b51eSKate Stone } else 77430fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 77530fdc8d8SChris Lattner 77630fdc8d8SChris Lattner return sb_error; 77730fdc8d8SChris Lattner } 77830fdc8d8SChris Lattner 779b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) { 78030fdc8d8SChris Lattner SBError sb_error; 781acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 782b9c1b51eSKate Stone if (process_sp) { 783b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 784b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 785acdbe816SGreg Clayton sb_error.SetError(process_sp->Signal(signo)); 786b9c1b51eSKate Stone } else 78730fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 7885160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 789b9c1b51eSKate Stone if (log) { 7904838131bSGreg Clayton SBStream sstr; 7914838131bSGreg Clayton sb_error.GetDescription(sstr); 7924838131bSGreg Clayton log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 793324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), signo, 794324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 7954838131bSGreg Clayton } 79630fdc8d8SChris Lattner return sb_error; 79730fdc8d8SChris Lattner } 79830fdc8d8SChris Lattner 799b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() { 80098d0a4b3SChaoren Lin if (auto process_sp = GetSP()) 80198d0a4b3SChaoren Lin return SBUnixSignals{process_sp}; 802802dc402STodd Fiala 80398d0a4b3SChaoren Lin return {}; 804802dc402STodd Fiala } 805802dc402STodd Fiala 806b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() { 807cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 808b9c1b51eSKate Stone if (process_sp) { 809cfc0935eSJim Ingham process_sp->SendAsyncInterrupt(); 810cfc0935eSJim Ingham } 811cfc0935eSJim Ingham } 812cfc0935eSJim Ingham 813b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) { 8144838131bSGreg Clayton SBThread sb_thread; 81517a6ad05SGreg Clayton ThreadSP thread_sp; 816acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 817b9c1b51eSKate Stone if (process_sp) { 8187fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8197fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 820b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 821b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 8227fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update); 82317a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 824af67cecdSGreg Clayton } 8254838131bSGreg Clayton 8265160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 8274838131bSGreg Clayton if (log) 828b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 829b9c1b51eSKate Stone ") => SBThread (%p)", 830324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, 831324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 8324838131bSGreg Clayton 8334838131bSGreg Clayton return sb_thread; 83430fdc8d8SChris Lattner } 83530fdc8d8SChris Lattner 836b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) { 83718b46896SJim Ingham SBThread sb_thread; 83818b46896SJim Ingham ThreadSP thread_sp; 83918b46896SJim Ingham ProcessSP process_sp(GetSP()); 840b9c1b51eSKate Stone if (process_sp) { 84118b46896SJim Ingham Process::StopLocker stop_locker; 84218b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 843b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 844b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 845b9c1b51eSKate Stone thread_sp = 846b9c1b51eSKate Stone process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update); 84718b46896SJim Ingham sb_thread.SetThread(thread_sp); 84818b46896SJim Ingham } 84918b46896SJim Ingham 8505160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 85118b46896SJim Ingham if (log) 85218b46896SJim Ingham log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 853324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), index_id, 854324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 85518b46896SJim Ingham 85618b46896SJim Ingham return sb_thread; 85718b46896SJim Ingham } 85818b46896SJim Ingham 859b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) { 8605160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 861ceb6b139SCaroline Tice 862ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get()); 863ceb6b139SCaroline Tice 864ceb6b139SCaroline Tice if (log) 865324a1036SSaleem Abdulrasool log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s", 866324a1036SSaleem Abdulrasool static_cast<void *>(event.get()), 867750cd175SCaroline Tice lldb_private::StateAsCString(ret_val)); 868ceb6b139SCaroline Tice 869ceb6b139SCaroline Tice return ret_val; 87030fdc8d8SChris Lattner } 87130fdc8d8SChris Lattner 872b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) { 873ea2cc5e0SPavel Labath Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 874ea2cc5e0SPavel Labath 875ea2cc5e0SPavel Labath bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get()); 876ea2cc5e0SPavel Labath 877ea2cc5e0SPavel Labath if (log) 878400e1809SHans Wennborg log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__, 879400e1809SHans Wennborg static_cast<void *>(event.get()), ret_val); 880ea2cc5e0SPavel Labath 881ea2cc5e0SPavel Labath return ret_val; 88230fdc8d8SChris Lattner } 88330fdc8d8SChris Lattner 884b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) { 8850161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 8860161b49cSJim Ingham } 8870161b49cSJim Ingham 8880161b49cSJim Ingham const char * 889b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event, 890b9c1b51eSKate Stone size_t idx) { 8910161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 8920161b49cSJim Ingham } 8930161b49cSJim Ingham 894b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) { 89575930019STodd Fiala ProcessSP process_sp = 89675930019STodd Fiala Process::ProcessEventData::GetProcessFromEvent(event.get()); 897b9c1b51eSKate Stone if (!process_sp) { 89805097246SAdrian Prantl // StructuredData events also know the process they come from. Try that. 89975930019STodd Fiala process_sp = EventDataStructuredData::GetProcessFromEvent(event.get()); 90075930019STodd Fiala } 90175930019STodd Fiala 90275930019STodd Fiala return SBProcess(process_sp); 90330fdc8d8SChris Lattner } 90430fdc8d8SChris Lattner 905b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) { 90606d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 90706d2855fSIlia K } 90806d2855fSIlia K 90975930019STodd Fiala lldb::SBStructuredData 910b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) { 91175930019STodd Fiala return SBStructuredData(event.GetSP()); 91275930019STodd Fiala } 91375930019STodd Fiala 914b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) { 91575930019STodd Fiala return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) && 91675930019STodd Fiala !EventIsStructuredDataEvent(event); 91775930019STodd Fiala } 91875930019STodd Fiala 919b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) { 92075930019STodd Fiala EventSP event_sp = event.GetSP(); 92175930019STodd Fiala EventData *event_data = event_sp ? event_sp->GetData() : nullptr; 922b9c1b51eSKate Stone return event_data && (event_data->GetFlavor() == 923b9c1b51eSKate Stone EventDataStructuredData::GetFlavorString()); 924e6bc6cb9SJim Ingham } 92530fdc8d8SChris Lattner 926b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const { 9275160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 928ceb6b139SCaroline Tice 929acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 930acdbe816SGreg Clayton 931acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 932ceb6b139SCaroline Tice 933ceb6b139SCaroline Tice if (log) 934324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", 935324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 936324a1036SSaleem Abdulrasool static_cast<void *>(broadcaster.get())); 937ceb6b139SCaroline Tice 93830fdc8d8SChris Lattner return broadcaster; 93930fdc8d8SChris Lattner } 94030fdc8d8SChris Lattner 941b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() { 9424bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 9434bddaeb5SJim Ingham } 9444bddaeb5SJim Ingham 945b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len, 946b9c1b51eSKate Stone SBError &sb_error) { 9475160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 948ceb6b139SCaroline Tice 94930fdc8d8SChris Lattner size_t bytes_read = 0; 95030fdc8d8SChris Lattner 951acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 952acdbe816SGreg Clayton 9534838131bSGreg Clayton if (log) 954b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 955b9c1b51eSKate Stone ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 956324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 957324a1036SSaleem Abdulrasool static_cast<void *>(dst), static_cast<uint64_t>(dst_len), 958324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 9594838131bSGreg Clayton 960b9c1b51eSKate Stone if (process_sp) { 9617fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 962b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 963b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 964b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 9657fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref()); 966b9c1b51eSKate Stone } else { 967c9858e4dSGreg Clayton if (log) 968324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::ReadMemory() => error: process is running", 969324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 9707fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9717fdf9ef1SGreg Clayton } 972b9c1b51eSKate Stone } else { 97330fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 97430fdc8d8SChris Lattner } 97530fdc8d8SChris Lattner 976b9c1b51eSKate Stone if (log) { 97793aa84e8SGreg Clayton SBStream sstr; 97893aa84e8SGreg Clayton sb_error.GetDescription(sstr); 979b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 980b9c1b51eSKate Stone ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 981324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 982324a1036SSaleem Abdulrasool static_cast<void *>(dst), static_cast<uint64_t>(dst_len), 983324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData(), 984324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 98593aa84e8SGreg Clayton } 986ceb6b139SCaroline Tice 98730fdc8d8SChris Lattner return bytes_read; 98830fdc8d8SChris Lattner } 98930fdc8d8SChris Lattner 990b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size, 991b9c1b51eSKate Stone lldb::SBError &sb_error) { 992e91b7957SGreg Clayton size_t bytes_read = 0; 993acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 994b9c1b51eSKate Stone if (process_sp) { 9957fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 996b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 997b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 998b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 999b9c1b51eSKate Stone bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size, 1000b9c1b51eSKate Stone sb_error.ref()); 1001b9c1b51eSKate Stone } else { 10025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1003c9858e4dSGreg Clayton if (log) 1004b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process " 1005b9c1b51eSKate Stone "is running", 1006324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10077fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10087fdf9ef1SGreg Clayton } 1009b9c1b51eSKate Stone } else { 1010e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1011e91b7957SGreg Clayton } 1012e91b7957SGreg Clayton return bytes_read; 1013e91b7957SGreg Clayton } 1014e91b7957SGreg Clayton 1015b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size, 1016b9c1b51eSKate Stone lldb::SBError &sb_error) { 10177fdf9ef1SGreg Clayton uint64_t value = 0; 1018acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1019b9c1b51eSKate Stone if (process_sp) { 10207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1021b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1022b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1023b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1024b9c1b51eSKate Stone value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0, 1025b9c1b51eSKate Stone sb_error.ref()); 1026b9c1b51eSKate Stone } else { 10275160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1028c9858e4dSGreg Clayton if (log) 1029b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process " 1030b9c1b51eSKate Stone "is running", 1031324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10327fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10337fdf9ef1SGreg Clayton } 1034b9c1b51eSKate Stone } else { 1035e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1036e91b7957SGreg Clayton } 10377fdf9ef1SGreg Clayton return value; 1038e91b7957SGreg Clayton } 1039e91b7957SGreg Clayton 1040b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr, 1041b9c1b51eSKate Stone lldb::SBError &sb_error) { 1042e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1043acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1044b9c1b51eSKate Stone if (process_sp) { 10457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1046b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1047b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1048b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 10497fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref()); 1050b9c1b51eSKate Stone } else { 10515160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1052c9858e4dSGreg Clayton if (log) 1053b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process " 1054b9c1b51eSKate Stone "is running", 1055324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10567fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10577fdf9ef1SGreg Clayton } 1058b9c1b51eSKate Stone } else { 1059e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1060e91b7957SGreg Clayton } 1061e91b7957SGreg Clayton return ptr; 1062e91b7957SGreg Clayton } 1063e91b7957SGreg Clayton 1064b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len, 1065b9c1b51eSKate Stone SBError &sb_error) { 106630fdc8d8SChris Lattner size_t bytes_written = 0; 106730fdc8d8SChris Lattner 10685160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1069acdbe816SGreg Clayton 1070acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1071acdbe816SGreg Clayton 10724838131bSGreg Clayton if (log) 1073b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1074b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1075324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1076b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1077324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 10784838131bSGreg Clayton 1079b9c1b51eSKate Stone if (process_sp) { 10807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1081b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1082b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1083b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1084b9c1b51eSKate Stone bytes_written = 1085b9c1b51eSKate Stone process_sp->WriteMemory(addr, src, src_len, sb_error.ref()); 1086b9c1b51eSKate Stone } else { 1087c9858e4dSGreg Clayton if (log) 1088324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::WriteMemory() => error: process is running", 1089324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 10907fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10917fdf9ef1SGreg Clayton } 109230fdc8d8SChris Lattner } 109330fdc8d8SChris Lattner 1094b9c1b51eSKate Stone if (log) { 10954838131bSGreg Clayton SBStream sstr; 10964838131bSGreg Clayton sb_error.GetDescription(sstr); 1097b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1098b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1099324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1100b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1101324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData(), 1102324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_written)); 11034838131bSGreg Clayton } 11044838131bSGreg Clayton 110530fdc8d8SChris Lattner return bytes_written; 110630fdc8d8SChris Lattner } 110730fdc8d8SChris Lattner 1108b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) { 1109da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1110da7bc7d0SGreg Clayton 1111acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1112b9c1b51eSKate Stone if (process_sp) { 1113dde9cff3SCaroline Tice char path[PATH_MAX]; 1114dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath(path, sizeof(path)); 1115acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 11161d273166SGreg Clayton const char *exe_name = NULL; 11171d273166SGreg Clayton if (exe_module) 11181d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 11191d273166SGreg Clayton 1120d01b2953SDaniel Malea strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1121b9c1b51eSKate Stone process_sp->GetID(), lldb_private::StateAsCString(GetState()), 1122b9c1b51eSKate Stone GetNumThreads(), exe_name ? ", executable = " : "", 11231d273166SGreg Clayton exe_name ? exe_name : ""); 1124b9c1b51eSKate Stone } else 1125da7bc7d0SGreg Clayton strm.PutCString("No value"); 1126dde9cff3SCaroline Tice 1127dde9cff3SCaroline Tice return true; 1128dde9cff3SCaroline Tice } 11298f343b09SGreg Clayton 11308f343b09SGreg Clayton uint32_t 1131b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const { 11325160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1133f9ef60d2SJohnny Chen 1134f9ef60d2SJohnny Chen uint32_t num = 0; 1135f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1136b9c1b51eSKate Stone if (process_sp) { 1137b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1138b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1139f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo(num)); 1140f9ef60d2SJohnny Chen if (log) 1141f9ef60d2SJohnny Chen log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1142324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num); 1143b9c1b51eSKate Stone } else { 1144f9ef60d2SJohnny Chen sb_error.SetErrorString("SBProcess is invalid"); 1145f9ef60d2SJohnny Chen } 1146f9ef60d2SJohnny Chen return num; 1147f9ef60d2SJohnny Chen } 1148f9ef60d2SJohnny Chen 1149b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec, 1150b9c1b51eSKate Stone lldb::SBError &sb_error) { 11514fbd67acSTamas Berghammer return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); 11524fbd67acSTamas Berghammer } 11534fbd67acSTamas Berghammer 1154b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec, 11554fbd67acSTamas Berghammer const lldb::SBFileSpec &sb_remote_image_spec, 1156b9c1b51eSKate Stone lldb::SBError &sb_error) { 1157abc5d72fSJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1158acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1159b9c1b51eSKate Stone if (process_sp) { 11607fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1161b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1162abc5d72fSJim Ingham if (log) 1163abc5d72fSJim Ingham log->Printf("SBProcess(%p)::LoadImage() => calling Platform::LoadImage" 1164abc5d72fSJim Ingham "for: %s", 1165abc5d72fSJim Ingham static_cast<void *>(process_sp.get()), 1166abc5d72fSJim Ingham sb_local_image_spec.GetFilename()); 1167abc5d72fSJim Ingham 1168b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1169b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 11703cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1171b9c1b51eSKate Stone return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec, 1172b9c1b51eSKate Stone *sb_remote_image_spec, sb_error.ref()); 1173b9c1b51eSKate Stone } else { 1174c9858e4dSGreg Clayton if (log) 1175324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::LoadImage() => error: process is running", 1176324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 11777fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11787fdf9ef1SGreg Clayton } 1179abc5d72fSJim Ingham } else { 1180abc5d72fSJim Ingham if (log) 1181abc5d72fSJim Ingham log->Printf("SBProcess(%p)::LoadImage() => error: called with invalid" 1182abc5d72fSJim Ingham " process", 1183abc5d72fSJim Ingham static_cast<void *>(process_sp.get())); 1184abc5d72fSJim Ingham sb_error.SetErrorString("process is invalid"); 11857fdf9ef1SGreg Clayton } 11868f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11878f343b09SGreg Clayton } 11888f343b09SGreg Clayton 11890d231f71SJim Ingham uint32_t SBProcess::LoadImageUsingPaths(const lldb::SBFileSpec &image_spec, 11900d231f71SJim Ingham SBStringList &paths, 11910d231f71SJim Ingham lldb::SBFileSpec &loaded_path, 11920d231f71SJim Ingham lldb::SBError &error) { 11930d231f71SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 11940d231f71SJim Ingham ProcessSP process_sp(GetSP()); 11950d231f71SJim Ingham if (process_sp) { 11960d231f71SJim Ingham Process::StopLocker stop_locker; 11970d231f71SJim Ingham if (stop_locker.TryLock(&process_sp->GetRunLock())) { 11980d231f71SJim Ingham if (log) 11990d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => " 12000d231f71SJim Ingham "calling Platform::LoadImageUsingPaths for: %s", 12010d231f71SJim Ingham static_cast<void *>(process_sp.get()), 12020d231f71SJim Ingham image_spec.GetFilename()); 12030d231f71SJim Ingham 12040d231f71SJim Ingham std::lock_guard<std::recursive_mutex> guard( 12050d231f71SJim Ingham process_sp->GetTarget().GetAPIMutex()); 12060d231f71SJim Ingham PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 12070d231f71SJim Ingham size_t num_paths = paths.GetSize(); 12080d231f71SJim Ingham std::vector<std::string> paths_vec; 12090d231f71SJim Ingham paths_vec.reserve(num_paths); 12100d231f71SJim Ingham for (size_t i = 0; i < num_paths; i++) 12110d231f71SJim Ingham paths_vec.push_back(paths.GetStringAtIndex(i)); 12120d231f71SJim Ingham FileSpec loaded_spec; 12130d231f71SJim Ingham 12140d231f71SJim Ingham uint32_t token = platform_sp->LoadImageUsingPaths(process_sp.get(), 12150d231f71SJim Ingham *image_spec, 12160d231f71SJim Ingham paths_vec, 12170d231f71SJim Ingham error.ref(), 12180d231f71SJim Ingham &loaded_spec); 12190d231f71SJim Ingham if (token != LLDB_INVALID_IMAGE_TOKEN) 12200d231f71SJim Ingham loaded_path = loaded_spec; 12210d231f71SJim Ingham return token; 12220d231f71SJim Ingham } else { 12230d231f71SJim Ingham if (log) 12240d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: " 12250d231f71SJim Ingham "process is running", 12260d231f71SJim Ingham static_cast<void *>(process_sp.get())); 12270d231f71SJim Ingham error.SetErrorString("process is running"); 12280d231f71SJim Ingham } 12290d231f71SJim Ingham } else { 12300d231f71SJim Ingham if (log) 12310d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: " 12320d231f71SJim Ingham "called with invalid process", 12330d231f71SJim Ingham static_cast<void *>(process_sp.get())); 12340d231f71SJim Ingham error.SetErrorString("process is invalid"); 12350d231f71SJim Ingham } 12360d231f71SJim Ingham 12370d231f71SJim Ingham return LLDB_INVALID_IMAGE_TOKEN; 12380d231f71SJim Ingham } 12390d231f71SJim Ingham 1240b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) { 12418f343b09SGreg Clayton lldb::SBError sb_error; 1242acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1243b9c1b51eSKate Stone if (process_sp) { 12447fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1245b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1246b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1247b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 12483cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1249b9c1b51eSKate Stone sb_error.SetError( 1250b9c1b51eSKate Stone platform_sp->UnloadImage(process_sp.get(), image_token)); 1251b9c1b51eSKate Stone } else { 12525160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1253c9858e4dSGreg Clayton if (log) 1254324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::UnloadImage() => error: process is running", 1255324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 12567fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12577fdf9ef1SGreg Clayton } 1258b9c1b51eSKate Stone } else 12598f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 12608f343b09SGreg Clayton return sb_error; 12618f343b09SGreg Clayton } 12628c71337aSJason Molenda 1263b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) { 1264a332978bSJason Molenda lldb::SBError sb_error; 1265a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1266b9c1b51eSKate Stone if (process_sp) { 1267a332978bSJason Molenda Process::StopLocker stop_locker; 1268b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1269b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1270b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1271a332978bSJason Molenda sb_error.SetError(process_sp->SendEventData(event_data)); 1272b9c1b51eSKate Stone } else { 1273a332978bSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1274a332978bSJason Molenda if (log) 1275b9c1b51eSKate Stone log->Printf( 1276b9c1b51eSKate Stone "SBProcess(%p)::SendEventData() => error: process is running", 1277324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 1278a332978bSJason Molenda sb_error.SetErrorString("process is running"); 1279a332978bSJason Molenda } 1280b9c1b51eSKate Stone } else 1281a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1282a332978bSJason Molenda return sb_error; 1283a332978bSJason Molenda } 1284a332978bSJason Molenda 1285b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() { 12868c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1287b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 12888c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 128995d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 12908c71337aSJason Molenda } 12918c71337aSJason Molenda return 0; 12928c71337aSJason Molenda } 12938c71337aSJason Molenda 1294b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) { 12958c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1296b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 12978c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1298b9c1b51eSKate Stone const std::vector<ConstString> &names = 1299b9c1b51eSKate Stone runtime->GetExtendedBacktraceTypes(); 1300b9c1b51eSKate Stone if (idx < names.size()) { 13018c71337aSJason Molenda return names[idx].AsCString(); 1302b9c1b51eSKate Stone } else { 13038c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 13048c71337aSJason Molenda if (log) 1305b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => " 1306b9c1b51eSKate Stone "error: requested extended backtrace name out of bounds", 1307324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 13088c71337aSJason Molenda } 13098c71337aSJason Molenda } 13108c71337aSJason Molenda return NULL; 13118c71337aSJason Molenda } 1312a51ea382SKuba Brecka 1313b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) { 1314a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1315a51ea382SKuba Brecka SBThreadCollection threads; 1316b9c1b51eSKate Stone if (process_sp) { 1317a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1318a51ea382SKuba Brecka } 1319a51ea382SKuba Brecka return threads; 1320a51ea382SKuba Brecka } 132163927548SKuba Brecka 1322b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent( 1323b9c1b51eSKate Stone InstrumentationRuntimeType type) { 132463927548SKuba Brecka ProcessSP process_sp(GetSP()); 132563927548SKuba Brecka if (!process_sp) 132663927548SKuba Brecka return false; 132763927548SKuba Brecka 1328b9c1b51eSKate Stone InstrumentationRuntimeSP runtime_sp = 1329b9c1b51eSKate Stone process_sp->GetInstrumentationRuntime(type); 133063927548SKuba Brecka 133163927548SKuba Brecka if (!runtime_sp.get()) 133263927548SKuba Brecka return false; 133363927548SKuba Brecka 133463927548SKuba Brecka return runtime_sp->IsActive(); 133563927548SKuba Brecka } 1336f7d1893fSAdrian McCarthy 1337b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) { 1338f7d1893fSAdrian McCarthy lldb::SBError error; 1339f7d1893fSAdrian McCarthy ProcessSP process_sp(GetSP()); 1340b9c1b51eSKate Stone if (!process_sp) { 1341f7d1893fSAdrian McCarthy error.SetErrorString("SBProcess is invalid"); 1342f7d1893fSAdrian McCarthy return error; 1343f7d1893fSAdrian McCarthy } 1344f7d1893fSAdrian McCarthy 1345b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1346b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1347f7d1893fSAdrian McCarthy 1348b9c1b51eSKate Stone if (process_sp->GetState() != eStateStopped) { 1349f7d1893fSAdrian McCarthy error.SetErrorString("the process is not stopped"); 1350f7d1893fSAdrian McCarthy return error; 1351f7d1893fSAdrian McCarthy } 1352f7d1893fSAdrian McCarthy 1353*8f3be7a3SJonas Devlieghere FileSpec core_file(file_name); 1354f7d1893fSAdrian McCarthy error.ref() = PluginManager::SaveCore(process_sp, core_file); 1355f7d1893fSAdrian McCarthy return error; 1356f7d1893fSAdrian McCarthy } 135726036843SHoward Hellyer 135826036843SHoward Hellyer lldb::SBError 1359b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr, 1360b9c1b51eSKate Stone SBMemoryRegionInfo &sb_region_info) { 136126036843SHoward Hellyer lldb::SBError sb_error; 136226036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1363b9c1b51eSKate Stone MemoryRegionInfoSP region_info_sp = 1364b9c1b51eSKate Stone std::make_shared<lldb_private::MemoryRegionInfo>(); 1365b9c1b51eSKate Stone if (process_sp) { 136626036843SHoward Hellyer Process::StopLocker stop_locker; 1367b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1368b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1369b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1370b9c1b51eSKate Stone sb_error.ref() = 1371b9c1b51eSKate Stone process_sp->GetMemoryRegionInfo(load_addr, *region_info_sp); 137226036843SHoward Hellyer if (sb_error.Success()) { 137326036843SHoward Hellyer sb_region_info.ref() = *region_info_sp; 137426036843SHoward Hellyer } 1375b9c1b51eSKate Stone } else { 137626036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 137726036843SHoward Hellyer if (log) 1378b9c1b51eSKate Stone log->Printf( 1379b9c1b51eSKate Stone "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 138026036843SHoward Hellyer static_cast<void *>(process_sp.get())); 138126036843SHoward Hellyer sb_error.SetErrorString("process is running"); 138226036843SHoward Hellyer } 1383b9c1b51eSKate Stone } else { 138426036843SHoward Hellyer sb_error.SetErrorString("SBProcess is invalid"); 138526036843SHoward Hellyer } 138626036843SHoward Hellyer return sb_error; 138726036843SHoward Hellyer } 138826036843SHoward Hellyer 1389b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() { 139026036843SHoward Hellyer lldb::SBError sb_error; 139126036843SHoward Hellyer lldb::SBMemoryRegionInfoList sb_region_list; 139226036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1393b9c1b51eSKate Stone if (process_sp) { 139426036843SHoward Hellyer Process::StopLocker stop_locker; 1395b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1396b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1397b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 139826036843SHoward Hellyer std::vector<MemoryRegionInfoSP> region_list; 139926036843SHoward Hellyer sb_error.ref() = process_sp->GetMemoryRegions(region_list); 140026036843SHoward Hellyer if (sb_error.Success()) { 140126036843SHoward Hellyer std::vector<MemoryRegionInfoSP>::iterator end = region_list.end(); 1402b9c1b51eSKate Stone for (std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin(); 1403b9c1b51eSKate Stone it != end; it++) { 140426036843SHoward Hellyer SBMemoryRegionInfo sb_region_info(it->get()); 140526036843SHoward Hellyer sb_region_list.Append(sb_region_info); 140626036843SHoward Hellyer } 140726036843SHoward Hellyer } 1408b9c1b51eSKate Stone } else { 140926036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 141026036843SHoward Hellyer if (log) 1411b9c1b51eSKate Stone log->Printf( 1412b9c1b51eSKate Stone "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 141326036843SHoward Hellyer static_cast<void *>(process_sp.get())); 141426036843SHoward Hellyer sb_error.SetErrorString("process is running"); 141526036843SHoward Hellyer } 1416b9c1b51eSKate Stone } else { 141726036843SHoward Hellyer sb_error.SetErrorString("SBProcess is invalid"); 141826036843SHoward Hellyer } 141926036843SHoward Hellyer return sb_region_list; 142026036843SHoward Hellyer } 1421141a6263SVadim Macagon 1422141a6263SVadim Macagon lldb::SBProcessInfo SBProcess::GetProcessInfo() { 1423141a6263SVadim Macagon lldb::SBProcessInfo sb_proc_info; 1424141a6263SVadim Macagon ProcessSP process_sp(GetSP()); 1425141a6263SVadim Macagon ProcessInstanceInfo proc_info; 1426141a6263SVadim Macagon if (process_sp && process_sp->GetProcessInfo(proc_info)) { 1427141a6263SVadim Macagon sb_proc_info.SetProcessInfo(proc_info); 1428141a6263SVadim Macagon } 1429141a6263SVadim Macagon return sb_proc_info; 1430141a6263SVadim Macagon } 1431