130fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===// 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*baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 1130fdc8d8SChris Lattner 12bdae3787SVirgile Bello #include <inttypes.h> 13bdae3787SVirgile Bello 1430fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner 175d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 181f746071SGreg Clayton #include "lldb/Core/Module.h" 19f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h" 2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2126036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h" 2230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 248c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h" 256611103cSGreg Clayton #include "lldb/Target/Target.h" 266611103cSGreg Clayton #include "lldb/Target/Thread.h" 27145d95c9SPavel Labath #include "lldb/Utility/Args.h" 286f9e6901SZachary Turner #include "lldb/Utility/Log.h" 29805e7106SZachary Turner #include "lldb/Utility/ProcessInfo.h" 30d821c997SPavel Labath #include "lldb/Utility/State.h" 31bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 3230fdc8d8SChris Lattner 3330fdc8d8SChris Lattner 344c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 354c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 360e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 374c5de699SEli Friedman #include "lldb/API/SBEvent.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" 47d5d8d91cSRavitheja Addepally #include "lldb/API/SBTraceOptions.h" 48802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h" 4930fdc8d8SChris Lattner 5030fdc8d8SChris Lattner using namespace lldb; 5130fdc8d8SChris Lattner using namespace lldb_private; 5230fdc8d8SChris Lattner 53*baf5664fSJonas Devlieghere SBProcess::SBProcess() : m_opaque_wp() { 54*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBProcess); 55*baf5664fSJonas Devlieghere } 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner //---------------------------------------------------------------------- 5830fdc8d8SChris Lattner // SBProcess constructor 5930fdc8d8SChris Lattner //---------------------------------------------------------------------- 6030fdc8d8SChris Lattner 61*baf5664fSJonas Devlieghere SBProcess::SBProcess(const SBProcess &rhs) : m_opaque_wp(rhs.m_opaque_wp) { 62*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBProcess, (const lldb::SBProcess &), rhs); 63*baf5664fSJonas Devlieghere } 6430fdc8d8SChris Lattner 65b9c1b51eSKate Stone SBProcess::SBProcess(const lldb::ProcessSP &process_sp) 66*baf5664fSJonas Devlieghere : m_opaque_wp(process_sp) { 67*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBProcess, (const lldb::ProcessSP &), process_sp); 68*baf5664fSJonas Devlieghere } 6930fdc8d8SChris Lattner 70b9c1b51eSKate Stone const SBProcess &SBProcess::operator=(const SBProcess &rhs) { 71*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBProcess &, 72*baf5664fSJonas Devlieghere SBProcess, operator=,(const lldb::SBProcess &), rhs); 73*baf5664fSJonas Devlieghere 74efabb123SGreg Clayton if (this != &rhs) 754e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 76efabb123SGreg Clayton return *this; 77efabb123SGreg Clayton } 78efabb123SGreg Clayton 7930fdc8d8SChris Lattner //---------------------------------------------------------------------- 8030fdc8d8SChris Lattner // Destructor 8130fdc8d8SChris Lattner //---------------------------------------------------------------------- 82b9c1b51eSKate Stone SBProcess::~SBProcess() {} 8330fdc8d8SChris Lattner 84b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClassName() { 85*baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD_NO_ARGS(const char *, SBProcess, 86*baf5664fSJonas Devlieghere GetBroadcasterClassName); 87*baf5664fSJonas Devlieghere 884bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 894bddaeb5SJim Ingham } 904bddaeb5SJim Ingham 91b9c1b51eSKate Stone const char *SBProcess::GetPluginName() { 92*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBProcess, GetPluginName); 93*baf5664fSJonas Devlieghere 94d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 95b9c1b51eSKate Stone if (process_sp) { 9657abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 97d7b30ef9SJim Ingham } 98d7b30ef9SJim Ingham return "<Unknown>"; 99d7b30ef9SJim Ingham } 100d7b30ef9SJim Ingham 101b9c1b51eSKate Stone const char *SBProcess::GetShortPluginName() { 102*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBProcess, GetShortPluginName); 103*baf5664fSJonas Devlieghere 104d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 105b9c1b51eSKate Stone if (process_sp) { 10657abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 107d7b30ef9SJim Ingham } 108d7b30ef9SJim Ingham return "<Unknown>"; 109d7b30ef9SJim Ingham } 110d7b30ef9SJim Ingham 111b9c1b51eSKate Stone lldb::ProcessSP SBProcess::GetSP() const { return m_opaque_wp.lock(); } 112d7b30ef9SJim Ingham 113b9c1b51eSKate Stone void SBProcess::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; } 114b9556accSGreg Clayton 115*baf5664fSJonas Devlieghere void SBProcess::Clear() { 116*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBProcess, Clear); 117*baf5664fSJonas Devlieghere 118*baf5664fSJonas Devlieghere m_opaque_wp.reset(); 119*baf5664fSJonas Devlieghere } 12030fdc8d8SChris Lattner 121b9c1b51eSKate Stone bool SBProcess::IsValid() const { 122*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBProcess, IsValid); 123*baf5664fSJonas Devlieghere 1244fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1254fc6cb9cSJim Ingham return ((bool)process_sp && process_sp->IsValid()); 12630fdc8d8SChris Lattner } 12730fdc8d8SChris Lattner 128b9c1b51eSKate Stone bool SBProcess::RemoteLaunch(char const **argv, char const **envp, 129b9c1b51eSKate Stone const char *stdin_path, const char *stdout_path, 1309631aae2SJames McIlree const char *stderr_path, 1319631aae2SJames McIlree const char *working_directory, 132b9c1b51eSKate Stone uint32_t launch_flags, bool stop_at_entry, 133b9c1b51eSKate Stone lldb::SBError &error) { 134*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBProcess, RemoteLaunch, 135*baf5664fSJonas Devlieghere (const char **, const char **, const char *, const char *, 136*baf5664fSJonas Devlieghere const char *, const char *, uint32_t, bool, 137*baf5664fSJonas Devlieghere lldb::SBError &), 138*baf5664fSJonas Devlieghere argv, envp, stdin_path, stdout_path, stderr_path, 139*baf5664fSJonas Devlieghere working_directory, launch_flags, stop_at_entry, error); 140*baf5664fSJonas Devlieghere 1415160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 142324a1036SSaleem Abdulrasool if (log) 143b9c1b51eSKate Stone log->Printf("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, " 144b9c1b51eSKate Stone "stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, " 145b9c1b51eSKate Stone "stop_at_entry=%i, &error (%p))...", 146324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_wp.lock().get()), 147324a1036SSaleem Abdulrasool static_cast<void *>(argv), static_cast<void *>(envp), 1489631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1499631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1509631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 151b9c1b51eSKate Stone working_directory ? working_directory : "NULL", launch_flags, 152b9c1b51eSKate Stone stop_at_entry, static_cast<void *>(error.get())); 1539631aae2SJames McIlree 154acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 155b9c1b51eSKate Stone if (process_sp) { 156b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 157b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 158b9c1b51eSKate Stone if (process_sp->GetState() == eStateConnected) { 159982c9762SGreg Clayton if (stop_at_entry) 160982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 1618f3be7a3SJonas Devlieghere ProcessLaunchInfo launch_info(FileSpec(stdin_path), FileSpec(stdout_path), 1628f3be7a3SJonas Devlieghere FileSpec(stderr_path), 1638f3be7a3SJonas Devlieghere FileSpec(working_directory), launch_flags); 164acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 165982c9762SGreg Clayton if (exe_module) 16614715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 167982c9762SGreg Clayton if (argv) 168982c9762SGreg Clayton launch_info.GetArguments().AppendArguments(argv); 169982c9762SGreg Clayton if (envp) 17062930e57SPavel Labath launch_info.GetEnvironment() = Environment(envp); 171acdbe816SGreg Clayton error.SetError(process_sp->Launch(launch_info)); 172b9c1b51eSKate Stone } else { 1739631aae2SJames McIlree error.SetErrorString("must be in eStateConnected to call RemoteLaunch"); 1749631aae2SJames McIlree } 175b9c1b51eSKate Stone } else { 1769631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 1779631aae2SJames McIlree } 1789631aae2SJames McIlree 1799631aae2SJames McIlree if (log) { 1809631aae2SJames McIlree SBStream sstr; 1819631aae2SJames McIlree error.GetDescription(sstr); 182324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", 183324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 184324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), sstr.GetData()); 1859631aae2SJames McIlree } 1869631aae2SJames McIlree 1879631aae2SJames McIlree return error.Success(); 1889631aae2SJames McIlree } 1899631aae2SJames McIlree 190b9c1b51eSKate Stone bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid, 191b9c1b51eSKate Stone lldb::SBError &error) { 192*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBProcess, RemoteAttachToProcessWithID, 193*baf5664fSJonas Devlieghere (lldb::pid_t, lldb::SBError &), pid, error); 194*baf5664fSJonas Devlieghere 195acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 196b9c1b51eSKate Stone if (process_sp) { 197b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 198b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 199b9c1b51eSKate Stone if (process_sp->GetState() == eStateConnected) { 200144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 201144f3a9cSGreg Clayton attach_info.SetProcessID(pid); 202acdbe816SGreg Clayton error.SetError(process_sp->Attach(attach_info)); 203b9c1b51eSKate Stone } else { 204b9c1b51eSKate Stone error.SetErrorString( 205b9c1b51eSKate Stone "must be in eStateConnected to call RemoteAttachToProcessWithID"); 2069631aae2SJames McIlree } 207b9c1b51eSKate Stone } else { 2089631aae2SJames McIlree error.SetErrorString("unable to attach pid"); 2099631aae2SJames McIlree } 2109631aae2SJames McIlree 2115160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2129631aae2SJames McIlree if (log) { 2139631aae2SJames McIlree SBStream sstr; 2149631aae2SJames McIlree error.GetDescription(sstr); 215b9c1b51eSKate Stone log->Printf("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 216b9c1b51eSKate Stone ") => SBError (%p): %s", 217324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), pid, 218324a1036SSaleem Abdulrasool static_cast<void *>(error.get()), sstr.GetData()); 2199631aae2SJames McIlree } 2209631aae2SJames McIlree 2219631aae2SJames McIlree return error.Success(); 2229631aae2SJames McIlree } 2239631aae2SJames McIlree 224b9c1b51eSKate Stone uint32_t SBProcess::GetNumThreads() { 225*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBProcess, GetNumThreads); 226*baf5664fSJonas Devlieghere 2275160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 228ceb6b139SCaroline Tice 229ceb6b139SCaroline Tice uint32_t num_threads = 0; 230acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 231b9c1b51eSKate Stone if (process_sp) { 2327fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2337fdf9ef1SGreg Clayton 2347fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 235b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 236b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 237acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 23830fdc8d8SChris Lattner } 239ceb6b139SCaroline Tice 240ceb6b139SCaroline Tice if (log) 241324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetNumThreads () => %d", 242324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num_threads); 243ceb6b139SCaroline Tice 244ceb6b139SCaroline Tice return num_threads; 24530fdc8d8SChris Lattner } 24630fdc8d8SChris Lattner 247b9c1b51eSKate Stone SBThread SBProcess::GetSelectedThread() const { 248*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBProcess, 249*baf5664fSJonas Devlieghere GetSelectedThread); 250*baf5664fSJonas Devlieghere 2515160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 252ceb6b139SCaroline Tice 25330fdc8d8SChris Lattner SBThread sb_thread; 25417a6ad05SGreg Clayton ThreadSP thread_sp; 255acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 256b9c1b51eSKate Stone if (process_sp) { 257b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 258b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 259acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 26017a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 261af67cecdSGreg Clayton } 262ceb6b139SCaroline Tice 263ceb6b139SCaroline Tice if (log) 264324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", 265324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 266324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 267ceb6b139SCaroline Tice 268*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_thread); 26930fdc8d8SChris Lattner } 27030fdc8d8SChris Lattner 271b9c1b51eSKate Stone SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid, 272b9c1b51eSKate Stone lldb::addr_t context) { 273*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBThread, SBProcess, CreateOSPluginThread, 274*baf5664fSJonas Devlieghere (lldb::tid_t, lldb::addr_t), tid, context); 275*baf5664fSJonas Devlieghere 2765160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 277a4d8747dSGreg Clayton 278a4d8747dSGreg Clayton SBThread sb_thread; 279a4d8747dSGreg Clayton ThreadSP thread_sp; 280a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 281b9c1b51eSKate Stone if (process_sp) { 282b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 283b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 284a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 285a4d8747dSGreg Clayton sb_thread.SetThread(thread_sp); 286a4d8747dSGreg Clayton } 287a4d8747dSGreg Clayton 288a4d8747dSGreg Clayton if (log) 289b9c1b51eSKate Stone log->Printf("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 290b9c1b51eSKate Stone ", context=0x%" PRIx64 ") => SBThread(%p)", 291324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, context, 292324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 293a4d8747dSGreg Clayton 294*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_thread); 295a4d8747dSGreg Clayton } 296a4d8747dSGreg Clayton 297b9c1b51eSKate Stone SBTarget SBProcess::GetTarget() const { 298*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBTarget, SBProcess, GetTarget); 299*baf5664fSJonas Devlieghere 3005160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 301ceb6b139SCaroline Tice 30230fdc8d8SChris Lattner SBTarget sb_target; 303b9556accSGreg Clayton TargetSP target_sp; 304acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 305b9c1b51eSKate Stone if (process_sp) { 306acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 307b9556accSGreg Clayton sb_target.SetSP(target_sp); 308b9556accSGreg Clayton } 309ceb6b139SCaroline Tice 310ceb6b139SCaroline Tice if (log) 311324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetTarget () => SBTarget(%p)", 312324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 313324a1036SSaleem Abdulrasool static_cast<void *>(target_sp.get())); 314ceb6b139SCaroline Tice 315*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_target); 31630fdc8d8SChris Lattner } 31730fdc8d8SChris Lattner 318b9c1b51eSKate Stone size_t SBProcess::PutSTDIN(const char *src, size_t src_len) { 319*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(size_t, SBProcess, PutSTDIN, (const char *, size_t), src, 320*baf5664fSJonas Devlieghere src_len); 321*baf5664fSJonas Devlieghere 3225160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 323ceb6b139SCaroline Tice 324ceb6b139SCaroline Tice size_t ret_val = 0; 325acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 326b9c1b51eSKate Stone if (process_sp) { 32797206d57SZachary Turner Status error; 328acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN(src, src_len, error); 32930fdc8d8SChris Lattner } 330ceb6b139SCaroline Tice 331ceb6b139SCaroline Tice if (log) 332b9c1b51eSKate Stone log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 333b9c1b51eSKate Stone ") => %" PRIu64, 334324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), src, 335b9c1b51eSKate Stone static_cast<uint64_t>(src_len), static_cast<uint64_t>(ret_val)); 336ceb6b139SCaroline Tice 337ceb6b139SCaroline Tice return ret_val; 33830fdc8d8SChris Lattner } 33930fdc8d8SChris Lattner 340b9c1b51eSKate Stone size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const { 341*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(size_t, SBProcess, GetSTDOUT, (char *, size_t), dst, 342*baf5664fSJonas Devlieghere dst_len); 343*baf5664fSJonas Devlieghere 344cfd1acedSGreg Clayton size_t bytes_read = 0; 345acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 346b9c1b51eSKate Stone if (process_sp) { 34797206d57SZachary Turner Status error; 348acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT(dst, dst_len, error); 34930fdc8d8SChris Lattner } 350ceb6b139SCaroline Tice 3515160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 352ceb6b139SCaroline Tice if (log) 353b9c1b51eSKate Stone log->Printf( 354b9c1b51eSKate Stone "SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 355b9c1b51eSKate Stone ") => %" PRIu64, 356b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 357b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 358ceb6b139SCaroline Tice 359cfd1acedSGreg Clayton return bytes_read; 36030fdc8d8SChris Lattner } 36130fdc8d8SChris Lattner 362b9c1b51eSKate Stone size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const { 363*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(size_t, SBProcess, GetSTDERR, (char *, size_t), dst, 364*baf5664fSJonas Devlieghere dst_len); 365*baf5664fSJonas Devlieghere 366cfd1acedSGreg Clayton size_t bytes_read = 0; 367acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 368b9c1b51eSKate Stone if (process_sp) { 36997206d57SZachary Turner Status error; 370acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR(dst, dst_len, error); 37130fdc8d8SChris Lattner } 372ceb6b139SCaroline Tice 3735160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 374ceb6b139SCaroline Tice if (log) 375b9c1b51eSKate Stone log->Printf( 376b9c1b51eSKate Stone "SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 377b9c1b51eSKate Stone ") => %" PRIu64, 378b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 379b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 380ceb6b139SCaroline Tice 381cfd1acedSGreg Clayton return bytes_read; 38230fdc8d8SChris Lattner } 38330fdc8d8SChris Lattner 384b9c1b51eSKate Stone size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const { 385*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(size_t, SBProcess, GetAsyncProfileData, 386*baf5664fSJonas Devlieghere (char *, size_t), dst, dst_len); 387*baf5664fSJonas Devlieghere 388ab3b8b22SHan Ming Ong size_t bytes_read = 0; 389ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 390b9c1b51eSKate Stone if (process_sp) { 39197206d57SZachary Turner Status error; 392ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error); 393ab3b8b22SHan Ming Ong } 394ab3b8b22SHan Ming Ong 3955160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 396ab3b8b22SHan Ming Ong if (log) 397b9c1b51eSKate Stone log->Printf( 398b9c1b51eSKate Stone "SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 399b9c1b51eSKate Stone ") => %" PRIu64, 400b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), static_cast<int>(bytes_read), 401b9c1b51eSKate Stone dst, static_cast<uint64_t>(dst_len), static_cast<uint64_t>(bytes_read)); 402ab3b8b22SHan Ming Ong 403ab3b8b22SHan Ming Ong return bytes_read; 404ab3b8b22SHan Ming Ong } 405ab3b8b22SHan Ming Ong 406d5d8d91cSRavitheja Addepally lldb::SBTrace SBProcess::StartTrace(SBTraceOptions &options, 407d5d8d91cSRavitheja Addepally lldb::SBError &error) { 408*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTrace, SBProcess, StartTrace, 409*baf5664fSJonas Devlieghere (lldb::SBTraceOptions &, lldb::SBError &), options, error); 410*baf5664fSJonas Devlieghere 411d5d8d91cSRavitheja Addepally Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 412d5d8d91cSRavitheja Addepally ProcessSP process_sp(GetSP()); 413d5d8d91cSRavitheja Addepally error.Clear(); 414d5d8d91cSRavitheja Addepally SBTrace trace_instance; 415d5d8d91cSRavitheja Addepally trace_instance.SetSP(process_sp); 416d5d8d91cSRavitheja Addepally lldb::user_id_t uid = LLDB_INVALID_UID; 417d5d8d91cSRavitheja Addepally 418d5d8d91cSRavitheja Addepally if (!process_sp) { 419d5d8d91cSRavitheja Addepally error.SetErrorString("invalid process"); 420d5d8d91cSRavitheja Addepally } else { 421e714c4f5SRavitheja Addepally uid = process_sp->StartTrace(*(options.m_traceoptions_sp), error.ref()); 422d5d8d91cSRavitheja Addepally trace_instance.SetTraceUID(uid); 423e714c4f5SRavitheja Addepally LLDB_LOG(log, "SBProcess::returned uid - {0}", uid); 424d5d8d91cSRavitheja Addepally } 425*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(trace_instance); 426d5d8d91cSRavitheja Addepally } 427d5d8d91cSRavitheja Addepally 428b9c1b51eSKate Stone void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const { 429*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(void, SBProcess, ReportEventState, 430*baf5664fSJonas Devlieghere (const lldb::SBEvent &, FILE *), event, out); 431*baf5664fSJonas Devlieghere 43230fdc8d8SChris Lattner if (out == NULL) 43330fdc8d8SChris Lattner return; 43430fdc8d8SChris Lattner 435acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 436b9c1b51eSKate Stone if (process_sp) { 43730fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 43830fdc8d8SChris Lattner char message[1024]; 439b9c1b51eSKate Stone int message_len = ::snprintf( 440b9c1b51eSKate Stone message, sizeof(message), "Process %" PRIu64 " %s\n", 441b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 44230fdc8d8SChris Lattner 44330fdc8d8SChris Lattner if (message_len > 0) 44430fdc8d8SChris Lattner ::fwrite(message, 1, message_len, out); 44530fdc8d8SChris Lattner } 44630fdc8d8SChris Lattner } 44730fdc8d8SChris Lattner 448b9c1b51eSKate Stone void SBProcess::AppendEventStateReport(const SBEvent &event, 449b9c1b51eSKate Stone SBCommandReturnObject &result) { 450*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBProcess, AppendEventStateReport, 451*baf5664fSJonas Devlieghere (const lldb::SBEvent &, lldb::SBCommandReturnObject &), 452*baf5664fSJonas Devlieghere event, result); 453*baf5664fSJonas Devlieghere 454acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 455b9c1b51eSKate Stone if (process_sp) { 45630fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent(event); 45730fdc8d8SChris Lattner char message[1024]; 458b9c1b51eSKate Stone ::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n", 459b9c1b51eSKate Stone process_sp->GetID(), SBDebugger::StateAsCString(event_state)); 46030fdc8d8SChris Lattner 46130fdc8d8SChris Lattner result.AppendMessage(message); 46230fdc8d8SChris Lattner } 46330fdc8d8SChris Lattner } 46430fdc8d8SChris Lattner 465b9c1b51eSKate Stone bool SBProcess::SetSelectedThread(const SBThread &thread) { 466*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBProcess, SetSelectedThread, 467*baf5664fSJonas Devlieghere (const lldb::SBThread &), thread); 468*baf5664fSJonas Devlieghere 469acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 470b9c1b51eSKate Stone if (process_sp) { 471b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 472b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 473b9c1b51eSKate Stone return process_sp->GetThreadList().SetSelectedThreadByID( 474b9c1b51eSKate Stone thread.GetThreadID()); 475af67cecdSGreg Clayton } 47630fdc8d8SChris Lattner return false; 47730fdc8d8SChris Lattner } 47830fdc8d8SChris Lattner 479b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) { 480*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBProcess, SetSelectedThreadByID, (lldb::tid_t), 481*baf5664fSJonas Devlieghere tid); 482*baf5664fSJonas Devlieghere 4835160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 484ceb6b139SCaroline Tice 485ceb6b139SCaroline Tice bool ret_val = false; 486acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 487b9c1b51eSKate Stone if (process_sp) { 488b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 489b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 490acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid); 491af67cecdSGreg Clayton } 492ceb6b139SCaroline Tice 493ceb6b139SCaroline Tice if (log) 494b9c1b51eSKate Stone log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 495b9c1b51eSKate Stone ") => %s", 496324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, 497324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 498ceb6b139SCaroline Tice 499ceb6b139SCaroline Tice return ret_val; 50030fdc8d8SChris Lattner } 50130fdc8d8SChris Lattner 502b9c1b51eSKate Stone bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) { 503*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBProcess, SetSelectedThreadByIndexID, (uint32_t), 504*baf5664fSJonas Devlieghere index_id); 505*baf5664fSJonas Devlieghere 5065160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 50718b46896SJim Ingham 50818b46896SJim Ingham bool ret_val = false; 50918b46896SJim Ingham ProcessSP process_sp(GetSP()); 510b9c1b51eSKate Stone if (process_sp) { 511b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 512b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 51318b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id); 51418b46896SJim Ingham } 51518b46896SJim Ingham 51618b46896SJim Ingham if (log) 51718b46896SJim Ingham log->Printf("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 518324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), index_id, 519324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 52018b46896SJim Ingham 52118b46896SJim Ingham return ret_val; 52218b46896SJim Ingham } 52318b46896SJim Ingham 524b9c1b51eSKate Stone SBThread SBProcess::GetThreadAtIndex(size_t index) { 525*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBThread, SBProcess, GetThreadAtIndex, (size_t), 526*baf5664fSJonas Devlieghere index); 527*baf5664fSJonas Devlieghere 5285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 529ceb6b139SCaroline Tice 53017a6ad05SGreg Clayton SBThread sb_thread; 53117a6ad05SGreg Clayton ThreadSP thread_sp; 532acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 533b9c1b51eSKate Stone if (process_sp) { 5347fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5357fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 536b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 537b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 5387fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 53917a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 540af67cecdSGreg Clayton } 541ceb6b139SCaroline Tice 542ceb6b139SCaroline Tice if (log) 54393aa84e8SGreg Clayton log->Printf("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 544324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 545324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 546324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 547ceb6b139SCaroline Tice 548*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_thread); 54930fdc8d8SChris Lattner } 55030fdc8d8SChris Lattner 551b9c1b51eSKate Stone uint32_t SBProcess::GetNumQueues() { 552*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBProcess, GetNumQueues); 553*baf5664fSJonas Devlieghere 5545e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5555e8dce4dSJason Molenda 5565e8dce4dSJason Molenda uint32_t num_queues = 0; 5575e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 558b9c1b51eSKate Stone if (process_sp) { 5595e8dce4dSJason Molenda Process::StopLocker stop_locker; 560b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 561b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 562b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 5635e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 5645e8dce4dSJason Molenda } 565a61d0a5bSGreg Clayton } 5665e8dce4dSJason Molenda 5675e8dce4dSJason Molenda if (log) 568324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetNumQueues () => %d", 569324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num_queues); 5705e8dce4dSJason Molenda 5715e8dce4dSJason Molenda return num_queues; 5725e8dce4dSJason Molenda } 5735e8dce4dSJason Molenda 574b9c1b51eSKate Stone SBQueue SBProcess::GetQueueAtIndex(size_t index) { 575*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBQueue, SBProcess, GetQueueAtIndex, (size_t), 576*baf5664fSJonas Devlieghere index); 577*baf5664fSJonas Devlieghere 5785e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5795e8dce4dSJason Molenda 5805e8dce4dSJason Molenda SBQueue sb_queue; 5815e8dce4dSJason Molenda QueueSP queue_sp; 5825e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 583b9c1b51eSKate Stone if (process_sp) { 5845e8dce4dSJason Molenda Process::StopLocker stop_locker; 585b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 586b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 587b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 5885e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 5895e8dce4dSJason Molenda sb_queue.SetQueue(queue_sp); 5905e8dce4dSJason Molenda } 591a61d0a5bSGreg Clayton } 5925e8dce4dSJason Molenda 5935e8dce4dSJason Molenda if (log) 5945e8dce4dSJason Molenda log->Printf("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", 595324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 596324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 597324a1036SSaleem Abdulrasool static_cast<void *>(queue_sp.get())); 5985e8dce4dSJason Molenda 599*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_queue); 6005e8dce4dSJason Molenda } 6015e8dce4dSJason Molenda 602b9c1b51eSKate Stone uint32_t SBProcess::GetStopID(bool include_expression_stops) { 603*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint32_t, SBProcess, GetStopID, (bool), 604*baf5664fSJonas Devlieghere include_expression_stops); 605*baf5664fSJonas Devlieghere 606bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 607b9c1b51eSKate Stone if (process_sp) { 608b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 609b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 610bf2956a2SJim Ingham if (include_expression_stops) 611bf2956a2SJim Ingham return process_sp->GetStopID(); 612bf2956a2SJim Ingham else 613bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 614bf2956a2SJim Ingham } 615bf2956a2SJim Ingham return 0; 616bf2956a2SJim Ingham } 617bf2956a2SJim Ingham 618b9c1b51eSKate Stone SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) { 619*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBEvent, SBProcess, GetStopEventForStopID, 620*baf5664fSJonas Devlieghere (uint32_t), stop_id); 621*baf5664fSJonas Devlieghere 62238810f43SIlia K Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 62338810f43SIlia K 62438810f43SIlia K SBEvent sb_event; 62538810f43SIlia K EventSP event_sp; 62638810f43SIlia K ProcessSP process_sp(GetSP()); 627b9c1b51eSKate Stone if (process_sp) { 628b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 629b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 63038810f43SIlia K event_sp = process_sp->GetStopEventForStopID(stop_id); 63138810f43SIlia K sb_event.reset(event_sp); 63238810f43SIlia K } 63338810f43SIlia K 63438810f43SIlia K if (log) 635b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 636b9c1b51eSKate Stone ") => SBEvent(%p)", 637b9c1b51eSKate Stone static_cast<void *>(process_sp.get()), stop_id, 63838810f43SIlia K static_cast<void *>(event_sp.get())); 63938810f43SIlia K 640*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_event); 64138810f43SIlia K } 64238810f43SIlia K 643b9c1b51eSKate Stone StateType SBProcess::GetState() { 644*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::StateType, SBProcess, GetState); 645ceb6b139SCaroline Tice 646ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 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 ret_val = process_sp->GetState(); 652af67cecdSGreg Clayton } 653ceb6b139SCaroline Tice 6545160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 655ceb6b139SCaroline Tice if (log) 656cfd1acedSGreg Clayton log->Printf("SBProcess(%p)::GetState () => %s", 657324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 658750cd175SCaroline Tice lldb_private::StateAsCString(ret_val)); 659ceb6b139SCaroline Tice 660ceb6b139SCaroline Tice return ret_val; 66130fdc8d8SChris Lattner } 66230fdc8d8SChris Lattner 663b9c1b51eSKate Stone int SBProcess::GetExitStatus() { 664*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(int, SBProcess, GetExitStatus); 665*baf5664fSJonas Devlieghere 6664838131bSGreg Clayton int exit_status = 0; 667acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 668b9c1b51eSKate Stone if (process_sp) { 669b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 670b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 671acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus(); 672af67cecdSGreg Clayton } 6735160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6744838131bSGreg Clayton if (log) 6754838131bSGreg Clayton log->Printf("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 676324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), exit_status, 677324a1036SSaleem Abdulrasool exit_status); 6784838131bSGreg Clayton 6794838131bSGreg Clayton return exit_status; 68030fdc8d8SChris Lattner } 68130fdc8d8SChris Lattner 682b9c1b51eSKate Stone const char *SBProcess::GetExitDescription() { 683*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBProcess, GetExitDescription); 684*baf5664fSJonas Devlieghere 6854838131bSGreg Clayton const char *exit_desc = NULL; 686acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 687b9c1b51eSKate Stone if (process_sp) { 688b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 689b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 690acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription(); 691af67cecdSGreg Clayton } 6925160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6934838131bSGreg Clayton if (log) 6944838131bSGreg Clayton log->Printf("SBProcess(%p)::GetExitDescription () => %s", 695324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), exit_desc); 6964838131bSGreg Clayton return exit_desc; 69730fdc8d8SChris Lattner } 69830fdc8d8SChris Lattner 699b9c1b51eSKate Stone lldb::pid_t SBProcess::GetProcessID() { 700*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::pid_t, SBProcess, GetProcessID); 701*baf5664fSJonas Devlieghere 702ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 703acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 704acdbe816SGreg Clayton if (process_sp) 705acdbe816SGreg Clayton ret_val = process_sp->GetID(); 706ceb6b139SCaroline Tice 7075160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 708ceb6b139SCaroline Tice if (log) 709324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetProcessID () => %" PRIu64, 710324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), ret_val); 711ceb6b139SCaroline Tice 712ceb6b139SCaroline Tice return ret_val; 71330fdc8d8SChris Lattner } 71430fdc8d8SChris Lattner 715b9c1b51eSKate Stone uint32_t SBProcess::GetUniqueID() { 716*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBProcess, GetUniqueID); 717*baf5664fSJonas Devlieghere 718949e8221SGreg Clayton uint32_t ret_val = 0; 719949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 720949e8221SGreg Clayton if (process_sp) 721949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 7225160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 723949e8221SGreg Clayton if (log) 724324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetUniqueID () => %" PRIu32, 725324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), ret_val); 726949e8221SGreg Clayton return ret_val; 727949e8221SGreg Clayton } 728949e8221SGreg Clayton 729b9c1b51eSKate Stone ByteOrder SBProcess::GetByteOrder() const { 730*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::ByteOrder, SBProcess, GetByteOrder); 731*baf5664fSJonas Devlieghere 732cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 733acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 734acdbe816SGreg Clayton if (process_sp) 735acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 736cf386e24SJohnny Chen 7375160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 738cf386e24SJohnny Chen if (log) 739324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetByteOrder () => %d", 740324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), byteOrder); 741cf386e24SJohnny Chen 742cf386e24SJohnny Chen return byteOrder; 743cf386e24SJohnny Chen } 744cf386e24SJohnny Chen 745b9c1b51eSKate Stone uint32_t SBProcess::GetAddressByteSize() const { 746*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBProcess, GetAddressByteSize); 747*baf5664fSJonas Devlieghere 748ceb6b139SCaroline Tice uint32_t size = 0; 749acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 750acdbe816SGreg Clayton if (process_sp) 751acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 752ceb6b139SCaroline Tice 7535160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 754ceb6b139SCaroline Tice if (log) 755324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetAddressByteSize () => %d", 756324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), size); 757ceb6b139SCaroline Tice 758ceb6b139SCaroline Tice return size; 75930fdc8d8SChris Lattner } 76030fdc8d8SChris Lattner 761b9c1b51eSKate Stone SBError SBProcess::Continue() { 762*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBProcess, Continue); 763*baf5664fSJonas Devlieghere 7645160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 765ceb6b139SCaroline Tice 76630fdc8d8SChris Lattner SBError sb_error; 767acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 7680c74e78dSGreg Clayton 769acdbe816SGreg Clayton if (log) 770324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::Continue ()...", 771324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 772acdbe816SGreg Clayton 773b9c1b51eSKate Stone if (process_sp) { 774b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 775b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 776acdbe816SGreg Clayton 777dc6224e0SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution()) 778dc6224e0SGreg Clayton sb_error.ref() = process_sp->Resume(); 779dc6224e0SGreg Clayton else 780dc6224e0SGreg Clayton sb_error.ref() = process_sp->ResumeSynchronous(NULL); 781b9c1b51eSKate Stone } else 78230fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 78330fdc8d8SChris Lattner 784b9c1b51eSKate Stone if (log) { 785ceb6b139SCaroline Tice SBStream sstr; 786ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 787324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::Continue () => SBError (%p): %s", 788324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 789324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 790ceb6b139SCaroline Tice } 791ceb6b139SCaroline Tice 792*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 79330fdc8d8SChris Lattner } 79430fdc8d8SChris Lattner 795b9c1b51eSKate Stone SBError SBProcess::Destroy() { 796*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBProcess, Destroy); 797*baf5664fSJonas Devlieghere 79830fdc8d8SChris Lattner SBError sb_error; 799acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 800b9c1b51eSKate Stone if (process_sp) { 801b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 802b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 803ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 804b9c1b51eSKate Stone } else 80530fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 80630fdc8d8SChris Lattner 8075160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 808b9c1b51eSKate Stone if (log) { 8094838131bSGreg Clayton SBStream sstr; 8104838131bSGreg Clayton sb_error.GetDescription(sstr); 8116779606aSGreg Clayton log->Printf("SBProcess(%p)::Destroy () => SBError (%p): %s", 812324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 813324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 8144838131bSGreg Clayton } 8154838131bSGreg Clayton 816*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 81730fdc8d8SChris Lattner } 81830fdc8d8SChris Lattner 819b9c1b51eSKate Stone SBError SBProcess::Stop() { 820*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBProcess, Stop); 821*baf5664fSJonas Devlieghere 82230fdc8d8SChris Lattner SBError sb_error; 823acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 824b9c1b51eSKate Stone if (process_sp) { 825b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 826b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 827acdbe816SGreg Clayton sb_error.SetError(process_sp->Halt()); 828b9c1b51eSKate Stone } else 82930fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 830ceb6b139SCaroline Tice 8315160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 832b9c1b51eSKate Stone if (log) { 833ceb6b139SCaroline Tice SBStream sstr; 834ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 83593aa84e8SGreg Clayton log->Printf("SBProcess(%p)::Stop () => SBError (%p): %s", 836324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 837324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 838ceb6b139SCaroline Tice } 839ceb6b139SCaroline Tice 840*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 84130fdc8d8SChris Lattner } 84230fdc8d8SChris Lattner 843b9c1b51eSKate Stone SBError SBProcess::Kill() { 844*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBProcess, Kill); 845*baf5664fSJonas Devlieghere 84630fdc8d8SChris Lattner SBError sb_error; 847acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 848b9c1b51eSKate Stone if (process_sp) { 849b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 850b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 851ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(true)); 852b9c1b51eSKate Stone } else 85330fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 854ceb6b139SCaroline Tice 8555160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 856b9c1b51eSKate Stone if (log) { 857ceb6b139SCaroline Tice SBStream sstr; 858ceb6b139SCaroline Tice sb_error.GetDescription(sstr); 85993aa84e8SGreg Clayton log->Printf("SBProcess(%p)::Kill () => SBError (%p): %s", 860324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 861324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 862ceb6b139SCaroline Tice } 863ceb6b139SCaroline Tice 864*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 86530fdc8d8SChris Lattner } 86630fdc8d8SChris Lattner 867b9c1b51eSKate Stone SBError SBProcess::Detach() { 868*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBProcess, Detach); 869*baf5664fSJonas Devlieghere 870acff8950SJim Ingham // FIXME: This should come from a process default. 871acff8950SJim Ingham bool keep_stopped = false; 872*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(Detach(keep_stopped)); 873acff8950SJim Ingham } 874acff8950SJim Ingham 875b9c1b51eSKate Stone SBError SBProcess::Detach(bool keep_stopped) { 876*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBProcess, Detach, (bool), keep_stopped); 877*baf5664fSJonas Devlieghere 87830fdc8d8SChris Lattner SBError sb_error; 879acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 880b9c1b51eSKate Stone if (process_sp) { 881b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 882b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 883acff8950SJim Ingham sb_error.SetError(process_sp->Detach(keep_stopped)); 884b9c1b51eSKate Stone } else 88530fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 88630fdc8d8SChris Lattner 887*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 88830fdc8d8SChris Lattner } 88930fdc8d8SChris Lattner 890b9c1b51eSKate Stone SBError SBProcess::Signal(int signo) { 891*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBProcess, Signal, (int), signo); 892*baf5664fSJonas Devlieghere 89330fdc8d8SChris Lattner SBError sb_error; 894acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 895b9c1b51eSKate Stone if (process_sp) { 896b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 897b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 898acdbe816SGreg Clayton sb_error.SetError(process_sp->Signal(signo)); 899b9c1b51eSKate Stone } else 90030fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 9015160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 902b9c1b51eSKate Stone if (log) { 9034838131bSGreg Clayton SBStream sstr; 9044838131bSGreg Clayton sb_error.GetDescription(sstr); 9054838131bSGreg Clayton log->Printf("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 906324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), signo, 907324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData()); 9084838131bSGreg Clayton } 909*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 91030fdc8d8SChris Lattner } 91130fdc8d8SChris Lattner 912b9c1b51eSKate Stone SBUnixSignals SBProcess::GetUnixSignals() { 913*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBUnixSignals, SBProcess, GetUnixSignals); 914802dc402STodd Fiala 915*baf5664fSJonas Devlieghere if (auto process_sp = GetSP()) 916*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBUnixSignals{process_sp}); 917*baf5664fSJonas Devlieghere 918*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBUnixSignals{}); 919802dc402STodd Fiala } 920802dc402STodd Fiala 921b9c1b51eSKate Stone void SBProcess::SendAsyncInterrupt() { 922*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBProcess, SendAsyncInterrupt); 923*baf5664fSJonas Devlieghere 924cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 925b9c1b51eSKate Stone if (process_sp) { 926cfc0935eSJim Ingham process_sp->SendAsyncInterrupt(); 927cfc0935eSJim Ingham } 928cfc0935eSJim Ingham } 929cfc0935eSJim Ingham 930b9c1b51eSKate Stone SBThread SBProcess::GetThreadByID(tid_t tid) { 931*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBThread, SBProcess, GetThreadByID, (lldb::tid_t), 932*baf5664fSJonas Devlieghere tid); 933*baf5664fSJonas Devlieghere 9344838131bSGreg Clayton SBThread sb_thread; 93517a6ad05SGreg Clayton ThreadSP thread_sp; 936acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 937b9c1b51eSKate Stone if (process_sp) { 9387fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9397fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 940b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 941b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 9427fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update); 94317a6ad05SGreg Clayton sb_thread.SetThread(thread_sp); 944af67cecdSGreg Clayton } 9454838131bSGreg Clayton 9465160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 9474838131bSGreg Clayton if (log) 948b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 949b9c1b51eSKate Stone ") => SBThread (%p)", 950324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), tid, 951324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 9524838131bSGreg Clayton 953*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_thread); 95430fdc8d8SChris Lattner } 95530fdc8d8SChris Lattner 956b9c1b51eSKate Stone SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) { 957*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBThread, SBProcess, GetThreadByIndexID, (uint32_t), 958*baf5664fSJonas Devlieghere index_id); 959*baf5664fSJonas Devlieghere 96018b46896SJim Ingham SBThread sb_thread; 96118b46896SJim Ingham ThreadSP thread_sp; 96218b46896SJim Ingham ProcessSP process_sp(GetSP()); 963b9c1b51eSKate Stone if (process_sp) { 96418b46896SJim Ingham Process::StopLocker stop_locker; 96518b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 966b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 967b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 968b9c1b51eSKate Stone thread_sp = 969b9c1b51eSKate Stone process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update); 97018b46896SJim Ingham sb_thread.SetThread(thread_sp); 97118b46896SJim Ingham } 97218b46896SJim Ingham 9735160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 97418b46896SJim Ingham if (log) 97518b46896SJim Ingham log->Printf("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 976324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), index_id, 977324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get())); 97818b46896SJim Ingham 979*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_thread); 98018b46896SJim Ingham } 98118b46896SJim Ingham 982b9c1b51eSKate Stone StateType SBProcess::GetStateFromEvent(const SBEvent &event) { 983*baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::StateType, SBProcess, GetStateFromEvent, 984*baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 985*baf5664fSJonas Devlieghere 9865160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 987ceb6b139SCaroline Tice 988ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get()); 989ceb6b139SCaroline Tice 990ceb6b139SCaroline Tice if (log) 991324a1036SSaleem Abdulrasool log->Printf("SBProcess::GetStateFromEvent (event.sp=%p) => %s", 992324a1036SSaleem Abdulrasool static_cast<void *>(event.get()), 993750cd175SCaroline Tice lldb_private::StateAsCString(ret_val)); 994ceb6b139SCaroline Tice 995ceb6b139SCaroline Tice return ret_val; 99630fdc8d8SChris Lattner } 99730fdc8d8SChris Lattner 998b9c1b51eSKate Stone bool SBProcess::GetRestartedFromEvent(const SBEvent &event) { 999*baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(bool, SBProcess, GetRestartedFromEvent, 1000*baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 1001*baf5664fSJonas Devlieghere 1002ea2cc5e0SPavel Labath Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1003ea2cc5e0SPavel Labath 1004ea2cc5e0SPavel Labath bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get()); 1005ea2cc5e0SPavel Labath 1006ea2cc5e0SPavel Labath if (log) 1007400e1809SHans Wennborg log->Printf("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__, 1008400e1809SHans Wennborg static_cast<void *>(event.get()), ret_val); 1009ea2cc5e0SPavel Labath 1010ea2cc5e0SPavel Labath return ret_val; 101130fdc8d8SChris Lattner } 101230fdc8d8SChris Lattner 1013b9c1b51eSKate Stone size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) { 1014*baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(size_t, SBProcess, GetNumRestartedReasonsFromEvent, 1015*baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 1016*baf5664fSJonas Devlieghere 10170161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 10180161b49cSJim Ingham } 10190161b49cSJim Ingham 10200161b49cSJim Ingham const char * 1021b9c1b51eSKate Stone SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event, 1022b9c1b51eSKate Stone size_t idx) { 1023*baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(const char *, SBProcess, 1024*baf5664fSJonas Devlieghere GetRestartedReasonAtIndexFromEvent, 1025*baf5664fSJonas Devlieghere (const lldb::SBEvent &, size_t), event, idx); 1026*baf5664fSJonas Devlieghere 10270161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 10280161b49cSJim Ingham } 10290161b49cSJim Ingham 1030b9c1b51eSKate Stone SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) { 1031*baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBProcess, SBProcess, GetProcessFromEvent, 1032*baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 1033*baf5664fSJonas Devlieghere 103475930019STodd Fiala ProcessSP process_sp = 103575930019STodd Fiala Process::ProcessEventData::GetProcessFromEvent(event.get()); 1036b9c1b51eSKate Stone if (!process_sp) { 103705097246SAdrian Prantl // StructuredData events also know the process they come from. Try that. 103875930019STodd Fiala process_sp = EventDataStructuredData::GetProcessFromEvent(event.get()); 103975930019STodd Fiala } 104075930019STodd Fiala 1041*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBProcess(process_sp)); 104230fdc8d8SChris Lattner } 104330fdc8d8SChris Lattner 1044b9c1b51eSKate Stone bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) { 1045*baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(bool, SBProcess, GetInterruptedFromEvent, 1046*baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 1047*baf5664fSJonas Devlieghere 104806d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 104906d2855fSIlia K } 105006d2855fSIlia K 105175930019STodd Fiala lldb::SBStructuredData 1052b9c1b51eSKate Stone SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) { 1053*baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBStructuredData, SBProcess, 1054*baf5664fSJonas Devlieghere GetStructuredDataFromEvent, (const lldb::SBEvent &), 1055*baf5664fSJonas Devlieghere event); 1056*baf5664fSJonas Devlieghere 1057*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBStructuredData(event.GetSP())); 105875930019STodd Fiala } 105975930019STodd Fiala 1060b9c1b51eSKate Stone bool SBProcess::EventIsProcessEvent(const SBEvent &event) { 1061*baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(bool, SBProcess, EventIsProcessEvent, 1062*baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 1063*baf5664fSJonas Devlieghere 106475930019STodd Fiala return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) && 106575930019STodd Fiala !EventIsStructuredDataEvent(event); 106675930019STodd Fiala } 106775930019STodd Fiala 1068b9c1b51eSKate Stone bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) { 1069*baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(bool, SBProcess, EventIsStructuredDataEvent, 1070*baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 1071*baf5664fSJonas Devlieghere 107275930019STodd Fiala EventSP event_sp = event.GetSP(); 107375930019STodd Fiala EventData *event_data = event_sp ? event_sp->GetData() : nullptr; 1074b9c1b51eSKate Stone return event_data && (event_data->GetFlavor() == 1075b9c1b51eSKate Stone EventDataStructuredData::GetFlavorString()); 1076e6bc6cb9SJim Ingham } 107730fdc8d8SChris Lattner 1078b9c1b51eSKate Stone SBBroadcaster SBProcess::GetBroadcaster() const { 1079*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBroadcaster, SBProcess, 1080*baf5664fSJonas Devlieghere GetBroadcaster); 1081*baf5664fSJonas Devlieghere 10825160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1083ceb6b139SCaroline Tice 1084acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1085acdbe816SGreg Clayton 1086acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 1087ceb6b139SCaroline Tice 1088ceb6b139SCaroline Tice if (log) 1089324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", 1090324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), 1091324a1036SSaleem Abdulrasool static_cast<void *>(broadcaster.get())); 1092ceb6b139SCaroline Tice 1093*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(broadcaster); 109430fdc8d8SChris Lattner } 109530fdc8d8SChris Lattner 1096b9c1b51eSKate Stone const char *SBProcess::GetBroadcasterClass() { 1097*baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD_NO_ARGS(const char *, SBProcess, 1098*baf5664fSJonas Devlieghere GetBroadcasterClass); 1099*baf5664fSJonas Devlieghere 11004bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 11014bddaeb5SJim Ingham } 11024bddaeb5SJim Ingham 1103b9c1b51eSKate Stone size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len, 1104b9c1b51eSKate Stone SBError &sb_error) { 11055160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1106ceb6b139SCaroline Tice 110730fdc8d8SChris Lattner size_t bytes_read = 0; 110830fdc8d8SChris Lattner 1109acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1110acdbe816SGreg Clayton 11114838131bSGreg Clayton if (log) 1112b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 1113b9c1b51eSKate Stone ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 1114324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1115324a1036SSaleem Abdulrasool static_cast<void *>(dst), static_cast<uint64_t>(dst_len), 1116324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 11174838131bSGreg Clayton 1118b9c1b51eSKate Stone if (process_sp) { 11197fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1120b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1121b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1122b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 11237fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref()); 1124b9c1b51eSKate Stone } else { 1125c9858e4dSGreg Clayton if (log) 1126324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::ReadMemory() => error: process is running", 1127324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 11287fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11297fdf9ef1SGreg Clayton } 1130b9c1b51eSKate Stone } else { 113130fdc8d8SChris Lattner sb_error.SetErrorString("SBProcess is invalid"); 113230fdc8d8SChris Lattner } 113330fdc8d8SChris Lattner 1134b9c1b51eSKate Stone if (log) { 113593aa84e8SGreg Clayton SBStream sstr; 113693aa84e8SGreg Clayton sb_error.GetDescription(sstr); 1137b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 1138b9c1b51eSKate Stone ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1139324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1140324a1036SSaleem Abdulrasool static_cast<void *>(dst), static_cast<uint64_t>(dst_len), 1141324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData(), 1142324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 114393aa84e8SGreg Clayton } 1144ceb6b139SCaroline Tice 114530fdc8d8SChris Lattner return bytes_read; 114630fdc8d8SChris Lattner } 114730fdc8d8SChris Lattner 1148b9c1b51eSKate Stone size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size, 1149b9c1b51eSKate Stone lldb::SBError &sb_error) { 1150e91b7957SGreg Clayton size_t bytes_read = 0; 1151acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1152b9c1b51eSKate Stone if (process_sp) { 11537fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1154b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1155b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1156b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1157b9c1b51eSKate Stone bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size, 1158b9c1b51eSKate Stone sb_error.ref()); 1159b9c1b51eSKate Stone } else { 11605160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1161c9858e4dSGreg Clayton if (log) 1162b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadCStringFromMemory() => error: process " 1163b9c1b51eSKate Stone "is running", 1164324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 11657fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11667fdf9ef1SGreg Clayton } 1167b9c1b51eSKate Stone } else { 1168e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1169e91b7957SGreg Clayton } 1170e91b7957SGreg Clayton return bytes_read; 1171e91b7957SGreg Clayton } 1172e91b7957SGreg Clayton 1173b9c1b51eSKate Stone uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size, 1174b9c1b51eSKate Stone lldb::SBError &sb_error) { 1175*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint64_t, SBProcess, ReadUnsignedFromMemory, 1176*baf5664fSJonas Devlieghere (lldb::addr_t, uint32_t, lldb::SBError &), addr, byte_size, 1177*baf5664fSJonas Devlieghere sb_error); 1178*baf5664fSJonas Devlieghere 11797fdf9ef1SGreg Clayton uint64_t value = 0; 1180acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1181b9c1b51eSKate Stone if (process_sp) { 11827fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1183b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1184b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1185b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1186b9c1b51eSKate Stone value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0, 1187b9c1b51eSKate Stone sb_error.ref()); 1188b9c1b51eSKate Stone } else { 11895160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1190c9858e4dSGreg Clayton if (log) 1191b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadUnsignedFromMemory() => error: process " 1192b9c1b51eSKate Stone "is running", 1193324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 11947fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11957fdf9ef1SGreg Clayton } 1196b9c1b51eSKate Stone } else { 1197e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1198e91b7957SGreg Clayton } 11997fdf9ef1SGreg Clayton return value; 1200e91b7957SGreg Clayton } 1201e91b7957SGreg Clayton 1202b9c1b51eSKate Stone lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr, 1203b9c1b51eSKate Stone lldb::SBError &sb_error) { 1204*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::addr_t, SBProcess, ReadPointerFromMemory, 1205*baf5664fSJonas Devlieghere (lldb::addr_t, lldb::SBError &), addr, sb_error); 1206*baf5664fSJonas Devlieghere 1207e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1208acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1209b9c1b51eSKate Stone if (process_sp) { 12107fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1211b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1212b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1213b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 12147fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref()); 1215b9c1b51eSKate Stone } else { 12165160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1217c9858e4dSGreg Clayton if (log) 1218b9c1b51eSKate Stone log->Printf("SBProcess(%p)::ReadPointerFromMemory() => error: process " 1219b9c1b51eSKate Stone "is running", 1220324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 12217fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12227fdf9ef1SGreg Clayton } 1223b9c1b51eSKate Stone } else { 1224e91b7957SGreg Clayton sb_error.SetErrorString("SBProcess is invalid"); 1225e91b7957SGreg Clayton } 1226e91b7957SGreg Clayton return ptr; 1227e91b7957SGreg Clayton } 1228e91b7957SGreg Clayton 1229b9c1b51eSKate Stone size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len, 1230b9c1b51eSKate Stone SBError &sb_error) { 123130fdc8d8SChris Lattner size_t bytes_written = 0; 123230fdc8d8SChris Lattner 12335160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1234acdbe816SGreg Clayton 1235acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1236acdbe816SGreg Clayton 12374838131bSGreg Clayton if (log) 1238b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1239b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1240324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1241b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1242324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get())); 12434838131bSGreg Clayton 1244b9c1b51eSKate Stone if (process_sp) { 12457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1246b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1247b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1248b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1249b9c1b51eSKate Stone bytes_written = 1250b9c1b51eSKate Stone process_sp->WriteMemory(addr, src, src_len, sb_error.ref()); 1251b9c1b51eSKate Stone } else { 1252c9858e4dSGreg Clayton if (log) 1253324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::WriteMemory() => error: process is running", 1254324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 12557fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12567fdf9ef1SGreg Clayton } 125730fdc8d8SChris Lattner } 125830fdc8d8SChris Lattner 1259b9c1b51eSKate Stone if (log) { 12604838131bSGreg Clayton SBStream sstr; 12614838131bSGreg Clayton sb_error.GetDescription(sstr); 1262b9c1b51eSKate Stone log->Printf("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 1263b9c1b51eSKate Stone ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1264324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), addr, 1265b9c1b51eSKate Stone static_cast<const void *>(src), static_cast<uint64_t>(src_len), 1266324a1036SSaleem Abdulrasool static_cast<void *>(sb_error.get()), sstr.GetData(), 1267324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_written)); 12684838131bSGreg Clayton } 12694838131bSGreg Clayton 127030fdc8d8SChris Lattner return bytes_written; 127130fdc8d8SChris Lattner } 127230fdc8d8SChris Lattner 1273b9c1b51eSKate Stone bool SBProcess::GetDescription(SBStream &description) { 1274*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBProcess, GetDescription, (lldb::SBStream &), 1275*baf5664fSJonas Devlieghere description); 1276*baf5664fSJonas Devlieghere 1277da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1278da7bc7d0SGreg Clayton 1279acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1280b9c1b51eSKate Stone if (process_sp) { 1281dde9cff3SCaroline Tice char path[PATH_MAX]; 1282dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath(path, sizeof(path)); 1283acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 12841d273166SGreg Clayton const char *exe_name = NULL; 12851d273166SGreg Clayton if (exe_module) 12861d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 12871d273166SGreg Clayton 1288d01b2953SDaniel Malea strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1289b9c1b51eSKate Stone process_sp->GetID(), lldb_private::StateAsCString(GetState()), 1290b9c1b51eSKate Stone GetNumThreads(), exe_name ? ", executable = " : "", 12911d273166SGreg Clayton exe_name ? exe_name : ""); 1292b9c1b51eSKate Stone } else 1293da7bc7d0SGreg Clayton strm.PutCString("No value"); 1294dde9cff3SCaroline Tice 1295dde9cff3SCaroline Tice return true; 1296dde9cff3SCaroline Tice } 12978f343b09SGreg Clayton 12988f343b09SGreg Clayton uint32_t 1299b9c1b51eSKate Stone SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const { 1300*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(uint32_t, SBProcess, 1301*baf5664fSJonas Devlieghere GetNumSupportedHardwareWatchpoints, 1302*baf5664fSJonas Devlieghere (lldb::SBError &), sb_error); 1303*baf5664fSJonas Devlieghere 13045160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1305f9ef60d2SJohnny Chen 1306f9ef60d2SJohnny Chen uint32_t num = 0; 1307f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1308b9c1b51eSKate Stone if (process_sp) { 1309b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1310b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1311f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo(num)); 1312f9ef60d2SJohnny Chen if (log) 1313f9ef60d2SJohnny Chen log->Printf("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1314324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get()), num); 1315b9c1b51eSKate Stone } else { 1316f9ef60d2SJohnny Chen sb_error.SetErrorString("SBProcess is invalid"); 1317f9ef60d2SJohnny Chen } 1318f9ef60d2SJohnny Chen return num; 1319f9ef60d2SJohnny Chen } 1320f9ef60d2SJohnny Chen 1321b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec, 1322b9c1b51eSKate Stone lldb::SBError &sb_error) { 1323*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint32_t, SBProcess, LoadImage, 1324*baf5664fSJonas Devlieghere (lldb::SBFileSpec &, lldb::SBError &), 1325*baf5664fSJonas Devlieghere sb_remote_image_spec, sb_error); 1326*baf5664fSJonas Devlieghere 13274fbd67acSTamas Berghammer return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); 13284fbd67acSTamas Berghammer } 13294fbd67acSTamas Berghammer 1330b9c1b51eSKate Stone uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec, 13314fbd67acSTamas Berghammer const lldb::SBFileSpec &sb_remote_image_spec, 1332b9c1b51eSKate Stone lldb::SBError &sb_error) { 1333*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD( 1334*baf5664fSJonas Devlieghere uint32_t, SBProcess, LoadImage, 1335*baf5664fSJonas Devlieghere (const lldb::SBFileSpec &, const lldb::SBFileSpec &, lldb::SBError &), 1336*baf5664fSJonas Devlieghere sb_local_image_spec, sb_remote_image_spec, sb_error); 1337*baf5664fSJonas Devlieghere 1338abc5d72fSJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1339acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1340b9c1b51eSKate Stone if (process_sp) { 13417fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1342b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1343abc5d72fSJim Ingham if (log) 1344abc5d72fSJim Ingham log->Printf("SBProcess(%p)::LoadImage() => calling Platform::LoadImage" 1345abc5d72fSJim Ingham "for: %s", 1346abc5d72fSJim Ingham static_cast<void *>(process_sp.get()), 1347abc5d72fSJim Ingham sb_local_image_spec.GetFilename()); 1348abc5d72fSJim Ingham 1349b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1350b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 13513cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1352b9c1b51eSKate Stone return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec, 1353b9c1b51eSKate Stone *sb_remote_image_spec, sb_error.ref()); 1354b9c1b51eSKate Stone } else { 1355c9858e4dSGreg Clayton if (log) 1356324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::LoadImage() => error: process is running", 1357324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 13587fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 13597fdf9ef1SGreg Clayton } 1360abc5d72fSJim Ingham } else { 1361abc5d72fSJim Ingham if (log) 1362abc5d72fSJim Ingham log->Printf("SBProcess(%p)::LoadImage() => error: called with invalid" 1363abc5d72fSJim Ingham " process", 1364abc5d72fSJim Ingham static_cast<void *>(process_sp.get())); 1365abc5d72fSJim Ingham sb_error.SetErrorString("process is invalid"); 13667fdf9ef1SGreg Clayton } 13678f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 13688f343b09SGreg Clayton } 13698f343b09SGreg Clayton 13700d231f71SJim Ingham uint32_t SBProcess::LoadImageUsingPaths(const lldb::SBFileSpec &image_spec, 13710d231f71SJim Ingham SBStringList &paths, 13720d231f71SJim Ingham lldb::SBFileSpec &loaded_path, 13730d231f71SJim Ingham lldb::SBError &error) { 1374*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint32_t, SBProcess, LoadImageUsingPaths, 1375*baf5664fSJonas Devlieghere (const lldb::SBFileSpec &, lldb::SBStringList &, 1376*baf5664fSJonas Devlieghere lldb::SBFileSpec &, lldb::SBError &), 1377*baf5664fSJonas Devlieghere image_spec, paths, loaded_path, error); 1378*baf5664fSJonas Devlieghere 13790d231f71SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 13800d231f71SJim Ingham ProcessSP process_sp(GetSP()); 13810d231f71SJim Ingham if (process_sp) { 13820d231f71SJim Ingham Process::StopLocker stop_locker; 13830d231f71SJim Ingham if (stop_locker.TryLock(&process_sp->GetRunLock())) { 13840d231f71SJim Ingham if (log) 13850d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => " 13860d231f71SJim Ingham "calling Platform::LoadImageUsingPaths for: %s", 13870d231f71SJim Ingham static_cast<void *>(process_sp.get()), 13880d231f71SJim Ingham image_spec.GetFilename()); 13890d231f71SJim Ingham 13900d231f71SJim Ingham std::lock_guard<std::recursive_mutex> guard( 13910d231f71SJim Ingham process_sp->GetTarget().GetAPIMutex()); 13920d231f71SJim Ingham PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 13930d231f71SJim Ingham size_t num_paths = paths.GetSize(); 13940d231f71SJim Ingham std::vector<std::string> paths_vec; 13950d231f71SJim Ingham paths_vec.reserve(num_paths); 13960d231f71SJim Ingham for (size_t i = 0; i < num_paths; i++) 13970d231f71SJim Ingham paths_vec.push_back(paths.GetStringAtIndex(i)); 13980d231f71SJim Ingham FileSpec loaded_spec; 13990d231f71SJim Ingham 14000d231f71SJim Ingham uint32_t token = platform_sp->LoadImageUsingPaths(process_sp.get(), 14010d231f71SJim Ingham *image_spec, 14020d231f71SJim Ingham paths_vec, 14030d231f71SJim Ingham error.ref(), 14040d231f71SJim Ingham &loaded_spec); 14050d231f71SJim Ingham if (token != LLDB_INVALID_IMAGE_TOKEN) 14060d231f71SJim Ingham loaded_path = loaded_spec; 14070d231f71SJim Ingham return token; 14080d231f71SJim Ingham } else { 14090d231f71SJim Ingham if (log) 14100d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: " 14110d231f71SJim Ingham "process is running", 14120d231f71SJim Ingham static_cast<void *>(process_sp.get())); 14130d231f71SJim Ingham error.SetErrorString("process is running"); 14140d231f71SJim Ingham } 14150d231f71SJim Ingham } else { 14160d231f71SJim Ingham if (log) 14170d231f71SJim Ingham log->Printf("SBProcess(%p)::LoadImageUsingPaths() => error: " 14180d231f71SJim Ingham "called with invalid process", 14190d231f71SJim Ingham static_cast<void *>(process_sp.get())); 14200d231f71SJim Ingham error.SetErrorString("process is invalid"); 14210d231f71SJim Ingham } 14220d231f71SJim Ingham 14230d231f71SJim Ingham return LLDB_INVALID_IMAGE_TOKEN; 14240d231f71SJim Ingham } 14250d231f71SJim Ingham 1426b9c1b51eSKate Stone lldb::SBError SBProcess::UnloadImage(uint32_t image_token) { 1427*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBProcess, UnloadImage, (uint32_t), 1428*baf5664fSJonas Devlieghere image_token); 1429*baf5664fSJonas Devlieghere 14308f343b09SGreg Clayton lldb::SBError sb_error; 1431acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1432b9c1b51eSKate Stone if (process_sp) { 14337fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1434b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1435b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1436b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 14373cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 1438b9c1b51eSKate Stone sb_error.SetError( 1439b9c1b51eSKate Stone platform_sp->UnloadImage(process_sp.get(), image_token)); 1440b9c1b51eSKate Stone } else { 14415160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1442c9858e4dSGreg Clayton if (log) 1443324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::UnloadImage() => error: process is running", 1444324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 14457fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 14467fdf9ef1SGreg Clayton } 1447b9c1b51eSKate Stone } else 14488f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 1449*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 14508f343b09SGreg Clayton } 14518c71337aSJason Molenda 1452b9c1b51eSKate Stone lldb::SBError SBProcess::SendEventData(const char *event_data) { 1453*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBProcess, SendEventData, (const char *), 1454*baf5664fSJonas Devlieghere event_data); 1455*baf5664fSJonas Devlieghere 1456a332978bSJason Molenda lldb::SBError sb_error; 1457a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1458b9c1b51eSKate Stone if (process_sp) { 1459a332978bSJason Molenda Process::StopLocker stop_locker; 1460b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1461b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1462b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1463a332978bSJason Molenda sb_error.SetError(process_sp->SendEventData(event_data)); 1464b9c1b51eSKate Stone } else { 1465a332978bSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1466a332978bSJason Molenda if (log) 1467b9c1b51eSKate Stone log->Printf( 1468b9c1b51eSKate Stone "SBProcess(%p)::SendEventData() => error: process is running", 1469324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 1470a332978bSJason Molenda sb_error.SetErrorString("process is running"); 1471a332978bSJason Molenda } 1472b9c1b51eSKate Stone } else 1473a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1474*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 1475a332978bSJason Molenda } 1476a332978bSJason Molenda 1477b9c1b51eSKate Stone uint32_t SBProcess::GetNumExtendedBacktraceTypes() { 1478*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBProcess, GetNumExtendedBacktraceTypes); 1479*baf5664fSJonas Devlieghere 14808c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1481b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 14828c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 148395d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 14848c71337aSJason Molenda } 14858c71337aSJason Molenda return 0; 14868c71337aSJason Molenda } 14878c71337aSJason Molenda 1488b9c1b51eSKate Stone const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) { 1489*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const char *, SBProcess, GetExtendedBacktraceTypeAtIndex, 1490*baf5664fSJonas Devlieghere (uint32_t), idx); 1491*baf5664fSJonas Devlieghere 14928c71337aSJason Molenda ProcessSP process_sp(GetSP()); 1493b9c1b51eSKate Stone if (process_sp && process_sp->GetSystemRuntime()) { 14948c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1495b9c1b51eSKate Stone const std::vector<ConstString> &names = 1496b9c1b51eSKate Stone runtime->GetExtendedBacktraceTypes(); 1497b9c1b51eSKate Stone if (idx < names.size()) { 14988c71337aSJason Molenda return names[idx].AsCString(); 1499b9c1b51eSKate Stone } else { 15008c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 15018c71337aSJason Molenda if (log) 1502b9c1b51eSKate Stone log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => " 1503b9c1b51eSKate Stone "error: requested extended backtrace name out of bounds", 1504324a1036SSaleem Abdulrasool static_cast<void *>(process_sp.get())); 15058c71337aSJason Molenda } 15068c71337aSJason Molenda } 15078c71337aSJason Molenda return NULL; 15088c71337aSJason Molenda } 1509a51ea382SKuba Brecka 1510b9c1b51eSKate Stone SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) { 1511*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBThreadCollection, SBProcess, GetHistoryThreads, 1512*baf5664fSJonas Devlieghere (lldb::addr_t), addr); 1513*baf5664fSJonas Devlieghere 1514a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1515a51ea382SKuba Brecka SBThreadCollection threads; 1516b9c1b51eSKate Stone if (process_sp) { 1517a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1518a51ea382SKuba Brecka } 1519*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(threads); 1520a51ea382SKuba Brecka } 152163927548SKuba Brecka 1522b9c1b51eSKate Stone bool SBProcess::IsInstrumentationRuntimePresent( 1523b9c1b51eSKate Stone InstrumentationRuntimeType type) { 1524*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBProcess, IsInstrumentationRuntimePresent, 1525*baf5664fSJonas Devlieghere (lldb::InstrumentationRuntimeType), type); 1526*baf5664fSJonas Devlieghere 152763927548SKuba Brecka ProcessSP process_sp(GetSP()); 152863927548SKuba Brecka if (!process_sp) 152963927548SKuba Brecka return false; 153063927548SKuba Brecka 1531b9c1b51eSKate Stone InstrumentationRuntimeSP runtime_sp = 1532b9c1b51eSKate Stone process_sp->GetInstrumentationRuntime(type); 153363927548SKuba Brecka 153463927548SKuba Brecka if (!runtime_sp.get()) 153563927548SKuba Brecka return false; 153663927548SKuba Brecka 153763927548SKuba Brecka return runtime_sp->IsActive(); 153863927548SKuba Brecka } 1539f7d1893fSAdrian McCarthy 1540b9c1b51eSKate Stone lldb::SBError SBProcess::SaveCore(const char *file_name) { 1541*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBProcess, SaveCore, (const char *), 1542*baf5664fSJonas Devlieghere file_name); 1543*baf5664fSJonas Devlieghere 1544f7d1893fSAdrian McCarthy lldb::SBError error; 1545f7d1893fSAdrian McCarthy ProcessSP process_sp(GetSP()); 1546b9c1b51eSKate Stone if (!process_sp) { 1547f7d1893fSAdrian McCarthy error.SetErrorString("SBProcess is invalid"); 1548*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 1549f7d1893fSAdrian McCarthy } 1550f7d1893fSAdrian McCarthy 1551b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1552b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 1553f7d1893fSAdrian McCarthy 1554b9c1b51eSKate Stone if (process_sp->GetState() != eStateStopped) { 1555f7d1893fSAdrian McCarthy error.SetErrorString("the process is not stopped"); 1556*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 1557f7d1893fSAdrian McCarthy } 1558f7d1893fSAdrian McCarthy 15598f3be7a3SJonas Devlieghere FileSpec core_file(file_name); 1560f7d1893fSAdrian McCarthy error.ref() = PluginManager::SaveCore(process_sp, core_file); 1561*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 1562f7d1893fSAdrian McCarthy } 156326036843SHoward Hellyer 156426036843SHoward Hellyer lldb::SBError 1565b9c1b51eSKate Stone SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr, 1566b9c1b51eSKate Stone SBMemoryRegionInfo &sb_region_info) { 1567*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBProcess, GetMemoryRegionInfo, 1568*baf5664fSJonas Devlieghere (lldb::addr_t, lldb::SBMemoryRegionInfo &), load_addr, 1569*baf5664fSJonas Devlieghere sb_region_info); 1570*baf5664fSJonas Devlieghere 157126036843SHoward Hellyer lldb::SBError sb_error; 157226036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1573b9c1b51eSKate Stone if (process_sp) { 157426036843SHoward Hellyer Process::StopLocker stop_locker; 1575b9c1b51eSKate Stone if (stop_locker.TryLock(&process_sp->GetRunLock())) { 1576b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1577b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 157836788bbbSTatyana Krasnukha 1579b9c1b51eSKate Stone sb_error.ref() = 158036788bbbSTatyana Krasnukha process_sp->GetMemoryRegionInfo(load_addr, sb_region_info.ref()); 1581b9c1b51eSKate Stone } else { 158226036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 158326036843SHoward Hellyer if (log) 1584b9c1b51eSKate Stone log->Printf( 1585b9c1b51eSKate Stone "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 158626036843SHoward Hellyer static_cast<void *>(process_sp.get())); 158726036843SHoward Hellyer sb_error.SetErrorString("process is running"); 158826036843SHoward Hellyer } 1589b9c1b51eSKate Stone } else { 159026036843SHoward Hellyer sb_error.SetErrorString("SBProcess is invalid"); 159126036843SHoward Hellyer } 1592*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 159326036843SHoward Hellyer } 159426036843SHoward Hellyer 1595b9c1b51eSKate Stone lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() { 1596*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBMemoryRegionInfoList, SBProcess, 1597*baf5664fSJonas Devlieghere GetMemoryRegions); 1598*baf5664fSJonas Devlieghere 159926036843SHoward Hellyer lldb::SBMemoryRegionInfoList sb_region_list; 160036788bbbSTatyana Krasnukha 160126036843SHoward Hellyer ProcessSP process_sp(GetSP()); 160226036843SHoward Hellyer Process::StopLocker stop_locker; 160336788bbbSTatyana Krasnukha if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) { 1604b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1605b9c1b51eSKate Stone process_sp->GetTarget().GetAPIMutex()); 160636788bbbSTatyana Krasnukha 160736788bbbSTatyana Krasnukha process_sp->GetMemoryRegions(sb_region_list.ref()); 1608b9c1b51eSKate Stone } else { 160926036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 161026036843SHoward Hellyer if (log) 1611b9c1b51eSKate Stone log->Printf( 1612b9c1b51eSKate Stone "SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 161326036843SHoward Hellyer static_cast<void *>(process_sp.get())); 161426036843SHoward Hellyer } 161536788bbbSTatyana Krasnukha 1616*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_region_list); 161726036843SHoward Hellyer } 1618141a6263SVadim Macagon 1619141a6263SVadim Macagon lldb::SBProcessInfo SBProcess::GetProcessInfo() { 1620*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBProcessInfo, SBProcess, GetProcessInfo); 1621*baf5664fSJonas Devlieghere 1622141a6263SVadim Macagon lldb::SBProcessInfo sb_proc_info; 1623141a6263SVadim Macagon ProcessSP process_sp(GetSP()); 1624141a6263SVadim Macagon ProcessInstanceInfo proc_info; 1625141a6263SVadim Macagon if (process_sp && process_sp->GetProcessInfo(proc_info)) { 1626141a6263SVadim Macagon sb_proc_info.SetProcessInfo(proc_info); 1627141a6263SVadim Macagon } 1628*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_proc_info); 1629141a6263SVadim Macagon } 1630