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" 26*26036843SHoward 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" 40*26036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfo.h" 41*26036843SHoward Hellyer #include "lldb/API/SBMemoryRegionInfoList.h" 424c5de699SEli Friedman #include "lldb/API/SBThread.h" 43a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h" 44dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 454c5de699SEli Friedman #include "lldb/API/SBStringList.h" 46802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h" 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner using namespace lldb; 4930fdc8d8SChris Lattner using namespace lldb_private; 5030fdc8d8SChris Lattner 5130fdc8d8SChris Lattner 5230fdc8d8SChris Lattner SBProcess::SBProcess () : 534e0fe8abSGreg Clayton m_opaque_wp() 5430fdc8d8SChris Lattner { 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner //---------------------------------------------------------------------- 5930fdc8d8SChris Lattner // SBProcess constructor 6030fdc8d8SChris Lattner //---------------------------------------------------------------------- 6130fdc8d8SChris Lattner 6230fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 634e0fe8abSGreg Clayton m_opaque_wp (rhs.m_opaque_wp) 6430fdc8d8SChris Lattner { 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner 6730fdc8d8SChris Lattner 6830fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 694e0fe8abSGreg Clayton m_opaque_wp (process_sp) 7030fdc8d8SChris Lattner { 7130fdc8d8SChris Lattner } 7230fdc8d8SChris Lattner 73efabb123SGreg Clayton const SBProcess& 74efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 75efabb123SGreg Clayton { 76efabb123SGreg Clayton if (this != &rhs) 774e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 78efabb123SGreg Clayton return *this; 79efabb123SGreg Clayton } 80efabb123SGreg Clayton 8130fdc8d8SChris Lattner //---------------------------------------------------------------------- 8230fdc8d8SChris Lattner // Destructor 8330fdc8d8SChris Lattner //---------------------------------------------------------------------- 8430fdc8d8SChris Lattner SBProcess::~SBProcess() 8530fdc8d8SChris Lattner { 8630fdc8d8SChris Lattner } 8730fdc8d8SChris Lattner 884bddaeb5SJim Ingham const char * 894bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName () 904bddaeb5SJim Ingham { 914bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 924bddaeb5SJim Ingham } 934bddaeb5SJim Ingham 94d7b30ef9SJim Ingham const char * 95d7b30ef9SJim Ingham SBProcess::GetPluginName () 96d7b30ef9SJim Ingham { 97d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 98d7b30ef9SJim Ingham if (process_sp) 99d7b30ef9SJim Ingham { 10057abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 101d7b30ef9SJim Ingham } 102d7b30ef9SJim Ingham return "<Unknown>"; 103d7b30ef9SJim Ingham } 104d7b30ef9SJim Ingham 105d7b30ef9SJim Ingham const char * 106d7b30ef9SJim Ingham SBProcess::GetShortPluginName () 107d7b30ef9SJim Ingham { 108d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 109d7b30ef9SJim Ingham if (process_sp) 110d7b30ef9SJim Ingham { 11157abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 112d7b30ef9SJim Ingham } 113d7b30ef9SJim Ingham return "<Unknown>"; 114d7b30ef9SJim Ingham } 115d7b30ef9SJim Ingham 116d7b30ef9SJim Ingham 117b9556accSGreg Clayton lldb::ProcessSP 118b9556accSGreg Clayton SBProcess::GetSP() const 119b9556accSGreg Clayton { 1204e0fe8abSGreg Clayton return m_opaque_wp.lock(); 121b9556accSGreg Clayton } 122b9556accSGreg Clayton 12330fdc8d8SChris Lattner void 124b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 12530fdc8d8SChris Lattner { 1264e0fe8abSGreg Clayton m_opaque_wp = process_sp; 12730fdc8d8SChris Lattner } 12830fdc8d8SChris Lattner 12930fdc8d8SChris Lattner void 13030fdc8d8SChris Lattner SBProcess::Clear () 13130fdc8d8SChris Lattner { 1324e0fe8abSGreg Clayton m_opaque_wp.reset(); 13330fdc8d8SChris Lattner } 13430fdc8d8SChris Lattner 13530fdc8d8SChris Lattner 13630fdc8d8SChris Lattner bool 13730fdc8d8SChris Lattner SBProcess::IsValid() const 13830fdc8d8SChris Lattner { 1394fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1404fc6cb9cSJim Ingham return ((bool) process_sp && process_sp->IsValid()); 14130fdc8d8SChris Lattner } 14230fdc8d8SChris Lattner 1439631aae2SJames McIlree bool 1449631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1459631aae2SJames McIlree char const **envp, 1469631aae2SJames McIlree const char *stdin_path, 1479631aae2SJames McIlree const char *stdout_path, 1489631aae2SJames McIlree const char *stderr_path, 1499631aae2SJames McIlree const char *working_directory, 1509631aae2SJames McIlree uint32_t launch_flags, 1519631aae2SJames McIlree bool stop_at_entry, 1529631aae2SJames McIlree lldb::SBError& error) 1539631aae2SJames McIlree { 1545160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 155324a1036SSaleem Abdulrasool if (log) 1569631aae2SJames 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))...", 157324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_wp.lock().get()), 158324a1036SSaleem Abdulrasool static_cast<void*>(argv), static_cast<void*>(envp), 1599631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1609631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1619631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1629631aae2SJames McIlree working_directory ? working_directory : "NULL", 163324a1036SSaleem Abdulrasool launch_flags, stop_at_entry, 164324a1036SSaleem Abdulrasool static_cast<void*>(error.get())); 1659631aae2SJames McIlree 166acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 167acdbe816SGreg Clayton if (process_sp) 1689631aae2SJames McIlree { 169bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 170acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1719631aae2SJames McIlree { 172982c9762SGreg Clayton if (stop_at_entry) 173982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 174d3173f34SChaoren Lin ProcessLaunchInfo launch_info(FileSpec{stdin_path, false}, 175d3173f34SChaoren Lin FileSpec{stdout_path, false}, 176d3173f34SChaoren Lin FileSpec{stderr_path, false}, 177d3173f34SChaoren Lin FileSpec{working_directory, false}, 178982c9762SGreg Clayton launch_flags); 179acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 180982c9762SGreg Clayton if (exe_module) 18114715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 182982c9762SGreg Clayton if (argv) 183982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 184982c9762SGreg Clayton if (envp) 185982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 186acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1879631aae2SJames McIlree } 1889631aae2SJames McIlree else 1899631aae2SJames McIlree { 1909631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1919631aae2SJames McIlree } 1929631aae2SJames McIlree } 1939631aae2SJames McIlree else 1949631aae2SJames McIlree { 1959631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1969631aae2SJames McIlree } 1979631aae2SJames McIlree 1989631aae2SJames McIlree if (log) { 1999631aae2SJames McIlree SBStream sstr; 2009631aae2SJames McIlree error.GetDescription (sstr); 201324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", 202324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 203324a1036SSaleem Abdulrasool static_cast<void*>(error.get()), sstr.GetData()); 2049631aae2SJames McIlree } 2059631aae2SJames McIlree 2069631aae2SJames McIlree return error.Success(); 2079631aae2SJames McIlree } 2089631aae2SJames McIlree 2099631aae2SJames McIlree bool 2109631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 2119631aae2SJames McIlree { 212acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 213acdbe816SGreg Clayton if (process_sp) 2149631aae2SJames McIlree { 215bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 216acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 2179631aae2SJames McIlree { 218144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 219144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 220acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 2219631aae2SJames McIlree } 2229631aae2SJames McIlree else 2239631aae2SJames McIlree { 2249631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 2259631aae2SJames McIlree } 2269631aae2SJames McIlree } 2279631aae2SJames McIlree else 2289631aae2SJames McIlree { 2299631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 2309631aae2SJames McIlree } 2319631aae2SJames McIlree 2325160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2339631aae2SJames McIlree if (log) { 2349631aae2SJames McIlree SBStream sstr; 2359631aae2SJames McIlree error.GetDescription (sstr); 236324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", 237324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), pid, 238324a1036SSaleem Abdulrasool static_cast<void*>(error.get()), sstr.GetData()); 2399631aae2SJames McIlree } 2409631aae2SJames McIlree 2419631aae2SJames McIlree return error.Success(); 2429631aae2SJames McIlree } 2439631aae2SJames McIlree 24430fdc8d8SChris Lattner 24530fdc8d8SChris Lattner uint32_t 24630fdc8d8SChris Lattner SBProcess::GetNumThreads () 24730fdc8d8SChris Lattner { 2485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 249ceb6b139SCaroline Tice 250ceb6b139SCaroline Tice uint32_t num_threads = 0; 251acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 252acdbe816SGreg Clayton if (process_sp) 25330fdc8d8SChris Lattner { 2547fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2557fdf9ef1SGreg Clayton 2567fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 257bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 258acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 25930fdc8d8SChris Lattner } 260ceb6b139SCaroline Tice 261ceb6b139SCaroline Tice if (log) 262324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetNumThreads () => %d", 263324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num_threads); 264ceb6b139SCaroline Tice 265ceb6b139SCaroline Tice return num_threads; 26630fdc8d8SChris Lattner } 26730fdc8d8SChris Lattner 26830fdc8d8SChris Lattner SBThread 2692976d00aSJim Ingham SBProcess::GetSelectedThread () const 27030fdc8d8SChris Lattner { 2715160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 272ceb6b139SCaroline Tice 27330fdc8d8SChris Lattner SBThread sb_thread; 27417a6ad05SGreg Clayton ThreadSP thread_sp; 275acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 276acdbe816SGreg Clayton if (process_sp) 277af67cecdSGreg Clayton { 278bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 279acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 28017a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 281af67cecdSGreg Clayton } 282ceb6b139SCaroline Tice 283ceb6b139SCaroline Tice if (log) 284324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", 285324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 286324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 287ceb6b139SCaroline Tice 28830fdc8d8SChris Lattner return sb_thread; 28930fdc8d8SChris Lattner } 29030fdc8d8SChris Lattner 291a4d8747dSGreg Clayton SBThread 292a4d8747dSGreg Clayton SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) 293a4d8747dSGreg Clayton { 2945160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 295a4d8747dSGreg Clayton 296a4d8747dSGreg Clayton SBThread sb_thread; 297a4d8747dSGreg Clayton ThreadSP thread_sp; 298a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 299a4d8747dSGreg Clayton if (process_sp) 300a4d8747dSGreg Clayton { 301bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 302a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 303a4d8747dSGreg Clayton sb_thread.SetThread (thread_sp); 304a4d8747dSGreg Clayton } 305a4d8747dSGreg Clayton 306a4d8747dSGreg Clayton if (log) 307324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", 308324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, context, 309324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 310a4d8747dSGreg Clayton 311a4d8747dSGreg Clayton return sb_thread; 312a4d8747dSGreg Clayton } 313a4d8747dSGreg Clayton 31430fdc8d8SChris Lattner SBTarget 31530fdc8d8SChris Lattner SBProcess::GetTarget() const 31630fdc8d8SChris Lattner { 3175160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 318ceb6b139SCaroline Tice 31930fdc8d8SChris Lattner SBTarget sb_target; 320b9556accSGreg Clayton TargetSP target_sp; 321acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 322acdbe816SGreg Clayton if (process_sp) 323b9556accSGreg Clayton { 324acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 325b9556accSGreg Clayton sb_target.SetSP (target_sp); 326b9556accSGreg Clayton } 327ceb6b139SCaroline Tice 328ceb6b139SCaroline Tice if (log) 329324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", 330324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 331324a1036SSaleem Abdulrasool static_cast<void*>(target_sp.get())); 332ceb6b139SCaroline Tice 33330fdc8d8SChris Lattner return sb_target; 33430fdc8d8SChris Lattner } 33530fdc8d8SChris Lattner 33630fdc8d8SChris Lattner 33730fdc8d8SChris Lattner size_t 33830fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 33930fdc8d8SChris Lattner { 3405160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 341ceb6b139SCaroline Tice 342ceb6b139SCaroline Tice size_t ret_val = 0; 343acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 344acdbe816SGreg Clayton if (process_sp) 34530fdc8d8SChris Lattner { 34630fdc8d8SChris Lattner Error error; 347acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 34830fdc8d8SChris Lattner } 349ceb6b139SCaroline Tice 350ceb6b139SCaroline Tice if (log) 3516fea17e8SGreg Clayton log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 ") => %" PRIu64, 352324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), src, 353324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 354324a1036SSaleem Abdulrasool static_cast<uint64_t>(ret_val)); 355ceb6b139SCaroline Tice 356ceb6b139SCaroline Tice return ret_val; 35730fdc8d8SChris Lattner } 35830fdc8d8SChris Lattner 35930fdc8d8SChris Lattner size_t 36030fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 36130fdc8d8SChris Lattner { 362cfd1acedSGreg Clayton size_t bytes_read = 0; 363acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 364acdbe816SGreg Clayton if (process_sp) 36530fdc8d8SChris Lattner { 36630fdc8d8SChris Lattner Error error; 367acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 36830fdc8d8SChris Lattner } 369ceb6b139SCaroline Tice 3705160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 371ceb6b139SCaroline Tice if (log) 372d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 373324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 374324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 375324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 376324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 377ceb6b139SCaroline Tice 378cfd1acedSGreg Clayton return bytes_read; 37930fdc8d8SChris Lattner } 38030fdc8d8SChris Lattner 38130fdc8d8SChris Lattner size_t 38230fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 38330fdc8d8SChris Lattner { 384cfd1acedSGreg Clayton size_t bytes_read = 0; 385acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 386acdbe816SGreg Clayton if (process_sp) 38730fdc8d8SChris Lattner { 38830fdc8d8SChris Lattner Error error; 389acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 39030fdc8d8SChris Lattner } 391ceb6b139SCaroline Tice 3925160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 393ceb6b139SCaroline Tice if (log) 394d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 395324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 396324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 397324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 398324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 399ceb6b139SCaroline Tice 400cfd1acedSGreg Clayton return bytes_read; 40130fdc8d8SChris Lattner } 40230fdc8d8SChris Lattner 403ab3b8b22SHan Ming Ong size_t 404ab3b8b22SHan Ming Ong SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const 405ab3b8b22SHan Ming Ong { 406ab3b8b22SHan Ming Ong size_t bytes_read = 0; 407ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 408ab3b8b22SHan Ming Ong if (process_sp) 409ab3b8b22SHan Ming Ong { 410ab3b8b22SHan Ming Ong Error error; 411ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error); 412ab3b8b22SHan Ming Ong } 413ab3b8b22SHan Ming Ong 4145160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 415ab3b8b22SHan Ming Ong if (log) 416adb99821SBruce Mitchener log->Printf ("SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 417324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 418324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 419324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 420324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 421ab3b8b22SHan Ming Ong 422ab3b8b22SHan Ming Ong return bytes_read; 423ab3b8b22SHan Ming Ong } 424ab3b8b22SHan Ming Ong 42530fdc8d8SChris Lattner void 4262976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 42730fdc8d8SChris Lattner { 42830fdc8d8SChris Lattner if (out == NULL) 42930fdc8d8SChris Lattner return; 43030fdc8d8SChris Lattner 431acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 432acdbe816SGreg Clayton if (process_sp) 43330fdc8d8SChris Lattner { 43430fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 43530fdc8d8SChris Lattner char message[1024]; 43630fdc8d8SChris Lattner int message_len = ::snprintf (message, 43730fdc8d8SChris Lattner sizeof (message), 438d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 439acdbe816SGreg Clayton process_sp->GetID(), 44030fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 44130fdc8d8SChris Lattner 44230fdc8d8SChris Lattner if (message_len > 0) 44330fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 44430fdc8d8SChris Lattner } 44530fdc8d8SChris Lattner } 44630fdc8d8SChris Lattner 44730fdc8d8SChris Lattner void 4482976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 44930fdc8d8SChris Lattner { 450acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 451acdbe816SGreg Clayton if (process_sp) 45230fdc8d8SChris Lattner { 45330fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 45430fdc8d8SChris Lattner char message[1024]; 45530fdc8d8SChris Lattner ::snprintf (message, 45630fdc8d8SChris Lattner sizeof (message), 457d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 458acdbe816SGreg Clayton process_sp->GetID(), 45930fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 46030fdc8d8SChris Lattner 46130fdc8d8SChris Lattner result.AppendMessage (message); 46230fdc8d8SChris Lattner } 46330fdc8d8SChris Lattner } 46430fdc8d8SChris Lattner 46530fdc8d8SChris Lattner bool 4662976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 46730fdc8d8SChris Lattner { 468acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 469acdbe816SGreg Clayton if (process_sp) 470af67cecdSGreg Clayton { 471bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 472acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 473af67cecdSGreg Clayton } 47430fdc8d8SChris Lattner return false; 47530fdc8d8SChris Lattner } 47630fdc8d8SChris Lattner 47730fdc8d8SChris Lattner bool 478ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid) 479ea561dcfSGreg Clayton { 4805160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 481ceb6b139SCaroline Tice 482ceb6b139SCaroline Tice bool ret_val = false; 483acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 484acdbe816SGreg Clayton if (process_sp) 485af67cecdSGreg Clayton { 486bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 487acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 488af67cecdSGreg Clayton } 489ceb6b139SCaroline Tice 490ceb6b139SCaroline Tice if (log) 491d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s", 492324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, 493324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 494ceb6b139SCaroline Tice 495ceb6b139SCaroline Tice return ret_val; 49630fdc8d8SChris Lattner } 49730fdc8d8SChris Lattner 49818b46896SJim Ingham bool 49918b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 50018b46896SJim Ingham { 5015160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 50218b46896SJim Ingham 50318b46896SJim Ingham bool ret_val = false; 50418b46896SJim Ingham ProcessSP process_sp(GetSP()); 50518b46896SJim Ingham if (process_sp) 50618b46896SJim Ingham { 507bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 50818b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 50918b46896SJim Ingham } 51018b46896SJim Ingham 51118b46896SJim Ingham if (log) 51218b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 513324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), index_id, 514324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 51518b46896SJim Ingham 51618b46896SJim Ingham return ret_val; 51718b46896SJim Ingham } 51818b46896SJim Ingham 51930fdc8d8SChris Lattner SBThread 52030fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 52130fdc8d8SChris Lattner { 5225160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 523ceb6b139SCaroline Tice 52417a6ad05SGreg Clayton SBThread sb_thread; 52517a6ad05SGreg Clayton ThreadSP thread_sp; 526acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 527acdbe816SGreg Clayton if (process_sp) 528af67cecdSGreg Clayton { 5297fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5307fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 531bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 5327fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 53317a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 534af67cecdSGreg Clayton } 535ceb6b139SCaroline Tice 536ceb6b139SCaroline Tice if (log) 53793aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 538324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 539324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 540324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 541ceb6b139SCaroline Tice 54217a6ad05SGreg Clayton return sb_thread; 54330fdc8d8SChris Lattner } 54430fdc8d8SChris Lattner 545bf2956a2SJim Ingham uint32_t 5465e8dce4dSJason Molenda SBProcess::GetNumQueues () 5475e8dce4dSJason Molenda { 5485e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5495e8dce4dSJason Molenda 5505e8dce4dSJason Molenda uint32_t num_queues = 0; 5515e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 5525e8dce4dSJason Molenda if (process_sp) 5535e8dce4dSJason Molenda { 5545e8dce4dSJason Molenda Process::StopLocker stop_locker; 555a61d0a5bSGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 556a61d0a5bSGreg Clayton { 557bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 5585e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 5595e8dce4dSJason Molenda } 560a61d0a5bSGreg Clayton } 5615e8dce4dSJason Molenda 5625e8dce4dSJason Molenda if (log) 563324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetNumQueues () => %d", 564324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num_queues); 5655e8dce4dSJason Molenda 5665e8dce4dSJason Molenda return num_queues; 5675e8dce4dSJason Molenda } 5685e8dce4dSJason Molenda 5695e8dce4dSJason Molenda SBQueue 5705e8dce4dSJason Molenda SBProcess::GetQueueAtIndex (size_t index) 5715e8dce4dSJason Molenda { 5725e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5735e8dce4dSJason Molenda 5745e8dce4dSJason Molenda SBQueue sb_queue; 5755e8dce4dSJason Molenda QueueSP queue_sp; 5765e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 5775e8dce4dSJason Molenda if (process_sp) 5785e8dce4dSJason Molenda { 5795e8dce4dSJason Molenda Process::StopLocker stop_locker; 580a61d0a5bSGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 581a61d0a5bSGreg Clayton { 582bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 5835e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 5845e8dce4dSJason Molenda sb_queue.SetQueue (queue_sp); 5855e8dce4dSJason Molenda } 586a61d0a5bSGreg Clayton } 5875e8dce4dSJason Molenda 5885e8dce4dSJason Molenda if (log) 5895e8dce4dSJason Molenda log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", 590324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 591324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 592324a1036SSaleem Abdulrasool static_cast<void*>(queue_sp.get())); 5935e8dce4dSJason Molenda 5945e8dce4dSJason Molenda return sb_queue; 5955e8dce4dSJason Molenda } 5965e8dce4dSJason Molenda 5975e8dce4dSJason Molenda 5985e8dce4dSJason Molenda uint32_t 599bf2956a2SJim Ingham SBProcess::GetStopID(bool include_expression_stops) 600bf2956a2SJim Ingham { 601bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 602bf2956a2SJim Ingham if (process_sp) 603bf2956a2SJim Ingham { 604bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 605bf2956a2SJim Ingham if (include_expression_stops) 606bf2956a2SJim Ingham return process_sp->GetStopID(); 607bf2956a2SJim Ingham else 608bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 609bf2956a2SJim Ingham } 610bf2956a2SJim Ingham return 0; 611bf2956a2SJim Ingham } 612bf2956a2SJim Ingham 61338810f43SIlia K SBEvent 61438810f43SIlia K SBProcess::GetStopEventForStopID(uint32_t stop_id) 61538810f43SIlia K { 61638810f43SIlia K Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 61738810f43SIlia K 61838810f43SIlia K SBEvent sb_event; 61938810f43SIlia K EventSP event_sp; 62038810f43SIlia K ProcessSP process_sp(GetSP()); 62138810f43SIlia K if (process_sp) 62238810f43SIlia K { 623bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 62438810f43SIlia K event_sp = process_sp->GetStopEventForStopID(stop_id); 62538810f43SIlia K sb_event.reset(event_sp); 62638810f43SIlia K } 62738810f43SIlia K 62838810f43SIlia K if (log) 62938810f43SIlia K log->Printf ("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 ") => SBEvent(%p)", 63038810f43SIlia K static_cast<void*>(process_sp.get()), 63138810f43SIlia K stop_id, 63238810f43SIlia K static_cast<void*>(event_sp.get())); 63338810f43SIlia K 63438810f43SIlia K return sb_event; 63538810f43SIlia K } 63638810f43SIlia K 63730fdc8d8SChris Lattner StateType 63830fdc8d8SChris Lattner SBProcess::GetState () 63930fdc8d8SChris Lattner { 640ceb6b139SCaroline Tice 641ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 642acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 643acdbe816SGreg Clayton if (process_sp) 644af67cecdSGreg Clayton { 645bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 646acdbe816SGreg Clayton ret_val = process_sp->GetState(); 647af67cecdSGreg Clayton } 648ceb6b139SCaroline Tice 6495160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 650ceb6b139SCaroline Tice if (log) 651cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 652324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 653750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 654ceb6b139SCaroline Tice 655ceb6b139SCaroline Tice return ret_val; 65630fdc8d8SChris Lattner } 65730fdc8d8SChris Lattner 65830fdc8d8SChris Lattner 65930fdc8d8SChris Lattner int 66030fdc8d8SChris Lattner SBProcess::GetExitStatus () 66130fdc8d8SChris Lattner { 6624838131bSGreg Clayton int exit_status = 0; 663acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 664acdbe816SGreg Clayton if (process_sp) 665af67cecdSGreg Clayton { 666bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 667acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 668af67cecdSGreg Clayton } 6695160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6704838131bSGreg Clayton if (log) 6714838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 672324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), exit_status, 673324a1036SSaleem Abdulrasool exit_status); 6744838131bSGreg Clayton 6754838131bSGreg Clayton return exit_status; 67630fdc8d8SChris Lattner } 67730fdc8d8SChris Lattner 67830fdc8d8SChris Lattner const char * 67930fdc8d8SChris Lattner SBProcess::GetExitDescription () 68030fdc8d8SChris Lattner { 6814838131bSGreg Clayton const char *exit_desc = NULL; 682acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 683acdbe816SGreg Clayton if (process_sp) 684af67cecdSGreg Clayton { 685bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 686acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 687af67cecdSGreg Clayton } 6885160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6894838131bSGreg Clayton if (log) 6904838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 691324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), exit_desc); 6924838131bSGreg Clayton return exit_desc; 69330fdc8d8SChris Lattner } 69430fdc8d8SChris Lattner 69530fdc8d8SChris Lattner lldb::pid_t 69630fdc8d8SChris Lattner SBProcess::GetProcessID () 69730fdc8d8SChris Lattner { 698ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 699acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 700acdbe816SGreg Clayton if (process_sp) 701acdbe816SGreg Clayton ret_val = process_sp->GetID(); 702ceb6b139SCaroline Tice 7035160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 704ceb6b139SCaroline Tice if (log) 705324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, 706324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), ret_val); 707ceb6b139SCaroline Tice 708ceb6b139SCaroline Tice return ret_val; 70930fdc8d8SChris Lattner } 71030fdc8d8SChris Lattner 711949e8221SGreg Clayton uint32_t 712949e8221SGreg Clayton SBProcess::GetUniqueID() 713949e8221SGreg Clayton { 714949e8221SGreg Clayton uint32_t ret_val = 0; 715949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 716949e8221SGreg Clayton if (process_sp) 717949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 7185160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 719949e8221SGreg Clayton if (log) 720324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, 721324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), ret_val); 722949e8221SGreg Clayton return ret_val; 723949e8221SGreg Clayton } 724949e8221SGreg Clayton 725cf386e24SJohnny Chen ByteOrder 726cf386e24SJohnny Chen SBProcess::GetByteOrder () const 727cf386e24SJohnny Chen { 728cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 729acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 730acdbe816SGreg Clayton if (process_sp) 731acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 732cf386e24SJohnny Chen 7335160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 734cf386e24SJohnny Chen if (log) 735324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetByteOrder () => %d", 736324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), byteOrder); 737cf386e24SJohnny Chen 738cf386e24SJohnny Chen return byteOrder; 739cf386e24SJohnny Chen } 740cf386e24SJohnny Chen 74130fdc8d8SChris Lattner uint32_t 74230fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 74330fdc8d8SChris Lattner { 744ceb6b139SCaroline Tice uint32_t size = 0; 745acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 746acdbe816SGreg Clayton if (process_sp) 747acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 748ceb6b139SCaroline Tice 7495160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 750ceb6b139SCaroline Tice if (log) 751324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", 752324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), size); 753ceb6b139SCaroline Tice 754ceb6b139SCaroline Tice return size; 75530fdc8d8SChris Lattner } 75630fdc8d8SChris Lattner 75730fdc8d8SChris Lattner SBError 75830fdc8d8SChris Lattner SBProcess::Continue () 75930fdc8d8SChris Lattner { 7605160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 761ceb6b139SCaroline Tice 76230fdc8d8SChris Lattner SBError sb_error; 763acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 7640c74e78dSGreg Clayton 765acdbe816SGreg Clayton if (log) 766324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::Continue ()...", 767324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 768acdbe816SGreg Clayton 769acdbe816SGreg Clayton if (process_sp) 770acdbe816SGreg Clayton { 771bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 772acdbe816SGreg Clayton 773dc6224e0SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution ()) 774dc6224e0SGreg Clayton sb_error.ref() = process_sp->Resume (); 775dc6224e0SGreg Clayton else 776dc6224e0SGreg Clayton sb_error.ref() = process_sp->ResumeSynchronous (NULL); 7775d5028b5SGreg Clayton } 77830fdc8d8SChris Lattner else 77930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 78030fdc8d8SChris Lattner 781ceb6b139SCaroline Tice if (log) 782ceb6b139SCaroline Tice { 783ceb6b139SCaroline Tice SBStream sstr; 784ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 785324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", 786324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 787324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 788ceb6b139SCaroline Tice } 789ceb6b139SCaroline Tice 79030fdc8d8SChris Lattner return sb_error; 79130fdc8d8SChris Lattner } 79230fdc8d8SChris Lattner 79330fdc8d8SChris Lattner 79430fdc8d8SChris Lattner SBError 79530fdc8d8SChris Lattner SBProcess::Destroy () 79630fdc8d8SChris Lattner { 79730fdc8d8SChris Lattner SBError sb_error; 798acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 799acdbe816SGreg Clayton if (process_sp) 8006779606aSGreg Clayton { 801bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 802ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 8036779606aSGreg Clayton } 80430fdc8d8SChris Lattner else 80530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 80630fdc8d8SChris Lattner 8075160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8084838131bSGreg Clayton if (log) 8094838131bSGreg Clayton { 8104838131bSGreg Clayton SBStream sstr; 8114838131bSGreg Clayton sb_error.GetDescription (sstr); 8126779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 813324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 814324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 8154838131bSGreg Clayton } 8164838131bSGreg Clayton 81730fdc8d8SChris Lattner return sb_error; 81830fdc8d8SChris Lattner } 81930fdc8d8SChris Lattner 82030fdc8d8SChris Lattner 82130fdc8d8SChris Lattner SBError 82230fdc8d8SChris Lattner SBProcess::Stop () 82330fdc8d8SChris Lattner { 82430fdc8d8SChris Lattner SBError sb_error; 825acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 826acdbe816SGreg Clayton if (process_sp) 827af67cecdSGreg Clayton { 828bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 829acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 830af67cecdSGreg Clayton } 83130fdc8d8SChris Lattner else 83230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 833ceb6b139SCaroline Tice 8345160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 835ceb6b139SCaroline Tice if (log) 836ceb6b139SCaroline Tice { 837ceb6b139SCaroline Tice SBStream sstr; 838ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 83993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 840324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 841324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 842ceb6b139SCaroline Tice } 843ceb6b139SCaroline Tice 84430fdc8d8SChris Lattner return sb_error; 84530fdc8d8SChris Lattner } 84630fdc8d8SChris Lattner 84730fdc8d8SChris Lattner SBError 84830fdc8d8SChris Lattner SBProcess::Kill () 84930fdc8d8SChris Lattner { 85030fdc8d8SChris Lattner SBError sb_error; 851acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 852acdbe816SGreg Clayton if (process_sp) 853af67cecdSGreg Clayton { 854bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 855ede3193bSJason Molenda sb_error.SetError (process_sp->Destroy(true)); 856af67cecdSGreg Clayton } 85730fdc8d8SChris Lattner else 85830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 859ceb6b139SCaroline Tice 8605160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 861ceb6b139SCaroline Tice if (log) 862ceb6b139SCaroline Tice { 863ceb6b139SCaroline Tice SBStream sstr; 864ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 86593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 866324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 867324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 868ceb6b139SCaroline Tice } 869ceb6b139SCaroline Tice 87030fdc8d8SChris Lattner return sb_error; 87130fdc8d8SChris Lattner } 87230fdc8d8SChris Lattner 87330fdc8d8SChris Lattner SBError 87430fdc8d8SChris Lattner SBProcess::Detach () 87530fdc8d8SChris Lattner { 876acff8950SJim Ingham // FIXME: This should come from a process default. 877acff8950SJim Ingham bool keep_stopped = false; 878acff8950SJim Ingham return Detach (keep_stopped); 879acff8950SJim Ingham } 880acff8950SJim Ingham 881acff8950SJim Ingham SBError 882acff8950SJim Ingham SBProcess::Detach (bool keep_stopped) 883acff8950SJim Ingham { 88430fdc8d8SChris Lattner SBError sb_error; 885acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 886acdbe816SGreg Clayton if (process_sp) 887af67cecdSGreg Clayton { 888bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 889acff8950SJim Ingham sb_error.SetError (process_sp->Detach(keep_stopped)); 890af67cecdSGreg Clayton } 89130fdc8d8SChris Lattner else 89230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 89330fdc8d8SChris Lattner 89430fdc8d8SChris Lattner return sb_error; 89530fdc8d8SChris Lattner } 89630fdc8d8SChris Lattner 89730fdc8d8SChris Lattner SBError 8984838131bSGreg Clayton SBProcess::Signal (int signo) 89930fdc8d8SChris Lattner { 90030fdc8d8SChris Lattner SBError sb_error; 901acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 902acdbe816SGreg Clayton if (process_sp) 903af67cecdSGreg Clayton { 904bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 905acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 906af67cecdSGreg Clayton } 90730fdc8d8SChris Lattner else 90830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 9095160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9104838131bSGreg Clayton if (log) 9114838131bSGreg Clayton { 9124838131bSGreg Clayton SBStream sstr; 9134838131bSGreg Clayton sb_error.GetDescription (sstr); 9144838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 915324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), signo, 916324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 9174838131bSGreg Clayton } 91830fdc8d8SChris Lattner return sb_error; 91930fdc8d8SChris Lattner } 92030fdc8d8SChris Lattner 921802dc402STodd Fiala SBUnixSignals 922802dc402STodd Fiala SBProcess::GetUnixSignals() 923802dc402STodd Fiala { 92498d0a4b3SChaoren Lin if (auto process_sp = GetSP()) 92598d0a4b3SChaoren Lin return SBUnixSignals{process_sp}; 926802dc402STodd Fiala 92798d0a4b3SChaoren Lin return {}; 928802dc402STodd Fiala } 929802dc402STodd Fiala 930cfc0935eSJim Ingham void 931cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 932cfc0935eSJim Ingham { 933cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 934cfc0935eSJim Ingham if (process_sp) 935cfc0935eSJim Ingham { 936cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 937cfc0935eSJim Ingham } 938cfc0935eSJim Ingham } 939cfc0935eSJim Ingham 94030fdc8d8SChris Lattner SBThread 9414838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 94230fdc8d8SChris Lattner { 9434838131bSGreg Clayton SBThread sb_thread; 94417a6ad05SGreg Clayton ThreadSP thread_sp; 945acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 946acdbe816SGreg Clayton if (process_sp) 947af67cecdSGreg Clayton { 9487fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9497fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 950bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 9517fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 95217a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 953af67cecdSGreg Clayton } 9544838131bSGreg Clayton 9555160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9564838131bSGreg Clayton if (log) 957d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)", 958324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, 959324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 9604838131bSGreg Clayton 9614838131bSGreg Clayton return sb_thread; 96230fdc8d8SChris Lattner } 96330fdc8d8SChris Lattner 96418b46896SJim Ingham SBThread 96518b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 96618b46896SJim Ingham { 96718b46896SJim Ingham SBThread sb_thread; 96818b46896SJim Ingham ThreadSP thread_sp; 96918b46896SJim Ingham ProcessSP process_sp(GetSP()); 97018b46896SJim Ingham if (process_sp) 97118b46896SJim Ingham { 97218b46896SJim Ingham Process::StopLocker stop_locker; 97318b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 974bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 97518b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 97618b46896SJim Ingham sb_thread.SetThread (thread_sp); 97718b46896SJim Ingham } 97818b46896SJim Ingham 9795160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 98018b46896SJim Ingham if (log) 98118b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 982324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), index_id, 983324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 98418b46896SJim Ingham 98518b46896SJim Ingham return sb_thread; 98618b46896SJim Ingham } 98718b46896SJim Ingham 98830fdc8d8SChris Lattner StateType 98930fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 99030fdc8d8SChris Lattner { 9915160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 992ceb6b139SCaroline Tice 993ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 994ceb6b139SCaroline Tice 995ceb6b139SCaroline Tice if (log) 996324a1036SSaleem Abdulrasool log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", 997324a1036SSaleem Abdulrasool static_cast<void*>(event.get()), 998750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 999ceb6b139SCaroline Tice 1000ceb6b139SCaroline Tice return ret_val; 100130fdc8d8SChris Lattner } 100230fdc8d8SChris Lattner 100330fdc8d8SChris Lattner bool 100430fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 100530fdc8d8SChris Lattner { 1006ea2cc5e0SPavel Labath Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1007ea2cc5e0SPavel Labath 1008ea2cc5e0SPavel Labath bool ret_val = Process::ProcessEventData::GetRestartedFromEvent (event.get()); 1009ea2cc5e0SPavel Labath 1010ea2cc5e0SPavel Labath if (log) 1011400e1809SHans Wennborg log->Printf ("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__, 1012400e1809SHans Wennborg static_cast<void*>(event.get()), ret_val); 1013ea2cc5e0SPavel Labath 1014ea2cc5e0SPavel Labath return ret_val; 101530fdc8d8SChris Lattner } 101630fdc8d8SChris Lattner 10170161b49cSJim Ingham size_t 10180161b49cSJim Ingham SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event) 10190161b49cSJim Ingham { 10200161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 10210161b49cSJim Ingham } 10220161b49cSJim Ingham 10230161b49cSJim Ingham const char * 10240161b49cSJim Ingham SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx) 10250161b49cSJim Ingham { 10260161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 10270161b49cSJim Ingham } 10280161b49cSJim Ingham 102930fdc8d8SChris Lattner SBProcess 103030fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 103130fdc8d8SChris Lattner { 10326611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 103330fdc8d8SChris Lattner return process; 103430fdc8d8SChris Lattner } 103530fdc8d8SChris Lattner 1036e6bc6cb9SJim Ingham bool 103706d2855fSIlia K SBProcess::GetInterruptedFromEvent (const SBEvent &event) 103806d2855fSIlia K { 103906d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 104006d2855fSIlia K } 104106d2855fSIlia K 104206d2855fSIlia K bool 1043e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 1044e6bc6cb9SJim Ingham { 1045f9e5dc16SIlia K return event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass(); 1046e6bc6cb9SJim Ingham } 104730fdc8d8SChris Lattner 104830fdc8d8SChris Lattner SBBroadcaster 104930fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 105030fdc8d8SChris Lattner { 10515160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1052ceb6b139SCaroline Tice 1053acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1054acdbe816SGreg Clayton 1055acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 1056ceb6b139SCaroline Tice 1057ceb6b139SCaroline Tice if (log) 1058324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", 1059324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 1060324a1036SSaleem Abdulrasool static_cast<void*>(broadcaster.get())); 1061ceb6b139SCaroline Tice 106230fdc8d8SChris Lattner return broadcaster; 106330fdc8d8SChris Lattner } 106430fdc8d8SChris Lattner 10654bddaeb5SJim Ingham const char * 10664bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 10674bddaeb5SJim Ingham { 10684bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 10694bddaeb5SJim Ingham } 10704bddaeb5SJim Ingham 107130fdc8d8SChris Lattner size_t 107230fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 107330fdc8d8SChris Lattner { 10745160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1075ceb6b139SCaroline Tice 107630fdc8d8SChris Lattner size_t bytes_read = 0; 107730fdc8d8SChris Lattner 1078acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1079acdbe816SGreg Clayton 10804838131bSGreg Clayton if (log) 1081d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 1082324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1083324a1036SSaleem Abdulrasool static_cast<void*>(dst), static_cast<uint64_t>(dst_len), 1084324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get())); 10854838131bSGreg Clayton 1086acdbe816SGreg Clayton if (process_sp) 108730fdc8d8SChris Lattner { 10887fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10897fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10907fdf9ef1SGreg Clayton { 1091bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 10927fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 10937fdf9ef1SGreg Clayton } 10947fdf9ef1SGreg Clayton else 10957fdf9ef1SGreg Clayton { 1096c9858e4dSGreg Clayton if (log) 1097324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", 1098324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 10997fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11007fdf9ef1SGreg Clayton } 110130fdc8d8SChris Lattner } 110230fdc8d8SChris Lattner else 110330fdc8d8SChris Lattner { 110430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 110530fdc8d8SChris Lattner } 110630fdc8d8SChris Lattner 1107ceb6b139SCaroline Tice if (log) 110893aa84e8SGreg Clayton { 110993aa84e8SGreg Clayton SBStream sstr; 111093aa84e8SGreg Clayton sb_error.GetDescription (sstr); 1111d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1112324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1113324a1036SSaleem Abdulrasool static_cast<void*>(dst), static_cast<uint64_t>(dst_len), 1114324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData(), 1115324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 111693aa84e8SGreg Clayton } 1117ceb6b139SCaroline Tice 111830fdc8d8SChris Lattner return bytes_read; 111930fdc8d8SChris Lattner } 112030fdc8d8SChris Lattner 112130fdc8d8SChris Lattner size_t 1122e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 1123e91b7957SGreg Clayton { 1124e91b7957SGreg Clayton size_t bytes_read = 0; 1125acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1126acdbe816SGreg Clayton if (process_sp) 1127e91b7957SGreg Clayton { 11287fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11297fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11307fdf9ef1SGreg Clayton { 1131bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 11327fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 11337fdf9ef1SGreg Clayton } 11347fdf9ef1SGreg Clayton else 11357fdf9ef1SGreg Clayton { 11365160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1137c9858e4dSGreg Clayton if (log) 1138324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", 1139324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11407fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11417fdf9ef1SGreg Clayton } 1142e91b7957SGreg Clayton } 1143e91b7957SGreg Clayton else 1144e91b7957SGreg Clayton { 1145e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1146e91b7957SGreg Clayton } 1147e91b7957SGreg Clayton return bytes_read; 1148e91b7957SGreg Clayton } 1149e91b7957SGreg Clayton 1150e91b7957SGreg Clayton uint64_t 1151e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 1152e91b7957SGreg Clayton { 11537fdf9ef1SGreg Clayton uint64_t value = 0; 1154acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1155acdbe816SGreg Clayton if (process_sp) 1156e91b7957SGreg Clayton { 11577fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11587fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11597fdf9ef1SGreg Clayton { 1160bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 11617fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 11627fdf9ef1SGreg Clayton } 11637fdf9ef1SGreg Clayton else 11647fdf9ef1SGreg Clayton { 11655160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1166c9858e4dSGreg Clayton if (log) 1167324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", 1168324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11697fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11707fdf9ef1SGreg Clayton } 1171e91b7957SGreg Clayton } 1172e91b7957SGreg Clayton else 1173e91b7957SGreg Clayton { 1174e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1175e91b7957SGreg Clayton } 11767fdf9ef1SGreg Clayton return value; 1177e91b7957SGreg Clayton } 1178e91b7957SGreg Clayton 1179e91b7957SGreg Clayton lldb::addr_t 1180e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 1181e91b7957SGreg Clayton { 1182e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1183acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1184acdbe816SGreg Clayton if (process_sp) 1185e91b7957SGreg Clayton { 11867fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11877fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11887fdf9ef1SGreg Clayton { 1189bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 11907fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 11917fdf9ef1SGreg Clayton } 11927fdf9ef1SGreg Clayton else 11937fdf9ef1SGreg Clayton { 11945160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1195c9858e4dSGreg Clayton if (log) 1196324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", 1197324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11987fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11997fdf9ef1SGreg Clayton } 1200e91b7957SGreg Clayton } 1201e91b7957SGreg Clayton else 1202e91b7957SGreg Clayton { 1203e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1204e91b7957SGreg Clayton } 1205e91b7957SGreg Clayton return ptr; 1206e91b7957SGreg Clayton } 1207e91b7957SGreg Clayton 1208e91b7957SGreg Clayton size_t 120930fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 121030fdc8d8SChris Lattner { 121130fdc8d8SChris Lattner size_t bytes_written = 0; 121230fdc8d8SChris Lattner 12135160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1214acdbe816SGreg Clayton 1215acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1216acdbe816SGreg Clayton 12174838131bSGreg Clayton if (log) 1218d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1219324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1220324a1036SSaleem Abdulrasool static_cast<const void*>(src), 1221324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 1222324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get())); 12234838131bSGreg Clayton 1224acdbe816SGreg Clayton if (process_sp) 122530fdc8d8SChris Lattner { 12267fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12277fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12287fdf9ef1SGreg Clayton { 1229bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 12307fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 12317fdf9ef1SGreg Clayton } 12327fdf9ef1SGreg Clayton else 12337fdf9ef1SGreg Clayton { 1234c9858e4dSGreg Clayton if (log) 1235324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", 1236324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 12377fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12387fdf9ef1SGreg Clayton } 123930fdc8d8SChris Lattner } 124030fdc8d8SChris Lattner 12414838131bSGreg Clayton if (log) 12424838131bSGreg Clayton { 12434838131bSGreg Clayton SBStream sstr; 12444838131bSGreg Clayton sb_error.GetDescription (sstr); 1245d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1246324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1247324a1036SSaleem Abdulrasool static_cast<const void*>(src), 1248324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 1249324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData(), 1250324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_written)); 12514838131bSGreg Clayton } 12524838131bSGreg Clayton 125330fdc8d8SChris Lattner return bytes_written; 125430fdc8d8SChris Lattner } 125530fdc8d8SChris Lattner 1256dde9cff3SCaroline Tice bool 1257dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1258dde9cff3SCaroline Tice { 1259da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1260da7bc7d0SGreg Clayton 1261acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1262acdbe816SGreg Clayton if (process_sp) 1263dde9cff3SCaroline Tice { 1264dde9cff3SCaroline Tice char path[PATH_MAX]; 1265dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1266acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 12671d273166SGreg Clayton const char *exe_name = NULL; 12681d273166SGreg Clayton if (exe_module) 12691d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 12701d273166SGreg Clayton 1271d01b2953SDaniel Malea strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1272acdbe816SGreg Clayton process_sp->GetID(), 1273ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 12741d273166SGreg Clayton GetNumThreads(), 127505faeb71SGreg Clayton exe_name ? ", executable = " : "", 12761d273166SGreg Clayton exe_name ? exe_name : ""); 1277dde9cff3SCaroline Tice } 1278dde9cff3SCaroline Tice else 1279da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1280dde9cff3SCaroline Tice 1281dde9cff3SCaroline Tice return true; 1282dde9cff3SCaroline Tice } 12838f343b09SGreg Clayton 12848f343b09SGreg Clayton uint32_t 1285f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1286f9ef60d2SJohnny Chen { 12875160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1288f9ef60d2SJohnny Chen 1289f9ef60d2SJohnny Chen uint32_t num = 0; 1290f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1291f9ef60d2SJohnny Chen if (process_sp) 1292f9ef60d2SJohnny Chen { 1293bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 1294f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1295f9ef60d2SJohnny Chen if (log) 1296f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1297324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num); 1298f9ef60d2SJohnny Chen } 1299f9ef60d2SJohnny Chen else 1300f9ef60d2SJohnny Chen { 1301f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1302f9ef60d2SJohnny Chen } 1303f9ef60d2SJohnny Chen return num; 1304f9ef60d2SJohnny Chen } 1305f9ef60d2SJohnny Chen 1306f9ef60d2SJohnny Chen uint32_t 13074fbd67acSTamas Berghammer SBProcess::LoadImage (lldb::SBFileSpec &sb_remote_image_spec, lldb::SBError &sb_error) 13084fbd67acSTamas Berghammer { 13094fbd67acSTamas Berghammer return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); 13104fbd67acSTamas Berghammer } 13114fbd67acSTamas Berghammer 13124fbd67acSTamas Berghammer uint32_t 13134fbd67acSTamas Berghammer SBProcess::LoadImage (const lldb::SBFileSpec &sb_local_image_spec, 13144fbd67acSTamas Berghammer const lldb::SBFileSpec &sb_remote_image_spec, 13154fbd67acSTamas Berghammer lldb::SBError &sb_error) 13168f343b09SGreg Clayton { 1317acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1318acdbe816SGreg Clayton if (process_sp) 1319af67cecdSGreg Clayton { 13207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13217fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 13227fdf9ef1SGreg Clayton { 1323bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 13243cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 13254fbd67acSTamas Berghammer return platform_sp->LoadImage (process_sp.get(), 13264fbd67acSTamas Berghammer *sb_local_image_spec, 13274fbd67acSTamas Berghammer *sb_remote_image_spec, 13284fbd67acSTamas Berghammer sb_error.ref()); 1329af67cecdSGreg Clayton } 13307fdf9ef1SGreg Clayton else 13317fdf9ef1SGreg Clayton { 13325160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1333c9858e4dSGreg Clayton if (log) 1334324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", 1335324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 13367fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 13377fdf9ef1SGreg Clayton } 13387fdf9ef1SGreg Clayton } 13398f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 13408f343b09SGreg Clayton } 13418f343b09SGreg Clayton 13428f343b09SGreg Clayton lldb::SBError 13438f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 13448f343b09SGreg Clayton { 13458f343b09SGreg Clayton lldb::SBError sb_error; 1346acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1347acdbe816SGreg Clayton if (process_sp) 1348af67cecdSGreg Clayton { 13497fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13507fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 13517fdf9ef1SGreg Clayton { 1352bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 13533cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 13543cb132a0STamas Berghammer sb_error.SetError (platform_sp->UnloadImage (process_sp.get(), image_token)); 1355af67cecdSGreg Clayton } 13568f343b09SGreg Clayton else 13577fdf9ef1SGreg Clayton { 13585160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1359c9858e4dSGreg Clayton if (log) 1360324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", 1361324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 13627fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 13637fdf9ef1SGreg Clayton } 13647fdf9ef1SGreg Clayton } 13657fdf9ef1SGreg Clayton else 13668f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 13678f343b09SGreg Clayton return sb_error; 13688f343b09SGreg Clayton } 13698c71337aSJason Molenda 1370a332978bSJason Molenda lldb::SBError 1371a332978bSJason Molenda SBProcess::SendEventData (const char *event_data) 1372a332978bSJason Molenda { 1373a332978bSJason Molenda lldb::SBError sb_error; 1374a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1375a332978bSJason Molenda if (process_sp) 1376a332978bSJason Molenda { 1377a332978bSJason Molenda Process::StopLocker stop_locker; 1378a332978bSJason Molenda if (stop_locker.TryLock(&process_sp->GetRunLock())) 1379a332978bSJason Molenda { 1380bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 1381a332978bSJason Molenda sb_error.SetError (process_sp->SendEventData (event_data)); 1382a332978bSJason Molenda } 1383a332978bSJason Molenda else 1384a332978bSJason Molenda { 1385a332978bSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1386a332978bSJason Molenda if (log) 1387324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::SendEventData() => error: process is running", 1388324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 1389a332978bSJason Molenda sb_error.SetErrorString("process is running"); 1390a332978bSJason Molenda } 1391a332978bSJason Molenda } 1392a332978bSJason Molenda else 1393a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1394a332978bSJason Molenda return sb_error; 1395a332978bSJason Molenda } 1396a332978bSJason Molenda 13978c71337aSJason Molenda uint32_t 139895d005c7SJason Molenda SBProcess::GetNumExtendedBacktraceTypes () 13998c71337aSJason Molenda { 14008c71337aSJason Molenda ProcessSP process_sp(GetSP()); 14018c71337aSJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 14028c71337aSJason Molenda { 14038c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 140495d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 14058c71337aSJason Molenda } 14068c71337aSJason Molenda return 0; 14078c71337aSJason Molenda } 14088c71337aSJason Molenda 14098c71337aSJason Molenda const char * 141095d005c7SJason Molenda SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx) 14118c71337aSJason Molenda { 14128c71337aSJason Molenda ProcessSP process_sp(GetSP()); 14138c71337aSJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 14148c71337aSJason Molenda { 14158c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1416008c45f1SJason Molenda const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes(); 14178c71337aSJason Molenda if (idx < names.size()) 14188c71337aSJason Molenda { 14198c71337aSJason Molenda return names[idx].AsCString(); 14208c71337aSJason Molenda } 14218c71337aSJason Molenda else 14228c71337aSJason Molenda { 14238c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14248c71337aSJason Molenda if (log) 1425324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds", 1426324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 14278c71337aSJason Molenda } 14288c71337aSJason Molenda } 14298c71337aSJason Molenda return NULL; 14308c71337aSJason Molenda } 1431a51ea382SKuba Brecka 1432a51ea382SKuba Brecka SBThreadCollection 1433a51ea382SKuba Brecka SBProcess::GetHistoryThreads (addr_t addr) 1434a51ea382SKuba Brecka { 1435a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1436a51ea382SKuba Brecka SBThreadCollection threads; 1437a51ea382SKuba Brecka if (process_sp) 1438a51ea382SKuba Brecka { 1439a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1440a51ea382SKuba Brecka } 1441a51ea382SKuba Brecka return threads; 1442a51ea382SKuba Brecka } 144363927548SKuba Brecka 144463927548SKuba Brecka bool 144563927548SKuba Brecka SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type) 144663927548SKuba Brecka { 144763927548SKuba Brecka ProcessSP process_sp(GetSP()); 144863927548SKuba Brecka if (! process_sp) 144963927548SKuba Brecka return false; 145063927548SKuba Brecka 145163927548SKuba Brecka InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type); 145263927548SKuba Brecka 145363927548SKuba Brecka if (! runtime_sp.get()) 145463927548SKuba Brecka return false; 145563927548SKuba Brecka 145663927548SKuba Brecka return runtime_sp->IsActive(); 145763927548SKuba Brecka } 1458f7d1893fSAdrian McCarthy 1459f7d1893fSAdrian McCarthy lldb::SBError 1460f7d1893fSAdrian McCarthy SBProcess::SaveCore(const char *file_name) 1461f7d1893fSAdrian McCarthy { 1462f7d1893fSAdrian McCarthy lldb::SBError error; 1463f7d1893fSAdrian McCarthy ProcessSP process_sp(GetSP()); 1464f7d1893fSAdrian McCarthy if (!process_sp) 1465f7d1893fSAdrian McCarthy { 1466f7d1893fSAdrian McCarthy error.SetErrorString("SBProcess is invalid"); 1467f7d1893fSAdrian McCarthy return error; 1468f7d1893fSAdrian McCarthy } 1469f7d1893fSAdrian McCarthy 1470bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 1471f7d1893fSAdrian McCarthy 1472f7d1893fSAdrian McCarthy if (process_sp->GetState() != eStateStopped) 1473f7d1893fSAdrian McCarthy { 1474f7d1893fSAdrian McCarthy error.SetErrorString("the process is not stopped"); 1475f7d1893fSAdrian McCarthy return error; 1476f7d1893fSAdrian McCarthy } 1477f7d1893fSAdrian McCarthy 1478f7d1893fSAdrian McCarthy FileSpec core_file(file_name, false); 1479f7d1893fSAdrian McCarthy error.ref() = PluginManager::SaveCore(process_sp, core_file); 1480f7d1893fSAdrian McCarthy return error; 1481f7d1893fSAdrian McCarthy } 1482*26036843SHoward Hellyer 1483*26036843SHoward Hellyer lldb::SBError 1484*26036843SHoward Hellyer SBProcess::GetMemoryRegionInfo (lldb::addr_t load_addr, SBMemoryRegionInfo &sb_region_info) 1485*26036843SHoward Hellyer { 1486*26036843SHoward Hellyer lldb::SBError sb_error; 1487*26036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1488*26036843SHoward Hellyer MemoryRegionInfoSP region_info_sp = std::make_shared<lldb_private::MemoryRegionInfo>(); 1489*26036843SHoward Hellyer if (process_sp) 1490*26036843SHoward Hellyer { 1491*26036843SHoward Hellyer Process::StopLocker stop_locker; 1492*26036843SHoward Hellyer if (stop_locker.TryLock(&process_sp->GetRunLock())) 1493*26036843SHoward Hellyer { 1494*26036843SHoward Hellyer std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 1495*26036843SHoward Hellyer sb_error.ref() = process_sp->GetMemoryRegionInfo(load_addr, *region_info_sp); 1496*26036843SHoward Hellyer if( sb_error.Success() ) { 1497*26036843SHoward Hellyer sb_region_info.ref() = *region_info_sp; 1498*26036843SHoward Hellyer } 1499*26036843SHoward Hellyer } 1500*26036843SHoward Hellyer else 1501*26036843SHoward Hellyer { 1502*26036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1503*26036843SHoward Hellyer if (log) 1504*26036843SHoward Hellyer log->Printf ("SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 1505*26036843SHoward Hellyer static_cast<void*>(process_sp.get())); 1506*26036843SHoward Hellyer sb_error.SetErrorString("process is running"); 1507*26036843SHoward Hellyer } 1508*26036843SHoward Hellyer } 1509*26036843SHoward Hellyer else 1510*26036843SHoward Hellyer { 1511*26036843SHoward Hellyer sb_error.SetErrorString ("SBProcess is invalid"); 1512*26036843SHoward Hellyer } 1513*26036843SHoward Hellyer return sb_error; 1514*26036843SHoward Hellyer } 1515*26036843SHoward Hellyer 1516*26036843SHoward Hellyer lldb::SBMemoryRegionInfoList 1517*26036843SHoward Hellyer SBProcess::GetMemoryRegions() 1518*26036843SHoward Hellyer { 1519*26036843SHoward Hellyer lldb::SBError sb_error; 1520*26036843SHoward Hellyer lldb::SBMemoryRegionInfoList sb_region_list; 1521*26036843SHoward Hellyer ProcessSP process_sp(GetSP()); 1522*26036843SHoward Hellyer if (process_sp) 1523*26036843SHoward Hellyer { 1524*26036843SHoward Hellyer Process::StopLocker stop_locker; 1525*26036843SHoward Hellyer if (stop_locker.TryLock(&process_sp->GetRunLock())) 1526*26036843SHoward Hellyer { 1527*26036843SHoward Hellyer std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 1528*26036843SHoward Hellyer std::vector<MemoryRegionInfoSP> region_list; 1529*26036843SHoward Hellyer sb_error.ref() = process_sp->GetMemoryRegions(region_list); 1530*26036843SHoward Hellyer if( sb_error.Success() ) { 1531*26036843SHoward Hellyer std::vector<MemoryRegionInfoSP>::iterator end = region_list.end(); 1532*26036843SHoward Hellyer for( std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin(); it != end; it++ ) { 1533*26036843SHoward Hellyer SBMemoryRegionInfo sb_region_info(it->get()); 1534*26036843SHoward Hellyer sb_region_list.Append(sb_region_info); 1535*26036843SHoward Hellyer } 1536*26036843SHoward Hellyer } 1537*26036843SHoward Hellyer } 1538*26036843SHoward Hellyer else 1539*26036843SHoward Hellyer { 1540*26036843SHoward Hellyer Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1541*26036843SHoward Hellyer if (log) 1542*26036843SHoward Hellyer log->Printf ("SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", 1543*26036843SHoward Hellyer static_cast<void*>(process_sp.get())); 1544*26036843SHoward Hellyer sb_error.SetErrorString("process is running"); 1545*26036843SHoward Hellyer } 1546*26036843SHoward Hellyer } 1547*26036843SHoward Hellyer else 1548*26036843SHoward Hellyer { 1549*26036843SHoward Hellyer sb_error.SetErrorString ("SBProcess is invalid"); 1550*26036843SHoward Hellyer } 1551*26036843SHoward Hellyer return sb_region_list; 1552*26036843SHoward Hellyer } 1553