180814287SRaphael Isemann //===-- SBProcess.cpp -----------------------------------------------------===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 94c5de699SEli Friedman #include "lldb/API/SBProcess.h" 10*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h" 1130fdc8d8SChris Lattner 1276e47d48SRaphael Isemann #include <cinttypes> 13bdae3787SVirgile Bello 1430fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner 175d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 181f746071SGreg Clayton #include "lldb/Core/Module.h" 19f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h" 2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 21eefda182SMed Ismail Bennani #include "lldb/Core/StructuredDataImpl.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" 29805e7106SZachary Turner #include "lldb/Utility/ProcessInfo.h" 30d821c997SPavel Labath #include "lldb/Utility/State.h" 31bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 3230fdc8d8SChris Lattner 334c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 344c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 350e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 364c5de699SEli Friedman #include "lldb/API/SBEvent.h" 37322f12afSLawrence D'Anna #include "lldb/API/SBFile.h" 380e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 3926036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfo.h" 4026036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfoList.h" 41b9c1b51eSKate Stone #include "lldb/API/SBStream.h" 42b9c1b51eSKate Stone #include "lldb/API/SBStringList.h" 4375930019STodd Fiala #include "lldb/API/SBStructuredData.h" 444c5de699SEli Friedman #include "lldb/API/SBThread.h" 45a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h" 46d5d8d91cSRavitheja Addepally #include "lldb/API/SBTrace.h" 47802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h" 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner using namespace lldb; 5030fdc8d8SChris Lattner using namespace lldb_private; 5130fdc8d8SChris Lattner 52*1755f5b1SJonas Devlieghere SBProcess::SBProcess() { LLDB_INSTRUMENT_VA(this); } 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner // SBProcess constructor 5530fdc8d8SChris Lattner 56baf5664fSJonas Devlieghere SBProcess::SBProcess(const SBProcess &rhs) : m_opaque_wp(rhs.m_opaque_wp) { 57*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 58baf5664fSJonas Devlieghere } 5930fdc8d8SChris Lattner 60b9c1b51eSKate Stone SBProcess::SBProcess(const lldb::ProcessSP &process_sp) 61baf5664fSJonas Devlieghere : m_opaque_wp(process_sp) { 62*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, process_sp); 63baf5664fSJonas Devlieghere } 6430fdc8d8SChris Lattner 65b9c1b51eSKate Stone const SBProcess &SBProcess::operator=(const SBProcess &rhs) { 66*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 67baf5664fSJonas Devlieghere 68efabb123SGreg Clayton if (this != &rhs) 694e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 70d232abc3SJonas Devlieghere return *this; 71efabb123SGreg Clayton } 72efabb123SGreg Clayton 7330fdc8d8SChris Lattner // Destructor 74866b7a65SJonas Devlieghere SBProcess::~SBProcess() = default; 7530fdc8d8SChris Lattner 76b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClassName() { 77*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT(); 78baf5664fSJonas Devlieghere 794bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 804bddaeb5SJim Ingham } 814bddaeb5SJim Ingham 82b9c1b51eSKate Stone const char *SBProcess::GetPluginName() { 83*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 84baf5664fSJonas Devlieghere 85d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 86b9c1b51eSKate Stone if (process_sp) { 87a3939e15SPavel Labath return ConstString(process_sp->GetPluginName()).GetCString(); 88d7b30ef9SJim Ingham } 89d7b30ef9SJim Ingham return "<Unknown>"; 90d7b30ef9SJim Ingham } 91d7b30ef9SJim Ingham 92b9c1b51eSKate Stone const char *SBProcess::GetShortPluginName() { 93*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 94baf5664fSJonas Devlieghere 95d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 96b9c1b51eSKate Stone if (process_sp) { 97a3939e15SPavel Labath return ConstString(process_sp->GetPluginName()).GetCString(); 98d7b30ef9SJim Ingham } 99d7b30ef9SJim Ingham return "<Unknown>"; 100d7b30ef9SJim Ingham } 101d7b30ef9SJim Ingham 102b9c1b51eSKate Stone lldb::ProcessSP SBProcess::GetSP() const { return m_opaque_wp.lock(); } 103d7b30ef9SJim Ingham 104b9c1b51eSKate Stone void SBProcess::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; } 105b9556accSGreg Clayton 106baf5664fSJonas Devlieghere void SBProcess::Clear() { 107*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 108baf5664fSJonas Devlieghere 109baf5664fSJonas Devlieghere m_opaque_wp.reset(); 110baf5664fSJonas Devlieghere } 11130fdc8d8SChris Lattner 112b9c1b51eSKate Stone bool SBProcess::IsValid() const { 113*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 1147f5237bcSPavel Labath return this->operator bool(); 1157f5237bcSPavel Labath } 1167f5237bcSPavel Labath SBProcess::operator bool() const { 117*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 118baf5664fSJonas Devlieghere 1194fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1204fc6cb9cSJim Ingham return ((bool)process_sp && process_sp->IsValid()); 12130fdc8d8SChris Lattner } 12230fdc8d8SChris Lattner 123b9c1b51eSKate Stone bool SBProcess::RemoteLaunch(char const **argv, char const **envp, 124b9c1b51eSKate Stone const char *stdin_path, const char *stdout_path, 1259631aae2SJames McIlree const char *stderr_path, 1269631aae2SJames McIlree const char *working_directory, 127b9c1b51eSKate Stone uint32_t launch_flags, bool stop_at_entry, 128b9c1b51eSKate Stone lldb::SBError &error) { 129*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, argv, envp, stdin_path, stdout_path, stderr_path, 130baf5664fSJonas Devlieghere working_directory, launch_flags, stop_at_entry, error); 131baf5664fSJonas Devlieghere 132acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 133b9c1b51eSKate Stone if (process_sp) { 134b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 135b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 136b9c1b51eSKate Stone if (process_sp->GetState() == eStateConnected) { 137982c9762SGreg Clayton if (stop_at_entry) 138982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 1398f3be7a3SJonas Devlieghere ProcessLaunchInfo launch_info(FileSpec(stdin_path), FileSpec(stdout_path), 1408f3be7a3SJonas Devlieghere FileSpec(stderr_path), 1418f3be7a3SJonas Devlieghere FileSpec(working_directory), launch_flags); 142acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 143982c9762SGreg Clayton if (exe_module) 14414715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 145982c9762SGreg Clayton if (argv) 146982c9762SGreg Clayton launch_info.GetArguments().AppendArguments(argv); 147982c9762SGreg Clayton if (envp) 14862930e57SPavel Labath launch_info.GetEnvironment() = Environment(envp); 149acdbe816SGreg Clayton error.SetError(process_sp->Launch(launch_info)); 150b9c1b51eSKate Stone } else { 1519631aae2SJames McIlree error.SetErrorString("must be in eStateConnected to call RemoteLaunch"); 1529631aae2SJames McIlree } 153b9c1b51eSKate Stone } else { 1549631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 1559631aae2SJames McIlree } 1569631aae2SJames McIlree 1579631aae2SJames McIlree return error.Success(); 1589631aae2SJames McIlree } 1599631aae2SJames McIlree 160b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid, 161b9c1b51eSKate Stone lldb::SBError &error) { 162*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, pid, error); 163baf5664fSJonas Devlieghere 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 1809631aae2SJames McIlree return error.Success(); 1819631aae2SJames McIlree } 1829631aae2SJames McIlree 183b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() { 184*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 185baf5664fSJonas Devlieghere 186ceb6b139SCaroline Tice uint32_t num_threads = 0; 187acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 188b9c1b51eSKate Stone if (process_sp) { 1897fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1907fdf9ef1SGreg Clayton 1917fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 192b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 193b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 194acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 19530fdc8d8SChris Lattner } 196ceb6b139SCaroline Tice 197ceb6b139SCaroline Tice return num_threads; 19830fdc8d8SChris Lattner } 19930fdc8d8SChris Lattner 200b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const { 201*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 202baf5664fSJonas Devlieghere 20330fdc8d8SChris Lattner SBThread sb_thread; 20417a6ad05SGreg Clayton ThreadSP thread_sp; 205acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 206b9c1b51eSKate Stone if (process_sp) { 207b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 208b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 209acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 21017a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 211af67cecdSGreg Clayton } 212ceb6b139SCaroline Tice 213d232abc3SJonas Devlieghere return sb_thread; 21430fdc8d8SChris Lattner } 21530fdc8d8SChris Lattner 216b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid, 217b9c1b51eSKate Stone lldb::addr_t context) { 218*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, tid, context); 219baf5664fSJonas Devlieghere 220a4d8747dSGreg Clayton SBThread sb_thread; 221a4d8747dSGreg Clayton ThreadSP thread_sp; 222a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 223b9c1b51eSKate Stone if (process_sp) { 224b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 225b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 226a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 227a4d8747dSGreg Clayton sb_thread.SetThread(thread_sp); 228a4d8747dSGreg Clayton } 229a4d8747dSGreg Clayton 230d232abc3SJonas Devlieghere return sb_thread; 231a4d8747dSGreg Clayton } 232a4d8747dSGreg Clayton 233b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const { 234*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 235baf5664fSJonas Devlieghere 23630fdc8d8SChris Lattner SBTarget sb_target; 237b9556accSGreg Clayton TargetSP target_sp; 238acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 239b9c1b51eSKate Stone if (process_sp) { 240acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 241b9556accSGreg Clayton sb_target.SetSP(target_sp); 242b9556accSGreg Clayton } 243ceb6b139SCaroline Tice 244d232abc3SJonas Devlieghere return sb_target; 24530fdc8d8SChris Lattner } 24630fdc8d8SChris Lattner 247b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) { 248*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, src, src_len); 249baf5664fSJonas Devlieghere 250ceb6b139SCaroline Tice size_t ret_val = 0; 251acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 252b9c1b51eSKate Stone if (process_sp) { 25397206d57SZachary Turner Status error; 254acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN(src, src_len, error); 25530fdc8d8SChris Lattner } 256ceb6b139SCaroline Tice 257ceb6b139SCaroline Tice return ret_val; 25830fdc8d8SChris Lattner } 25930fdc8d8SChris Lattner 260b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const { 261*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, dst, dst_len); 262baf5664fSJonas Devlieghere 263cfd1acedSGreg Clayton size_t bytes_read = 0; 264acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 265b9c1b51eSKate Stone if (process_sp) { 26697206d57SZachary Turner Status error; 267acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT(dst, dst_len, error); 26830fdc8d8SChris Lattner } 269ceb6b139SCaroline Tice 270cfd1acedSGreg Clayton return bytes_read; 27130fdc8d8SChris Lattner } 27230fdc8d8SChris Lattner 273b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const { 274*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, dst, dst_len); 275baf5664fSJonas Devlieghere 276cfd1acedSGreg Clayton size_t bytes_read = 0; 277acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 278b9c1b51eSKate Stone if (process_sp) { 27997206d57SZachary Turner Status error; 280acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR(dst, dst_len, error); 28130fdc8d8SChris Lattner } 282ceb6b139SCaroline Tice 283cfd1acedSGreg Clayton return bytes_read; 28430fdc8d8SChris Lattner } 28530fdc8d8SChris Lattner 286b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const { 287*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, dst, dst_len); 288baf5664fSJonas Devlieghere 289ab3b8b22SHan Ming Ong size_t bytes_read = 0; 290ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 291b9c1b51eSKate Stone if (process_sp) { 29297206d57SZachary Turner Status error; 293ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error); 294ab3b8b22SHan Ming Ong } 295ab3b8b22SHan Ming Ong 296ab3b8b22SHan Ming Ong return bytes_read; 297ab3b8b22SHan Ming Ong } 298ab3b8b22SHan Ming Ong 299322f12afSLawrence D'Anna void SBProcess::ReportEventState(const SBEvent &event, SBFile out) const { 300*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, event, out); 301322f12afSLawrence D'Anna 302322f12afSLawrence D'Anna return ReportEventState(event, out.m_opaque_sp); 303322f12afSLawrence D'Anna } 304322f12afSLawrence D'Anna 305b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const { 306*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, event, out); 307322f12afSLawrence D'Anna FileSP outfile = std::make_shared<NativeFile>(out, false); 308322f12afSLawrence D'Anna return ReportEventState(event, outfile); 309322f12afSLawrence D'Anna } 310baf5664fSJonas Devlieghere 311322f12afSLawrence D'Anna void SBProcess::ReportEventState(const SBEvent &event, FileSP out) const { 312322f12afSLawrence D'Anna 313*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, event, out); 314322f12afSLawrence D'Anna 315322f12afSLawrence D'Anna if (!out || !out->IsValid()) 31630fdc8d8SChris Lattner return; 31730fdc8d8SChris Lattner 318acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 319b9c1b51eSKate Stone if (process_sp) { 320322f12afSLawrence D'Anna StreamFile stream(out); 32130fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 322322f12afSLawrence D'Anna stream.Printf("Process %" PRIu64 " %s\n", 323b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 32430fdc8d8SChris Lattner } 32530fdc8d8SChris Lattner } 32630fdc8d8SChris Lattner 327b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event, 328b9c1b51eSKate Stone SBCommandReturnObject &result) { 329*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, event, result); 330baf5664fSJonas Devlieghere 331acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 332b9c1b51eSKate Stone if (process_sp) { 33330fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 33430fdc8d8SChris Lattner char message[1024]; 335b9c1b51eSKate Stone ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n", 336b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 33730fdc8d8SChris Lattner 33830fdc8d8SChris Lattner result.AppendMessage(message); 33930fdc8d8SChris Lattner } 34030fdc8d8SChris Lattner } 34130fdc8d8SChris Lattner 342b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) { 343*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, thread); 344baf5664fSJonas Devlieghere 345acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 346b9c1b51eSKate Stone if (process_sp) { 347b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 348b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 349b9c1b51eSKate Stone return process_sp->GetThreadList().SetSelectedThreadByID( 350b9c1b51eSKate Stone thread.GetThreadID()); 351af67cecdSGreg Clayton } 35230fdc8d8SChris Lattner return false; 35330fdc8d8SChris Lattner } 35430fdc8d8SChris Lattner 355b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) { 356*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, tid); 357ceb6b139SCaroline Tice 358ceb6b139SCaroline Tice bool ret_val = false; 359acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 360b9c1b51eSKate Stone if (process_sp) { 361b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 362b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 363acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid); 364af67cecdSGreg Clayton } 365ceb6b139SCaroline Tice 366ceb6b139SCaroline Tice return ret_val; 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner 369b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) { 370*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, index_id); 371baf5664fSJonas Devlieghere 37218b46896SJim Ingham bool ret_val = false; 37318b46896SJim Ingham ProcessSP process_sp(GetSP()); 374b9c1b51eSKate Stone if (process_sp) { 375b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 376b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 37718b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id); 37818b46896SJim Ingham } 37918b46896SJim Ingham 38018b46896SJim Ingham 38118b46896SJim Ingham return ret_val; 38218b46896SJim Ingham } 38318b46896SJim Ingham 384b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) { 385*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, index); 386baf5664fSJonas Devlieghere 38717a6ad05SGreg Clayton SBThread sb_thread; 38817a6ad05SGreg Clayton ThreadSP thread_sp; 389acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 390b9c1b51eSKate Stone if (process_sp) { 3917fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3927fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 393b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 394b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 3957fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 39617a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 397af67cecdSGreg Clayton } 398ceb6b139SCaroline Tice 399d232abc3SJonas Devlieghere return sb_thread; 40030fdc8d8SChris Lattner } 40130fdc8d8SChris Lattner 402b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() { 403*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 404baf5664fSJonas Devlieghere 4055e8dce4dSJason Molenda uint32_t num_queues = 0; 4065e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 407b9c1b51eSKate Stone if (process_sp) { 4085e8dce4dSJason Molenda Process::StopLocker stop_locker; 409b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 410b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 411b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 4125e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 4135e8dce4dSJason Molenda } 414a61d0a5bSGreg Clayton } 4155e8dce4dSJason Molenda 4165e8dce4dSJason Molenda return num_queues; 4175e8dce4dSJason Molenda } 4185e8dce4dSJason Molenda 419b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) { 420*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, index); 421baf5664fSJonas Devlieghere 4225e8dce4dSJason Molenda SBQueue sb_queue; 4235e8dce4dSJason Molenda QueueSP queue_sp; 4245e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 425b9c1b51eSKate Stone if (process_sp) { 4265e8dce4dSJason Molenda Process::StopLocker stop_locker; 427b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 428b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 429b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 4305e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 4315e8dce4dSJason Molenda sb_queue.SetQueue(queue_sp); 4325e8dce4dSJason Molenda } 433a61d0a5bSGreg Clayton } 4345e8dce4dSJason Molenda 435d232abc3SJonas Devlieghere return sb_queue; 4365e8dce4dSJason Molenda } 4375e8dce4dSJason Molenda 438b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) { 439*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, include_expression_stops); 440baf5664fSJonas Devlieghere 441bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 442b9c1b51eSKate Stone if (process_sp) { 443b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 444b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 445bf2956a2SJim Ingham if (include_expression_stops) 446bf2956a2SJim Ingham return process_sp->GetStopID(); 447bf2956a2SJim Ingham else 448bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 449bf2956a2SJim Ingham } 450bf2956a2SJim Ingham return 0; 451bf2956a2SJim Ingham } 452bf2956a2SJim Ingham 453b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) { 454*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, stop_id); 455baf5664fSJonas Devlieghere 45638810f43SIlia K SBEvent sb_event; 45738810f43SIlia K EventSP event_sp; 45838810f43SIlia K ProcessSP process_sp(GetSP()); 459b9c1b51eSKate Stone if (process_sp) { 460b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 461b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 46238810f43SIlia K event_sp = process_sp->GetStopEventForStopID(stop_id); 46338810f43SIlia K sb_event.reset(event_sp); 46438810f43SIlia K } 46538810f43SIlia K 466d232abc3SJonas Devlieghere return sb_event; 46738810f43SIlia K } 46838810f43SIlia K 469b9c1b51eSKate Stone StateType SBProcess::GetState() { 470*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 471ceb6b139SCaroline Tice 472ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 473acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 474b9c1b51eSKate Stone if (process_sp) { 475b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 476b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 477acdbe816SGreg Clayton ret_val = process_sp->GetState(); 478af67cecdSGreg Clayton } 479ceb6b139SCaroline Tice 480ceb6b139SCaroline Tice return ret_val; 48130fdc8d8SChris Lattner } 48230fdc8d8SChris Lattner 483b9c1b51eSKate Stone int SBProcess::GetExitStatus() { 484*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 485baf5664fSJonas Devlieghere 4864838131bSGreg Clayton int exit_status = 0; 487acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 488b9c1b51eSKate Stone if (process_sp) { 489b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 490b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 491acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus(); 492af67cecdSGreg Clayton } 4934838131bSGreg Clayton 4944838131bSGreg Clayton return exit_status; 49530fdc8d8SChris Lattner } 49630fdc8d8SChris Lattner 497b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() { 498*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 499baf5664fSJonas Devlieghere 500248a1305SKonrad Kleine const char *exit_desc = nullptr; 501acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 502b9c1b51eSKate Stone if (process_sp) { 503b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 504b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 505acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription(); 506af67cecdSGreg Clayton } 5074838131bSGreg Clayton return exit_desc; 50830fdc8d8SChris Lattner } 50930fdc8d8SChris Lattner 510b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() { 511*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 512baf5664fSJonas Devlieghere 513ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 514acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 515acdbe816SGreg Clayton if (process_sp) 516acdbe816SGreg Clayton ret_val = process_sp->GetID(); 517ceb6b139SCaroline Tice 518ceb6b139SCaroline Tice return ret_val; 51930fdc8d8SChris Lattner } 52030fdc8d8SChris Lattner 521b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() { 522*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 523baf5664fSJonas Devlieghere 524949e8221SGreg Clayton uint32_t ret_val = 0; 525949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 526949e8221SGreg Clayton if (process_sp) 527949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 528949e8221SGreg Clayton return ret_val; 529949e8221SGreg Clayton } 530949e8221SGreg Clayton 531b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const { 532*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 533baf5664fSJonas Devlieghere 534cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 535acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 536acdbe816SGreg Clayton if (process_sp) 537acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 538cf386e24SJohnny Chen 539cf386e24SJohnny Chen 540cf386e24SJohnny Chen return byteOrder; 541cf386e24SJohnny Chen } 542cf386e24SJohnny Chen 543b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const { 544*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 545baf5664fSJonas Devlieghere 546ceb6b139SCaroline Tice uint32_t size = 0; 547acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 548acdbe816SGreg Clayton if (process_sp) 549acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 550ceb6b139SCaroline Tice 551ceb6b139SCaroline Tice 552ceb6b139SCaroline Tice return size; 55330fdc8d8SChris Lattner } 55430fdc8d8SChris Lattner 555b9c1b51eSKate Stone SBError SBProcess::Continue() { 556*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 557baf5664fSJonas Devlieghere 55830fdc8d8SChris Lattner SBError sb_error; 559acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 5600c74e78dSGreg Clayton 561b9c1b51eSKate Stone if (process_sp) { 562b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 563b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 564acdbe816SGreg Clayton 565dc6224e0SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution()) 566dc6224e0SGreg Clayton sb_error.ref() = process_sp->Resume(); 567dc6224e0SGreg Clayton else 568248a1305SKonrad Kleine sb_error.ref() = process_sp->ResumeSynchronous(nullptr); 569b9c1b51eSKate Stone } else 57030fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 57130fdc8d8SChris Lattner 572d232abc3SJonas Devlieghere return sb_error; 57330fdc8d8SChris Lattner } 57430fdc8d8SChris Lattner 575b9c1b51eSKate Stone SBError SBProcess::Destroy() { 576*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 577baf5664fSJonas Devlieghere 57830fdc8d8SChris Lattner SBError sb_error; 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()); 583ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 584b9c1b51eSKate Stone } else 58530fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 58630fdc8d8SChris Lattner 587d232abc3SJonas Devlieghere return sb_error; 58830fdc8d8SChris Lattner } 58930fdc8d8SChris Lattner 590b9c1b51eSKate Stone SBError SBProcess::Stop() { 591*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 592baf5664fSJonas Devlieghere 59330fdc8d8SChris Lattner SBError sb_error; 594acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 595b9c1b51eSKate Stone if (process_sp) { 596b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 597b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 598acdbe816SGreg Clayton sb_error.SetError(process_sp->Halt()); 599b9c1b51eSKate Stone } else 60030fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 601ceb6b139SCaroline Tice 602d232abc3SJonas Devlieghere return sb_error; 60330fdc8d8SChris Lattner } 60430fdc8d8SChris Lattner 605b9c1b51eSKate Stone SBError SBProcess::Kill() { 606*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 607baf5664fSJonas Devlieghere 60830fdc8d8SChris Lattner SBError sb_error; 609acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 610b9c1b51eSKate Stone if (process_sp) { 611b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 612b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 613ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(true)); 614b9c1b51eSKate Stone } else 61530fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 616ceb6b139SCaroline Tice 617d232abc3SJonas Devlieghere return sb_error; 61830fdc8d8SChris Lattner } 61930fdc8d8SChris Lattner 620b9c1b51eSKate Stone SBError SBProcess::Detach() { 621*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 622baf5664fSJonas Devlieghere 623acff8950SJim Ingham // FIXME: This should come from a process default. 624acff8950SJim Ingham bool keep_stopped = false; 625d232abc3SJonas Devlieghere return Detach(keep_stopped); 626acff8950SJim Ingham } 627acff8950SJim Ingham 628b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) { 629*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, keep_stopped); 630baf5664fSJonas Devlieghere 63130fdc8d8SChris Lattner SBError sb_error; 632acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 633b9c1b51eSKate Stone if (process_sp) { 634b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 635b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 636acff8950SJim Ingham sb_error.SetError(process_sp->Detach(keep_stopped)); 637b9c1b51eSKate Stone } else 63830fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 63930fdc8d8SChris Lattner 640d232abc3SJonas Devlieghere return sb_error; 64130fdc8d8SChris Lattner } 64230fdc8d8SChris Lattner 643b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) { 644*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, signo); 645baf5664fSJonas Devlieghere 64630fdc8d8SChris Lattner SBError sb_error; 647acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 648b9c1b51eSKate Stone if (process_sp) { 649b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 650b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 651acdbe816SGreg Clayton sb_error.SetError(process_sp->Signal(signo)); 652b9c1b51eSKate Stone } else 65330fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 654581af8b0SJonas Devlieghere 655d232abc3SJonas Devlieghere return sb_error; 65630fdc8d8SChris Lattner } 65730fdc8d8SChris Lattner 658b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() { 659*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 660802dc402STodd Fiala 661baf5664fSJonas Devlieghere if (auto process_sp = GetSP()) 662d232abc3SJonas Devlieghere return SBUnixSignals{process_sp}; 663baf5664fSJonas Devlieghere 664d232abc3SJonas Devlieghere return SBUnixSignals{}; 665802dc402STodd Fiala } 666802dc402STodd Fiala 667b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() { 668*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 669baf5664fSJonas Devlieghere 670cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 671b9c1b51eSKate Stone if (process_sp) { 672cfc0935eSJim Ingham process_sp->SendAsyncInterrupt(); 673cfc0935eSJim Ingham } 674cfc0935eSJim Ingham } 675cfc0935eSJim Ingham 676b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) { 677*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, tid); 678baf5664fSJonas Devlieghere 6794838131bSGreg Clayton SBThread sb_thread; 68017a6ad05SGreg Clayton ThreadSP thread_sp; 681acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 682b9c1b51eSKate Stone if (process_sp) { 6837fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6847fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 685b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 686b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 6877fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update); 68817a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 689af67cecdSGreg Clayton } 6904838131bSGreg Clayton 691d232abc3SJonas Devlieghere return sb_thread; 69230fdc8d8SChris Lattner } 69330fdc8d8SChris Lattner 694b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) { 695*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, index_id); 696baf5664fSJonas Devlieghere 69718b46896SJim Ingham SBThread sb_thread; 69818b46896SJim Ingham ThreadSP thread_sp; 69918b46896SJim Ingham ProcessSP process_sp(GetSP()); 700b9c1b51eSKate Stone if (process_sp) { 70118b46896SJim Ingham Process::StopLocker stop_locker; 70218b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 703b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 704b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 705b9c1b51eSKate Stone thread_sp = 706b9c1b51eSKate Stone process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update); 70718b46896SJim Ingham sb_thread.SetThread(thread_sp); 70818b46896SJim Ingham } 70918b46896SJim Ingham 710d232abc3SJonas Devlieghere return sb_thread; 71118b46896SJim Ingham } 71218b46896SJim Ingham 713b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) { 714*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(event); 715baf5664fSJonas Devlieghere 716ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get()); 717ceb6b139SCaroline Tice 718ceb6b139SCaroline Tice return ret_val; 71930fdc8d8SChris Lattner } 72030fdc8d8SChris Lattner 721b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) { 722*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(event); 723baf5664fSJonas Devlieghere 724ea2cc5e0SPavel Labath bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get()); 725ea2cc5e0SPavel Labath 726ea2cc5e0SPavel Labath return ret_val; 72730fdc8d8SChris Lattner } 72830fdc8d8SChris Lattner 729b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) { 730*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(event); 731baf5664fSJonas Devlieghere 7320161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 7330161b49cSJim Ingham } 7340161b49cSJim Ingham 7350161b49cSJim Ingham const char * 736b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event, 737b9c1b51eSKate Stone size_t idx) { 738*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(event, idx); 739baf5664fSJonas Devlieghere 7400161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 7410161b49cSJim Ingham } 7420161b49cSJim Ingham 743b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) { 744*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(event); 745baf5664fSJonas Devlieghere 74675930019STodd Fiala ProcessSP process_sp = 74775930019STodd Fiala Process::ProcessEventData::GetProcessFromEvent(event.get()); 748b9c1b51eSKate Stone if (!process_sp) { 74905097246SAdrian Prantl // StructuredData events also know the process they come from. Try that. 75075930019STodd Fiala process_sp = EventDataStructuredData::GetProcessFromEvent(event.get()); 75175930019STodd Fiala } 75275930019STodd Fiala 753d232abc3SJonas Devlieghere return SBProcess(process_sp); 75430fdc8d8SChris Lattner } 75530fdc8d8SChris Lattner 756b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) { 757*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(event); 758baf5664fSJonas Devlieghere 75906d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 76006d2855fSIlia K } 76106d2855fSIlia K 76275930019STodd Fiala lldb::SBStructuredData 763b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) { 764*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(event); 765baf5664fSJonas Devlieghere 766d232abc3SJonas Devlieghere return SBStructuredData(event.GetSP()); 76775930019STodd Fiala } 76875930019STodd Fiala 769b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) { 770*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(event); 771baf5664fSJonas Devlieghere 77275930019STodd Fiala return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) && 77375930019STodd Fiala !EventIsStructuredDataEvent(event); 77475930019STodd Fiala } 77575930019STodd Fiala 776b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) { 777*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(event); 778baf5664fSJonas Devlieghere 77975930019STodd Fiala EventSP event_sp = event.GetSP(); 78075930019STodd Fiala EventData *event_data = event_sp ? event_sp->GetData() : nullptr; 781b9c1b51eSKate Stone return event_data && (event_data->GetFlavor() == 782b9c1b51eSKate Stone EventDataStructuredData::GetFlavorString()); 783e6bc6cb9SJim Ingham } 78430fdc8d8SChris Lattner 785b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const { 786*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 787ceb6b139SCaroline Tice 788acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 789acdbe816SGreg Clayton 790acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 791ceb6b139SCaroline Tice 792d232abc3SJonas Devlieghere return broadcaster; 79330fdc8d8SChris Lattner } 79430fdc8d8SChris Lattner 795b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() { 796*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT(); 797baf5664fSJonas Devlieghere 7984bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 7994bddaeb5SJim Ingham } 8004bddaeb5SJim Ingham 801b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len, 802b9c1b51eSKate Stone SBError &sb_error) { 803*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, addr, dst, dst_len, sb_error); 804ceb6b139SCaroline Tice 80530fdc8d8SChris Lattner size_t bytes_read = 0; 80630fdc8d8SChris Lattner 807acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 808acdbe816SGreg Clayton 8094838131bSGreg Clayton 810b9c1b51eSKate Stone if (process_sp) { 8117fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 812b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 813b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 814b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 8157fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref()); 816b9c1b51eSKate Stone } else { 8177fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 8187fdf9ef1SGreg Clayton } 819b9c1b51eSKate Stone } else { 82030fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 82130fdc8d8SChris Lattner } 82230fdc8d8SChris Lattner 82330fdc8d8SChris Lattner return bytes_read; 82430fdc8d8SChris Lattner } 82530fdc8d8SChris Lattner 826b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size, 827b9c1b51eSKate Stone lldb::SBError &sb_error) { 828*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, addr, buf, size, sb_error); 8290d7b0c96SJonas Devlieghere 830e91b7957SGreg Clayton size_t bytes_read = 0; 831acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 832b9c1b51eSKate Stone if (process_sp) { 8337fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 834b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 835b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 836b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 837b9c1b51eSKate Stone bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size, 838b9c1b51eSKate Stone sb_error.ref()); 839b9c1b51eSKate Stone } else { 8407fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 8417fdf9ef1SGreg Clayton } 842b9c1b51eSKate Stone } else { 843e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 844e91b7957SGreg Clayton } 845e91b7957SGreg Clayton return bytes_read; 846e91b7957SGreg Clayton } 847e91b7957SGreg Clayton 848b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size, 849b9c1b51eSKate Stone lldb::SBError &sb_error) { 850*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, addr, byte_size, sb_error); 851baf5664fSJonas Devlieghere 8527fdf9ef1SGreg Clayton uint64_t value = 0; 853acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 854b9c1b51eSKate Stone if (process_sp) { 8557fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 856b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 857b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 858b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 859b9c1b51eSKate Stone value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0, 860b9c1b51eSKate Stone sb_error.ref()); 861b9c1b51eSKate Stone } else { 8627fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 8637fdf9ef1SGreg Clayton } 864b9c1b51eSKate Stone } else { 865e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 866e91b7957SGreg Clayton } 8677fdf9ef1SGreg Clayton return value; 868e91b7957SGreg Clayton } 869e91b7957SGreg Clayton 870b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr, 871b9c1b51eSKate Stone lldb::SBError &sb_error) { 872*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, addr, sb_error); 873baf5664fSJonas Devlieghere 874e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 875acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 876b9c1b51eSKate Stone if (process_sp) { 8777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 878b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 879b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 880b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 8817fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref()); 882b9c1b51eSKate Stone } else { 8837fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 8847fdf9ef1SGreg Clayton } 885b9c1b51eSKate Stone } else { 886e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 887e91b7957SGreg Clayton } 888e91b7957SGreg Clayton return ptr; 889e91b7957SGreg Clayton } 890e91b7957SGreg Clayton 891b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len, 892b9c1b51eSKate Stone SBError &sb_error) { 893*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, addr, src, src_len, sb_error); 8940d7b0c96SJonas Devlieghere 89530fdc8d8SChris Lattner size_t bytes_written = 0; 89630fdc8d8SChris Lattner 897acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 898acdbe816SGreg Clayton 899b9c1b51eSKate Stone if (process_sp) { 9007fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 901b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 902b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 903b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 904b9c1b51eSKate Stone bytes_written = 905b9c1b51eSKate Stone process_sp->WriteMemory(addr, src, src_len, sb_error.ref()); 906b9c1b51eSKate Stone } else { 9077fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9087fdf9ef1SGreg Clayton } 90930fdc8d8SChris Lattner } 91030fdc8d8SChris Lattner 91130fdc8d8SChris Lattner return bytes_written; 91230fdc8d8SChris Lattner } 91330fdc8d8SChris Lattner 914b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) { 915*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, description); 916baf5664fSJonas Devlieghere 917da7bc7d0SGreg Clayton Stream &strm = description.ref(); 918da7bc7d0SGreg Clayton 919acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 920b9c1b51eSKate Stone if (process_sp) { 921dde9cff3SCaroline Tice char path[PATH_MAX]; 922dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath(path, sizeof(path)); 923acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 924248a1305SKonrad Kleine const char *exe_name = nullptr; 9251d273166SGreg Clayton if (exe_module) 9261d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 9271d273166SGreg Clayton 928d01b2953SDaniel Malea strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 929b9c1b51eSKate Stone process_sp->GetID(), lldb_private::StateAsCString(GetState()), 930b9c1b51eSKate Stone GetNumThreads(), exe_name ? ", executable = " : "", 9311d273166SGreg Clayton exe_name ? exe_name : ""); 932b9c1b51eSKate Stone } else 933da7bc7d0SGreg Clayton strm.PutCString("No value"); 934dde9cff3SCaroline Tice 935dde9cff3SCaroline Tice return true; 936dde9cff3SCaroline Tice } 9378f343b09SGreg Clayton 938eefda182SMed Ismail Bennani SBStructuredData SBProcess::GetExtendedCrashInformation() { 939*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 940eefda182SMed Ismail Bennani SBStructuredData data; 941eefda182SMed Ismail Bennani ProcessSP process_sp(GetSP()); 942eefda182SMed Ismail Bennani if (!process_sp) 943d232abc3SJonas Devlieghere return data; 944eefda182SMed Ismail Bennani 945eefda182SMed Ismail Bennani PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 946eefda182SMed Ismail Bennani 947eefda182SMed Ismail Bennani if (!platform_sp) 948d232abc3SJonas Devlieghere return data; 949eefda182SMed Ismail Bennani 950eefda182SMed Ismail Bennani auto expected_data = 951eefda182SMed Ismail Bennani platform_sp->FetchExtendedCrashInformation(*process_sp.get()); 952eefda182SMed Ismail Bennani 953eefda182SMed Ismail Bennani if (!expected_data) 954d232abc3SJonas Devlieghere return data; 955eefda182SMed Ismail Bennani 956eefda182SMed Ismail Bennani StructuredData::ObjectSP fetched_data = *expected_data; 957eefda182SMed Ismail Bennani data.m_impl_up->SetObjectSP(fetched_data); 958d232abc3SJonas Devlieghere return data; 959eefda182SMed Ismail Bennani } 960eefda182SMed Ismail Bennani 9618f343b09SGreg Clayton uint32_t 962b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const { 963*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, sb_error); 964baf5664fSJonas Devlieghere 965f9ef60d2SJohnny Chen uint32_t num = 0; 966f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 967b9c1b51eSKate Stone if (process_sp) { 968b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 969b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 970f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo(num)); 971b9c1b51eSKate Stone } else { 972f9ef60d2SJohnny Chen sb_error.SetErrorString("SBProcess is invalid"); 973f9ef60d2SJohnny Chen } 974f9ef60d2SJohnny Chen return num; 975f9ef60d2SJohnny Chen } 976f9ef60d2SJohnny Chen 977b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec, 978b9c1b51eSKate Stone lldb::SBError &sb_error) { 979*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, sb_remote_image_spec, sb_error); 980baf5664fSJonas Devlieghere 9814fbd67acSTamas Berghammer return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); 9824fbd67acSTamas Berghammer } 9834fbd67acSTamas Berghammer 984b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec, 9854fbd67acSTamas Berghammer const lldb::SBFileSpec &sb_remote_image_spec, 986b9c1b51eSKate Stone lldb::SBError &sb_error) { 987*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, sb_local_image_spec, sb_remote_image_spec, sb_error); 988baf5664fSJonas Devlieghere 989acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 990b9c1b51eSKate Stone if (process_sp) { 9917fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 992b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 993b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 994b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 9953cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 996b9c1b51eSKate Stone return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec, 997b9c1b51eSKate Stone *sb_remote_image_spec, sb_error.ref()); 998b9c1b51eSKate Stone } else { 9997fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10007fdf9ef1SGreg Clayton } 1001abc5d72fSJim Ingham } else { 1002abc5d72fSJim Ingham sb_error.SetErrorString("process is invalid"); 10037fdf9ef1SGreg Clayton } 10048f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 10058f343b09SGreg Clayton } 10068f343b09SGreg Clayton 10070d231f71SJim Ingham uint32_t SBProcess::LoadImageUsingPaths(const lldb::SBFileSpec &image_spec, 10080d231f71SJim Ingham SBStringList &paths, 10090d231f71SJim Ingham lldb::SBFileSpec &loaded_path, 10100d231f71SJim Ingham lldb::SBError &error) { 1011*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, image_spec, paths, loaded_path, error); 1012baf5664fSJonas Devlieghere 10130d231f71SJim Ingham ProcessSP process_sp(GetSP()); 10140d231f71SJim Ingham if (process_sp) { 10150d231f71SJim Ingham Process::StopLocker stop_locker; 10160d231f71SJim Ingham if (stop_locker.TryLock(&process_sp->GetRunLock())) { 10170d231f71SJim Ingham std::lock_guard<std::recursive_mutex> guard( 10180d231f71SJim Ingham process_sp->GetTarget().GetAPIMutex()); 10190d231f71SJim Ingham PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 10200d231f71SJim Ingham size_t num_paths = paths.GetSize(); 10210d231f71SJim Ingham std::vector<std::string> paths_vec; 10220d231f71SJim Ingham paths_vec.reserve(num_paths); 10230d231f71SJim Ingham for (size_t i = 0; i < num_paths; i++) 10240d231f71SJim Ingham paths_vec.push_back(paths.GetStringAtIndex(i)); 10250d231f71SJim Ingham FileSpec loaded_spec; 10260d231f71SJim Ingham 1027581af8b0SJonas Devlieghere uint32_t token = platform_sp->LoadImageUsingPaths( 1028581af8b0SJonas Devlieghere process_sp.get(), *image_spec, paths_vec, error.ref(), &loaded_spec); 10290d231f71SJim Ingham if (token != LLDB_INVALID_IMAGE_TOKEN) 10300d231f71SJim Ingham loaded_path = loaded_spec; 10310d231f71SJim Ingham return token; 10320d231f71SJim Ingham } else { 10330d231f71SJim Ingham error.SetErrorString("process is running"); 10340d231f71SJim Ingham } 10350d231f71SJim Ingham } else { 10360d231f71SJim Ingham error.SetErrorString("process is invalid"); 10370d231f71SJim Ingham } 10380d231f71SJim Ingham 10390d231f71SJim Ingham return LLDB_INVALID_IMAGE_TOKEN; 10400d231f71SJim Ingham } 10410d231f71SJim Ingham 1042b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) { 1043*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, image_token); 1044baf5664fSJonas Devlieghere 10458f343b09SGreg Clayton lldb::SBError sb_error; 1046acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1047b9c1b51eSKate Stone if (process_sp) { 10487fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1049b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1050b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1051b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 10523cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1053b9c1b51eSKate Stone sb_error.SetError( 1054b9c1b51eSKate Stone platform_sp->UnloadImage(process_sp.get(), image_token)); 1055b9c1b51eSKate Stone } else { 10567fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10577fdf9ef1SGreg Clayton } 1058b9c1b51eSKate Stone } else 10598f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 1060d232abc3SJonas Devlieghere return sb_error; 10618f343b09SGreg Clayton } 10628c71337aSJason Molenda 1063b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) { 1064*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, event_data); 1065baf5664fSJonas Devlieghere 1066a332978bSJason Molenda lldb::SBError sb_error; 1067a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1068b9c1b51eSKate Stone if (process_sp) { 1069a332978bSJason Molenda Process::StopLocker stop_locker; 1070b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1071b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1072b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1073a332978bSJason Molenda sb_error.SetError(process_sp->SendEventData(event_data)); 1074b9c1b51eSKate Stone } else { 1075a332978bSJason Molenda sb_error.SetErrorString("process is running"); 1076a332978bSJason Molenda } 1077b9c1b51eSKate Stone } else 1078a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1079d232abc3SJonas Devlieghere return sb_error; 1080a332978bSJason Molenda } 1081a332978bSJason Molenda 1082b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() { 1083*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 1084baf5664fSJonas Devlieghere 10858c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1086b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 10878c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 108895d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 10898c71337aSJason Molenda } 10908c71337aSJason Molenda return 0; 10918c71337aSJason Molenda } 10928c71337aSJason Molenda 1093b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) { 1094*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, idx); 1095baf5664fSJonas Devlieghere 10968c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1097b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 10988c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1099b9c1b51eSKate Stone const std::vector<ConstString> &names = 1100b9c1b51eSKate Stone runtime->GetExtendedBacktraceTypes(); 1101b9c1b51eSKate Stone if (idx < names.size()) { 11028c71337aSJason Molenda return names[idx].AsCString(); 11038c71337aSJason Molenda } 11048c71337aSJason Molenda } 1105248a1305SKonrad Kleine return nullptr; 11068c71337aSJason Molenda } 1107a51ea382SKuba Brecka 1108b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) { 1109*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, addr); 1110baf5664fSJonas Devlieghere 1111a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1112a51ea382SKuba Brecka SBThreadCollection threads; 1113b9c1b51eSKate Stone if (process_sp) { 1114a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1115a51ea382SKuba Brecka } 1116d232abc3SJonas Devlieghere return threads; 1117a51ea382SKuba Brecka } 111863927548SKuba Brecka 1119b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent( 1120b9c1b51eSKate Stone InstrumentationRuntimeType type) { 1121*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, type); 1122baf5664fSJonas Devlieghere 112363927548SKuba Brecka ProcessSP process_sp(GetSP()); 112463927548SKuba Brecka if (!process_sp) 112563927548SKuba Brecka return false; 112663927548SKuba Brecka 1127baf769d3SRaphael Isemann std::lock_guard<std::recursive_mutex> guard( 1128baf769d3SRaphael Isemann process_sp->GetTarget().GetAPIMutex()); 1129baf769d3SRaphael Isemann 1130b9c1b51eSKate Stone InstrumentationRuntimeSP runtime_sp = 1131b9c1b51eSKate Stone process_sp->GetInstrumentationRuntime(type); 113263927548SKuba Brecka 113363927548SKuba Brecka if (!runtime_sp.get()) 113463927548SKuba Brecka return false; 113563927548SKuba Brecka 113663927548SKuba Brecka return runtime_sp->IsActive(); 113763927548SKuba Brecka } 1138f7d1893fSAdrian McCarthy 1139b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) { 1140*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, file_name); 1141baf5664fSJonas Devlieghere 1142f7d1893fSAdrian McCarthy lldb::SBError error; 1143f7d1893fSAdrian McCarthy ProcessSP process_sp(GetSP()); 1144b9c1b51eSKate Stone if (!process_sp) { 1145f7d1893fSAdrian McCarthy error.SetErrorString("SBProcess is invalid"); 1146d232abc3SJonas Devlieghere return error; 1147f7d1893fSAdrian McCarthy } 1148f7d1893fSAdrian McCarthy 1149b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1150b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1151f7d1893fSAdrian McCarthy 1152b9c1b51eSKate Stone if (process_sp->GetState() != eStateStopped) { 1153f7d1893fSAdrian McCarthy error.SetErrorString("the process is not stopped"); 1154d232abc3SJonas Devlieghere return error; 1155f7d1893fSAdrian McCarthy } 1156f7d1893fSAdrian McCarthy 11578f3be7a3SJonas Devlieghere FileSpec core_file(file_name); 11589ea6dd5cSJason Molenda SaveCoreStyle core_style = SaveCoreStyle::eSaveCoreFull; 11592ace1e57SPavel Labath error.ref() = PluginManager::SaveCore(process_sp, core_file, core_style, ""); 1160d232abc3SJonas Devlieghere return error; 1161f7d1893fSAdrian McCarthy } 116226036843SHoward Hellyer 116326036843SHoward Hellyer lldb::SBError 1164b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr, 1165b9c1b51eSKate Stone SBMemoryRegionInfo &sb_region_info) { 1166*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, load_addr, sb_region_info); 1167baf5664fSJonas Devlieghere 116826036843SHoward Hellyer lldb::SBError sb_error; 116926036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1170b9c1b51eSKate Stone if (process_sp) { 117126036843SHoward Hellyer Process::StopLocker stop_locker; 1172b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1173b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1174b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 117536788bbbSTatyana Krasnukha 1176b9c1b51eSKate Stone sb_error.ref() = 117736788bbbSTatyana Krasnukha process_sp->GetMemoryRegionInfo(load_addr, sb_region_info.ref()); 1178b9c1b51eSKate Stone } else { 117926036843SHoward Hellyer sb_error.SetErrorString("process is running"); 118026036843SHoward Hellyer } 1181b9c1b51eSKate Stone } else { 118226036843SHoward Hellyer sb_error.SetErrorString("SBProcess is invalid"); 118326036843SHoward Hellyer } 1184d232abc3SJonas Devlieghere return sb_error; 118526036843SHoward Hellyer } 118626036843SHoward Hellyer 1187b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() { 1188*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 1189baf5664fSJonas Devlieghere 119026036843SHoward Hellyer lldb::SBMemoryRegionInfoList sb_region_list; 119136788bbbSTatyana Krasnukha 119226036843SHoward Hellyer ProcessSP process_sp(GetSP()); 119326036843SHoward Hellyer Process::StopLocker stop_locker; 119436788bbbSTatyana Krasnukha if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) { 1195b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1196b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 119736788bbbSTatyana Krasnukha 119836788bbbSTatyana Krasnukha process_sp->GetMemoryRegions(sb_region_list.ref()); 119926036843SHoward Hellyer } 120036788bbbSTatyana Krasnukha 1201d232abc3SJonas Devlieghere return sb_region_list; 120226036843SHoward Hellyer } 1203141a6263SVadim Macagon 1204141a6263SVadim Macagon lldb::SBProcessInfo SBProcess::GetProcessInfo() { 1205*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 1206baf5664fSJonas Devlieghere 1207141a6263SVadim Macagon lldb::SBProcessInfo sb_proc_info; 1208141a6263SVadim Macagon ProcessSP process_sp(GetSP()); 1209141a6263SVadim Macagon ProcessInstanceInfo proc_info; 1210141a6263SVadim Macagon if (process_sp && process_sp->GetProcessInfo(proc_info)) { 1211141a6263SVadim Macagon sb_proc_info.SetProcessInfo(proc_info); 1212141a6263SVadim Macagon } 1213d232abc3SJonas Devlieghere return sb_proc_info; 1214141a6263SVadim Macagon } 1215ae211eceSMichal Gorny 12162e7ec447SPeter S. Housel lldb::addr_t SBProcess::AllocateMemory(size_t size, uint32_t permissions, 12172e7ec447SPeter S. Housel lldb::SBError &sb_error) { 1218*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, size, permissions, sb_error); 12192e7ec447SPeter S. Housel 12202e7ec447SPeter S. Housel lldb::addr_t addr = LLDB_INVALID_ADDRESS; 12212e7ec447SPeter S. Housel ProcessSP process_sp(GetSP()); 12222e7ec447SPeter S. Housel if (process_sp) { 12232e7ec447SPeter S. Housel Process::StopLocker stop_locker; 12242e7ec447SPeter S. Housel if (stop_locker.TryLock(&process_sp->GetRunLock())) { 12252e7ec447SPeter S. Housel std::lock_guard<std::recursive_mutex> guard( 12262e7ec447SPeter S. Housel process_sp->GetTarget().GetAPIMutex()); 12272e7ec447SPeter S. Housel addr = process_sp->AllocateMemory(size, permissions, sb_error.ref()); 12282e7ec447SPeter S. Housel } else { 12292e7ec447SPeter S. Housel sb_error.SetErrorString("process is running"); 12302e7ec447SPeter S. Housel } 12312e7ec447SPeter S. Housel } else { 12322e7ec447SPeter S. Housel sb_error.SetErrorString("SBProcess is invalid"); 12332e7ec447SPeter S. Housel } 12342e7ec447SPeter S. Housel return addr; 12352e7ec447SPeter S. Housel } 12362e7ec447SPeter S. Housel 12372e7ec447SPeter S. Housel lldb::SBError SBProcess::DeallocateMemory(lldb::addr_t ptr) { 1238*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, ptr); 12392e7ec447SPeter S. Housel 12402e7ec447SPeter S. Housel lldb::SBError sb_error; 12412e7ec447SPeter S. Housel ProcessSP process_sp(GetSP()); 12422e7ec447SPeter S. Housel if (process_sp) { 12432e7ec447SPeter S. Housel Process::StopLocker stop_locker; 12442e7ec447SPeter S. Housel if (stop_locker.TryLock(&process_sp->GetRunLock())) { 12452e7ec447SPeter S. Housel std::lock_guard<std::recursive_mutex> guard( 12462e7ec447SPeter S. Housel process_sp->GetTarget().GetAPIMutex()); 12472e7ec447SPeter S. Housel Status error = process_sp->DeallocateMemory(ptr); 12482e7ec447SPeter S. Housel sb_error.SetError(error); 12492e7ec447SPeter S. Housel } else { 12502e7ec447SPeter S. Housel sb_error.SetErrorString("process is running"); 12512e7ec447SPeter S. Housel } 12522e7ec447SPeter S. Housel } else { 12532e7ec447SPeter S. Housel sb_error.SetErrorString("SBProcess is invalid"); 12542e7ec447SPeter S. Housel } 12552e7ec447SPeter S. Housel return sb_error; 12562e7ec447SPeter S. Housel } 1257