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" 2630fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2730fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 288c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h" 296611103cSGreg Clayton #include "lldb/Target/Target.h" 306611103cSGreg Clayton #include "lldb/Target/Thread.h" 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner // Project includes 3330fdc8d8SChris Lattner 344c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 354c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 360e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 374c5de699SEli Friedman #include "lldb/API/SBEvent.h" 380e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 394c5de699SEli Friedman #include "lldb/API/SBThread.h" 40a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h" 41dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 424c5de699SEli Friedman #include "lldb/API/SBStringList.h" 43802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h" 4430fdc8d8SChris Lattner 4530fdc8d8SChris Lattner using namespace lldb; 4630fdc8d8SChris Lattner using namespace lldb_private; 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner SBProcess::SBProcess () : 504e0fe8abSGreg Clayton m_opaque_wp() 5130fdc8d8SChris Lattner { 5230fdc8d8SChris Lattner } 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner 5530fdc8d8SChris Lattner //---------------------------------------------------------------------- 5630fdc8d8SChris Lattner // SBProcess constructor 5730fdc8d8SChris Lattner //---------------------------------------------------------------------- 5830fdc8d8SChris Lattner 5930fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 604e0fe8abSGreg Clayton m_opaque_wp (rhs.m_opaque_wp) 6130fdc8d8SChris Lattner { 6230fdc8d8SChris Lattner } 6330fdc8d8SChris Lattner 6430fdc8d8SChris Lattner 6530fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 664e0fe8abSGreg Clayton m_opaque_wp (process_sp) 6730fdc8d8SChris Lattner { 6830fdc8d8SChris Lattner } 6930fdc8d8SChris Lattner 70efabb123SGreg Clayton const SBProcess& 71efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 72efabb123SGreg Clayton { 73efabb123SGreg Clayton if (this != &rhs) 744e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 75efabb123SGreg Clayton return *this; 76efabb123SGreg Clayton } 77efabb123SGreg Clayton 7830fdc8d8SChris Lattner //---------------------------------------------------------------------- 7930fdc8d8SChris Lattner // Destructor 8030fdc8d8SChris Lattner //---------------------------------------------------------------------- 8130fdc8d8SChris Lattner SBProcess::~SBProcess() 8230fdc8d8SChris Lattner { 8330fdc8d8SChris Lattner } 8430fdc8d8SChris Lattner 854bddaeb5SJim Ingham const char * 864bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName () 874bddaeb5SJim Ingham { 884bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 894bddaeb5SJim Ingham } 904bddaeb5SJim Ingham 91d7b30ef9SJim Ingham const char * 92d7b30ef9SJim Ingham SBProcess::GetPluginName () 93d7b30ef9SJim Ingham { 94d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 95d7b30ef9SJim Ingham if (process_sp) 96d7b30ef9SJim Ingham { 9757abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 98d7b30ef9SJim Ingham } 99d7b30ef9SJim Ingham return "<Unknown>"; 100d7b30ef9SJim Ingham } 101d7b30ef9SJim Ingham 102d7b30ef9SJim Ingham const char * 103d7b30ef9SJim Ingham SBProcess::GetShortPluginName () 104d7b30ef9SJim Ingham { 105d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 106d7b30ef9SJim Ingham if (process_sp) 107d7b30ef9SJim Ingham { 10857abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 109d7b30ef9SJim Ingham } 110d7b30ef9SJim Ingham return "<Unknown>"; 111d7b30ef9SJim Ingham } 112d7b30ef9SJim Ingham 113d7b30ef9SJim Ingham 114b9556accSGreg Clayton lldb::ProcessSP 115b9556accSGreg Clayton SBProcess::GetSP() const 116b9556accSGreg Clayton { 1174e0fe8abSGreg Clayton return m_opaque_wp.lock(); 118b9556accSGreg Clayton } 119b9556accSGreg Clayton 12030fdc8d8SChris Lattner void 121b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 12230fdc8d8SChris Lattner { 1234e0fe8abSGreg Clayton m_opaque_wp = process_sp; 12430fdc8d8SChris Lattner } 12530fdc8d8SChris Lattner 12630fdc8d8SChris Lattner void 12730fdc8d8SChris Lattner SBProcess::Clear () 12830fdc8d8SChris Lattner { 1294e0fe8abSGreg Clayton m_opaque_wp.reset(); 13030fdc8d8SChris Lattner } 13130fdc8d8SChris Lattner 13230fdc8d8SChris Lattner 13330fdc8d8SChris Lattner bool 13430fdc8d8SChris Lattner SBProcess::IsValid() const 13530fdc8d8SChris Lattner { 1364fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1374fc6cb9cSJim Ingham return ((bool) process_sp && process_sp->IsValid()); 13830fdc8d8SChris Lattner } 13930fdc8d8SChris Lattner 1409631aae2SJames McIlree bool 1419631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1429631aae2SJames McIlree char const **envp, 1439631aae2SJames McIlree const char *stdin_path, 1449631aae2SJames McIlree const char *stdout_path, 1459631aae2SJames McIlree const char *stderr_path, 1469631aae2SJames McIlree const char *working_directory, 1479631aae2SJames McIlree uint32_t launch_flags, 1489631aae2SJames McIlree bool stop_at_entry, 1499631aae2SJames McIlree lldb::SBError& error) 1509631aae2SJames McIlree { 1515160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 152324a1036SSaleem Abdulrasool if (log) 1539631aae2SJames 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))...", 154324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_wp.lock().get()), 155324a1036SSaleem Abdulrasool static_cast<void*>(argv), static_cast<void*>(envp), 1569631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1579631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1589631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1599631aae2SJames McIlree working_directory ? working_directory : "NULL", 160324a1036SSaleem Abdulrasool launch_flags, stop_at_entry, 161324a1036SSaleem Abdulrasool static_cast<void*>(error.get())); 1629631aae2SJames McIlree 163acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 164acdbe816SGreg Clayton if (process_sp) 1659631aae2SJames McIlree { 166bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 167acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1689631aae2SJames McIlree { 169982c9762SGreg Clayton if (stop_at_entry) 170982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 171d3173f34SChaoren Lin ProcessLaunchInfo launch_info(FileSpec{stdin_path, false}, 172d3173f34SChaoren Lin FileSpec{stdout_path, false}, 173d3173f34SChaoren Lin FileSpec{stderr_path, false}, 174d3173f34SChaoren Lin FileSpec{working_directory, false}, 175982c9762SGreg Clayton launch_flags); 176acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 177982c9762SGreg Clayton if (exe_module) 17814715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 179982c9762SGreg Clayton if (argv) 180982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 181982c9762SGreg Clayton if (envp) 182982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 183acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1849631aae2SJames McIlree } 1859631aae2SJames McIlree else 1869631aae2SJames McIlree { 1879631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1889631aae2SJames McIlree } 1899631aae2SJames McIlree } 1909631aae2SJames McIlree else 1919631aae2SJames McIlree { 1929631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1939631aae2SJames McIlree } 1949631aae2SJames McIlree 1959631aae2SJames McIlree if (log) { 1969631aae2SJames McIlree SBStream sstr; 1979631aae2SJames McIlree error.GetDescription (sstr); 198324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", 199324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 200324a1036SSaleem Abdulrasool static_cast<void*>(error.get()), sstr.GetData()); 2019631aae2SJames McIlree } 2029631aae2SJames McIlree 2039631aae2SJames McIlree return error.Success(); 2049631aae2SJames McIlree } 2059631aae2SJames McIlree 2069631aae2SJames McIlree bool 2079631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 2089631aae2SJames McIlree { 209acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 210acdbe816SGreg Clayton if (process_sp) 2119631aae2SJames McIlree { 212bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 213acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 2149631aae2SJames McIlree { 215144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 216144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 217acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 2189631aae2SJames McIlree } 2199631aae2SJames McIlree else 2209631aae2SJames McIlree { 2219631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 2229631aae2SJames McIlree } 2239631aae2SJames McIlree } 2249631aae2SJames McIlree else 2259631aae2SJames McIlree { 2269631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 2279631aae2SJames McIlree } 2289631aae2SJames McIlree 2295160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2309631aae2SJames McIlree if (log) { 2319631aae2SJames McIlree SBStream sstr; 2329631aae2SJames McIlree error.GetDescription (sstr); 233324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", 234324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), pid, 235324a1036SSaleem Abdulrasool static_cast<void*>(error.get()), sstr.GetData()); 2369631aae2SJames McIlree } 2379631aae2SJames McIlree 2389631aae2SJames McIlree return error.Success(); 2399631aae2SJames McIlree } 2409631aae2SJames McIlree 24130fdc8d8SChris Lattner 24230fdc8d8SChris Lattner uint32_t 24330fdc8d8SChris Lattner SBProcess::GetNumThreads () 24430fdc8d8SChris Lattner { 2455160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 246ceb6b139SCaroline Tice 247ceb6b139SCaroline Tice uint32_t num_threads = 0; 248acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 249acdbe816SGreg Clayton if (process_sp) 25030fdc8d8SChris Lattner { 2517fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2527fdf9ef1SGreg Clayton 2537fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 254bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 255acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 25630fdc8d8SChris Lattner } 257ceb6b139SCaroline Tice 258ceb6b139SCaroline Tice if (log) 259324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetNumThreads () => %d", 260324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num_threads); 261ceb6b139SCaroline Tice 262ceb6b139SCaroline Tice return num_threads; 26330fdc8d8SChris Lattner } 26430fdc8d8SChris Lattner 26530fdc8d8SChris Lattner SBThread 2662976d00aSJim Ingham SBProcess::GetSelectedThread () const 26730fdc8d8SChris Lattner { 2685160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 269ceb6b139SCaroline Tice 27030fdc8d8SChris Lattner SBThread sb_thread; 27117a6ad05SGreg Clayton ThreadSP thread_sp; 272acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 273acdbe816SGreg Clayton if (process_sp) 274af67cecdSGreg Clayton { 275bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 276acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 27717a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 278af67cecdSGreg Clayton } 279ceb6b139SCaroline Tice 280ceb6b139SCaroline Tice if (log) 281324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", 282324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 283324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 284ceb6b139SCaroline Tice 28530fdc8d8SChris Lattner return sb_thread; 28630fdc8d8SChris Lattner } 28730fdc8d8SChris Lattner 288a4d8747dSGreg Clayton SBThread 289a4d8747dSGreg Clayton SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) 290a4d8747dSGreg Clayton { 2915160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 292a4d8747dSGreg Clayton 293a4d8747dSGreg Clayton SBThread sb_thread; 294a4d8747dSGreg Clayton ThreadSP thread_sp; 295a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 296a4d8747dSGreg Clayton if (process_sp) 297a4d8747dSGreg Clayton { 298bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 299a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 300a4d8747dSGreg Clayton sb_thread.SetThread (thread_sp); 301a4d8747dSGreg Clayton } 302a4d8747dSGreg Clayton 303a4d8747dSGreg Clayton if (log) 304324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", 305324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, context, 306324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 307a4d8747dSGreg Clayton 308a4d8747dSGreg Clayton return sb_thread; 309a4d8747dSGreg Clayton } 310a4d8747dSGreg Clayton 31130fdc8d8SChris Lattner SBTarget 31230fdc8d8SChris Lattner SBProcess::GetTarget() const 31330fdc8d8SChris Lattner { 3145160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 315ceb6b139SCaroline Tice 31630fdc8d8SChris Lattner SBTarget sb_target; 317b9556accSGreg Clayton TargetSP target_sp; 318acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 319acdbe816SGreg Clayton if (process_sp) 320b9556accSGreg Clayton { 321acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 322b9556accSGreg Clayton sb_target.SetSP (target_sp); 323b9556accSGreg Clayton } 324ceb6b139SCaroline Tice 325ceb6b139SCaroline Tice if (log) 326324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", 327324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 328324a1036SSaleem Abdulrasool static_cast<void*>(target_sp.get())); 329ceb6b139SCaroline Tice 33030fdc8d8SChris Lattner return sb_target; 33130fdc8d8SChris Lattner } 33230fdc8d8SChris Lattner 33330fdc8d8SChris Lattner 33430fdc8d8SChris Lattner size_t 33530fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 33630fdc8d8SChris Lattner { 3375160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 338ceb6b139SCaroline Tice 339ceb6b139SCaroline Tice size_t ret_val = 0; 340acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 341acdbe816SGreg Clayton if (process_sp) 34230fdc8d8SChris Lattner { 34330fdc8d8SChris Lattner Error error; 344acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 34530fdc8d8SChris Lattner } 346ceb6b139SCaroline Tice 347ceb6b139SCaroline Tice if (log) 3486fea17e8SGreg Clayton log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 ") => %" PRIu64, 349324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), src, 350324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 351324a1036SSaleem Abdulrasool static_cast<uint64_t>(ret_val)); 352ceb6b139SCaroline Tice 353ceb6b139SCaroline Tice return ret_val; 35430fdc8d8SChris Lattner } 35530fdc8d8SChris Lattner 35630fdc8d8SChris Lattner size_t 35730fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 35830fdc8d8SChris Lattner { 359cfd1acedSGreg Clayton size_t bytes_read = 0; 360acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 361acdbe816SGreg Clayton if (process_sp) 36230fdc8d8SChris Lattner { 36330fdc8d8SChris Lattner Error error; 364acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 36530fdc8d8SChris Lattner } 366ceb6b139SCaroline Tice 3675160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 368ceb6b139SCaroline Tice if (log) 369d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 370324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 371324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 372324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 373324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 374ceb6b139SCaroline Tice 375cfd1acedSGreg Clayton return bytes_read; 37630fdc8d8SChris Lattner } 37730fdc8d8SChris Lattner 37830fdc8d8SChris Lattner size_t 37930fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 38030fdc8d8SChris Lattner { 381cfd1acedSGreg Clayton size_t bytes_read = 0; 382acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 383acdbe816SGreg Clayton if (process_sp) 38430fdc8d8SChris Lattner { 38530fdc8d8SChris Lattner Error error; 386acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 38730fdc8d8SChris Lattner } 388ceb6b139SCaroline Tice 3895160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 390ceb6b139SCaroline Tice if (log) 391d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 392324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 393324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 394324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 395324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 396ceb6b139SCaroline Tice 397cfd1acedSGreg Clayton return bytes_read; 39830fdc8d8SChris Lattner } 39930fdc8d8SChris Lattner 400ab3b8b22SHan Ming Ong size_t 401ab3b8b22SHan Ming Ong SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const 402ab3b8b22SHan Ming Ong { 403ab3b8b22SHan Ming Ong size_t bytes_read = 0; 404ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 405ab3b8b22SHan Ming Ong if (process_sp) 406ab3b8b22SHan Ming Ong { 407ab3b8b22SHan Ming Ong Error error; 408ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error); 409ab3b8b22SHan Ming Ong } 410ab3b8b22SHan Ming Ong 4115160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 412ab3b8b22SHan Ming Ong if (log) 413adb99821SBruce Mitchener log->Printf ("SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 414324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 415324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 416324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 417324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 418ab3b8b22SHan Ming Ong 419ab3b8b22SHan Ming Ong return bytes_read; 420ab3b8b22SHan Ming Ong } 421ab3b8b22SHan Ming Ong 42230fdc8d8SChris Lattner void 4232976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 42430fdc8d8SChris Lattner { 42530fdc8d8SChris Lattner if (out == NULL) 42630fdc8d8SChris Lattner return; 42730fdc8d8SChris Lattner 428acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 429acdbe816SGreg Clayton if (process_sp) 43030fdc8d8SChris Lattner { 43130fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 43230fdc8d8SChris Lattner char message[1024]; 43330fdc8d8SChris Lattner int message_len = ::snprintf (message, 43430fdc8d8SChris Lattner sizeof (message), 435d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 436acdbe816SGreg Clayton process_sp->GetID(), 43730fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 43830fdc8d8SChris Lattner 43930fdc8d8SChris Lattner if (message_len > 0) 44030fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 44130fdc8d8SChris Lattner } 44230fdc8d8SChris Lattner } 44330fdc8d8SChris Lattner 44430fdc8d8SChris Lattner void 4452976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 44630fdc8d8SChris Lattner { 447acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 448acdbe816SGreg Clayton if (process_sp) 44930fdc8d8SChris Lattner { 45030fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 45130fdc8d8SChris Lattner char message[1024]; 45230fdc8d8SChris Lattner ::snprintf (message, 45330fdc8d8SChris Lattner sizeof (message), 454d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 455acdbe816SGreg Clayton process_sp->GetID(), 45630fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 45730fdc8d8SChris Lattner 45830fdc8d8SChris Lattner result.AppendMessage (message); 45930fdc8d8SChris Lattner } 46030fdc8d8SChris Lattner } 46130fdc8d8SChris Lattner 46230fdc8d8SChris Lattner bool 4632976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 46430fdc8d8SChris Lattner { 465acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 466acdbe816SGreg Clayton if (process_sp) 467af67cecdSGreg Clayton { 468bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 469acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 470af67cecdSGreg Clayton } 47130fdc8d8SChris Lattner return false; 47230fdc8d8SChris Lattner } 47330fdc8d8SChris Lattner 47430fdc8d8SChris Lattner bool 475ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid) 476ea561dcfSGreg Clayton { 4775160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 478ceb6b139SCaroline Tice 479ceb6b139SCaroline Tice bool ret_val = false; 480acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 481acdbe816SGreg Clayton if (process_sp) 482af67cecdSGreg Clayton { 483bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 484acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 485af67cecdSGreg Clayton } 486ceb6b139SCaroline Tice 487ceb6b139SCaroline Tice if (log) 488d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s", 489324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, 490324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 491ceb6b139SCaroline Tice 492ceb6b139SCaroline Tice return ret_val; 49330fdc8d8SChris Lattner } 49430fdc8d8SChris Lattner 49518b46896SJim Ingham bool 49618b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 49718b46896SJim Ingham { 4985160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 49918b46896SJim Ingham 50018b46896SJim Ingham bool ret_val = false; 50118b46896SJim Ingham ProcessSP process_sp(GetSP()); 50218b46896SJim Ingham if (process_sp) 50318b46896SJim Ingham { 504bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 50518b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 50618b46896SJim Ingham } 50718b46896SJim Ingham 50818b46896SJim Ingham if (log) 50918b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 510324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), index_id, 511324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 51218b46896SJim Ingham 51318b46896SJim Ingham return ret_val; 51418b46896SJim Ingham } 51518b46896SJim Ingham 51630fdc8d8SChris Lattner SBThread 51730fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 51830fdc8d8SChris Lattner { 5195160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 520ceb6b139SCaroline Tice 52117a6ad05SGreg Clayton SBThread sb_thread; 52217a6ad05SGreg Clayton ThreadSP thread_sp; 523acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 524acdbe816SGreg Clayton if (process_sp) 525af67cecdSGreg Clayton { 5267fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5277fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 528bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 5297fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 53017a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 531af67cecdSGreg Clayton } 532ceb6b139SCaroline Tice 533ceb6b139SCaroline Tice if (log) 53493aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 535324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 536324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 537324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 538ceb6b139SCaroline Tice 53917a6ad05SGreg Clayton return sb_thread; 54030fdc8d8SChris Lattner } 54130fdc8d8SChris Lattner 542bf2956a2SJim Ingham uint32_t 5435e8dce4dSJason Molenda SBProcess::GetNumQueues () 5445e8dce4dSJason Molenda { 5455e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5465e8dce4dSJason Molenda 5475e8dce4dSJason Molenda uint32_t num_queues = 0; 5485e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 5495e8dce4dSJason Molenda if (process_sp) 5505e8dce4dSJason Molenda { 5515e8dce4dSJason Molenda Process::StopLocker stop_locker; 552*a61d0a5bSGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 553*a61d0a5bSGreg Clayton { 554bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 5555e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 5565e8dce4dSJason Molenda } 557*a61d0a5bSGreg Clayton } 5585e8dce4dSJason Molenda 5595e8dce4dSJason Molenda if (log) 560324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetNumQueues () => %d", 561324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num_queues); 5625e8dce4dSJason Molenda 5635e8dce4dSJason Molenda return num_queues; 5645e8dce4dSJason Molenda } 5655e8dce4dSJason Molenda 5665e8dce4dSJason Molenda SBQueue 5675e8dce4dSJason Molenda SBProcess::GetQueueAtIndex (size_t index) 5685e8dce4dSJason Molenda { 5695e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5705e8dce4dSJason Molenda 5715e8dce4dSJason Molenda SBQueue sb_queue; 5725e8dce4dSJason Molenda QueueSP queue_sp; 5735e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 5745e8dce4dSJason Molenda if (process_sp) 5755e8dce4dSJason Molenda { 5765e8dce4dSJason Molenda Process::StopLocker stop_locker; 577*a61d0a5bSGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 578*a61d0a5bSGreg Clayton { 579bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 5805e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 5815e8dce4dSJason Molenda sb_queue.SetQueue (queue_sp); 5825e8dce4dSJason Molenda } 583*a61d0a5bSGreg Clayton } 5845e8dce4dSJason Molenda 5855e8dce4dSJason Molenda if (log) 5865e8dce4dSJason Molenda log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", 587324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 588324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 589324a1036SSaleem Abdulrasool static_cast<void*>(queue_sp.get())); 5905e8dce4dSJason Molenda 5915e8dce4dSJason Molenda return sb_queue; 5925e8dce4dSJason Molenda } 5935e8dce4dSJason Molenda 5945e8dce4dSJason Molenda 5955e8dce4dSJason Molenda uint32_t 596bf2956a2SJim Ingham SBProcess::GetStopID(bool include_expression_stops) 597bf2956a2SJim Ingham { 598bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 599bf2956a2SJim Ingham if (process_sp) 600bf2956a2SJim Ingham { 601bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 602bf2956a2SJim Ingham if (include_expression_stops) 603bf2956a2SJim Ingham return process_sp->GetStopID(); 604bf2956a2SJim Ingham else 605bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 606bf2956a2SJim Ingham } 607bf2956a2SJim Ingham return 0; 608bf2956a2SJim Ingham } 609bf2956a2SJim Ingham 61038810f43SIlia K SBEvent 61138810f43SIlia K SBProcess::GetStopEventForStopID(uint32_t stop_id) 61238810f43SIlia K { 61338810f43SIlia K Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 61438810f43SIlia K 61538810f43SIlia K SBEvent sb_event; 61638810f43SIlia K EventSP event_sp; 61738810f43SIlia K ProcessSP process_sp(GetSP()); 61838810f43SIlia K if (process_sp) 61938810f43SIlia K { 620bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 62138810f43SIlia K event_sp = process_sp->GetStopEventForStopID(stop_id); 62238810f43SIlia K sb_event.reset(event_sp); 62338810f43SIlia K } 62438810f43SIlia K 62538810f43SIlia K if (log) 62638810f43SIlia K log->Printf ("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 ") => SBEvent(%p)", 62738810f43SIlia K static_cast<void*>(process_sp.get()), 62838810f43SIlia K stop_id, 62938810f43SIlia K static_cast<void*>(event_sp.get())); 63038810f43SIlia K 63138810f43SIlia K return sb_event; 63238810f43SIlia K } 63338810f43SIlia K 63430fdc8d8SChris Lattner StateType 63530fdc8d8SChris Lattner SBProcess::GetState () 63630fdc8d8SChris Lattner { 637ceb6b139SCaroline Tice 638ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 639acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 640acdbe816SGreg Clayton if (process_sp) 641af67cecdSGreg Clayton { 642bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 643acdbe816SGreg Clayton ret_val = process_sp->GetState(); 644af67cecdSGreg Clayton } 645ceb6b139SCaroline Tice 6465160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 647ceb6b139SCaroline Tice if (log) 648cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 649324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 650750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 651ceb6b139SCaroline Tice 652ceb6b139SCaroline Tice return ret_val; 65330fdc8d8SChris Lattner } 65430fdc8d8SChris Lattner 65530fdc8d8SChris Lattner 65630fdc8d8SChris Lattner int 65730fdc8d8SChris Lattner SBProcess::GetExitStatus () 65830fdc8d8SChris Lattner { 6594838131bSGreg Clayton int exit_status = 0; 660acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 661acdbe816SGreg Clayton if (process_sp) 662af67cecdSGreg Clayton { 663bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 664acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 665af67cecdSGreg Clayton } 6665160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6674838131bSGreg Clayton if (log) 6684838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 669324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), exit_status, 670324a1036SSaleem Abdulrasool exit_status); 6714838131bSGreg Clayton 6724838131bSGreg Clayton return exit_status; 67330fdc8d8SChris Lattner } 67430fdc8d8SChris Lattner 67530fdc8d8SChris Lattner const char * 67630fdc8d8SChris Lattner SBProcess::GetExitDescription () 67730fdc8d8SChris Lattner { 6784838131bSGreg Clayton const char *exit_desc = NULL; 679acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 680acdbe816SGreg Clayton if (process_sp) 681af67cecdSGreg Clayton { 682bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 683acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 684af67cecdSGreg Clayton } 6855160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6864838131bSGreg Clayton if (log) 6874838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 688324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), exit_desc); 6894838131bSGreg Clayton return exit_desc; 69030fdc8d8SChris Lattner } 69130fdc8d8SChris Lattner 69230fdc8d8SChris Lattner lldb::pid_t 69330fdc8d8SChris Lattner SBProcess::GetProcessID () 69430fdc8d8SChris Lattner { 695ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 696acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 697acdbe816SGreg Clayton if (process_sp) 698acdbe816SGreg Clayton ret_val = process_sp->GetID(); 699ceb6b139SCaroline Tice 7005160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 701ceb6b139SCaroline Tice if (log) 702324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, 703324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), ret_val); 704ceb6b139SCaroline Tice 705ceb6b139SCaroline Tice return ret_val; 70630fdc8d8SChris Lattner } 70730fdc8d8SChris Lattner 708949e8221SGreg Clayton uint32_t 709949e8221SGreg Clayton SBProcess::GetUniqueID() 710949e8221SGreg Clayton { 711949e8221SGreg Clayton uint32_t ret_val = 0; 712949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 713949e8221SGreg Clayton if (process_sp) 714949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 7155160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 716949e8221SGreg Clayton if (log) 717324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, 718324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), ret_val); 719949e8221SGreg Clayton return ret_val; 720949e8221SGreg Clayton } 721949e8221SGreg Clayton 722cf386e24SJohnny Chen ByteOrder 723cf386e24SJohnny Chen SBProcess::GetByteOrder () const 724cf386e24SJohnny Chen { 725cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 726acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 727acdbe816SGreg Clayton if (process_sp) 728acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 729cf386e24SJohnny Chen 7305160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 731cf386e24SJohnny Chen if (log) 732324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetByteOrder () => %d", 733324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), byteOrder); 734cf386e24SJohnny Chen 735cf386e24SJohnny Chen return byteOrder; 736cf386e24SJohnny Chen } 737cf386e24SJohnny Chen 73830fdc8d8SChris Lattner uint32_t 73930fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 74030fdc8d8SChris Lattner { 741ceb6b139SCaroline Tice uint32_t size = 0; 742acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 743acdbe816SGreg Clayton if (process_sp) 744acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 745ceb6b139SCaroline Tice 7465160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 747ceb6b139SCaroline Tice if (log) 748324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", 749324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), size); 750ceb6b139SCaroline Tice 751ceb6b139SCaroline Tice return size; 75230fdc8d8SChris Lattner } 75330fdc8d8SChris Lattner 75430fdc8d8SChris Lattner SBError 75530fdc8d8SChris Lattner SBProcess::Continue () 75630fdc8d8SChris Lattner { 7575160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 758ceb6b139SCaroline Tice 75930fdc8d8SChris Lattner SBError sb_error; 760acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 7610c74e78dSGreg Clayton 762acdbe816SGreg Clayton if (log) 763324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::Continue ()...", 764324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 765acdbe816SGreg Clayton 766acdbe816SGreg Clayton if (process_sp) 767acdbe816SGreg Clayton { 768bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 769acdbe816SGreg Clayton 770dc6224e0SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution ()) 771dc6224e0SGreg Clayton sb_error.ref() = process_sp->Resume (); 772dc6224e0SGreg Clayton else 773dc6224e0SGreg Clayton sb_error.ref() = process_sp->ResumeSynchronous (NULL); 7745d5028b5SGreg Clayton } 77530fdc8d8SChris Lattner else 77630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 77730fdc8d8SChris Lattner 778ceb6b139SCaroline Tice if (log) 779ceb6b139SCaroline Tice { 780ceb6b139SCaroline Tice SBStream sstr; 781ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 782324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", 783324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 784324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 785ceb6b139SCaroline Tice } 786ceb6b139SCaroline Tice 78730fdc8d8SChris Lattner return sb_error; 78830fdc8d8SChris Lattner } 78930fdc8d8SChris Lattner 79030fdc8d8SChris Lattner 79130fdc8d8SChris Lattner SBError 79230fdc8d8SChris Lattner SBProcess::Destroy () 79330fdc8d8SChris Lattner { 79430fdc8d8SChris Lattner SBError sb_error; 795acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 796acdbe816SGreg Clayton if (process_sp) 7976779606aSGreg Clayton { 798bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 799ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 8006779606aSGreg Clayton } 80130fdc8d8SChris Lattner else 80230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 80330fdc8d8SChris Lattner 8045160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8054838131bSGreg Clayton if (log) 8064838131bSGreg Clayton { 8074838131bSGreg Clayton SBStream sstr; 8084838131bSGreg Clayton sb_error.GetDescription (sstr); 8096779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 810324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 811324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 8124838131bSGreg Clayton } 8134838131bSGreg Clayton 81430fdc8d8SChris Lattner return sb_error; 81530fdc8d8SChris Lattner } 81630fdc8d8SChris Lattner 81730fdc8d8SChris Lattner 81830fdc8d8SChris Lattner SBError 81930fdc8d8SChris Lattner SBProcess::Stop () 82030fdc8d8SChris Lattner { 82130fdc8d8SChris Lattner SBError sb_error; 822acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 823acdbe816SGreg Clayton if (process_sp) 824af67cecdSGreg Clayton { 825bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 826acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 827af67cecdSGreg Clayton } 82830fdc8d8SChris Lattner else 82930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 830ceb6b139SCaroline Tice 8315160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 832ceb6b139SCaroline Tice if (log) 833ceb6b139SCaroline Tice { 834ceb6b139SCaroline Tice SBStream sstr; 835ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 83693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 837324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 838324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 839ceb6b139SCaroline Tice } 840ceb6b139SCaroline Tice 84130fdc8d8SChris Lattner return sb_error; 84230fdc8d8SChris Lattner } 84330fdc8d8SChris Lattner 84430fdc8d8SChris Lattner SBError 84530fdc8d8SChris Lattner SBProcess::Kill () 84630fdc8d8SChris Lattner { 84730fdc8d8SChris Lattner SBError sb_error; 848acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 849acdbe816SGreg Clayton if (process_sp) 850af67cecdSGreg Clayton { 851bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 852ede3193bSJason Molenda sb_error.SetError (process_sp->Destroy(true)); 853af67cecdSGreg Clayton } 85430fdc8d8SChris Lattner else 85530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 856ceb6b139SCaroline Tice 8575160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 858ceb6b139SCaroline Tice if (log) 859ceb6b139SCaroline Tice { 860ceb6b139SCaroline Tice SBStream sstr; 861ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 86293aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 863324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 864324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 865ceb6b139SCaroline Tice } 866ceb6b139SCaroline Tice 86730fdc8d8SChris Lattner return sb_error; 86830fdc8d8SChris Lattner } 86930fdc8d8SChris Lattner 87030fdc8d8SChris Lattner SBError 87130fdc8d8SChris Lattner SBProcess::Detach () 87230fdc8d8SChris Lattner { 873acff8950SJim Ingham // FIXME: This should come from a process default. 874acff8950SJim Ingham bool keep_stopped = false; 875acff8950SJim Ingham return Detach (keep_stopped); 876acff8950SJim Ingham } 877acff8950SJim Ingham 878acff8950SJim Ingham SBError 879acff8950SJim Ingham SBProcess::Detach (bool keep_stopped) 880acff8950SJim Ingham { 88130fdc8d8SChris Lattner SBError sb_error; 882acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 883acdbe816SGreg Clayton if (process_sp) 884af67cecdSGreg Clayton { 885bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 886acff8950SJim Ingham sb_error.SetError (process_sp->Detach(keep_stopped)); 887af67cecdSGreg Clayton } 88830fdc8d8SChris Lattner else 88930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 89030fdc8d8SChris Lattner 89130fdc8d8SChris Lattner return sb_error; 89230fdc8d8SChris Lattner } 89330fdc8d8SChris Lattner 89430fdc8d8SChris Lattner SBError 8954838131bSGreg Clayton SBProcess::Signal (int signo) 89630fdc8d8SChris Lattner { 89730fdc8d8SChris Lattner SBError sb_error; 898acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 899acdbe816SGreg Clayton if (process_sp) 900af67cecdSGreg Clayton { 901bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 902acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 903af67cecdSGreg Clayton } 90430fdc8d8SChris Lattner else 90530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 9065160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9074838131bSGreg Clayton if (log) 9084838131bSGreg Clayton { 9094838131bSGreg Clayton SBStream sstr; 9104838131bSGreg Clayton sb_error.GetDescription (sstr); 9114838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 912324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), signo, 913324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 9144838131bSGreg Clayton } 91530fdc8d8SChris Lattner return sb_error; 91630fdc8d8SChris Lattner } 91730fdc8d8SChris Lattner 918802dc402STodd Fiala SBUnixSignals 919802dc402STodd Fiala SBProcess::GetUnixSignals() 920802dc402STodd Fiala { 92198d0a4b3SChaoren Lin if (auto process_sp = GetSP()) 92298d0a4b3SChaoren Lin return SBUnixSignals{process_sp}; 923802dc402STodd Fiala 92498d0a4b3SChaoren Lin return {}; 925802dc402STodd Fiala } 926802dc402STodd Fiala 927cfc0935eSJim Ingham void 928cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 929cfc0935eSJim Ingham { 930cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 931cfc0935eSJim Ingham if (process_sp) 932cfc0935eSJim Ingham { 933cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 934cfc0935eSJim Ingham } 935cfc0935eSJim Ingham } 936cfc0935eSJim Ingham 93730fdc8d8SChris Lattner SBThread 9384838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 93930fdc8d8SChris Lattner { 9404838131bSGreg Clayton SBThread sb_thread; 94117a6ad05SGreg Clayton ThreadSP thread_sp; 942acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 943acdbe816SGreg Clayton if (process_sp) 944af67cecdSGreg Clayton { 9457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9467fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 947bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 9487fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 94917a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 950af67cecdSGreg Clayton } 9514838131bSGreg Clayton 9525160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9534838131bSGreg Clayton if (log) 954d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)", 955324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, 956324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 9574838131bSGreg Clayton 9584838131bSGreg Clayton return sb_thread; 95930fdc8d8SChris Lattner } 96030fdc8d8SChris Lattner 96118b46896SJim Ingham SBThread 96218b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 96318b46896SJim Ingham { 96418b46896SJim Ingham SBThread sb_thread; 96518b46896SJim Ingham ThreadSP thread_sp; 96618b46896SJim Ingham ProcessSP process_sp(GetSP()); 96718b46896SJim Ingham if (process_sp) 96818b46896SJim Ingham { 96918b46896SJim Ingham Process::StopLocker stop_locker; 97018b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 971bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 97218b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 97318b46896SJim Ingham sb_thread.SetThread (thread_sp); 97418b46896SJim Ingham } 97518b46896SJim Ingham 9765160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 97718b46896SJim Ingham if (log) 97818b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 979324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), index_id, 980324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 98118b46896SJim Ingham 98218b46896SJim Ingham return sb_thread; 98318b46896SJim Ingham } 98418b46896SJim Ingham 98530fdc8d8SChris Lattner StateType 98630fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 98730fdc8d8SChris Lattner { 9885160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 989ceb6b139SCaroline Tice 990ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 991ceb6b139SCaroline Tice 992ceb6b139SCaroline Tice if (log) 993324a1036SSaleem Abdulrasool log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", 994324a1036SSaleem Abdulrasool static_cast<void*>(event.get()), 995750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 996ceb6b139SCaroline Tice 997ceb6b139SCaroline Tice return ret_val; 99830fdc8d8SChris Lattner } 99930fdc8d8SChris Lattner 100030fdc8d8SChris Lattner bool 100130fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 100230fdc8d8SChris Lattner { 1003ea2cc5e0SPavel Labath Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1004ea2cc5e0SPavel Labath 1005ea2cc5e0SPavel Labath bool ret_val = Process::ProcessEventData::GetRestartedFromEvent (event.get()); 1006ea2cc5e0SPavel Labath 1007ea2cc5e0SPavel Labath if (log) 1008400e1809SHans Wennborg log->Printf ("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__, 1009400e1809SHans Wennborg static_cast<void*>(event.get()), ret_val); 1010ea2cc5e0SPavel Labath 1011ea2cc5e0SPavel Labath return ret_val; 101230fdc8d8SChris Lattner } 101330fdc8d8SChris Lattner 10140161b49cSJim Ingham size_t 10150161b49cSJim Ingham SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event) 10160161b49cSJim Ingham { 10170161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 10180161b49cSJim Ingham } 10190161b49cSJim Ingham 10200161b49cSJim Ingham const char * 10210161b49cSJim Ingham SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx) 10220161b49cSJim Ingham { 10230161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 10240161b49cSJim Ingham } 10250161b49cSJim Ingham 102630fdc8d8SChris Lattner SBProcess 102730fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 102830fdc8d8SChris Lattner { 10296611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 103030fdc8d8SChris Lattner return process; 103130fdc8d8SChris Lattner } 103230fdc8d8SChris Lattner 1033e6bc6cb9SJim Ingham bool 103406d2855fSIlia K SBProcess::GetInterruptedFromEvent (const SBEvent &event) 103506d2855fSIlia K { 103606d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 103706d2855fSIlia K } 103806d2855fSIlia K 103906d2855fSIlia K bool 1040e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 1041e6bc6cb9SJim Ingham { 1042f9e5dc16SIlia K return event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass(); 1043e6bc6cb9SJim Ingham } 104430fdc8d8SChris Lattner 104530fdc8d8SChris Lattner SBBroadcaster 104630fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 104730fdc8d8SChris Lattner { 10485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1049ceb6b139SCaroline Tice 1050acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1051acdbe816SGreg Clayton 1052acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 1053ceb6b139SCaroline Tice 1054ceb6b139SCaroline Tice if (log) 1055324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", 1056324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 1057324a1036SSaleem Abdulrasool static_cast<void*>(broadcaster.get())); 1058ceb6b139SCaroline Tice 105930fdc8d8SChris Lattner return broadcaster; 106030fdc8d8SChris Lattner } 106130fdc8d8SChris Lattner 10624bddaeb5SJim Ingham const char * 10634bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 10644bddaeb5SJim Ingham { 10654bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 10664bddaeb5SJim Ingham } 10674bddaeb5SJim Ingham 106830fdc8d8SChris Lattner size_t 106930fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 107030fdc8d8SChris Lattner { 10715160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1072ceb6b139SCaroline Tice 107330fdc8d8SChris Lattner size_t bytes_read = 0; 107430fdc8d8SChris Lattner 1075acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1076acdbe816SGreg Clayton 10774838131bSGreg Clayton if (log) 1078d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 1079324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1080324a1036SSaleem Abdulrasool static_cast<void*>(dst), static_cast<uint64_t>(dst_len), 1081324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get())); 10824838131bSGreg Clayton 1083acdbe816SGreg Clayton if (process_sp) 108430fdc8d8SChris Lattner { 10857fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10867fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10877fdf9ef1SGreg Clayton { 1088bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 10897fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 10907fdf9ef1SGreg Clayton } 10917fdf9ef1SGreg Clayton else 10927fdf9ef1SGreg Clayton { 1093c9858e4dSGreg Clayton if (log) 1094324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", 1095324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 10967fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10977fdf9ef1SGreg Clayton } 109830fdc8d8SChris Lattner } 109930fdc8d8SChris Lattner else 110030fdc8d8SChris Lattner { 110130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 110230fdc8d8SChris Lattner } 110330fdc8d8SChris Lattner 1104ceb6b139SCaroline Tice if (log) 110593aa84e8SGreg Clayton { 110693aa84e8SGreg Clayton SBStream sstr; 110793aa84e8SGreg Clayton sb_error.GetDescription (sstr); 1108d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1109324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1110324a1036SSaleem Abdulrasool static_cast<void*>(dst), static_cast<uint64_t>(dst_len), 1111324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData(), 1112324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 111393aa84e8SGreg Clayton } 1114ceb6b139SCaroline Tice 111530fdc8d8SChris Lattner return bytes_read; 111630fdc8d8SChris Lattner } 111730fdc8d8SChris Lattner 111830fdc8d8SChris Lattner size_t 1119e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 1120e91b7957SGreg Clayton { 1121e91b7957SGreg Clayton size_t bytes_read = 0; 1122acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1123acdbe816SGreg Clayton if (process_sp) 1124e91b7957SGreg Clayton { 11257fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11267fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11277fdf9ef1SGreg Clayton { 1128bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 11297fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 11307fdf9ef1SGreg Clayton } 11317fdf9ef1SGreg Clayton else 11327fdf9ef1SGreg Clayton { 11335160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1134c9858e4dSGreg Clayton if (log) 1135324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", 1136324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11377fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11387fdf9ef1SGreg Clayton } 1139e91b7957SGreg Clayton } 1140e91b7957SGreg Clayton else 1141e91b7957SGreg Clayton { 1142e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1143e91b7957SGreg Clayton } 1144e91b7957SGreg Clayton return bytes_read; 1145e91b7957SGreg Clayton } 1146e91b7957SGreg Clayton 1147e91b7957SGreg Clayton uint64_t 1148e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 1149e91b7957SGreg Clayton { 11507fdf9ef1SGreg Clayton uint64_t value = 0; 1151acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1152acdbe816SGreg Clayton if (process_sp) 1153e91b7957SGreg Clayton { 11547fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11557fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11567fdf9ef1SGreg Clayton { 1157bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 11587fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 11597fdf9ef1SGreg Clayton } 11607fdf9ef1SGreg Clayton else 11617fdf9ef1SGreg Clayton { 11625160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1163c9858e4dSGreg Clayton if (log) 1164324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", 1165324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11667fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11677fdf9ef1SGreg Clayton } 1168e91b7957SGreg Clayton } 1169e91b7957SGreg Clayton else 1170e91b7957SGreg Clayton { 1171e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1172e91b7957SGreg Clayton } 11737fdf9ef1SGreg Clayton return value; 1174e91b7957SGreg Clayton } 1175e91b7957SGreg Clayton 1176e91b7957SGreg Clayton lldb::addr_t 1177e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 1178e91b7957SGreg Clayton { 1179e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1180acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1181acdbe816SGreg Clayton if (process_sp) 1182e91b7957SGreg Clayton { 11837fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11847fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11857fdf9ef1SGreg Clayton { 1186bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 11877fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 11887fdf9ef1SGreg Clayton } 11897fdf9ef1SGreg Clayton else 11907fdf9ef1SGreg Clayton { 11915160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1192c9858e4dSGreg Clayton if (log) 1193324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", 1194324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11957fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11967fdf9ef1SGreg Clayton } 1197e91b7957SGreg Clayton } 1198e91b7957SGreg Clayton else 1199e91b7957SGreg Clayton { 1200e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1201e91b7957SGreg Clayton } 1202e91b7957SGreg Clayton return ptr; 1203e91b7957SGreg Clayton } 1204e91b7957SGreg Clayton 1205e91b7957SGreg Clayton size_t 120630fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 120730fdc8d8SChris Lattner { 120830fdc8d8SChris Lattner size_t bytes_written = 0; 120930fdc8d8SChris Lattner 12105160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1211acdbe816SGreg Clayton 1212acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1213acdbe816SGreg Clayton 12144838131bSGreg Clayton if (log) 1215d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1216324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1217324a1036SSaleem Abdulrasool static_cast<const void*>(src), 1218324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 1219324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get())); 12204838131bSGreg Clayton 1221acdbe816SGreg Clayton if (process_sp) 122230fdc8d8SChris Lattner { 12237fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12247fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12257fdf9ef1SGreg Clayton { 1226bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 12277fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 12287fdf9ef1SGreg Clayton } 12297fdf9ef1SGreg Clayton else 12307fdf9ef1SGreg Clayton { 1231c9858e4dSGreg Clayton if (log) 1232324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", 1233324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 12347fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12357fdf9ef1SGreg Clayton } 123630fdc8d8SChris Lattner } 123730fdc8d8SChris Lattner 12384838131bSGreg Clayton if (log) 12394838131bSGreg Clayton { 12404838131bSGreg Clayton SBStream sstr; 12414838131bSGreg Clayton sb_error.GetDescription (sstr); 1242d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1243324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1244324a1036SSaleem Abdulrasool static_cast<const void*>(src), 1245324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 1246324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData(), 1247324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_written)); 12484838131bSGreg Clayton } 12494838131bSGreg Clayton 125030fdc8d8SChris Lattner return bytes_written; 125130fdc8d8SChris Lattner } 125230fdc8d8SChris Lattner 1253dde9cff3SCaroline Tice bool 1254dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1255dde9cff3SCaroline Tice { 1256da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1257da7bc7d0SGreg Clayton 1258acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1259acdbe816SGreg Clayton if (process_sp) 1260dde9cff3SCaroline Tice { 1261dde9cff3SCaroline Tice char path[PATH_MAX]; 1262dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1263acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 12641d273166SGreg Clayton const char *exe_name = NULL; 12651d273166SGreg Clayton if (exe_module) 12661d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 12671d273166SGreg Clayton 1268d01b2953SDaniel Malea strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1269acdbe816SGreg Clayton process_sp->GetID(), 1270ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 12711d273166SGreg Clayton GetNumThreads(), 127205faeb71SGreg Clayton exe_name ? ", executable = " : "", 12731d273166SGreg Clayton exe_name ? exe_name : ""); 1274dde9cff3SCaroline Tice } 1275dde9cff3SCaroline Tice else 1276da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1277dde9cff3SCaroline Tice 1278dde9cff3SCaroline Tice return true; 1279dde9cff3SCaroline Tice } 12808f343b09SGreg Clayton 12818f343b09SGreg Clayton uint32_t 1282f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1283f9ef60d2SJohnny Chen { 12845160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1285f9ef60d2SJohnny Chen 1286f9ef60d2SJohnny Chen uint32_t num = 0; 1287f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1288f9ef60d2SJohnny Chen if (process_sp) 1289f9ef60d2SJohnny Chen { 1290bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 1291f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1292f9ef60d2SJohnny Chen if (log) 1293f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1294324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num); 1295f9ef60d2SJohnny Chen } 1296f9ef60d2SJohnny Chen else 1297f9ef60d2SJohnny Chen { 1298f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1299f9ef60d2SJohnny Chen } 1300f9ef60d2SJohnny Chen return num; 1301f9ef60d2SJohnny Chen } 1302f9ef60d2SJohnny Chen 1303f9ef60d2SJohnny Chen uint32_t 13044fbd67acSTamas Berghammer SBProcess::LoadImage (lldb::SBFileSpec &sb_remote_image_spec, lldb::SBError &sb_error) 13054fbd67acSTamas Berghammer { 13064fbd67acSTamas Berghammer return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error); 13074fbd67acSTamas Berghammer } 13084fbd67acSTamas Berghammer 13094fbd67acSTamas Berghammer uint32_t 13104fbd67acSTamas Berghammer SBProcess::LoadImage (const lldb::SBFileSpec &sb_local_image_spec, 13114fbd67acSTamas Berghammer const lldb::SBFileSpec &sb_remote_image_spec, 13124fbd67acSTamas Berghammer lldb::SBError &sb_error) 13138f343b09SGreg Clayton { 1314acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1315acdbe816SGreg Clayton if (process_sp) 1316af67cecdSGreg Clayton { 13177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13187fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 13197fdf9ef1SGreg Clayton { 1320bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 13213cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 13224fbd67acSTamas Berghammer return platform_sp->LoadImage (process_sp.get(), 13234fbd67acSTamas Berghammer *sb_local_image_spec, 13244fbd67acSTamas Berghammer *sb_remote_image_spec, 13254fbd67acSTamas Berghammer sb_error.ref()); 1326af67cecdSGreg Clayton } 13277fdf9ef1SGreg Clayton else 13287fdf9ef1SGreg Clayton { 13295160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1330c9858e4dSGreg Clayton if (log) 1331324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", 1332324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 13337fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 13347fdf9ef1SGreg Clayton } 13357fdf9ef1SGreg Clayton } 13368f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 13378f343b09SGreg Clayton } 13388f343b09SGreg Clayton 13398f343b09SGreg Clayton lldb::SBError 13408f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 13418f343b09SGreg Clayton { 13428f343b09SGreg Clayton lldb::SBError sb_error; 1343acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1344acdbe816SGreg Clayton if (process_sp) 1345af67cecdSGreg Clayton { 13467fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13477fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 13487fdf9ef1SGreg Clayton { 1349bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 13503cb132a0STamas Berghammer PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); 13513cb132a0STamas Berghammer sb_error.SetError (platform_sp->UnloadImage (process_sp.get(), image_token)); 1352af67cecdSGreg Clayton } 13538f343b09SGreg Clayton else 13547fdf9ef1SGreg Clayton { 13555160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1356c9858e4dSGreg Clayton if (log) 1357324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", 1358324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 13597fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 13607fdf9ef1SGreg Clayton } 13617fdf9ef1SGreg Clayton } 13627fdf9ef1SGreg Clayton else 13638f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 13648f343b09SGreg Clayton return sb_error; 13658f343b09SGreg Clayton } 13668c71337aSJason Molenda 1367a332978bSJason Molenda lldb::SBError 1368a332978bSJason Molenda SBProcess::SendEventData (const char *event_data) 1369a332978bSJason Molenda { 1370a332978bSJason Molenda lldb::SBError sb_error; 1371a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1372a332978bSJason Molenda if (process_sp) 1373a332978bSJason Molenda { 1374a332978bSJason Molenda Process::StopLocker stop_locker; 1375a332978bSJason Molenda if (stop_locker.TryLock(&process_sp->GetRunLock())) 1376a332978bSJason Molenda { 1377bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 1378a332978bSJason Molenda sb_error.SetError (process_sp->SendEventData (event_data)); 1379a332978bSJason Molenda } 1380a332978bSJason Molenda else 1381a332978bSJason Molenda { 1382a332978bSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1383a332978bSJason Molenda if (log) 1384324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::SendEventData() => error: process is running", 1385324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 1386a332978bSJason Molenda sb_error.SetErrorString("process is running"); 1387a332978bSJason Molenda } 1388a332978bSJason Molenda } 1389a332978bSJason Molenda else 1390a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1391a332978bSJason Molenda return sb_error; 1392a332978bSJason Molenda } 1393a332978bSJason Molenda 13948c71337aSJason Molenda uint32_t 139595d005c7SJason Molenda SBProcess::GetNumExtendedBacktraceTypes () 13968c71337aSJason Molenda { 13978c71337aSJason Molenda ProcessSP process_sp(GetSP()); 13988c71337aSJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 13998c71337aSJason Molenda { 14008c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 140195d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 14028c71337aSJason Molenda } 14038c71337aSJason Molenda return 0; 14048c71337aSJason Molenda } 14058c71337aSJason Molenda 14068c71337aSJason Molenda const char * 140795d005c7SJason Molenda SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx) 14088c71337aSJason Molenda { 14098c71337aSJason Molenda ProcessSP process_sp(GetSP()); 14108c71337aSJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 14118c71337aSJason Molenda { 14128c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1413008c45f1SJason Molenda const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes(); 14148c71337aSJason Molenda if (idx < names.size()) 14158c71337aSJason Molenda { 14168c71337aSJason Molenda return names[idx].AsCString(); 14178c71337aSJason Molenda } 14188c71337aSJason Molenda else 14198c71337aSJason Molenda { 14208c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14218c71337aSJason Molenda if (log) 1422324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds", 1423324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 14248c71337aSJason Molenda } 14258c71337aSJason Molenda } 14268c71337aSJason Molenda return NULL; 14278c71337aSJason Molenda } 1428a51ea382SKuba Brecka 1429a51ea382SKuba Brecka SBThreadCollection 1430a51ea382SKuba Brecka SBProcess::GetHistoryThreads (addr_t addr) 1431a51ea382SKuba Brecka { 1432a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1433a51ea382SKuba Brecka SBThreadCollection threads; 1434a51ea382SKuba Brecka if (process_sp) 1435a51ea382SKuba Brecka { 1436a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1437a51ea382SKuba Brecka } 1438a51ea382SKuba Brecka return threads; 1439a51ea382SKuba Brecka } 144063927548SKuba Brecka 144163927548SKuba Brecka bool 144263927548SKuba Brecka SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type) 144363927548SKuba Brecka { 144463927548SKuba Brecka ProcessSP process_sp(GetSP()); 144563927548SKuba Brecka if (! process_sp) 144663927548SKuba Brecka return false; 144763927548SKuba Brecka 144863927548SKuba Brecka InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type); 144963927548SKuba Brecka 145063927548SKuba Brecka if (! runtime_sp.get()) 145163927548SKuba Brecka return false; 145263927548SKuba Brecka 145363927548SKuba Brecka return runtime_sp->IsActive(); 145463927548SKuba Brecka } 1455f7d1893fSAdrian McCarthy 1456f7d1893fSAdrian McCarthy lldb::SBError 1457f7d1893fSAdrian McCarthy SBProcess::SaveCore(const char *file_name) 1458f7d1893fSAdrian McCarthy { 1459f7d1893fSAdrian McCarthy lldb::SBError error; 1460f7d1893fSAdrian McCarthy ProcessSP process_sp(GetSP()); 1461f7d1893fSAdrian McCarthy if (!process_sp) 1462f7d1893fSAdrian McCarthy { 1463f7d1893fSAdrian McCarthy error.SetErrorString("SBProcess is invalid"); 1464f7d1893fSAdrian McCarthy return error; 1465f7d1893fSAdrian McCarthy } 1466f7d1893fSAdrian McCarthy 1467bb19a13cSSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); 1468f7d1893fSAdrian McCarthy 1469f7d1893fSAdrian McCarthy if (process_sp->GetState() != eStateStopped) 1470f7d1893fSAdrian McCarthy { 1471f7d1893fSAdrian McCarthy error.SetErrorString("the process is not stopped"); 1472f7d1893fSAdrian McCarthy return error; 1473f7d1893fSAdrian McCarthy } 1474f7d1893fSAdrian McCarthy 1475f7d1893fSAdrian McCarthy FileSpec core_file(file_name, false); 1476f7d1893fSAdrian McCarthy error.ref() = PluginManager::SaveCore(process_sp, core_file); 1477f7d1893fSAdrian McCarthy return error; 1478f7d1893fSAdrian McCarthy } 1479