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 1093a64300SDaniel Malea #include "lldb/lldb-python.h" 1193a64300SDaniel Malea 124c5de699SEli Friedman #include "lldb/API/SBProcess.h" 1330fdc8d8SChris Lattner 14bdae3787SVirgile Bello // C Includes 15bdae3787SVirgile Bello #include <inttypes.h> 16bdae3787SVirgile Bello 1730fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1830fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1930fdc8d8SChris Lattner 2040af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 215d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 22ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 231f746071SGreg Clayton #include "lldb/Core/Module.h" 2430fdc8d8SChris Lattner #include "lldb/Core/State.h" 2530fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2630fdc8d8SChris Lattner #include "lldb/Core/StreamFile.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" 404c5de699SEli Friedman #include "lldb/API/SBThread.h" 41a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h" 42dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 434c5de699SEli Friedman #include "lldb/API/SBStringList.h" 44802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h" 4530fdc8d8SChris Lattner 4630fdc8d8SChris Lattner using namespace lldb; 4730fdc8d8SChris Lattner using namespace lldb_private; 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner 5030fdc8d8SChris Lattner SBProcess::SBProcess () : 514e0fe8abSGreg Clayton m_opaque_wp() 5230fdc8d8SChris Lattner { 5330fdc8d8SChris Lattner } 5430fdc8d8SChris Lattner 5530fdc8d8SChris Lattner 5630fdc8d8SChris Lattner //---------------------------------------------------------------------- 5730fdc8d8SChris Lattner // SBProcess constructor 5830fdc8d8SChris Lattner //---------------------------------------------------------------------- 5930fdc8d8SChris Lattner 6030fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 614e0fe8abSGreg Clayton m_opaque_wp (rhs.m_opaque_wp) 6230fdc8d8SChris Lattner { 6330fdc8d8SChris Lattner } 6430fdc8d8SChris Lattner 6530fdc8d8SChris Lattner 6630fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 674e0fe8abSGreg Clayton m_opaque_wp (process_sp) 6830fdc8d8SChris Lattner { 6930fdc8d8SChris Lattner } 7030fdc8d8SChris Lattner 71efabb123SGreg Clayton const SBProcess& 72efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 73efabb123SGreg Clayton { 74efabb123SGreg Clayton if (this != &rhs) 754e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 76efabb123SGreg Clayton return *this; 77efabb123SGreg Clayton } 78efabb123SGreg Clayton 7930fdc8d8SChris Lattner //---------------------------------------------------------------------- 8030fdc8d8SChris Lattner // Destructor 8130fdc8d8SChris Lattner //---------------------------------------------------------------------- 8230fdc8d8SChris Lattner SBProcess::~SBProcess() 8330fdc8d8SChris Lattner { 8430fdc8d8SChris Lattner } 8530fdc8d8SChris Lattner 864bddaeb5SJim Ingham const char * 874bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName () 884bddaeb5SJim Ingham { 894bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 904bddaeb5SJim Ingham } 914bddaeb5SJim Ingham 92d7b30ef9SJim Ingham const char * 93d7b30ef9SJim Ingham SBProcess::GetPluginName () 94d7b30ef9SJim Ingham { 95d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 96d7b30ef9SJim Ingham if (process_sp) 97d7b30ef9SJim Ingham { 9857abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 99d7b30ef9SJim Ingham } 100d7b30ef9SJim Ingham return "<Unknown>"; 101d7b30ef9SJim Ingham } 102d7b30ef9SJim Ingham 103d7b30ef9SJim Ingham const char * 104d7b30ef9SJim Ingham SBProcess::GetShortPluginName () 105d7b30ef9SJim Ingham { 106d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 107d7b30ef9SJim Ingham if (process_sp) 108d7b30ef9SJim Ingham { 10957abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 110d7b30ef9SJim Ingham } 111d7b30ef9SJim Ingham return "<Unknown>"; 112d7b30ef9SJim Ingham } 113d7b30ef9SJim Ingham 114d7b30ef9SJim Ingham 115b9556accSGreg Clayton lldb::ProcessSP 116b9556accSGreg Clayton SBProcess::GetSP() const 117b9556accSGreg Clayton { 1184e0fe8abSGreg Clayton return m_opaque_wp.lock(); 119b9556accSGreg Clayton } 120b9556accSGreg Clayton 12130fdc8d8SChris Lattner void 122b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 12330fdc8d8SChris Lattner { 1244e0fe8abSGreg Clayton m_opaque_wp = process_sp; 12530fdc8d8SChris Lattner } 12630fdc8d8SChris Lattner 12730fdc8d8SChris Lattner void 12830fdc8d8SChris Lattner SBProcess::Clear () 12930fdc8d8SChris Lattner { 1304e0fe8abSGreg Clayton m_opaque_wp.reset(); 13130fdc8d8SChris Lattner } 13230fdc8d8SChris Lattner 13330fdc8d8SChris Lattner 13430fdc8d8SChris Lattner bool 13530fdc8d8SChris Lattner SBProcess::IsValid() const 13630fdc8d8SChris Lattner { 1374fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1384fc6cb9cSJim Ingham return ((bool) process_sp && process_sp->IsValid()); 13930fdc8d8SChris Lattner } 14030fdc8d8SChris Lattner 1419631aae2SJames McIlree bool 1429631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1439631aae2SJames McIlree char const **envp, 1449631aae2SJames McIlree const char *stdin_path, 1459631aae2SJames McIlree const char *stdout_path, 1469631aae2SJames McIlree const char *stderr_path, 1479631aae2SJames McIlree const char *working_directory, 1489631aae2SJames McIlree uint32_t launch_flags, 1499631aae2SJames McIlree bool stop_at_entry, 1509631aae2SJames McIlree lldb::SBError& error) 1519631aae2SJames McIlree { 1525160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 153324a1036SSaleem Abdulrasool if (log) 1549631aae2SJames 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))...", 155324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_wp.lock().get()), 156324a1036SSaleem Abdulrasool static_cast<void*>(argv), static_cast<void*>(envp), 1579631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1589631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1599631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1609631aae2SJames McIlree working_directory ? working_directory : "NULL", 161324a1036SSaleem Abdulrasool launch_flags, stop_at_entry, 162324a1036SSaleem Abdulrasool static_cast<void*>(error.get())); 1639631aae2SJames McIlree 164acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 165acdbe816SGreg Clayton if (process_sp) 1669631aae2SJames McIlree { 167acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 168acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1699631aae2SJames McIlree { 170982c9762SGreg Clayton if (stop_at_entry) 171982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 172982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 173982c9762SGreg Clayton stdout_path, 174982c9762SGreg Clayton stderr_path, 175982c9762SGreg Clayton working_directory, 176982c9762SGreg Clayton launch_flags); 177acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 178982c9762SGreg Clayton if (exe_module) 17914715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 180982c9762SGreg Clayton if (argv) 181982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 182982c9762SGreg Clayton if (envp) 183982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 184acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1859631aae2SJames McIlree } 1869631aae2SJames McIlree else 1879631aae2SJames McIlree { 1889631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1899631aae2SJames McIlree } 1909631aae2SJames McIlree } 1919631aae2SJames McIlree else 1929631aae2SJames McIlree { 1939631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1949631aae2SJames McIlree } 1959631aae2SJames McIlree 1969631aae2SJames McIlree if (log) { 1979631aae2SJames McIlree SBStream sstr; 1989631aae2SJames McIlree error.GetDescription (sstr); 199324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", 200324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 201324a1036SSaleem Abdulrasool static_cast<void*>(error.get()), sstr.GetData()); 2029631aae2SJames McIlree } 2039631aae2SJames McIlree 2049631aae2SJames McIlree return error.Success(); 2059631aae2SJames McIlree } 2069631aae2SJames McIlree 2079631aae2SJames McIlree bool 2089631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 2099631aae2SJames McIlree { 210acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 211acdbe816SGreg Clayton if (process_sp) 2129631aae2SJames McIlree { 213acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 214acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 2159631aae2SJames McIlree { 216144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 217144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 218acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 2199631aae2SJames McIlree } 2209631aae2SJames McIlree else 2219631aae2SJames McIlree { 2229631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 2239631aae2SJames McIlree } 2249631aae2SJames McIlree } 2259631aae2SJames McIlree else 2269631aae2SJames McIlree { 2279631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 2289631aae2SJames McIlree } 2299631aae2SJames McIlree 2305160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2319631aae2SJames McIlree if (log) { 2329631aae2SJames McIlree SBStream sstr; 2339631aae2SJames McIlree error.GetDescription (sstr); 234324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", 235324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), pid, 236324a1036SSaleem Abdulrasool static_cast<void*>(error.get()), sstr.GetData()); 2379631aae2SJames McIlree } 2389631aae2SJames McIlree 2399631aae2SJames McIlree return error.Success(); 2409631aae2SJames McIlree } 2419631aae2SJames McIlree 24230fdc8d8SChris Lattner 24330fdc8d8SChris Lattner uint32_t 24430fdc8d8SChris Lattner SBProcess::GetNumThreads () 24530fdc8d8SChris Lattner { 2465160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 247ceb6b139SCaroline Tice 248ceb6b139SCaroline Tice uint32_t num_threads = 0; 249acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 250acdbe816SGreg Clayton if (process_sp) 25130fdc8d8SChris Lattner { 2527fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2537fdf9ef1SGreg Clayton 2547fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 255acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 256acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 25730fdc8d8SChris Lattner } 258ceb6b139SCaroline Tice 259ceb6b139SCaroline Tice if (log) 260324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetNumThreads () => %d", 261324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num_threads); 262ceb6b139SCaroline Tice 263ceb6b139SCaroline Tice return num_threads; 26430fdc8d8SChris Lattner } 26530fdc8d8SChris Lattner 26630fdc8d8SChris Lattner SBThread 2672976d00aSJim Ingham SBProcess::GetSelectedThread () const 26830fdc8d8SChris Lattner { 2695160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 270ceb6b139SCaroline Tice 27130fdc8d8SChris Lattner SBThread sb_thread; 27217a6ad05SGreg Clayton ThreadSP thread_sp; 273acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 274acdbe816SGreg Clayton if (process_sp) 275af67cecdSGreg Clayton { 276acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 277acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 27817a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 279af67cecdSGreg Clayton } 280ceb6b139SCaroline Tice 281ceb6b139SCaroline Tice if (log) 282324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", 283324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 284324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 285ceb6b139SCaroline Tice 28630fdc8d8SChris Lattner return sb_thread; 28730fdc8d8SChris Lattner } 28830fdc8d8SChris Lattner 289a4d8747dSGreg Clayton SBThread 290a4d8747dSGreg Clayton SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) 291a4d8747dSGreg Clayton { 2925160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 293a4d8747dSGreg Clayton 294a4d8747dSGreg Clayton SBThread sb_thread; 295a4d8747dSGreg Clayton ThreadSP thread_sp; 296a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 297a4d8747dSGreg Clayton if (process_sp) 298a4d8747dSGreg Clayton { 299a4d8747dSGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 300a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 301a4d8747dSGreg Clayton sb_thread.SetThread (thread_sp); 302a4d8747dSGreg Clayton } 303a4d8747dSGreg Clayton 304a4d8747dSGreg Clayton if (log) 305324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", 306324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, context, 307324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 308a4d8747dSGreg Clayton 309a4d8747dSGreg Clayton return sb_thread; 310a4d8747dSGreg Clayton } 311a4d8747dSGreg Clayton 31230fdc8d8SChris Lattner SBTarget 31330fdc8d8SChris Lattner SBProcess::GetTarget() const 31430fdc8d8SChris Lattner { 3155160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 316ceb6b139SCaroline Tice 31730fdc8d8SChris Lattner SBTarget sb_target; 318b9556accSGreg Clayton TargetSP target_sp; 319acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 320acdbe816SGreg Clayton if (process_sp) 321b9556accSGreg Clayton { 322acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 323b9556accSGreg Clayton sb_target.SetSP (target_sp); 324b9556accSGreg Clayton } 325ceb6b139SCaroline Tice 326ceb6b139SCaroline Tice if (log) 327324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", 328324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 329324a1036SSaleem Abdulrasool static_cast<void*>(target_sp.get())); 330ceb6b139SCaroline Tice 33130fdc8d8SChris Lattner return sb_target; 33230fdc8d8SChris Lattner } 33330fdc8d8SChris Lattner 33430fdc8d8SChris Lattner 33530fdc8d8SChris Lattner size_t 33630fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 33730fdc8d8SChris Lattner { 3385160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 339ceb6b139SCaroline Tice 340ceb6b139SCaroline Tice size_t ret_val = 0; 341acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 342acdbe816SGreg Clayton if (process_sp) 34330fdc8d8SChris Lattner { 34430fdc8d8SChris Lattner Error error; 345acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 34630fdc8d8SChris Lattner } 347ceb6b139SCaroline Tice 348ceb6b139SCaroline Tice if (log) 3496fea17e8SGreg Clayton log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 ") => %" PRIu64, 350324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), src, 351324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 352324a1036SSaleem Abdulrasool static_cast<uint64_t>(ret_val)); 353ceb6b139SCaroline Tice 354ceb6b139SCaroline Tice return ret_val; 35530fdc8d8SChris Lattner } 35630fdc8d8SChris Lattner 35730fdc8d8SChris Lattner size_t 35830fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 35930fdc8d8SChris Lattner { 360cfd1acedSGreg Clayton size_t bytes_read = 0; 361acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 362acdbe816SGreg Clayton if (process_sp) 36330fdc8d8SChris Lattner { 36430fdc8d8SChris Lattner Error error; 365acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 36630fdc8d8SChris Lattner } 367ceb6b139SCaroline Tice 3685160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 369ceb6b139SCaroline Tice if (log) 370d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 371324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 372324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 373324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 374324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 375ceb6b139SCaroline Tice 376cfd1acedSGreg Clayton return bytes_read; 37730fdc8d8SChris Lattner } 37830fdc8d8SChris Lattner 37930fdc8d8SChris Lattner size_t 38030fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 38130fdc8d8SChris Lattner { 382cfd1acedSGreg Clayton size_t bytes_read = 0; 383acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 384acdbe816SGreg Clayton if (process_sp) 38530fdc8d8SChris Lattner { 38630fdc8d8SChris Lattner Error error; 387acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 38830fdc8d8SChris Lattner } 389ceb6b139SCaroline Tice 3905160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 391ceb6b139SCaroline Tice if (log) 392d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 393324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 394324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 395324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 396324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 397ceb6b139SCaroline Tice 398cfd1acedSGreg Clayton return bytes_read; 39930fdc8d8SChris Lattner } 40030fdc8d8SChris Lattner 401ab3b8b22SHan Ming Ong size_t 402ab3b8b22SHan Ming Ong SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const 403ab3b8b22SHan Ming Ong { 404ab3b8b22SHan Ming Ong size_t bytes_read = 0; 405ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 406ab3b8b22SHan Ming Ong if (process_sp) 407ab3b8b22SHan Ming Ong { 408ab3b8b22SHan Ming Ong Error error; 409ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error); 410ab3b8b22SHan Ming Ong } 411ab3b8b22SHan Ming Ong 4125160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 413ab3b8b22SHan Ming Ong if (log) 414d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 415324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 416324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 417324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 418324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 419ab3b8b22SHan Ming Ong 420ab3b8b22SHan Ming Ong return bytes_read; 421ab3b8b22SHan Ming Ong } 422ab3b8b22SHan Ming Ong 42330fdc8d8SChris Lattner void 4242976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 42530fdc8d8SChris Lattner { 42630fdc8d8SChris Lattner if (out == NULL) 42730fdc8d8SChris Lattner return; 42830fdc8d8SChris Lattner 429acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 430acdbe816SGreg Clayton if (process_sp) 43130fdc8d8SChris Lattner { 43230fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 43330fdc8d8SChris Lattner char message[1024]; 43430fdc8d8SChris Lattner int message_len = ::snprintf (message, 43530fdc8d8SChris Lattner sizeof (message), 436d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 437acdbe816SGreg Clayton process_sp->GetID(), 43830fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 43930fdc8d8SChris Lattner 44030fdc8d8SChris Lattner if (message_len > 0) 44130fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 44230fdc8d8SChris Lattner } 44330fdc8d8SChris Lattner } 44430fdc8d8SChris Lattner 44530fdc8d8SChris Lattner void 4462976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 44730fdc8d8SChris Lattner { 448acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 449acdbe816SGreg Clayton if (process_sp) 45030fdc8d8SChris Lattner { 45130fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 45230fdc8d8SChris Lattner char message[1024]; 45330fdc8d8SChris Lattner ::snprintf (message, 45430fdc8d8SChris Lattner sizeof (message), 455d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 456acdbe816SGreg Clayton process_sp->GetID(), 45730fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 45830fdc8d8SChris Lattner 45930fdc8d8SChris Lattner result.AppendMessage (message); 46030fdc8d8SChris Lattner } 46130fdc8d8SChris Lattner } 46230fdc8d8SChris Lattner 46330fdc8d8SChris Lattner bool 4642976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 46530fdc8d8SChris Lattner { 466acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 467acdbe816SGreg Clayton if (process_sp) 468af67cecdSGreg Clayton { 469acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 470acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 471af67cecdSGreg Clayton } 47230fdc8d8SChris Lattner return false; 47330fdc8d8SChris Lattner } 47430fdc8d8SChris Lattner 47530fdc8d8SChris Lattner bool 476ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid) 477ea561dcfSGreg Clayton { 4785160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 479ceb6b139SCaroline Tice 480ceb6b139SCaroline Tice bool ret_val = false; 481acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 482acdbe816SGreg Clayton if (process_sp) 483af67cecdSGreg Clayton { 484acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 485acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 486af67cecdSGreg Clayton } 487ceb6b139SCaroline Tice 488ceb6b139SCaroline Tice if (log) 489d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s", 490324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, 491324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 492ceb6b139SCaroline Tice 493ceb6b139SCaroline Tice return ret_val; 49430fdc8d8SChris Lattner } 49530fdc8d8SChris Lattner 49618b46896SJim Ingham bool 49718b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 49818b46896SJim Ingham { 4995160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 50018b46896SJim Ingham 50118b46896SJim Ingham bool ret_val = false; 50218b46896SJim Ingham ProcessSP process_sp(GetSP()); 50318b46896SJim Ingham if (process_sp) 50418b46896SJim Ingham { 50518b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 50618b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 50718b46896SJim Ingham } 50818b46896SJim Ingham 50918b46896SJim Ingham if (log) 51018b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 511324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), index_id, 512324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 51318b46896SJim Ingham 51418b46896SJim Ingham return ret_val; 51518b46896SJim Ingham } 51618b46896SJim Ingham 51730fdc8d8SChris Lattner SBThread 51830fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 51930fdc8d8SChris Lattner { 5205160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 521ceb6b139SCaroline Tice 52217a6ad05SGreg Clayton SBThread sb_thread; 52317a6ad05SGreg Clayton ThreadSP thread_sp; 524acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 525acdbe816SGreg Clayton if (process_sp) 526af67cecdSGreg Clayton { 5277fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5287fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 529acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 5307fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 53117a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 532af67cecdSGreg Clayton } 533ceb6b139SCaroline Tice 534ceb6b139SCaroline Tice if (log) 53593aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 536324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 537324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 538324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 539ceb6b139SCaroline Tice 54017a6ad05SGreg Clayton return sb_thread; 54130fdc8d8SChris Lattner } 54230fdc8d8SChris Lattner 543bf2956a2SJim Ingham uint32_t 5445e8dce4dSJason Molenda SBProcess::GetNumQueues () 5455e8dce4dSJason Molenda { 5465e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5475e8dce4dSJason Molenda 5485e8dce4dSJason Molenda uint32_t num_queues = 0; 5495e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 5505e8dce4dSJason Molenda if (process_sp) 5515e8dce4dSJason Molenda { 5525e8dce4dSJason Molenda Process::StopLocker stop_locker; 5535e8dce4dSJason Molenda 5545e8dce4dSJason Molenda Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 5555e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 5565e8dce4dSJason Molenda } 5575e8dce4dSJason Molenda 5585e8dce4dSJason Molenda if (log) 559324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetNumQueues () => %d", 560324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num_queues); 5615e8dce4dSJason Molenda 5625e8dce4dSJason Molenda return num_queues; 5635e8dce4dSJason Molenda } 5645e8dce4dSJason Molenda 5655e8dce4dSJason Molenda SBQueue 5665e8dce4dSJason Molenda SBProcess::GetQueueAtIndex (size_t index) 5675e8dce4dSJason Molenda { 5685e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5695e8dce4dSJason Molenda 5705e8dce4dSJason Molenda SBQueue sb_queue; 5715e8dce4dSJason Molenda QueueSP queue_sp; 5725e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 5735e8dce4dSJason Molenda if (process_sp) 5745e8dce4dSJason Molenda { 5755e8dce4dSJason Molenda Process::StopLocker stop_locker; 5765e8dce4dSJason Molenda Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 5775e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 5785e8dce4dSJason Molenda sb_queue.SetQueue (queue_sp); 5795e8dce4dSJason Molenda } 5805e8dce4dSJason Molenda 5815e8dce4dSJason Molenda if (log) 5825e8dce4dSJason Molenda log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", 583324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 584324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 585324a1036SSaleem Abdulrasool static_cast<void*>(queue_sp.get())); 5865e8dce4dSJason Molenda 5875e8dce4dSJason Molenda return sb_queue; 5885e8dce4dSJason Molenda } 5895e8dce4dSJason Molenda 5905e8dce4dSJason Molenda 5915e8dce4dSJason Molenda uint32_t 592bf2956a2SJim Ingham SBProcess::GetStopID(bool include_expression_stops) 593bf2956a2SJim Ingham { 594bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 595bf2956a2SJim Ingham if (process_sp) 596bf2956a2SJim Ingham { 597bf2956a2SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 598bf2956a2SJim Ingham if (include_expression_stops) 599bf2956a2SJim Ingham return process_sp->GetStopID(); 600bf2956a2SJim Ingham else 601bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 602bf2956a2SJim Ingham } 603bf2956a2SJim Ingham return 0; 604bf2956a2SJim Ingham } 605bf2956a2SJim Ingham 606*38810f43SIlia K SBEvent 607*38810f43SIlia K SBProcess::GetStopEventForStopID(uint32_t stop_id) 608*38810f43SIlia K { 609*38810f43SIlia K Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 610*38810f43SIlia K 611*38810f43SIlia K SBEvent sb_event; 612*38810f43SIlia K EventSP event_sp; 613*38810f43SIlia K ProcessSP process_sp(GetSP()); 614*38810f43SIlia K if (process_sp) 615*38810f43SIlia K { 616*38810f43SIlia K Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 617*38810f43SIlia K event_sp = process_sp->GetStopEventForStopID(stop_id); 618*38810f43SIlia K sb_event.reset(event_sp); 619*38810f43SIlia K } 620*38810f43SIlia K 621*38810f43SIlia K if (log) 622*38810f43SIlia K log->Printf ("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 ") => SBEvent(%p)", 623*38810f43SIlia K static_cast<void*>(process_sp.get()), 624*38810f43SIlia K stop_id, 625*38810f43SIlia K static_cast<void*>(event_sp.get())); 626*38810f43SIlia K 627*38810f43SIlia K return sb_event; 628*38810f43SIlia K } 629*38810f43SIlia K 63030fdc8d8SChris Lattner StateType 63130fdc8d8SChris Lattner SBProcess::GetState () 63230fdc8d8SChris Lattner { 633ceb6b139SCaroline Tice 634ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 635acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 636acdbe816SGreg Clayton if (process_sp) 637af67cecdSGreg Clayton { 638acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 639acdbe816SGreg Clayton ret_val = process_sp->GetState(); 640af67cecdSGreg Clayton } 641ceb6b139SCaroline Tice 6425160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 643ceb6b139SCaroline Tice if (log) 644cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 645324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 646750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 647ceb6b139SCaroline Tice 648ceb6b139SCaroline Tice return ret_val; 64930fdc8d8SChris Lattner } 65030fdc8d8SChris Lattner 65130fdc8d8SChris Lattner 65230fdc8d8SChris Lattner int 65330fdc8d8SChris Lattner SBProcess::GetExitStatus () 65430fdc8d8SChris Lattner { 6554838131bSGreg Clayton int exit_status = 0; 656acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 657acdbe816SGreg Clayton if (process_sp) 658af67cecdSGreg Clayton { 659acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 660acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 661af67cecdSGreg Clayton } 6625160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6634838131bSGreg Clayton if (log) 6644838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 665324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), exit_status, 666324a1036SSaleem Abdulrasool exit_status); 6674838131bSGreg Clayton 6684838131bSGreg Clayton return exit_status; 66930fdc8d8SChris Lattner } 67030fdc8d8SChris Lattner 67130fdc8d8SChris Lattner const char * 67230fdc8d8SChris Lattner SBProcess::GetExitDescription () 67330fdc8d8SChris Lattner { 6744838131bSGreg Clayton const char *exit_desc = NULL; 675acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 676acdbe816SGreg Clayton if (process_sp) 677af67cecdSGreg Clayton { 678acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 679acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 680af67cecdSGreg Clayton } 6815160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6824838131bSGreg Clayton if (log) 6834838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 684324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), exit_desc); 6854838131bSGreg Clayton return exit_desc; 68630fdc8d8SChris Lattner } 68730fdc8d8SChris Lattner 68830fdc8d8SChris Lattner lldb::pid_t 68930fdc8d8SChris Lattner SBProcess::GetProcessID () 69030fdc8d8SChris Lattner { 691ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 692acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 693acdbe816SGreg Clayton if (process_sp) 694acdbe816SGreg Clayton ret_val = process_sp->GetID(); 695ceb6b139SCaroline Tice 6965160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 697ceb6b139SCaroline Tice if (log) 698324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, 699324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), ret_val); 700ceb6b139SCaroline Tice 701ceb6b139SCaroline Tice return ret_val; 70230fdc8d8SChris Lattner } 70330fdc8d8SChris Lattner 704949e8221SGreg Clayton uint32_t 705949e8221SGreg Clayton SBProcess::GetUniqueID() 706949e8221SGreg Clayton { 707949e8221SGreg Clayton uint32_t ret_val = 0; 708949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 709949e8221SGreg Clayton if (process_sp) 710949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 7115160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 712949e8221SGreg Clayton if (log) 713324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, 714324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), ret_val); 715949e8221SGreg Clayton return ret_val; 716949e8221SGreg Clayton } 717949e8221SGreg Clayton 718cf386e24SJohnny Chen ByteOrder 719cf386e24SJohnny Chen SBProcess::GetByteOrder () const 720cf386e24SJohnny Chen { 721cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 722acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 723acdbe816SGreg Clayton if (process_sp) 724acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 725cf386e24SJohnny Chen 7265160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 727cf386e24SJohnny Chen if (log) 728324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetByteOrder () => %d", 729324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), byteOrder); 730cf386e24SJohnny Chen 731cf386e24SJohnny Chen return byteOrder; 732cf386e24SJohnny Chen } 733cf386e24SJohnny Chen 73430fdc8d8SChris Lattner uint32_t 73530fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 73630fdc8d8SChris Lattner { 737ceb6b139SCaroline Tice uint32_t size = 0; 738acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 739acdbe816SGreg Clayton if (process_sp) 740acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 741ceb6b139SCaroline Tice 7425160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 743ceb6b139SCaroline Tice if (log) 744324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", 745324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), size); 746ceb6b139SCaroline Tice 747ceb6b139SCaroline Tice return size; 74830fdc8d8SChris Lattner } 74930fdc8d8SChris Lattner 75030fdc8d8SChris Lattner SBError 75130fdc8d8SChris Lattner SBProcess::Continue () 75230fdc8d8SChris Lattner { 7535160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 754ceb6b139SCaroline Tice 75530fdc8d8SChris Lattner SBError sb_error; 756acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 7570c74e78dSGreg Clayton 758acdbe816SGreg Clayton if (log) 759324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::Continue ()...", 760324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 761acdbe816SGreg Clayton 762acdbe816SGreg Clayton if (process_sp) 763acdbe816SGreg Clayton { 764acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 765acdbe816SGreg Clayton 766dc6224e0SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution ()) 767dc6224e0SGreg Clayton sb_error.ref() = process_sp->Resume (); 768dc6224e0SGreg Clayton else 769dc6224e0SGreg Clayton sb_error.ref() = process_sp->ResumeSynchronous (NULL); 7705d5028b5SGreg Clayton } 77130fdc8d8SChris Lattner else 77230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 77330fdc8d8SChris Lattner 774ceb6b139SCaroline Tice if (log) 775ceb6b139SCaroline Tice { 776ceb6b139SCaroline Tice SBStream sstr; 777ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 778324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", 779324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 780324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 781ceb6b139SCaroline Tice } 782ceb6b139SCaroline Tice 78330fdc8d8SChris Lattner return sb_error; 78430fdc8d8SChris Lattner } 78530fdc8d8SChris Lattner 78630fdc8d8SChris Lattner 78730fdc8d8SChris Lattner SBError 78830fdc8d8SChris Lattner SBProcess::Destroy () 78930fdc8d8SChris Lattner { 79030fdc8d8SChris Lattner SBError sb_error; 791acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 792acdbe816SGreg Clayton if (process_sp) 7936779606aSGreg Clayton { 794acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 795ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 7966779606aSGreg Clayton } 79730fdc8d8SChris Lattner else 79830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 79930fdc8d8SChris Lattner 8005160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8014838131bSGreg Clayton if (log) 8024838131bSGreg Clayton { 8034838131bSGreg Clayton SBStream sstr; 8044838131bSGreg Clayton sb_error.GetDescription (sstr); 8056779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 806324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 807324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 8084838131bSGreg Clayton } 8094838131bSGreg Clayton 81030fdc8d8SChris Lattner return sb_error; 81130fdc8d8SChris Lattner } 81230fdc8d8SChris Lattner 81330fdc8d8SChris Lattner 81430fdc8d8SChris Lattner SBError 81530fdc8d8SChris Lattner SBProcess::Stop () 81630fdc8d8SChris Lattner { 81730fdc8d8SChris Lattner SBError sb_error; 818acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 819acdbe816SGreg Clayton if (process_sp) 820af67cecdSGreg Clayton { 821acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 822acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 823af67cecdSGreg Clayton } 82430fdc8d8SChris Lattner else 82530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 826ceb6b139SCaroline Tice 8275160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 828ceb6b139SCaroline Tice if (log) 829ceb6b139SCaroline Tice { 830ceb6b139SCaroline Tice SBStream sstr; 831ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 83293aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 833324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 834324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 835ceb6b139SCaroline Tice } 836ceb6b139SCaroline Tice 83730fdc8d8SChris Lattner return sb_error; 83830fdc8d8SChris Lattner } 83930fdc8d8SChris Lattner 84030fdc8d8SChris Lattner SBError 84130fdc8d8SChris Lattner SBProcess::Kill () 84230fdc8d8SChris Lattner { 84330fdc8d8SChris Lattner SBError sb_error; 844acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 845acdbe816SGreg Clayton if (process_sp) 846af67cecdSGreg Clayton { 847acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 848ede3193bSJason Molenda sb_error.SetError (process_sp->Destroy(true)); 849af67cecdSGreg Clayton } 85030fdc8d8SChris Lattner else 85130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 852ceb6b139SCaroline Tice 8535160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 854ceb6b139SCaroline Tice if (log) 855ceb6b139SCaroline Tice { 856ceb6b139SCaroline Tice SBStream sstr; 857ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 85893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 859324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 860324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 861ceb6b139SCaroline Tice } 862ceb6b139SCaroline Tice 86330fdc8d8SChris Lattner return sb_error; 86430fdc8d8SChris Lattner } 86530fdc8d8SChris Lattner 86630fdc8d8SChris Lattner SBError 86730fdc8d8SChris Lattner SBProcess::Detach () 86830fdc8d8SChris Lattner { 869acff8950SJim Ingham // FIXME: This should come from a process default. 870acff8950SJim Ingham bool keep_stopped = false; 871acff8950SJim Ingham return Detach (keep_stopped); 872acff8950SJim Ingham } 873acff8950SJim Ingham 874acff8950SJim Ingham SBError 875acff8950SJim Ingham SBProcess::Detach (bool keep_stopped) 876acff8950SJim Ingham { 87730fdc8d8SChris Lattner SBError sb_error; 878acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 879acdbe816SGreg Clayton if (process_sp) 880af67cecdSGreg Clayton { 881acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 882acff8950SJim Ingham sb_error.SetError (process_sp->Detach(keep_stopped)); 883af67cecdSGreg Clayton } 88430fdc8d8SChris Lattner else 88530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 88630fdc8d8SChris Lattner 88730fdc8d8SChris Lattner return sb_error; 88830fdc8d8SChris Lattner } 88930fdc8d8SChris Lattner 89030fdc8d8SChris Lattner SBError 8914838131bSGreg Clayton SBProcess::Signal (int signo) 89230fdc8d8SChris Lattner { 89330fdc8d8SChris Lattner SBError sb_error; 894acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 895acdbe816SGreg Clayton if (process_sp) 896af67cecdSGreg Clayton { 897acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 898acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 899af67cecdSGreg Clayton } 90030fdc8d8SChris Lattner else 90130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 9025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9034838131bSGreg Clayton if (log) 9044838131bSGreg Clayton { 9054838131bSGreg Clayton SBStream sstr; 9064838131bSGreg Clayton sb_error.GetDescription (sstr); 9074838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 908324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), signo, 909324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 9104838131bSGreg Clayton } 91130fdc8d8SChris Lattner return sb_error; 91230fdc8d8SChris Lattner } 91330fdc8d8SChris Lattner 914802dc402STodd Fiala SBUnixSignals 915802dc402STodd Fiala SBProcess::GetUnixSignals() 916802dc402STodd Fiala { 917802dc402STodd Fiala SBUnixSignals sb_unix_signals; 918802dc402STodd Fiala ProcessSP process_sp(GetSP()); 919802dc402STodd Fiala if (process_sp) 920802dc402STodd Fiala { 921802dc402STodd Fiala sb_unix_signals.SetSP(process_sp); 922802dc402STodd Fiala } 923802dc402STodd Fiala 924802dc402STodd Fiala return sb_unix_signals; 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()); 9475bf72c46SHafiz Abid Qadeer Mutex::Locker api_locker (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()); 9715bf72c46SHafiz Abid Qadeer Mutex::Locker api_locker (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 { 10036611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 100430fdc8d8SChris Lattner } 100530fdc8d8SChris Lattner 10060161b49cSJim Ingham size_t 10070161b49cSJim Ingham SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event) 10080161b49cSJim Ingham { 10090161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 10100161b49cSJim Ingham } 10110161b49cSJim Ingham 10120161b49cSJim Ingham const char * 10130161b49cSJim Ingham SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx) 10140161b49cSJim Ingham { 10150161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 10160161b49cSJim Ingham } 10170161b49cSJim Ingham 101830fdc8d8SChris Lattner SBProcess 101930fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 102030fdc8d8SChris Lattner { 10216611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 102230fdc8d8SChris Lattner return process; 102330fdc8d8SChris Lattner } 102430fdc8d8SChris Lattner 1025e6bc6cb9SJim Ingham bool 102606d2855fSIlia K SBProcess::GetInterruptedFromEvent (const SBEvent &event) 102706d2855fSIlia K { 102806d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 102906d2855fSIlia K } 103006d2855fSIlia K 103106d2855fSIlia K bool 1032e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 1033e6bc6cb9SJim Ingham { 1034f9e5dc16SIlia K return event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass(); 1035e6bc6cb9SJim Ingham } 103630fdc8d8SChris Lattner 103730fdc8d8SChris Lattner SBBroadcaster 103830fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 103930fdc8d8SChris Lattner { 10405160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1041ceb6b139SCaroline Tice 1042acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1043acdbe816SGreg Clayton 1044acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 1045ceb6b139SCaroline Tice 1046ceb6b139SCaroline Tice if (log) 1047324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", 1048324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 1049324a1036SSaleem Abdulrasool static_cast<void*>(broadcaster.get())); 1050ceb6b139SCaroline Tice 105130fdc8d8SChris Lattner return broadcaster; 105230fdc8d8SChris Lattner } 105330fdc8d8SChris Lattner 10544bddaeb5SJim Ingham const char * 10554bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 10564bddaeb5SJim Ingham { 10574bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 10584bddaeb5SJim Ingham } 10594bddaeb5SJim Ingham 106030fdc8d8SChris Lattner size_t 106130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 106230fdc8d8SChris Lattner { 10635160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1064ceb6b139SCaroline Tice 106530fdc8d8SChris Lattner size_t bytes_read = 0; 106630fdc8d8SChris Lattner 1067acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1068acdbe816SGreg Clayton 10694838131bSGreg Clayton if (log) 1070d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 1071324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1072324a1036SSaleem Abdulrasool static_cast<void*>(dst), static_cast<uint64_t>(dst_len), 1073324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get())); 10744838131bSGreg Clayton 1075acdbe816SGreg Clayton if (process_sp) 107630fdc8d8SChris Lattner { 10777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10787fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10797fdf9ef1SGreg Clayton { 1080acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10817fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 10827fdf9ef1SGreg Clayton } 10837fdf9ef1SGreg Clayton else 10847fdf9ef1SGreg Clayton { 1085c9858e4dSGreg Clayton if (log) 1086324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", 1087324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 10887fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10897fdf9ef1SGreg Clayton } 109030fdc8d8SChris Lattner } 109130fdc8d8SChris Lattner else 109230fdc8d8SChris Lattner { 109330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 109430fdc8d8SChris Lattner } 109530fdc8d8SChris Lattner 1096ceb6b139SCaroline Tice if (log) 109793aa84e8SGreg Clayton { 109893aa84e8SGreg Clayton SBStream sstr; 109993aa84e8SGreg Clayton sb_error.GetDescription (sstr); 1100d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1101324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1102324a1036SSaleem Abdulrasool static_cast<void*>(dst), static_cast<uint64_t>(dst_len), 1103324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData(), 1104324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 110593aa84e8SGreg Clayton } 1106ceb6b139SCaroline Tice 110730fdc8d8SChris Lattner return bytes_read; 110830fdc8d8SChris Lattner } 110930fdc8d8SChris Lattner 111030fdc8d8SChris Lattner size_t 1111e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 1112e91b7957SGreg Clayton { 1113e91b7957SGreg Clayton size_t bytes_read = 0; 1114acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1115acdbe816SGreg Clayton if (process_sp) 1116e91b7957SGreg Clayton { 11177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11187fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11197fdf9ef1SGreg Clayton { 1120acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11217fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 11227fdf9ef1SGreg Clayton } 11237fdf9ef1SGreg Clayton else 11247fdf9ef1SGreg Clayton { 11255160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1126c9858e4dSGreg Clayton if (log) 1127324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", 1128324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11297fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11307fdf9ef1SGreg Clayton } 1131e91b7957SGreg Clayton } 1132e91b7957SGreg Clayton else 1133e91b7957SGreg Clayton { 1134e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1135e91b7957SGreg Clayton } 1136e91b7957SGreg Clayton return bytes_read; 1137e91b7957SGreg Clayton } 1138e91b7957SGreg Clayton 1139e91b7957SGreg Clayton uint64_t 1140e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 1141e91b7957SGreg Clayton { 11427fdf9ef1SGreg Clayton uint64_t value = 0; 1143acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1144acdbe816SGreg Clayton if (process_sp) 1145e91b7957SGreg Clayton { 11467fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11477fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11487fdf9ef1SGreg Clayton { 1149acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11507fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 11517fdf9ef1SGreg Clayton } 11527fdf9ef1SGreg Clayton else 11537fdf9ef1SGreg Clayton { 11545160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1155c9858e4dSGreg Clayton if (log) 1156324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", 1157324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11587fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11597fdf9ef1SGreg Clayton } 1160e91b7957SGreg Clayton } 1161e91b7957SGreg Clayton else 1162e91b7957SGreg Clayton { 1163e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1164e91b7957SGreg Clayton } 11657fdf9ef1SGreg Clayton return value; 1166e91b7957SGreg Clayton } 1167e91b7957SGreg Clayton 1168e91b7957SGreg Clayton lldb::addr_t 1169e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 1170e91b7957SGreg Clayton { 1171e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1172acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1173acdbe816SGreg Clayton if (process_sp) 1174e91b7957SGreg Clayton { 11757fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11767fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11777fdf9ef1SGreg Clayton { 1178acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11797fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 11807fdf9ef1SGreg Clayton } 11817fdf9ef1SGreg Clayton else 11827fdf9ef1SGreg Clayton { 11835160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1184c9858e4dSGreg Clayton if (log) 1185324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", 1186324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11877fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11887fdf9ef1SGreg Clayton } 1189e91b7957SGreg Clayton } 1190e91b7957SGreg Clayton else 1191e91b7957SGreg Clayton { 1192e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1193e91b7957SGreg Clayton } 1194e91b7957SGreg Clayton return ptr; 1195e91b7957SGreg Clayton } 1196e91b7957SGreg Clayton 1197e91b7957SGreg Clayton size_t 119830fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 119930fdc8d8SChris Lattner { 120030fdc8d8SChris Lattner size_t bytes_written = 0; 120130fdc8d8SChris Lattner 12025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1203acdbe816SGreg Clayton 1204acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1205acdbe816SGreg Clayton 12064838131bSGreg Clayton if (log) 1207d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1208324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1209324a1036SSaleem Abdulrasool static_cast<const void*>(src), 1210324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 1211324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get())); 12124838131bSGreg Clayton 1213acdbe816SGreg Clayton if (process_sp) 121430fdc8d8SChris Lattner { 12157fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12167fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12177fdf9ef1SGreg Clayton { 1218acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 12197fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 12207fdf9ef1SGreg Clayton } 12217fdf9ef1SGreg Clayton else 12227fdf9ef1SGreg Clayton { 1223c9858e4dSGreg Clayton if (log) 1224324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", 1225324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 12267fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12277fdf9ef1SGreg Clayton } 122830fdc8d8SChris Lattner } 122930fdc8d8SChris Lattner 12304838131bSGreg Clayton if (log) 12314838131bSGreg Clayton { 12324838131bSGreg Clayton SBStream sstr; 12334838131bSGreg Clayton sb_error.GetDescription (sstr); 1234d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1235324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1236324a1036SSaleem Abdulrasool static_cast<const void*>(src), 1237324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 1238324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData(), 1239324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_written)); 12404838131bSGreg Clayton } 12414838131bSGreg Clayton 124230fdc8d8SChris Lattner return bytes_written; 124330fdc8d8SChris Lattner } 124430fdc8d8SChris Lattner 1245dde9cff3SCaroline Tice bool 1246dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1247dde9cff3SCaroline Tice { 1248da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1249da7bc7d0SGreg Clayton 1250acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1251acdbe816SGreg Clayton if (process_sp) 1252dde9cff3SCaroline Tice { 1253dde9cff3SCaroline Tice char path[PATH_MAX]; 1254dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1255acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 12561d273166SGreg Clayton const char *exe_name = NULL; 12571d273166SGreg Clayton if (exe_module) 12581d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 12591d273166SGreg Clayton 1260d01b2953SDaniel Malea strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1261acdbe816SGreg Clayton process_sp->GetID(), 1262ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 12631d273166SGreg Clayton GetNumThreads(), 126405faeb71SGreg Clayton exe_name ? ", executable = " : "", 12651d273166SGreg Clayton exe_name ? exe_name : ""); 1266dde9cff3SCaroline Tice } 1267dde9cff3SCaroline Tice else 1268da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1269dde9cff3SCaroline Tice 1270dde9cff3SCaroline Tice return true; 1271dde9cff3SCaroline Tice } 12728f343b09SGreg Clayton 12738f343b09SGreg Clayton uint32_t 1274f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1275f9ef60d2SJohnny Chen { 12765160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1277f9ef60d2SJohnny Chen 1278f9ef60d2SJohnny Chen uint32_t num = 0; 1279f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1280f9ef60d2SJohnny Chen if (process_sp) 1281f9ef60d2SJohnny Chen { 1282f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1283f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1284f9ef60d2SJohnny Chen if (log) 1285f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1286324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num); 1287f9ef60d2SJohnny Chen } 1288f9ef60d2SJohnny Chen else 1289f9ef60d2SJohnny Chen { 1290f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1291f9ef60d2SJohnny Chen } 1292f9ef60d2SJohnny Chen return num; 1293f9ef60d2SJohnny Chen } 1294f9ef60d2SJohnny Chen 1295f9ef60d2SJohnny Chen uint32_t 12968f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 12978f343b09SGreg Clayton { 1298acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1299acdbe816SGreg Clayton if (process_sp) 1300af67cecdSGreg Clayton { 13017fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13027fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 13037fdf9ef1SGreg Clayton { 1304acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1305acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1306af67cecdSGreg Clayton } 13077fdf9ef1SGreg Clayton else 13087fdf9ef1SGreg Clayton { 13095160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1310c9858e4dSGreg Clayton if (log) 1311324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", 1312324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 13137fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 13147fdf9ef1SGreg Clayton } 13157fdf9ef1SGreg Clayton } 13168f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 13178f343b09SGreg Clayton } 13188f343b09SGreg Clayton 13198f343b09SGreg Clayton lldb::SBError 13208f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 13218f343b09SGreg Clayton { 13228f343b09SGreg Clayton lldb::SBError sb_error; 1323acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1324acdbe816SGreg Clayton if (process_sp) 1325af67cecdSGreg Clayton { 13267fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13277fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 13287fdf9ef1SGreg Clayton { 1329acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1330acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1331af67cecdSGreg Clayton } 13328f343b09SGreg Clayton else 13337fdf9ef1SGreg Clayton { 13345160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1335c9858e4dSGreg Clayton if (log) 1336324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", 1337324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 13387fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 13397fdf9ef1SGreg Clayton } 13407fdf9ef1SGreg Clayton } 13417fdf9ef1SGreg Clayton else 13428f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 13438f343b09SGreg Clayton return sb_error; 13448f343b09SGreg Clayton } 13458c71337aSJason Molenda 1346a332978bSJason Molenda lldb::SBError 1347a332978bSJason Molenda SBProcess::SendEventData (const char *event_data) 1348a332978bSJason Molenda { 1349a332978bSJason Molenda lldb::SBError sb_error; 1350a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1351a332978bSJason Molenda if (process_sp) 1352a332978bSJason Molenda { 1353a332978bSJason Molenda Process::StopLocker stop_locker; 1354a332978bSJason Molenda if (stop_locker.TryLock(&process_sp->GetRunLock())) 1355a332978bSJason Molenda { 1356a332978bSJason Molenda Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1357a332978bSJason Molenda sb_error.SetError (process_sp->SendEventData (event_data)); 1358a332978bSJason Molenda } 1359a332978bSJason Molenda else 1360a332978bSJason Molenda { 1361a332978bSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1362a332978bSJason Molenda if (log) 1363324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::SendEventData() => error: process is running", 1364324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 1365a332978bSJason Molenda sb_error.SetErrorString("process is running"); 1366a332978bSJason Molenda } 1367a332978bSJason Molenda } 1368a332978bSJason Molenda else 1369a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1370a332978bSJason Molenda return sb_error; 1371a332978bSJason Molenda } 1372a332978bSJason Molenda 13738c71337aSJason Molenda uint32_t 137495d005c7SJason Molenda SBProcess::GetNumExtendedBacktraceTypes () 13758c71337aSJason Molenda { 13768c71337aSJason Molenda ProcessSP process_sp(GetSP()); 13778c71337aSJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 13788c71337aSJason Molenda { 13798c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 138095d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 13818c71337aSJason Molenda } 13828c71337aSJason Molenda return 0; 13838c71337aSJason Molenda } 13848c71337aSJason Molenda 13858c71337aSJason Molenda const char * 138695d005c7SJason Molenda SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx) 13878c71337aSJason Molenda { 13888c71337aSJason Molenda ProcessSP process_sp(GetSP()); 13898c71337aSJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 13908c71337aSJason Molenda { 13918c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1392008c45f1SJason Molenda const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes(); 13938c71337aSJason Molenda if (idx < names.size()) 13948c71337aSJason Molenda { 13958c71337aSJason Molenda return names[idx].AsCString(); 13968c71337aSJason Molenda } 13978c71337aSJason Molenda else 13988c71337aSJason Molenda { 13998c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14008c71337aSJason Molenda if (log) 1401324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds", 1402324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 14038c71337aSJason Molenda } 14048c71337aSJason Molenda } 14058c71337aSJason Molenda return NULL; 14068c71337aSJason Molenda } 1407a51ea382SKuba Brecka 1408a51ea382SKuba Brecka SBThreadCollection 1409a51ea382SKuba Brecka SBProcess::GetHistoryThreads (addr_t addr) 1410a51ea382SKuba Brecka { 1411a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1412a51ea382SKuba Brecka SBThreadCollection threads; 1413a51ea382SKuba Brecka if (process_sp) 1414a51ea382SKuba Brecka { 1415a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1416a51ea382SKuba Brecka } 1417a51ea382SKuba Brecka return threads; 1418a51ea382SKuba Brecka } 141963927548SKuba Brecka 142063927548SKuba Brecka bool 142163927548SKuba Brecka SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type) 142263927548SKuba Brecka { 142363927548SKuba Brecka ProcessSP process_sp(GetSP()); 142463927548SKuba Brecka if (! process_sp) 142563927548SKuba Brecka return false; 142663927548SKuba Brecka 142763927548SKuba Brecka InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type); 142863927548SKuba Brecka 142963927548SKuba Brecka if (! runtime_sp.get()) 143063927548SKuba Brecka return false; 143163927548SKuba Brecka 143263927548SKuba Brecka return runtime_sp->IsActive(); 143363927548SKuba Brecka } 1434