130fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 104c5de699SEli Friedman #include "lldb/API/SBProcess.h" 1130fdc8d8SChris Lattner 12bdae3787SVirgile Bello // C Includes 13bdae3787SVirgile Bello #include <inttypes.h> 14bdae3787SVirgile Bello 1530fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1630fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1730fdc8d8SChris Lattner 1840af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 195d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 20ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 211f746071SGreg Clayton #include "lldb/Core/Module.h" 22f7d1893fSAdrian McCarthy #include "lldb/Core/PluginManager.h" 2330fdc8d8SChris Lattner #include "lldb/Core/State.h" 2430fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2530fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2626036843SHoward Hellyer #include "lldb/Target/MemoryRegionInfo.h" 2730fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2830fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 298c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h" 306611103cSGreg Clayton #include "lldb/Target/Target.h" 316611103cSGreg Clayton #include "lldb/Target/Thread.h" 3230fdc8d8SChris Lattner 3330fdc8d8SChris Lattner // Project includes 3430fdc8d8SChris Lattner 354c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 364c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 370e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 384c5de699SEli Friedman #include "lldb/API/SBEvent.h" 390e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 4026036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfo.h" 4126036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfoList.h" 42*75930019STodd Fiala #include "lldb/API/SBStructuredData.h" 434c5de699SEli Friedman #include "lldb/API/SBThread.h" 44a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h" 45dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 464c5de699SEli Friedman #include "lldb/API/SBStringList.h" 47802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h" 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner using namespace lldb; 5030fdc8d8SChris Lattner using namespace lldb_private; 5130fdc8d8SChris Lattner 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner SBProcess::SBProcess () : 544e0fe8abSGreg Clayton m_opaque_wp() 5530fdc8d8SChris Lattner { 5630fdc8d8SChris Lattner } 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner 5930fdc8d8SChris Lattner //---------------------------------------------------------------------- 6030fdc8d8SChris Lattner // SBProcess constructor 6130fdc8d8SChris Lattner //---------------------------------------------------------------------- 6230fdc8d8SChris Lattner 6330fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 644e0fe8abSGreg Clayton m_opaque_wp (rhs.m_opaque_wp) 6530fdc8d8SChris Lattner { 6630fdc8d8SChris Lattner } 6730fdc8d8SChris Lattner 6830fdc8d8SChris Lattner 6930fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 704e0fe8abSGreg Clayton m_opaque_wp (process_sp) 7130fdc8d8SChris Lattner { 7230fdc8d8SChris Lattner } 7330fdc8d8SChris Lattner 74efabb123SGreg Clayton const SBProcess& 75efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 76efabb123SGreg Clayton { 77efabb123SGreg Clayton if (this != &rhs) 784e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 79efabb123SGreg Clayton return *this; 80efabb123SGreg Clayton } 81efabb123SGreg Clayton 8230fdc8d8SChris Lattner //---------------------------------------------------------------------- 8330fdc8d8SChris Lattner // Destructor 8430fdc8d8SChris Lattner //---------------------------------------------------------------------- 8530fdc8d8SChris Lattner SBProcess::~SBProcess() 8630fdc8d8SChris Lattner { 8730fdc8d8SChris Lattner } 8830fdc8d8SChris Lattner 894bddaeb5SJim Ingham const char * 904bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName () 914bddaeb5SJim Ingham { 924bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 934bddaeb5SJim Ingham } 944bddaeb5SJim Ingham 95d7b30ef9SJim Ingham const char * 96d7b30ef9SJim Ingham SBProcess::GetPluginName () 97d7b30ef9SJim Ingham { 98d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 99d7b30ef9SJim Ingham if (process_sp) 100d7b30ef9SJim Ingham { 10157abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 102d7b30ef9SJim Ingham } 103d7b30ef9SJim Ingham return "<Unknown>"; 104d7b30ef9SJim Ingham } 105d7b30ef9SJim Ingham 106d7b30ef9SJim Ingham const char * 107d7b30ef9SJim Ingham SBProcess::GetShortPluginName () 108d7b30ef9SJim Ingham { 109d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 110d7b30ef9SJim Ingham if (process_sp) 111d7b30ef9SJim Ingham { 11257abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 113d7b30ef9SJim Ingham } 114d7b30ef9SJim Ingham return "<Unknown>"; 115d7b30ef9SJim Ingham } 116d7b30ef9SJim Ingham 117d7b30ef9SJim Ingham 118b9556accSGreg Clayton lldb::ProcessSP 119b9556accSGreg Clayton SBProcess::GetSP() const 120b9556accSGreg Clayton { 1214e0fe8abSGreg Clayton return m_opaque_wp.lock(); 122b9556accSGreg Clayton } 123b9556accSGreg Clayton 12430fdc8d8SChris Lattner void 125b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 12630fdc8d8SChris Lattner { 1274e0fe8abSGreg Clayton m_opaque_wp = process_sp; 12830fdc8d8SChris Lattner } 12930fdc8d8SChris Lattner 13030fdc8d8SChris Lattner void 13130fdc8d8SChris Lattner SBProcess::Clear () 13230fdc8d8SChris Lattner { 1334e0fe8abSGreg Clayton m_opaque_wp.reset(); 13430fdc8d8SChris Lattner } 13530fdc8d8SChris Lattner 13630fdc8d8SChris Lattner 13730fdc8d8SChris Lattner bool 13830fdc8d8SChris Lattner SBProcess::IsValid() const 13930fdc8d8SChris Lattner { 1404fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1414fc6cb9cSJim Ingham return ((bool) process_sp && process_sp->IsValid()); 14230fdc8d8SChris Lattner } 14330fdc8d8SChris Lattner 1449631aae2SJames McIlree bool 1459631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1469631aae2SJames McIlree char const **envp, 1479631aae2SJames McIlree const char *stdin_path, 1489631aae2SJames McIlree const char *stdout_path, 1499631aae2SJames McIlree const char *stderr_path, 1509631aae2SJames McIlree const char *working_directory, 1519631aae2SJames McIlree uint32_t launch_flags, 1529631aae2SJames McIlree bool stop_at_entry, 1539631aae2SJames McIlree lldb::SBError& error) 1549631aae2SJames McIlree { 1555160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 156324a1036SSaleem Abdulrasool if (log) 1579631aae2SJames McIlree log->Printf ("SBProcess(%p)::RemoteLaunch (argv=%p, envp=%p, stdin=%s, stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, stop_at_entry=%i, &error (%p))...", 158324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_wp.lock().get()), 159324a1036SSaleem Abdulrasool static_cast<void*>(argv), static_cast<void*>(envp), 1609631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1619631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1629631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1639631aae2SJames McIlree working_directory ? working_directory : "NULL", 164324a1036SSaleem Abdulrasool launch_flags, stop_at_entry, 165324a1036SSaleem Abdulrasool static_cast<void*>(error.get())); 1669631aae2SJames McIlree 167acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 168acdbe816SGreg Clayton if (process_sp) 1699631aae2SJames McIlree { 170bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 171acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1729631aae2SJames McIlree { 173982c9762SGreg Clayton if (stop_at_entry) 174982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 175d3173f34SChaoren Lin ProcessLaunchInfo launch_info(FileSpec{stdin_path, false}, 176d3173f34SChaoren Lin FileSpec{stdout_path, false}, 177d3173f34SChaoren Lin FileSpec{stderr_path, false}, 178d3173f34SChaoren Lin FileSpec{working_directory, false}, 179982c9762SGreg Clayton launch_flags); 180acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 181982c9762SGreg Clayton if (exe_module) 18214715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 183982c9762SGreg Clayton if (argv) 184982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 185982c9762SGreg Clayton if (envp) 186982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 187acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1889631aae2SJames McIlree } 1899631aae2SJames McIlree else 1909631aae2SJames McIlree { 1919631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1929631aae2SJames McIlree } 1939631aae2SJames McIlree } 1949631aae2SJames McIlree else 1959631aae2SJames McIlree { 1969631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1979631aae2SJames McIlree } 1989631aae2SJames McIlree 1999631aae2SJames McIlree if (log) { 2009631aae2SJames McIlree SBStream sstr; 2019631aae2SJames McIlree error.GetDescription (sstr); 202324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", 203324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 204324a1036SSaleem Abdulrasool static_cast<void*>(error.get()), sstr.GetData()); 2059631aae2SJames McIlree } 2069631aae2SJames McIlree 2079631aae2SJames McIlree return error.Success(); 2089631aae2SJames McIlree } 2099631aae2SJames McIlree 2109631aae2SJames McIlree bool 2119631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 2129631aae2SJames McIlree { 213acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 214acdbe816SGreg Clayton if (process_sp) 2159631aae2SJames McIlree { 216bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 217acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 2189631aae2SJames McIlree { 219144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 220144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 221acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 2229631aae2SJames McIlree } 2239631aae2SJames McIlree else 2249631aae2SJames McIlree { 2259631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 2269631aae2SJames McIlree } 2279631aae2SJames McIlree } 2289631aae2SJames McIlree else 2299631aae2SJames McIlree { 2309631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 2319631aae2SJames McIlree } 2329631aae2SJames McIlree 2335160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2349631aae2SJames McIlree if (log) { 2359631aae2SJames McIlree SBStream sstr; 2369631aae2SJames McIlree error.GetDescription (sstr); 237324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", 238324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), pid, 239324a1036SSaleem Abdulrasool static_cast<void*>(error.get()), sstr.GetData()); 2409631aae2SJames McIlree } 2419631aae2SJames McIlree 2429631aae2SJames McIlree return error.Success(); 2439631aae2SJames McIlree } 2449631aae2SJames McIlree 24530fdc8d8SChris Lattner 24630fdc8d8SChris Lattner uint32_t 24730fdc8d8SChris Lattner SBProcess::GetNumThreads () 24830fdc8d8SChris Lattner { 2495160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 250ceb6b139SCaroline Tice 251ceb6b139SCaroline Tice uint32_t num_threads = 0; 252acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 253acdbe816SGreg Clayton if (process_sp) 25430fdc8d8SChris Lattner { 2557fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2567fdf9ef1SGreg Clayton 2577fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 258bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 259acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 26030fdc8d8SChris Lattner } 261ceb6b139SCaroline Tice 262ceb6b139SCaroline Tice if (log) 263324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetNumThreads () => %d", 264324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num_threads); 265ceb6b139SCaroline Tice 266ceb6b139SCaroline Tice return num_threads; 26730fdc8d8SChris Lattner } 26830fdc8d8SChris Lattner 26930fdc8d8SChris Lattner SBThread 2702976d00aSJim Ingham SBProcess::GetSelectedThread () const 27130fdc8d8SChris Lattner { 2725160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 273ceb6b139SCaroline Tice 27430fdc8d8SChris Lattner SBThread sb_thread; 27517a6ad05SGreg Clayton ThreadSP thread_sp; 276acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 277acdbe816SGreg Clayton if (process_sp) 278af67cecdSGreg Clayton { 279bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 280acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 28117a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 282af67cecdSGreg Clayton } 283ceb6b139SCaroline Tice 284ceb6b139SCaroline Tice if (log) 285324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", 286324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 287324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 288ceb6b139SCaroline Tice 28930fdc8d8SChris Lattner return sb_thread; 29030fdc8d8SChris Lattner } 29130fdc8d8SChris Lattner 292a4d8747dSGreg Clayton SBThread 293a4d8747dSGreg Clayton SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) 294a4d8747dSGreg Clayton { 2955160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 296a4d8747dSGreg Clayton 297a4d8747dSGreg Clayton SBThread sb_thread; 298a4d8747dSGreg Clayton ThreadSP thread_sp; 299a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 300a4d8747dSGreg Clayton if (process_sp) 301a4d8747dSGreg Clayton { 302bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 303a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 304a4d8747dSGreg Clayton sb_thread.SetThread (thread_sp); 305a4d8747dSGreg Clayton } 306a4d8747dSGreg Clayton 307a4d8747dSGreg Clayton if (log) 308324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", 309324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, context, 310324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 311a4d8747dSGreg Clayton 312a4d8747dSGreg Clayton return sb_thread; 313a4d8747dSGreg Clayton } 314a4d8747dSGreg Clayton 31530fdc8d8SChris Lattner SBTarget 31630fdc8d8SChris Lattner SBProcess::GetTarget() const 31730fdc8d8SChris Lattner { 3185160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 319ceb6b139SCaroline Tice 32030fdc8d8SChris Lattner SBTarget sb_target; 321b9556accSGreg Clayton TargetSP target_sp; 322acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 323acdbe816SGreg Clayton if (process_sp) 324b9556accSGreg Clayton { 325acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 326b9556accSGreg Clayton sb_target.SetSP (target_sp); 327b9556accSGreg Clayton } 328ceb6b139SCaroline Tice 329ceb6b139SCaroline Tice if (log) 330324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", 331324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 332324a1036SSaleem Abdulrasool static_cast<void*>(target_sp.get())); 333ceb6b139SCaroline Tice 33430fdc8d8SChris Lattner return sb_target; 33530fdc8d8SChris Lattner } 33630fdc8d8SChris Lattner 33730fdc8d8SChris Lattner 33830fdc8d8SChris Lattner size_t 33930fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 34030fdc8d8SChris Lattner { 3415160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 342ceb6b139SCaroline Tice 343ceb6b139SCaroline Tice size_t ret_val = 0; 344acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 345acdbe816SGreg Clayton if (process_sp) 34630fdc8d8SChris Lattner { 34730fdc8d8SChris Lattner Error error; 348acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 34930fdc8d8SChris Lattner } 350ceb6b139SCaroline Tice 351ceb6b139SCaroline Tice if (log) 3526fea17e8SGreg Clayton log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 ") => %" PRIu64, 353324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), src, 354324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 355324a1036SSaleem Abdulrasool static_cast<uint64_t>(ret_val)); 356ceb6b139SCaroline Tice 357ceb6b139SCaroline Tice return ret_val; 35830fdc8d8SChris Lattner } 35930fdc8d8SChris Lattner 36030fdc8d8SChris Lattner size_t 36130fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 36230fdc8d8SChris Lattner { 363cfd1acedSGreg Clayton size_t bytes_read = 0; 364acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 365acdbe816SGreg Clayton if (process_sp) 36630fdc8d8SChris Lattner { 36730fdc8d8SChris Lattner Error error; 368acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 36930fdc8d8SChris Lattner } 370ceb6b139SCaroline Tice 3715160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 372ceb6b139SCaroline Tice if (log) 373d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 374324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 375324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 376324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 377324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 378ceb6b139SCaroline Tice 379cfd1acedSGreg Clayton return bytes_read; 38030fdc8d8SChris Lattner } 38130fdc8d8SChris Lattner 38230fdc8d8SChris Lattner size_t 38330fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 38430fdc8d8SChris Lattner { 385cfd1acedSGreg Clayton size_t bytes_read = 0; 386acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 387acdbe816SGreg Clayton if (process_sp) 38830fdc8d8SChris Lattner { 38930fdc8d8SChris Lattner Error error; 390acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 39130fdc8d8SChris Lattner } 392ceb6b139SCaroline Tice 3935160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 394ceb6b139SCaroline Tice if (log) 395d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 396324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 397324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 398324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 399324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 400ceb6b139SCaroline Tice 401cfd1acedSGreg Clayton return bytes_read; 40230fdc8d8SChris Lattner } 40330fdc8d8SChris Lattner 404ab3b8b22SHan Ming Ong size_t 405ab3b8b22SHan Ming Ong SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const 406ab3b8b22SHan Ming Ong { 407ab3b8b22SHan Ming Ong size_t bytes_read = 0; 408ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 409ab3b8b22SHan Ming Ong if (process_sp) 410ab3b8b22SHan Ming Ong { 411ab3b8b22SHan Ming Ong Error error; 412ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error); 413ab3b8b22SHan Ming Ong } 414ab3b8b22SHan Ming Ong 4155160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 416ab3b8b22SHan Ming Ong if (log) 417adb99821SBruce Mitchener log->Printf ("SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 418324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 419324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 420324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 421324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 422ab3b8b22SHan Ming Ong 423ab3b8b22SHan Ming Ong return bytes_read; 424ab3b8b22SHan Ming Ong } 425ab3b8b22SHan Ming Ong 42630fdc8d8SChris Lattner void 4272976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 42830fdc8d8SChris Lattner { 42930fdc8d8SChris Lattner if (out == NULL) 43030fdc8d8SChris Lattner return; 43130fdc8d8SChris Lattner 432acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 433acdbe816SGreg Clayton if (process_sp) 43430fdc8d8SChris Lattner { 43530fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 43630fdc8d8SChris Lattner char message[1024]; 43730fdc8d8SChris Lattner int message_len = ::snprintf (message, 43830fdc8d8SChris Lattner sizeof (message), 439d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 440acdbe816SGreg Clayton process_sp->GetID(), 44130fdc8d8SChris Lattner 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 44830fdc8d8SChris Lattner void 4492976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 45030fdc8d8SChris Lattner { 451acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 452acdbe816SGreg Clayton if (process_sp) 45330fdc8d8SChris Lattner { 45430fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 45530fdc8d8SChris Lattner char message[1024]; 45630fdc8d8SChris Lattner ::snprintf (message, 45730fdc8d8SChris Lattner sizeof (message), 458d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 459acdbe816SGreg Clayton process_sp->GetID(), 46030fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 46130fdc8d8SChris Lattner 46230fdc8d8SChris Lattner result.AppendMessage (message); 46330fdc8d8SChris Lattner } 46430fdc8d8SChris Lattner } 46530fdc8d8SChris Lattner 46630fdc8d8SChris Lattner bool 4672976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 46830fdc8d8SChris Lattner { 469acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 470acdbe816SGreg Clayton if (process_sp) 471af67cecdSGreg Clayton { 472bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 473acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 474af67cecdSGreg Clayton } 47530fdc8d8SChris Lattner return false; 47630fdc8d8SChris Lattner } 47730fdc8d8SChris Lattner 47830fdc8d8SChris Lattner bool 479ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid) 480ea561dcfSGreg Clayton { 4815160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 482ceb6b139SCaroline Tice 483ceb6b139SCaroline Tice bool ret_val = false; 484acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 485acdbe816SGreg Clayton if (process_sp) 486af67cecdSGreg Clayton { 487bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 488acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 489af67cecdSGreg Clayton } 490ceb6b139SCaroline Tice 491ceb6b139SCaroline Tice if (log) 492d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s", 493324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, 494324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 495ceb6b139SCaroline Tice 496ceb6b139SCaroline Tice return ret_val; 49730fdc8d8SChris Lattner } 49830fdc8d8SChris Lattner 49918b46896SJim Ingham bool 50018b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 50118b46896SJim Ingham { 5025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 50318b46896SJim Ingham 50418b46896SJim Ingham bool ret_val = false; 50518b46896SJim Ingham ProcessSP process_sp(GetSP()); 50618b46896SJim Ingham if (process_sp) 50718b46896SJim Ingham { 508bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 50918b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 51018b46896SJim Ingham } 51118b46896SJim Ingham 51218b46896SJim Ingham if (log) 51318b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 514324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), index_id, 515324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 51618b46896SJim Ingham 51718b46896SJim Ingham return ret_val; 51818b46896SJim Ingham } 51918b46896SJim Ingham 52030fdc8d8SChris Lattner SBThread 52130fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 52230fdc8d8SChris Lattner { 5235160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 524ceb6b139SCaroline Tice 52517a6ad05SGreg Clayton SBThread sb_thread; 52617a6ad05SGreg Clayton ThreadSP thread_sp; 527acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 528acdbe816SGreg Clayton if (process_sp) 529af67cecdSGreg Clayton { 5307fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5317fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 532bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 5337fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 53417a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 535af67cecdSGreg Clayton } 536ceb6b139SCaroline Tice 537ceb6b139SCaroline Tice if (log) 53893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 539324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 540324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 541324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 542ceb6b139SCaroline Tice 54317a6ad05SGreg Clayton return sb_thread; 54430fdc8d8SChris Lattner } 54530fdc8d8SChris Lattner 546bf2956a2SJim Ingham uint32_t 5475e8dce4dSJason Molenda SBProcess::GetNumQueues () 5485e8dce4dSJason Molenda { 5495e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5505e8dce4dSJason Molenda 5515e8dce4dSJason Molenda uint32_t num_queues = 0; 5525e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 5535e8dce4dSJason Molenda if (process_sp) 5545e8dce4dSJason Molenda { 5555e8dce4dSJason Molenda Process::StopLocker stop_locker; 556a61d0a5bSGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 557a61d0a5bSGreg Clayton { 558bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 5595e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 5605e8dce4dSJason Molenda } 561a61d0a5bSGreg Clayton } 5625e8dce4dSJason Molenda 5635e8dce4dSJason Molenda if (log) 564324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetNumQueues () => %d", 565324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num_queues); 5665e8dce4dSJason Molenda 5675e8dce4dSJason Molenda return num_queues; 5685e8dce4dSJason Molenda } 5695e8dce4dSJason Molenda 5705e8dce4dSJason Molenda SBQueue 5715e8dce4dSJason Molenda SBProcess::GetQueueAtIndex (size_t index) 5725e8dce4dSJason Molenda { 5735e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5745e8dce4dSJason Molenda 5755e8dce4dSJason Molenda SBQueue sb_queue; 5765e8dce4dSJason Molenda QueueSP queue_sp; 5775e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 5785e8dce4dSJason Molenda if (process_sp) 5795e8dce4dSJason Molenda { 5805e8dce4dSJason Molenda Process::StopLocker stop_locker; 581a61d0a5bSGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 582a61d0a5bSGreg Clayton { 583bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 5845e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 5855e8dce4dSJason Molenda sb_queue.SetQueue (queue_sp); 5865e8dce4dSJason Molenda } 587a61d0a5bSGreg Clayton } 5885e8dce4dSJason Molenda 5895e8dce4dSJason Molenda if (log) 5905e8dce4dSJason Molenda log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", 591324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 592324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 593324a1036SSaleem Abdulrasool static_cast<void*>(queue_sp.get())); 5945e8dce4dSJason Molenda 5955e8dce4dSJason Molenda return sb_queue; 5965e8dce4dSJason Molenda } 5975e8dce4dSJason Molenda 5985e8dce4dSJason Molenda 5995e8dce4dSJason Molenda uint32_t 600bf2956a2SJim Ingham SBProcess::GetStopID(bool include_expression_stops) 601bf2956a2SJim Ingham { 602bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 603bf2956a2SJim Ingham if (process_sp) 604bf2956a2SJim Ingham { 605bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 606bf2956a2SJim Ingham if (include_expression_stops) 607bf2956a2SJim Ingham return process_sp->GetStopID(); 608bf2956a2SJim Ingham else 609bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 610bf2956a2SJim Ingham } 611bf2956a2SJim Ingham return 0; 612bf2956a2SJim Ingham } 613bf2956a2SJim Ingham 61438810f43SIlia K SBEvent 61538810f43SIlia K SBProcess::GetStopEventForStopID(uint32_t stop_id) 61638810f43SIlia K { 61738810f43SIlia K Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 61838810f43SIlia K 61938810f43SIlia K SBEvent sb_event; 62038810f43SIlia K EventSP event_sp; 62138810f43SIlia K ProcessSP process_sp(GetSP()); 62238810f43SIlia K if (process_sp) 62338810f43SIlia K { 624bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 62538810f43SIlia K event_sp = process_sp->GetStopEventForStopID(stop_id); 62638810f43SIlia K sb_event.reset(event_sp); 62738810f43SIlia K } 62838810f43SIlia K 62938810f43SIlia K if (log) 63038810f43SIlia K log->Printf ("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 ") => SBEvent(%p)", 63138810f43SIlia K static_cast<void*>(process_sp.get()), 63238810f43SIlia K stop_id, 63338810f43SIlia K static_cast<void*>(event_sp.get())); 63438810f43SIlia K 63538810f43SIlia K return sb_event; 63638810f43SIlia K } 63738810f43SIlia K 63830fdc8d8SChris Lattner StateType 63930fdc8d8SChris Lattner SBProcess::GetState () 64030fdc8d8SChris Lattner { 641ceb6b139SCaroline Tice 642ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 643acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 644acdbe816SGreg Clayton if (process_sp) 645af67cecdSGreg Clayton { 646bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 647acdbe816SGreg Clayton ret_val = process_sp->GetState(); 648af67cecdSGreg Clayton } 649ceb6b139SCaroline Tice 6505160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 651ceb6b139SCaroline Tice if (log) 652cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 653324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 654750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 655ceb6b139SCaroline Tice 656ceb6b139SCaroline Tice return ret_val; 65730fdc8d8SChris Lattner } 65830fdc8d8SChris Lattner 65930fdc8d8SChris Lattner 66030fdc8d8SChris Lattner int 66130fdc8d8SChris Lattner SBProcess::GetExitStatus () 66230fdc8d8SChris Lattner { 6634838131bSGreg Clayton int exit_status = 0; 664acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 665acdbe816SGreg Clayton if (process_sp) 666af67cecdSGreg Clayton { 667bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 668acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 669af67cecdSGreg Clayton } 6705160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6714838131bSGreg Clayton if (log) 6724838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 673324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), exit_status, 674324a1036SSaleem Abdulrasool exit_status); 6754838131bSGreg Clayton 6764838131bSGreg Clayton return exit_status; 67730fdc8d8SChris Lattner } 67830fdc8d8SChris Lattner 67930fdc8d8SChris Lattner const char * 68030fdc8d8SChris Lattner SBProcess::GetExitDescription () 68130fdc8d8SChris Lattner { 6824838131bSGreg Clayton const char *exit_desc = NULL; 683acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 684acdbe816SGreg Clayton if (process_sp) 685af67cecdSGreg Clayton { 686bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 687acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 688af67cecdSGreg Clayton } 6895160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6904838131bSGreg Clayton if (log) 6914838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 692324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), exit_desc); 6934838131bSGreg Clayton return exit_desc; 69430fdc8d8SChris Lattner } 69530fdc8d8SChris Lattner 69630fdc8d8SChris Lattner lldb::pid_t 69730fdc8d8SChris Lattner SBProcess::GetProcessID () 69830fdc8d8SChris Lattner { 699ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 700acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 701acdbe816SGreg Clayton if (process_sp) 702acdbe816SGreg Clayton ret_val = process_sp->GetID(); 703ceb6b139SCaroline Tice 7045160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 705ceb6b139SCaroline Tice if (log) 706324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, 707324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), ret_val); 708ceb6b139SCaroline Tice 709ceb6b139SCaroline Tice return ret_val; 71030fdc8d8SChris Lattner } 71130fdc8d8SChris Lattner 712949e8221SGreg Clayton uint32_t 713949e8221SGreg Clayton SBProcess::GetUniqueID() 714949e8221SGreg Clayton { 715949e8221SGreg Clayton uint32_t ret_val = 0; 716949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 717949e8221SGreg Clayton if (process_sp) 718949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 7195160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 720949e8221SGreg Clayton if (log) 721324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, 722324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), ret_val); 723949e8221SGreg Clayton return ret_val; 724949e8221SGreg Clayton } 725949e8221SGreg Clayton 726cf386e24SJohnny Chen ByteOrder 727cf386e24SJohnny Chen SBProcess::GetByteOrder () const 728cf386e24SJohnny Chen { 729cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 730acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 731acdbe816SGreg Clayton if (process_sp) 732acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 733cf386e24SJohnny Chen 7345160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 735cf386e24SJohnny Chen if (log) 736324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetByteOrder () => %d", 737324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), byteOrder); 738cf386e24SJohnny Chen 739cf386e24SJohnny Chen return byteOrder; 740cf386e24SJohnny Chen } 741cf386e24SJohnny Chen 74230fdc8d8SChris Lattner uint32_t 74330fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 74430fdc8d8SChris Lattner { 745ceb6b139SCaroline Tice uint32_t size = 0; 746acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 747acdbe816SGreg Clayton if (process_sp) 748acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 749ceb6b139SCaroline Tice 7505160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 751ceb6b139SCaroline Tice if (log) 752324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", 753324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), size); 754ceb6b139SCaroline Tice 755ceb6b139SCaroline Tice return size; 75630fdc8d8SChris Lattner } 75730fdc8d8SChris Lattner 75830fdc8d8SChris Lattner SBError 75930fdc8d8SChris Lattner SBProcess::Continue () 76030fdc8d8SChris Lattner { 7615160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 762ceb6b139SCaroline Tice 76330fdc8d8SChris Lattner SBError sb_error; 764acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 7650c74e78dSGreg Clayton 766acdbe816SGreg Clayton if (log) 767324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::Continue ()...", 768324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 769acdbe816SGreg Clayton 770acdbe816SGreg Clayton if (process_sp) 771acdbe816SGreg Clayton { 772bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 773acdbe816SGreg Clayton 774dc6224e0SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution ()) 775dc6224e0SGreg Clayton sb_error.ref() = process_sp->Resume (); 776dc6224e0SGreg Clayton else 777dc6224e0SGreg Clayton sb_error.ref() = process_sp->ResumeSynchronous (NULL); 7785d5028b5SGreg Clayton } 77930fdc8d8SChris Lattner else 78030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 78130fdc8d8SChris Lattner 782ceb6b139SCaroline Tice if (log) 783ceb6b139SCaroline Tice { 784ceb6b139SCaroline Tice SBStream sstr; 785ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 786324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", 787324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 788324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 789ceb6b139SCaroline Tice } 790ceb6b139SCaroline Tice 79130fdc8d8SChris Lattner return sb_error; 79230fdc8d8SChris Lattner } 79330fdc8d8SChris Lattner 79430fdc8d8SChris Lattner 79530fdc8d8SChris Lattner SBError 79630fdc8d8SChris Lattner SBProcess::Destroy () 79730fdc8d8SChris Lattner { 79830fdc8d8SChris Lattner SBError sb_error; 799acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 800acdbe816SGreg Clayton if (process_sp) 8016779606aSGreg Clayton { 802bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 803ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 8046779606aSGreg Clayton } 80530fdc8d8SChris Lattner else 80630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 80730fdc8d8SChris Lattner 8085160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8094838131bSGreg Clayton if (log) 8104838131bSGreg Clayton { 8114838131bSGreg Clayton SBStream sstr; 8124838131bSGreg Clayton sb_error.GetDescription (sstr); 8136779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 814324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 815324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 8164838131bSGreg Clayton } 8174838131bSGreg Clayton 81830fdc8d8SChris Lattner return sb_error; 81930fdc8d8SChris Lattner } 82030fdc8d8SChris Lattner 82130fdc8d8SChris Lattner 82230fdc8d8SChris Lattner SBError 82330fdc8d8SChris Lattner SBProcess::Stop () 82430fdc8d8SChris Lattner { 82530fdc8d8SChris Lattner SBError sb_error; 826acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 827acdbe816SGreg Clayton if (process_sp) 828af67cecdSGreg Clayton { 829bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 830acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 831af67cecdSGreg Clayton } 83230fdc8d8SChris Lattner else 83330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 834ceb6b139SCaroline Tice 8355160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 836ceb6b139SCaroline Tice if (log) 837ceb6b139SCaroline Tice { 838ceb6b139SCaroline Tice SBStream sstr; 839ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 84093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 841324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 842324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 843ceb6b139SCaroline Tice } 844ceb6b139SCaroline Tice 84530fdc8d8SChris Lattner return sb_error; 84630fdc8d8SChris Lattner } 84730fdc8d8SChris Lattner 84830fdc8d8SChris Lattner SBError 84930fdc8d8SChris Lattner SBProcess::Kill () 85030fdc8d8SChris Lattner { 85130fdc8d8SChris Lattner SBError sb_error; 852acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 853acdbe816SGreg Clayton if (process_sp) 854af67cecdSGreg Clayton { 855bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 856ede3193bSJason Molenda sb_error.SetError (process_sp->Destroy(true)); 857af67cecdSGreg Clayton } 85830fdc8d8SChris Lattner else 85930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 860ceb6b139SCaroline Tice 8615160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 862ceb6b139SCaroline Tice if (log) 863ceb6b139SCaroline Tice { 864ceb6b139SCaroline Tice SBStream sstr; 865ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 86693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 867324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 868324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 869ceb6b139SCaroline Tice } 870ceb6b139SCaroline Tice 87130fdc8d8SChris Lattner return sb_error; 87230fdc8d8SChris Lattner } 87330fdc8d8SChris Lattner 87430fdc8d8SChris Lattner SBError 87530fdc8d8SChris Lattner SBProcess::Detach () 87630fdc8d8SChris Lattner { 877acff8950SJim Ingham // FIXME: This should come from a process default. 878acff8950SJim Ingham bool keep_stopped = false; 879acff8950SJim Ingham return Detach (keep_stopped); 880acff8950SJim Ingham } 881acff8950SJim Ingham 882acff8950SJim Ingham SBError 883acff8950SJim Ingham SBProcess::Detach (bool keep_stopped) 884acff8950SJim Ingham { 88530fdc8d8SChris Lattner SBError sb_error; 886acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 887acdbe816SGreg Clayton if (process_sp) 888af67cecdSGreg Clayton { 889bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 890acff8950SJim Ingham sb_error.SetError (process_sp->Detach(keep_stopped)); 891af67cecdSGreg Clayton } 89230fdc8d8SChris Lattner else 89330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 89430fdc8d8SChris Lattner 89530fdc8d8SChris Lattner return sb_error; 89630fdc8d8SChris Lattner } 89730fdc8d8SChris Lattner 89830fdc8d8SChris Lattner SBError 8994838131bSGreg Clayton SBProcess::Signal (int signo) 90030fdc8d8SChris Lattner { 90130fdc8d8SChris Lattner SBError sb_error; 902acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 903acdbe816SGreg Clayton if (process_sp) 904af67cecdSGreg Clayton { 905bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 906acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 907af67cecdSGreg Clayton } 90830fdc8d8SChris Lattner else 90930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 9105160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9114838131bSGreg Clayton if (log) 9124838131bSGreg Clayton { 9134838131bSGreg Clayton SBStream sstr; 9144838131bSGreg Clayton sb_error.GetDescription (sstr); 9154838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 916324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), signo, 917324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 9184838131bSGreg Clayton } 91930fdc8d8SChris Lattner return sb_error; 92030fdc8d8SChris Lattner } 92130fdc8d8SChris Lattner 922802dc402STodd Fiala SBUnixSignals 923802dc402STodd Fiala SBProcess::GetUnixSignals() 924802dc402STodd Fiala { 92598d0a4b3SChaoren Lin if (auto process_sp = GetSP()) 92698d0a4b3SChaoren Lin return SBUnixSignals{process_sp}; 927802dc402STodd Fiala 92898d0a4b3SChaoren Lin return {}; 929802dc402STodd Fiala } 930802dc402STodd Fiala 931cfc0935eSJim Ingham void 932cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 933cfc0935eSJim Ingham { 934cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 935cfc0935eSJim Ingham if (process_sp) 936cfc0935eSJim Ingham { 937cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 938cfc0935eSJim Ingham } 939cfc0935eSJim Ingham } 940cfc0935eSJim Ingham 94130fdc8d8SChris Lattner SBThread 9424838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 94330fdc8d8SChris Lattner { 9444838131bSGreg Clayton SBThread sb_thread; 94517a6ad05SGreg Clayton ThreadSP thread_sp; 946acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 947acdbe816SGreg Clayton if (process_sp) 948af67cecdSGreg Clayton { 9497fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9507fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 951bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 9527fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 95317a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 954af67cecdSGreg Clayton } 9554838131bSGreg Clayton 9565160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9574838131bSGreg Clayton if (log) 958d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)", 959324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, 960324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 9614838131bSGreg Clayton 9624838131bSGreg Clayton return sb_thread; 96330fdc8d8SChris Lattner } 96430fdc8d8SChris Lattner 96518b46896SJim Ingham SBThread 96618b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 96718b46896SJim Ingham { 96818b46896SJim Ingham SBThread sb_thread; 96918b46896SJim Ingham ThreadSP thread_sp; 97018b46896SJim Ingham ProcessSP process_sp(GetSP()); 97118b46896SJim Ingham if (process_sp) 97218b46896SJim Ingham { 97318b46896SJim Ingham Process::StopLocker stop_locker; 97418b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 975bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 97618b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 97718b46896SJim Ingham sb_thread.SetThread (thread_sp); 97818b46896SJim Ingham } 97918b46896SJim Ingham 9805160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 98118b46896SJim Ingham if (log) 98218b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 983324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), index_id, 984324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 98518b46896SJim Ingham 98618b46896SJim Ingham return sb_thread; 98718b46896SJim Ingham } 98818b46896SJim Ingham 98930fdc8d8SChris Lattner StateType 99030fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 99130fdc8d8SChris Lattner { 9925160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 993ceb6b139SCaroline Tice 994ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 995ceb6b139SCaroline Tice 996ceb6b139SCaroline Tice if (log) 997324a1036SSaleem Abdulrasool log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", 998324a1036SSaleem Abdulrasool static_cast<void*>(event.get()), 999750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 1000ceb6b139SCaroline Tice 1001ceb6b139SCaroline Tice return ret_val; 100230fdc8d8SChris Lattner } 100330fdc8d8SChris Lattner 100430fdc8d8SChris Lattner bool 100530fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 100630fdc8d8SChris Lattner { 1007ea2cc5e0SPavel Labath Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1008ea2cc5e0SPavel Labath 1009ea2cc5e0SPavel Labath bool ret_val = Process::ProcessEventData::GetRestartedFromEvent (event.get()); 1010ea2cc5e0SPavel Labath 1011ea2cc5e0SPavel Labath if (log) 1012400e1809SHans Wennborg log->Printf ("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__, 1013400e1809SHans Wennborg static_cast<void*>(event.get()), ret_val); 1014ea2cc5e0SPavel Labath 1015ea2cc5e0SPavel Labath return ret_val; 101630fdc8d8SChris Lattner } 101730fdc8d8SChris Lattner 10180161b49cSJim Ingham size_t 10190161b49cSJim Ingham SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event) 10200161b49cSJim Ingham { 10210161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 10220161b49cSJim Ingham } 10230161b49cSJim Ingham 10240161b49cSJim Ingham const char * 10250161b49cSJim Ingham SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx) 10260161b49cSJim Ingham { 10270161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 10280161b49cSJim Ingham } 10290161b49cSJim Ingham 103030fdc8d8SChris Lattner SBProcess 103130fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 103230fdc8d8SChris Lattner { 1033*75930019STodd Fiala ProcessSP process_sp = 1034*75930019STodd Fiala Process::ProcessEventData::GetProcessFromEvent (event.get()); 1035*75930019STodd Fiala if (!process_sp) 1036*75930019STodd Fiala { 1037*75930019STodd Fiala // StructuredData events also know the process they come from. 1038*75930019STodd Fiala // Try that. 1039*75930019STodd Fiala process_sp = EventDataStructuredData::GetProcessFromEvent(event.get()); 1040*75930019STodd Fiala } 1041*75930019STodd Fiala 1042*75930019STodd Fiala return SBProcess(process_sp); 104330fdc8d8SChris Lattner } 104430fdc8d8SChris Lattner 1045e6bc6cb9SJim Ingham bool 104606d2855fSIlia K SBProcess::GetInterruptedFromEvent (const SBEvent &event) 104706d2855fSIlia K { 104806d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 104906d2855fSIlia K } 105006d2855fSIlia K 1051*75930019STodd Fiala lldb::SBStructuredData 1052*75930019STodd Fiala SBProcess::GetStructuredDataFromEvent (const lldb::SBEvent &event) 1053*75930019STodd Fiala { 1054*75930019STodd Fiala return SBStructuredData(event.GetSP()); 1055*75930019STodd Fiala } 1056*75930019STodd Fiala 105706d2855fSIlia K bool 1058e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 1059e6bc6cb9SJim Ingham { 1060*75930019STodd Fiala return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) && 1061*75930019STodd Fiala !EventIsStructuredDataEvent (event); 1062*75930019STodd Fiala } 1063*75930019STodd Fiala 1064*75930019STodd Fiala bool 1065*75930019STodd Fiala SBProcess::EventIsStructuredDataEvent (const lldb::SBEvent &event) 1066*75930019STodd Fiala { 1067*75930019STodd Fiala EventSP event_sp = event.GetSP(); 1068*75930019STodd Fiala EventData *event_data = event_sp ? event_sp->GetData() : nullptr; 1069*75930019STodd Fiala return event_data && 1070*75930019STodd Fiala (event_data->GetFlavor() == EventDataStructuredData::GetFlavorString()); 1071e6bc6cb9SJim Ingham } 107230fdc8d8SChris Lattner 107330fdc8d8SChris Lattner SBBroadcaster 107430fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 107530fdc8d8SChris Lattner { 10765160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1077ceb6b139SCaroline Tice 1078acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1079acdbe816SGreg Clayton 1080acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 1081ceb6b139SCaroline Tice 1082ceb6b139SCaroline Tice if (log) 1083324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", 1084324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 1085324a1036SSaleem Abdulrasool static_cast<void*>(broadcaster.get())); 1086ceb6b139SCaroline Tice 108730fdc8d8SChris Lattner return broadcaster; 108830fdc8d8SChris Lattner } 108930fdc8d8SChris Lattner 10904bddaeb5SJim Ingham const char * 10914bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 10924bddaeb5SJim Ingham { 10934bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 10944bddaeb5SJim Ingham } 10954bddaeb5SJim Ingham 109630fdc8d8SChris Lattner size_t 109730fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 109830fdc8d8SChris Lattner { 10995160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1100ceb6b139SCaroline Tice 110130fdc8d8SChris Lattner size_t bytes_read = 0; 110230fdc8d8SChris Lattner 1103acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1104acdbe816SGreg Clayton 11054838131bSGreg Clayton if (log) 1106d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 1107324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1108324a1036SSaleem Abdulrasool static_cast<void*>(dst), static_cast<uint64_t>(dst_len), 1109324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get())); 11104838131bSGreg Clayton 1111acdbe816SGreg Clayton if (process_sp) 111230fdc8d8SChris Lattner { 11137fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11147fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11157fdf9ef1SGreg Clayton { 1116bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 11177fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 11187fdf9ef1SGreg Clayton } 11197fdf9ef1SGreg Clayton else 11207fdf9ef1SGreg Clayton { 1121c9858e4dSGreg Clayton if (log) 1122324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", 1123324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11247fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11257fdf9ef1SGreg Clayton } 112630fdc8d8SChris Lattner } 112730fdc8d8SChris Lattner else 112830fdc8d8SChris Lattner { 112930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 113030fdc8d8SChris Lattner } 113130fdc8d8SChris Lattner 1132ceb6b139SCaroline Tice if (log) 113393aa84e8SGreg Clayton { 113493aa84e8SGreg Clayton SBStream sstr; 113593aa84e8SGreg Clayton sb_error.GetDescription (sstr); 1136d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1137324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1138324a1036SSaleem Abdulrasool static_cast<void*>(dst), static_cast<uint64_t>(dst_len), 1139324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData(), 1140324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 114193aa84e8SGreg Clayton } 1142ceb6b139SCaroline Tice 114330fdc8d8SChris Lattner return bytes_read; 114430fdc8d8SChris Lattner } 114530fdc8d8SChris Lattner 114630fdc8d8SChris Lattner size_t 1147e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 1148e91b7957SGreg Clayton { 1149e91b7957SGreg Clayton size_t bytes_read = 0; 1150acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1151acdbe816SGreg Clayton if (process_sp) 1152e91b7957SGreg Clayton { 11537fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11547fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11557fdf9ef1SGreg Clayton { 1156bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 11577fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 11587fdf9ef1SGreg Clayton } 11597fdf9ef1SGreg Clayton else 11607fdf9ef1SGreg Clayton { 11615160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1162c9858e4dSGreg Clayton if (log) 1163324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", 1164324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11657fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11667fdf9ef1SGreg Clayton } 1167e91b7957SGreg Clayton } 1168e91b7957SGreg Clayton else 1169e91b7957SGreg Clayton { 1170e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1171e91b7957SGreg Clayton } 1172e91b7957SGreg Clayton return bytes_read; 1173e91b7957SGreg Clayton } 1174e91b7957SGreg Clayton 1175e91b7957SGreg Clayton uint64_t 1176e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 1177e91b7957SGreg Clayton { 11787fdf9ef1SGreg Clayton uint64_t value = 0; 1179acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1180acdbe816SGreg Clayton if (process_sp) 1181e91b7957SGreg Clayton { 11827fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11837fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11847fdf9ef1SGreg Clayton { 1185bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 11867fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 11877fdf9ef1SGreg Clayton } 11887fdf9ef1SGreg Clayton else 11897fdf9ef1SGreg Clayton { 11905160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1191c9858e4dSGreg Clayton if (log) 1192324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", 1193324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11947fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11957fdf9ef1SGreg Clayton } 1196e91b7957SGreg Clayton } 1197e91b7957SGreg Clayton else 1198e91b7957SGreg Clayton { 1199e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1200e91b7957SGreg Clayton } 12017fdf9ef1SGreg Clayton return value; 1202e91b7957SGreg Clayton } 1203e91b7957SGreg Clayton 1204e91b7957SGreg Clayton lldb::addr_t 1205e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 1206e91b7957SGreg Clayton { 1207e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1208acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1209acdbe816SGreg Clayton if (process_sp) 1210e91b7957SGreg Clayton { 12117fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12127fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12137fdf9ef1SGreg Clayton { 1214bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 12157fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 12167fdf9ef1SGreg Clayton } 12177fdf9ef1SGreg Clayton else 12187fdf9ef1SGreg Clayton { 12195160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1220c9858e4dSGreg Clayton if (log) 1221324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", 1222324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 12237fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12247fdf9ef1SGreg Clayton } 1225e91b7957SGreg Clayton } 1226e91b7957SGreg Clayton else 1227e91b7957SGreg Clayton { 1228e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1229e91b7957SGreg Clayton } 1230e91b7957SGreg Clayton return ptr; 1231e91b7957SGreg Clayton } 1232e91b7957SGreg Clayton 1233e91b7957SGreg Clayton size_t 123430fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 123530fdc8d8SChris Lattner { 123630fdc8d8SChris Lattner size_t bytes_written = 0; 123730fdc8d8SChris Lattner 12385160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1239acdbe816SGreg Clayton 1240acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1241acdbe816SGreg Clayton 12424838131bSGreg Clayton if (log) 1243d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1244324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1245324a1036SSaleem Abdulrasool static_cast<const void*>(src), 1246324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 1247324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get())); 12484838131bSGreg Clayton 1249acdbe816SGreg Clayton if (process_sp) 125030fdc8d8SChris Lattner { 12517fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12527fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12537fdf9ef1SGreg Clayton { 1254bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 12557fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 12567fdf9ef1SGreg Clayton } 12577fdf9ef1SGreg Clayton else 12587fdf9ef1SGreg Clayton { 1259c9858e4dSGreg Clayton if (log) 1260324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", 1261324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 12627fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12637fdf9ef1SGreg Clayton } 126430fdc8d8SChris Lattner } 126530fdc8d8SChris Lattner 12664838131bSGreg Clayton if (log) 12674838131bSGreg Clayton { 12684838131bSGreg Clayton SBStream sstr; 12694838131bSGreg Clayton sb_error.GetDescription (sstr); 1270d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1271324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1272324a1036SSaleem Abdulrasool static_cast<const void*>(src), 1273324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 1274324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData(), 1275324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_written)); 12764838131bSGreg Clayton } 12774838131bSGreg Clayton 127830fdc8d8SChris Lattner return bytes_written; 127930fdc8d8SChris Lattner } 128030fdc8d8SChris Lattner 1281dde9cff3SCaroline Tice bool 1282dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1283dde9cff3SCaroline Tice { 1284da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1285da7bc7d0SGreg Clayton 1286acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1287acdbe816SGreg Clayton if (process_sp) 1288dde9cff3SCaroline Tice { 1289dde9cff3SCaroline Tice char path[PATH_MAX]; 1290dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1291acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 12921d273166SGreg Clayton const char *exe_name = NULL; 12931d273166SGreg Clayton if (exe_module) 12941d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 12951d273166SGreg Clayton 1296d01b2953SDaniel Malea strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1297acdbe816SGreg Clayton process_sp->GetID(), 1298ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 12991d273166SGreg Clayton GetNumThreads(), 130005faeb71SGreg Clayton exe_name ? ", executable = " : "", 13011d273166SGreg Clayton exe_name ? exe_name : ""); 1302dde9cff3SCaroline Tice } 1303dde9cff3SCaroline Tice else 1304da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1305dde9cff3SCaroline Tice 1306dde9cff3SCaroline Tice return true; 1307dde9cff3SCaroline Tice } 13088f343b09SGreg Clayton 13098f343b09SGreg Clayton uint32_t 1310f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1311f9ef60d2SJohnny Chen { 13125160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1313f9ef60d2SJohnny Chen 1314f9ef60d2SJohnny Chen uint32_t num = 0; 1315f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1316f9ef60d2SJohnny Chen if (process_sp) 1317f9ef60d2SJohnny Chen { 1318bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 1319f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1320f9ef60d2SJohnny Chen if (log) 1321f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1322324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num); 1323f9ef60d2SJohnny Chen } 1324f9ef60d2SJohnny Chen else 1325f9ef60d2SJohnny Chen { 1326f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1327f9ef60d2SJohnny Chen } 1328f9ef60d2SJohnny Chen return num; 1329f9ef60d2SJohnny Chen } 1330f9ef60d2SJohnny Chen 1331f9ef60d2SJohnny Chen uint32_t 13324fbd67acSTamas Berghammer SBProcess::LoadImage (lldb::SBFileSpec &sb_remote_image_spec, lldb::SBError &sb_error) 13334fbd67acSTamas Berghammer { 13344fbd67acSTamas Berghammer return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); 13354fbd67acSTamas Berghammer } 13364fbd67acSTamas Berghammer 13374fbd67acSTamas Berghammer uint32_t 13384fbd67acSTamas Berghammer SBProcess::LoadImage (const lldb::SBFileSpec &sb_local_image_spec, 13394fbd67acSTamas Berghammer const lldb::SBFileSpec &sb_remote_image_spec, 13404fbd67acSTamas Berghammer lldb::SBError &sb_error) 13418f343b09SGreg Clayton { 1342acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1343acdbe816SGreg Clayton if (process_sp) 1344af67cecdSGreg Clayton { 13457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13467fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 13477fdf9ef1SGreg Clayton { 1348bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 13493cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 13504fbd67acSTamas Berghammer return platform_sp->LoadImage (process_sp.get(), 13514fbd67acSTamas Berghammer *sb_local_image_spec, 13524fbd67acSTamas Berghammer *sb_remote_image_spec, 13534fbd67acSTamas Berghammer sb_error.ref()); 1354af67cecdSGreg Clayton } 13557fdf9ef1SGreg Clayton else 13567fdf9ef1SGreg Clayton { 13575160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1358c9858e4dSGreg Clayton if (log) 1359324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", 1360324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 13617fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 13627fdf9ef1SGreg Clayton } 13637fdf9ef1SGreg Clayton } 13648f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 13658f343b09SGreg Clayton } 13668f343b09SGreg Clayton 13678f343b09SGreg Clayton lldb::SBError 13688f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 13698f343b09SGreg Clayton { 13708f343b09SGreg Clayton lldb::SBError sb_error; 1371acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1372acdbe816SGreg Clayton if (process_sp) 1373af67cecdSGreg Clayton { 13747fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13757fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 13767fdf9ef1SGreg Clayton { 1377bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 13783cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 13793cb132a0STamas Berghammer sb_error.SetError (platform_sp->UnloadImage (process_sp.get(), image_token)); 1380af67cecdSGreg Clayton } 13818f343b09SGreg Clayton else 13827fdf9ef1SGreg Clayton { 13835160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1384c9858e4dSGreg Clayton if (log) 1385324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", 1386324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 13877fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 13887fdf9ef1SGreg Clayton } 13897fdf9ef1SGreg Clayton } 13907fdf9ef1SGreg Clayton else 13918f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 13928f343b09SGreg Clayton return sb_error; 13938f343b09SGreg Clayton } 13948c71337aSJason Molenda 1395a332978bSJason Molenda lldb::SBError 1396a332978bSJason Molenda SBProcess::SendEventData (const char *event_data) 1397a332978bSJason Molenda { 1398a332978bSJason Molenda lldb::SBError sb_error; 1399a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1400a332978bSJason Molenda if (process_sp) 1401a332978bSJason Molenda { 1402a332978bSJason Molenda Process::StopLocker stop_locker; 1403a332978bSJason Molenda if (stop_locker.TryLock(&process_sp->GetRunLock())) 1404a332978bSJason Molenda { 1405bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 1406a332978bSJason Molenda sb_error.SetError (process_sp->SendEventData (event_data)); 1407a332978bSJason Molenda } 1408a332978bSJason Molenda else 1409a332978bSJason Molenda { 1410a332978bSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1411a332978bSJason Molenda if (log) 1412324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::SendEventData() => error: process is running", 1413324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 1414a332978bSJason Molenda sb_error.SetErrorString("process is running"); 1415a332978bSJason Molenda } 1416a332978bSJason Molenda } 1417a332978bSJason Molenda else 1418a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1419a332978bSJason Molenda return sb_error; 1420a332978bSJason Molenda } 1421a332978bSJason Molenda 14228c71337aSJason Molenda uint32_t 142395d005c7SJason Molenda SBProcess::GetNumExtendedBacktraceTypes () 14248c71337aSJason Molenda { 14258c71337aSJason Molenda ProcessSP process_sp(GetSP()); 14268c71337aSJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 14278c71337aSJason Molenda { 14288c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 142995d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 14308c71337aSJason Molenda } 14318c71337aSJason Molenda return 0; 14328c71337aSJason Molenda } 14338c71337aSJason Molenda 14348c71337aSJason Molenda const char * 143595d005c7SJason Molenda SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx) 14368c71337aSJason Molenda { 14378c71337aSJason Molenda ProcessSP process_sp(GetSP()); 14388c71337aSJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 14398c71337aSJason Molenda { 14408c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1441008c45f1SJason Molenda const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes(); 14428c71337aSJason Molenda if (idx < names.size()) 14438c71337aSJason Molenda { 14448c71337aSJason Molenda return names[idx].AsCString(); 14458c71337aSJason Molenda } 14468c71337aSJason Molenda else 14478c71337aSJason Molenda { 14488c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14498c71337aSJason Molenda if (log) 1450324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds", 1451324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 14528c71337aSJason Molenda } 14538c71337aSJason Molenda } 14548c71337aSJason Molenda return NULL; 14558c71337aSJason Molenda } 1456a51ea382SKuba Brecka 1457a51ea382SKuba Brecka SBThreadCollection 1458a51ea382SKuba Brecka SBProcess::GetHistoryThreads (addr_t addr) 1459a51ea382SKuba Brecka { 1460a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1461a51ea382SKuba Brecka SBThreadCollection threads; 1462a51ea382SKuba Brecka if (process_sp) 1463a51ea382SKuba Brecka { 1464a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1465a51ea382SKuba Brecka } 1466a51ea382SKuba Brecka return threads; 1467a51ea382SKuba Brecka } 146863927548SKuba Brecka 146963927548SKuba Brecka bool 147063927548SKuba Brecka SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type) 147163927548SKuba Brecka { 147263927548SKuba Brecka ProcessSP process_sp(GetSP()); 147363927548SKuba Brecka if (! process_sp) 147463927548SKuba Brecka return false; 147563927548SKuba Brecka 147663927548SKuba Brecka InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type); 147763927548SKuba Brecka 147863927548SKuba Brecka if (! runtime_sp.get()) 147963927548SKuba Brecka return false; 148063927548SKuba Brecka 148163927548SKuba Brecka return runtime_sp->IsActive(); 148263927548SKuba Brecka } 1483f7d1893fSAdrian McCarthy 1484f7d1893fSAdrian McCarthy lldb::SBError 1485f7d1893fSAdrian McCarthy SBProcess::SaveCore(const char *file_name) 1486f7d1893fSAdrian McCarthy { 1487f7d1893fSAdrian McCarthy lldb::SBError error; 1488f7d1893fSAdrian McCarthy ProcessSP process_sp(GetSP()); 1489f7d1893fSAdrian McCarthy if (!process_sp) 1490f7d1893fSAdrian McCarthy { 1491f7d1893fSAdrian McCarthy error.SetErrorString("SBProcess is invalid"); 1492f7d1893fSAdrian McCarthy return error; 1493f7d1893fSAdrian McCarthy } 1494f7d1893fSAdrian McCarthy 1495bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 1496f7d1893fSAdrian McCarthy 1497f7d1893fSAdrian McCarthy if (process_sp->GetState() != eStateStopped) 1498f7d1893fSAdrian McCarthy { 1499f7d1893fSAdrian McCarthy error.SetErrorString("the process is not stopped"); 1500f7d1893fSAdrian McCarthy return error; 1501f7d1893fSAdrian McCarthy } 1502f7d1893fSAdrian McCarthy 1503f7d1893fSAdrian McCarthy FileSpec core_file(file_name, false); 1504f7d1893fSAdrian McCarthy error.ref() = PluginManager::SaveCore(process_sp, core_file); 1505f7d1893fSAdrian McCarthy return error; 1506f7d1893fSAdrian McCarthy } 150726036843SHoward Hellyer 150826036843SHoward Hellyer lldb::SBError 150926036843SHoward Hellyer SBProcess::GetMemoryRegionInfo (lldb::addr_t load_addr, SBMemoryRegionInfo &sb_region_info) 151026036843SHoward Hellyer { 151126036843SHoward Hellyer lldb::SBError sb_error; 151226036843SHoward Hellyer ProcessSP process_sp(GetSP()); 151326036843SHoward Hellyer MemoryRegionInfoSP region_info_sp = std::make_shared<lldb_private::MemoryRegionInfo>(); 151426036843SHoward Hellyer if (process_sp) 151526036843SHoward Hellyer { 151626036843SHoward Hellyer Process::StopLocker stop_locker; 151726036843SHoward Hellyer if (stop_locker.TryLock(&process_sp->GetRunLock())) 151826036843SHoward Hellyer { 151926036843SHoward Hellyer std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 152026036843SHoward Hellyer sb_error.ref() = process_sp->GetMemoryRegionInfo(load_addr, *region_info_sp); 152126036843SHoward Hellyer if( sb_error.Success() ) { 152226036843SHoward Hellyer sb_region_info.ref() = *region_info_sp; 152326036843SHoward Hellyer } 152426036843SHoward Hellyer } 152526036843SHoward Hellyer else 152626036843SHoward Hellyer { 152726036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 152826036843SHoward Hellyer if (log) 152926036843SHoward Hellyer log->Printf ("SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 153026036843SHoward Hellyer static_cast<void*>(process_sp.get())); 153126036843SHoward Hellyer sb_error.SetErrorString("process is running"); 153226036843SHoward Hellyer } 153326036843SHoward Hellyer } 153426036843SHoward Hellyer else 153526036843SHoward Hellyer { 153626036843SHoward Hellyer sb_error.SetErrorString ("SBProcess is invalid"); 153726036843SHoward Hellyer } 153826036843SHoward Hellyer return sb_error; 153926036843SHoward Hellyer } 154026036843SHoward Hellyer 154126036843SHoward Hellyer lldb::SBMemoryRegionInfoList 154226036843SHoward Hellyer SBProcess::GetMemoryRegions() 154326036843SHoward Hellyer { 154426036843SHoward Hellyer lldb::SBError sb_error; 154526036843SHoward Hellyer lldb::SBMemoryRegionInfoList sb_region_list; 154626036843SHoward Hellyer ProcessSP process_sp(GetSP()); 154726036843SHoward Hellyer if (process_sp) 154826036843SHoward Hellyer { 154926036843SHoward Hellyer Process::StopLocker stop_locker; 155026036843SHoward Hellyer if (stop_locker.TryLock(&process_sp->GetRunLock())) 155126036843SHoward Hellyer { 155226036843SHoward Hellyer std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 155326036843SHoward Hellyer std::vector<MemoryRegionInfoSP> region_list; 155426036843SHoward Hellyer sb_error.ref() = process_sp->GetMemoryRegions(region_list); 155526036843SHoward Hellyer if( sb_error.Success() ) { 155626036843SHoward Hellyer std::vector<MemoryRegionInfoSP>::iterator end = region_list.end(); 155726036843SHoward Hellyer for( std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin(); it != end; it++ ) { 155826036843SHoward Hellyer SBMemoryRegionInfo sb_region_info(it->get()); 155926036843SHoward Hellyer sb_region_list.Append(sb_region_info); 156026036843SHoward Hellyer } 156126036843SHoward Hellyer } 156226036843SHoward Hellyer } 156326036843SHoward Hellyer else 156426036843SHoward Hellyer { 156526036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 156626036843SHoward Hellyer if (log) 156726036843SHoward Hellyer log->Printf ("SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 156826036843SHoward Hellyer static_cast<void*>(process_sp.get())); 156926036843SHoward Hellyer sb_error.SetErrorString("process is running"); 157026036843SHoward Hellyer } 157126036843SHoward Hellyer } 157226036843SHoward Hellyer else 157326036843SHoward Hellyer { 157426036843SHoward Hellyer sb_error.SetErrorString ("SBProcess is invalid"); 157526036843SHoward Hellyer } 157626036843SHoward Hellyer return sb_region_list; 157726036843SHoward Hellyer } 1578