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" 2230fdc8d8SChris Lattner #include "lldb/Core/State.h" 2330fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2430fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2530fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2630fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 278c71337aSJason Molenda #include "lldb/Target/SystemRuntime.h" 286611103cSGreg Clayton #include "lldb/Target/Target.h" 296611103cSGreg Clayton #include "lldb/Target/Thread.h" 3030fdc8d8SChris Lattner 3130fdc8d8SChris Lattner // Project includes 3230fdc8d8SChris Lattner 334c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 344c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 350e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 364c5de699SEli Friedman #include "lldb/API/SBEvent.h" 370e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 384c5de699SEli Friedman #include "lldb/API/SBThread.h" 39a51ea382SKuba Brecka #include "lldb/API/SBThreadCollection.h" 40dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 414c5de699SEli Friedman #include "lldb/API/SBStringList.h" 42802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h" 4330fdc8d8SChris Lattner 4430fdc8d8SChris Lattner using namespace lldb; 4530fdc8d8SChris Lattner using namespace lldb_private; 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner SBProcess::SBProcess () : 494e0fe8abSGreg Clayton m_opaque_wp() 5030fdc8d8SChris Lattner { 5130fdc8d8SChris Lattner } 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner //---------------------------------------------------------------------- 5530fdc8d8SChris Lattner // SBProcess constructor 5630fdc8d8SChris Lattner //---------------------------------------------------------------------- 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 594e0fe8abSGreg Clayton m_opaque_wp (rhs.m_opaque_wp) 6030fdc8d8SChris Lattner { 6130fdc8d8SChris Lattner } 6230fdc8d8SChris Lattner 6330fdc8d8SChris Lattner 6430fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 654e0fe8abSGreg Clayton m_opaque_wp (process_sp) 6630fdc8d8SChris Lattner { 6730fdc8d8SChris Lattner } 6830fdc8d8SChris Lattner 69efabb123SGreg Clayton const SBProcess& 70efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 71efabb123SGreg Clayton { 72efabb123SGreg Clayton if (this != &rhs) 734e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 74efabb123SGreg Clayton return *this; 75efabb123SGreg Clayton } 76efabb123SGreg Clayton 7730fdc8d8SChris Lattner //---------------------------------------------------------------------- 7830fdc8d8SChris Lattner // Destructor 7930fdc8d8SChris Lattner //---------------------------------------------------------------------- 8030fdc8d8SChris Lattner SBProcess::~SBProcess() 8130fdc8d8SChris Lattner { 8230fdc8d8SChris Lattner } 8330fdc8d8SChris Lattner 844bddaeb5SJim Ingham const char * 854bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName () 864bddaeb5SJim Ingham { 874bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 884bddaeb5SJim Ingham } 894bddaeb5SJim Ingham 90d7b30ef9SJim Ingham const char * 91d7b30ef9SJim Ingham SBProcess::GetPluginName () 92d7b30ef9SJim Ingham { 93d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 94d7b30ef9SJim Ingham if (process_sp) 95d7b30ef9SJim Ingham { 9657abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 97d7b30ef9SJim Ingham } 98d7b30ef9SJim Ingham return "<Unknown>"; 99d7b30ef9SJim Ingham } 100d7b30ef9SJim Ingham 101d7b30ef9SJim Ingham const char * 102d7b30ef9SJim Ingham SBProcess::GetShortPluginName () 103d7b30ef9SJim Ingham { 104d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 105d7b30ef9SJim Ingham if (process_sp) 106d7b30ef9SJim Ingham { 10757abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 108d7b30ef9SJim Ingham } 109d7b30ef9SJim Ingham return "<Unknown>"; 110d7b30ef9SJim Ingham } 111d7b30ef9SJim Ingham 112d7b30ef9SJim Ingham 113b9556accSGreg Clayton lldb::ProcessSP 114b9556accSGreg Clayton SBProcess::GetSP() const 115b9556accSGreg Clayton { 1164e0fe8abSGreg Clayton return m_opaque_wp.lock(); 117b9556accSGreg Clayton } 118b9556accSGreg Clayton 11930fdc8d8SChris Lattner void 120b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 12130fdc8d8SChris Lattner { 1224e0fe8abSGreg Clayton m_opaque_wp = process_sp; 12330fdc8d8SChris Lattner } 12430fdc8d8SChris Lattner 12530fdc8d8SChris Lattner void 12630fdc8d8SChris Lattner SBProcess::Clear () 12730fdc8d8SChris Lattner { 1284e0fe8abSGreg Clayton m_opaque_wp.reset(); 12930fdc8d8SChris Lattner } 13030fdc8d8SChris Lattner 13130fdc8d8SChris Lattner 13230fdc8d8SChris Lattner bool 13330fdc8d8SChris Lattner SBProcess::IsValid() const 13430fdc8d8SChris Lattner { 1354fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1364fc6cb9cSJim Ingham return ((bool) process_sp && process_sp->IsValid()); 13730fdc8d8SChris Lattner } 13830fdc8d8SChris Lattner 1399631aae2SJames McIlree bool 1409631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1419631aae2SJames McIlree char const **envp, 1429631aae2SJames McIlree const char *stdin_path, 1439631aae2SJames McIlree const char *stdout_path, 1449631aae2SJames McIlree const char *stderr_path, 1459631aae2SJames McIlree const char *working_directory, 1469631aae2SJames McIlree uint32_t launch_flags, 1479631aae2SJames McIlree bool stop_at_entry, 1489631aae2SJames McIlree lldb::SBError& error) 1499631aae2SJames McIlree { 1505160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 151324a1036SSaleem Abdulrasool if (log) 1529631aae2SJames 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))...", 153324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_wp.lock().get()), 154324a1036SSaleem Abdulrasool static_cast<void*>(argv), static_cast<void*>(envp), 1559631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1569631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1579631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1589631aae2SJames McIlree working_directory ? working_directory : "NULL", 159324a1036SSaleem Abdulrasool launch_flags, stop_at_entry, 160324a1036SSaleem Abdulrasool static_cast<void*>(error.get())); 1619631aae2SJames McIlree 162acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 163acdbe816SGreg Clayton if (process_sp) 1649631aae2SJames McIlree { 165acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 166acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1679631aae2SJames McIlree { 168982c9762SGreg Clayton if (stop_at_entry) 169982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 170*d3173f34SChaoren Lin ProcessLaunchInfo launch_info(FileSpec{stdin_path, false}, 171*d3173f34SChaoren Lin FileSpec{stdout_path, false}, 172*d3173f34SChaoren Lin FileSpec{stderr_path, false}, 173*d3173f34SChaoren Lin FileSpec{working_directory, false}, 174982c9762SGreg Clayton launch_flags); 175acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 176982c9762SGreg Clayton if (exe_module) 17714715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 178982c9762SGreg Clayton if (argv) 179982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 180982c9762SGreg Clayton if (envp) 181982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 182acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1839631aae2SJames McIlree } 1849631aae2SJames McIlree else 1859631aae2SJames McIlree { 1869631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1879631aae2SJames McIlree } 1889631aae2SJames McIlree } 1899631aae2SJames McIlree else 1909631aae2SJames McIlree { 1919631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1929631aae2SJames McIlree } 1939631aae2SJames McIlree 1949631aae2SJames McIlree if (log) { 1959631aae2SJames McIlree SBStream sstr; 1969631aae2SJames McIlree error.GetDescription (sstr); 197324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", 198324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 199324a1036SSaleem Abdulrasool static_cast<void*>(error.get()), sstr.GetData()); 2009631aae2SJames McIlree } 2019631aae2SJames McIlree 2029631aae2SJames McIlree return error.Success(); 2039631aae2SJames McIlree } 2049631aae2SJames McIlree 2059631aae2SJames McIlree bool 2069631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 2079631aae2SJames McIlree { 208acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 209acdbe816SGreg Clayton if (process_sp) 2109631aae2SJames McIlree { 211acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 212acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 2139631aae2SJames McIlree { 214144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 215144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 216acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 2179631aae2SJames McIlree } 2189631aae2SJames McIlree else 2199631aae2SJames McIlree { 2209631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 2219631aae2SJames McIlree } 2229631aae2SJames McIlree } 2239631aae2SJames McIlree else 2249631aae2SJames McIlree { 2259631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 2269631aae2SJames McIlree } 2279631aae2SJames McIlree 2285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2299631aae2SJames McIlree if (log) { 2309631aae2SJames McIlree SBStream sstr; 2319631aae2SJames McIlree error.GetDescription (sstr); 232324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", 233324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), pid, 234324a1036SSaleem Abdulrasool static_cast<void*>(error.get()), sstr.GetData()); 2359631aae2SJames McIlree } 2369631aae2SJames McIlree 2379631aae2SJames McIlree return error.Success(); 2389631aae2SJames McIlree } 2399631aae2SJames McIlree 24030fdc8d8SChris Lattner 24130fdc8d8SChris Lattner uint32_t 24230fdc8d8SChris Lattner SBProcess::GetNumThreads () 24330fdc8d8SChris Lattner { 2445160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 245ceb6b139SCaroline Tice 246ceb6b139SCaroline Tice uint32_t num_threads = 0; 247acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 248acdbe816SGreg Clayton if (process_sp) 24930fdc8d8SChris Lattner { 2507fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2517fdf9ef1SGreg Clayton 2527fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 253acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 254acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 25530fdc8d8SChris Lattner } 256ceb6b139SCaroline Tice 257ceb6b139SCaroline Tice if (log) 258324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetNumThreads () => %d", 259324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num_threads); 260ceb6b139SCaroline Tice 261ceb6b139SCaroline Tice return num_threads; 26230fdc8d8SChris Lattner } 26330fdc8d8SChris Lattner 26430fdc8d8SChris Lattner SBThread 2652976d00aSJim Ingham SBProcess::GetSelectedThread () const 26630fdc8d8SChris Lattner { 2675160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 268ceb6b139SCaroline Tice 26930fdc8d8SChris Lattner SBThread sb_thread; 27017a6ad05SGreg Clayton ThreadSP thread_sp; 271acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 272acdbe816SGreg Clayton if (process_sp) 273af67cecdSGreg Clayton { 274acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 275acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 27617a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 277af67cecdSGreg Clayton } 278ceb6b139SCaroline Tice 279ceb6b139SCaroline Tice if (log) 280324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", 281324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 282324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 283ceb6b139SCaroline Tice 28430fdc8d8SChris Lattner return sb_thread; 28530fdc8d8SChris Lattner } 28630fdc8d8SChris Lattner 287a4d8747dSGreg Clayton SBThread 288a4d8747dSGreg Clayton SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) 289a4d8747dSGreg Clayton { 2905160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 291a4d8747dSGreg Clayton 292a4d8747dSGreg Clayton SBThread sb_thread; 293a4d8747dSGreg Clayton ThreadSP thread_sp; 294a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 295a4d8747dSGreg Clayton if (process_sp) 296a4d8747dSGreg Clayton { 297a4d8747dSGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 298a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 299a4d8747dSGreg Clayton sb_thread.SetThread (thread_sp); 300a4d8747dSGreg Clayton } 301a4d8747dSGreg Clayton 302a4d8747dSGreg Clayton if (log) 303324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", 304324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, context, 305324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 306a4d8747dSGreg Clayton 307a4d8747dSGreg Clayton return sb_thread; 308a4d8747dSGreg Clayton } 309a4d8747dSGreg Clayton 31030fdc8d8SChris Lattner SBTarget 31130fdc8d8SChris Lattner SBProcess::GetTarget() const 31230fdc8d8SChris Lattner { 3135160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 314ceb6b139SCaroline Tice 31530fdc8d8SChris Lattner SBTarget sb_target; 316b9556accSGreg Clayton TargetSP target_sp; 317acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 318acdbe816SGreg Clayton if (process_sp) 319b9556accSGreg Clayton { 320acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 321b9556accSGreg Clayton sb_target.SetSP (target_sp); 322b9556accSGreg Clayton } 323ceb6b139SCaroline Tice 324ceb6b139SCaroline Tice if (log) 325324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", 326324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 327324a1036SSaleem Abdulrasool static_cast<void*>(target_sp.get())); 328ceb6b139SCaroline Tice 32930fdc8d8SChris Lattner return sb_target; 33030fdc8d8SChris Lattner } 33130fdc8d8SChris Lattner 33230fdc8d8SChris Lattner 33330fdc8d8SChris Lattner size_t 33430fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 33530fdc8d8SChris Lattner { 3365160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 337ceb6b139SCaroline Tice 338ceb6b139SCaroline Tice size_t ret_val = 0; 339acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 340acdbe816SGreg Clayton if (process_sp) 34130fdc8d8SChris Lattner { 34230fdc8d8SChris Lattner Error error; 343acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 34430fdc8d8SChris Lattner } 345ceb6b139SCaroline Tice 346ceb6b139SCaroline Tice if (log) 3476fea17e8SGreg Clayton log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 ") => %" PRIu64, 348324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), src, 349324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 350324a1036SSaleem Abdulrasool static_cast<uint64_t>(ret_val)); 351ceb6b139SCaroline Tice 352ceb6b139SCaroline Tice return ret_val; 35330fdc8d8SChris Lattner } 35430fdc8d8SChris Lattner 35530fdc8d8SChris Lattner size_t 35630fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 35730fdc8d8SChris Lattner { 358cfd1acedSGreg Clayton size_t bytes_read = 0; 359acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 360acdbe816SGreg Clayton if (process_sp) 36130fdc8d8SChris Lattner { 36230fdc8d8SChris Lattner Error error; 363acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 36430fdc8d8SChris Lattner } 365ceb6b139SCaroline Tice 3665160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 367ceb6b139SCaroline Tice if (log) 368d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 369324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 370324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 371324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 372324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 373ceb6b139SCaroline Tice 374cfd1acedSGreg Clayton return bytes_read; 37530fdc8d8SChris Lattner } 37630fdc8d8SChris Lattner 37730fdc8d8SChris Lattner size_t 37830fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 37930fdc8d8SChris Lattner { 380cfd1acedSGreg Clayton size_t bytes_read = 0; 381acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 382acdbe816SGreg Clayton if (process_sp) 38330fdc8d8SChris Lattner { 38430fdc8d8SChris Lattner Error error; 385acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 38630fdc8d8SChris Lattner } 387ceb6b139SCaroline Tice 3885160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 389ceb6b139SCaroline Tice if (log) 390d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 391324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 392324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 393324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 394324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 395ceb6b139SCaroline Tice 396cfd1acedSGreg Clayton return bytes_read; 39730fdc8d8SChris Lattner } 39830fdc8d8SChris Lattner 399ab3b8b22SHan Ming Ong size_t 400ab3b8b22SHan Ming Ong SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const 401ab3b8b22SHan Ming Ong { 402ab3b8b22SHan Ming Ong size_t bytes_read = 0; 403ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 404ab3b8b22SHan Ming Ong if (process_sp) 405ab3b8b22SHan Ming Ong { 406ab3b8b22SHan Ming Ong Error error; 407ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error); 408ab3b8b22SHan Ming Ong } 409ab3b8b22SHan Ming Ong 4105160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 411ab3b8b22SHan Ming Ong if (log) 412d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 413324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 414324a1036SSaleem Abdulrasool static_cast<int>(bytes_read), dst, 415324a1036SSaleem Abdulrasool static_cast<uint64_t>(dst_len), 416324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 417ab3b8b22SHan Ming Ong 418ab3b8b22SHan Ming Ong return bytes_read; 419ab3b8b22SHan Ming Ong } 420ab3b8b22SHan Ming Ong 42130fdc8d8SChris Lattner void 4222976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 42330fdc8d8SChris Lattner { 42430fdc8d8SChris Lattner if (out == NULL) 42530fdc8d8SChris Lattner return; 42630fdc8d8SChris Lattner 427acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 428acdbe816SGreg Clayton if (process_sp) 42930fdc8d8SChris Lattner { 43030fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 43130fdc8d8SChris Lattner char message[1024]; 43230fdc8d8SChris Lattner int message_len = ::snprintf (message, 43330fdc8d8SChris Lattner sizeof (message), 434d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 435acdbe816SGreg Clayton process_sp->GetID(), 43630fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 43730fdc8d8SChris Lattner 43830fdc8d8SChris Lattner if (message_len > 0) 43930fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 44030fdc8d8SChris Lattner } 44130fdc8d8SChris Lattner } 44230fdc8d8SChris Lattner 44330fdc8d8SChris Lattner void 4442976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 44530fdc8d8SChris Lattner { 446acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 447acdbe816SGreg Clayton if (process_sp) 44830fdc8d8SChris Lattner { 44930fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 45030fdc8d8SChris Lattner char message[1024]; 45130fdc8d8SChris Lattner ::snprintf (message, 45230fdc8d8SChris Lattner sizeof (message), 453d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 454acdbe816SGreg Clayton process_sp->GetID(), 45530fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 45630fdc8d8SChris Lattner 45730fdc8d8SChris Lattner result.AppendMessage (message); 45830fdc8d8SChris Lattner } 45930fdc8d8SChris Lattner } 46030fdc8d8SChris Lattner 46130fdc8d8SChris Lattner bool 4622976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 46330fdc8d8SChris Lattner { 464acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 465acdbe816SGreg Clayton if (process_sp) 466af67cecdSGreg Clayton { 467acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 468acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 469af67cecdSGreg Clayton } 47030fdc8d8SChris Lattner return false; 47130fdc8d8SChris Lattner } 47230fdc8d8SChris Lattner 47330fdc8d8SChris Lattner bool 474ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid) 475ea561dcfSGreg Clayton { 4765160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 477ceb6b139SCaroline Tice 478ceb6b139SCaroline Tice bool ret_val = false; 479acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 480acdbe816SGreg Clayton if (process_sp) 481af67cecdSGreg Clayton { 482acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 483acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 484af67cecdSGreg Clayton } 485ceb6b139SCaroline Tice 486ceb6b139SCaroline Tice if (log) 487d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s", 488324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, 489324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 490ceb6b139SCaroline Tice 491ceb6b139SCaroline Tice return ret_val; 49230fdc8d8SChris Lattner } 49330fdc8d8SChris Lattner 49418b46896SJim Ingham bool 49518b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 49618b46896SJim Ingham { 4975160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 49818b46896SJim Ingham 49918b46896SJim Ingham bool ret_val = false; 50018b46896SJim Ingham ProcessSP process_sp(GetSP()); 50118b46896SJim Ingham if (process_sp) 50218b46896SJim Ingham { 50318b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 50418b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 50518b46896SJim Ingham } 50618b46896SJim Ingham 50718b46896SJim Ingham if (log) 50818b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 509324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), index_id, 510324a1036SSaleem Abdulrasool (ret_val ? "true" : "false")); 51118b46896SJim Ingham 51218b46896SJim Ingham return ret_val; 51318b46896SJim Ingham } 51418b46896SJim Ingham 51530fdc8d8SChris Lattner SBThread 51630fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 51730fdc8d8SChris Lattner { 5185160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 519ceb6b139SCaroline Tice 52017a6ad05SGreg Clayton SBThread sb_thread; 52117a6ad05SGreg Clayton ThreadSP thread_sp; 522acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 523acdbe816SGreg Clayton if (process_sp) 524af67cecdSGreg Clayton { 5257fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5267fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 527acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 5287fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 52917a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 530af67cecdSGreg Clayton } 531ceb6b139SCaroline Tice 532ceb6b139SCaroline Tice if (log) 53393aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 534324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 535324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 536324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 537ceb6b139SCaroline Tice 53817a6ad05SGreg Clayton return sb_thread; 53930fdc8d8SChris Lattner } 54030fdc8d8SChris Lattner 541bf2956a2SJim Ingham uint32_t 5425e8dce4dSJason Molenda SBProcess::GetNumQueues () 5435e8dce4dSJason Molenda { 5445e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5455e8dce4dSJason Molenda 5465e8dce4dSJason Molenda uint32_t num_queues = 0; 5475e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 5485e8dce4dSJason Molenda if (process_sp) 5495e8dce4dSJason Molenda { 5505e8dce4dSJason Molenda Process::StopLocker stop_locker; 5515e8dce4dSJason Molenda 5525e8dce4dSJason Molenda Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 5535e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 5545e8dce4dSJason Molenda } 5555e8dce4dSJason Molenda 5565e8dce4dSJason Molenda if (log) 557324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetNumQueues () => %d", 558324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num_queues); 5595e8dce4dSJason Molenda 5605e8dce4dSJason Molenda return num_queues; 5615e8dce4dSJason Molenda } 5625e8dce4dSJason Molenda 5635e8dce4dSJason Molenda SBQueue 5645e8dce4dSJason Molenda SBProcess::GetQueueAtIndex (size_t index) 5655e8dce4dSJason Molenda { 5665e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5675e8dce4dSJason Molenda 5685e8dce4dSJason Molenda SBQueue sb_queue; 5695e8dce4dSJason Molenda QueueSP queue_sp; 5705e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 5715e8dce4dSJason Molenda if (process_sp) 5725e8dce4dSJason Molenda { 5735e8dce4dSJason Molenda Process::StopLocker stop_locker; 5745e8dce4dSJason Molenda Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 5755e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 5765e8dce4dSJason Molenda sb_queue.SetQueue (queue_sp); 5775e8dce4dSJason Molenda } 5785e8dce4dSJason Molenda 5795e8dce4dSJason Molenda if (log) 5805e8dce4dSJason Molenda log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", 581324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 582324a1036SSaleem Abdulrasool static_cast<uint32_t>(index), 583324a1036SSaleem Abdulrasool static_cast<void*>(queue_sp.get())); 5845e8dce4dSJason Molenda 5855e8dce4dSJason Molenda return sb_queue; 5865e8dce4dSJason Molenda } 5875e8dce4dSJason Molenda 5885e8dce4dSJason Molenda 5895e8dce4dSJason Molenda uint32_t 590bf2956a2SJim Ingham SBProcess::GetStopID(bool include_expression_stops) 591bf2956a2SJim Ingham { 592bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 593bf2956a2SJim Ingham if (process_sp) 594bf2956a2SJim Ingham { 595bf2956a2SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 596bf2956a2SJim Ingham if (include_expression_stops) 597bf2956a2SJim Ingham return process_sp->GetStopID(); 598bf2956a2SJim Ingham else 599bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 600bf2956a2SJim Ingham } 601bf2956a2SJim Ingham return 0; 602bf2956a2SJim Ingham } 603bf2956a2SJim Ingham 60438810f43SIlia K SBEvent 60538810f43SIlia K SBProcess::GetStopEventForStopID(uint32_t stop_id) 60638810f43SIlia K { 60738810f43SIlia K Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 60838810f43SIlia K 60938810f43SIlia K SBEvent sb_event; 61038810f43SIlia K EventSP event_sp; 61138810f43SIlia K ProcessSP process_sp(GetSP()); 61238810f43SIlia K if (process_sp) 61338810f43SIlia K { 61438810f43SIlia K Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 61538810f43SIlia K event_sp = process_sp->GetStopEventForStopID(stop_id); 61638810f43SIlia K sb_event.reset(event_sp); 61738810f43SIlia K } 61838810f43SIlia K 61938810f43SIlia K if (log) 62038810f43SIlia K log->Printf ("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 ") => SBEvent(%p)", 62138810f43SIlia K static_cast<void*>(process_sp.get()), 62238810f43SIlia K stop_id, 62338810f43SIlia K static_cast<void*>(event_sp.get())); 62438810f43SIlia K 62538810f43SIlia K return sb_event; 62638810f43SIlia K } 62738810f43SIlia K 62830fdc8d8SChris Lattner StateType 62930fdc8d8SChris Lattner SBProcess::GetState () 63030fdc8d8SChris Lattner { 631ceb6b139SCaroline Tice 632ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 633acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 634acdbe816SGreg Clayton if (process_sp) 635af67cecdSGreg Clayton { 636acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 637acdbe816SGreg Clayton ret_val = process_sp->GetState(); 638af67cecdSGreg Clayton } 639ceb6b139SCaroline Tice 6405160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 641ceb6b139SCaroline Tice if (log) 642cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 643324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 644750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 645ceb6b139SCaroline Tice 646ceb6b139SCaroline Tice return ret_val; 64730fdc8d8SChris Lattner } 64830fdc8d8SChris Lattner 64930fdc8d8SChris Lattner 65030fdc8d8SChris Lattner int 65130fdc8d8SChris Lattner SBProcess::GetExitStatus () 65230fdc8d8SChris Lattner { 6534838131bSGreg Clayton int exit_status = 0; 654acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 655acdbe816SGreg Clayton if (process_sp) 656af67cecdSGreg Clayton { 657acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 658acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 659af67cecdSGreg Clayton } 6605160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6614838131bSGreg Clayton if (log) 6624838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 663324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), exit_status, 664324a1036SSaleem Abdulrasool exit_status); 6654838131bSGreg Clayton 6664838131bSGreg Clayton return exit_status; 66730fdc8d8SChris Lattner } 66830fdc8d8SChris Lattner 66930fdc8d8SChris Lattner const char * 67030fdc8d8SChris Lattner SBProcess::GetExitDescription () 67130fdc8d8SChris Lattner { 6724838131bSGreg Clayton const char *exit_desc = NULL; 673acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 674acdbe816SGreg Clayton if (process_sp) 675af67cecdSGreg Clayton { 676acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 677acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 678af67cecdSGreg Clayton } 6795160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6804838131bSGreg Clayton if (log) 6814838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 682324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), exit_desc); 6834838131bSGreg Clayton return exit_desc; 68430fdc8d8SChris Lattner } 68530fdc8d8SChris Lattner 68630fdc8d8SChris Lattner lldb::pid_t 68730fdc8d8SChris Lattner SBProcess::GetProcessID () 68830fdc8d8SChris Lattner { 689ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 690acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 691acdbe816SGreg Clayton if (process_sp) 692acdbe816SGreg Clayton ret_val = process_sp->GetID(); 693ceb6b139SCaroline Tice 6945160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 695ceb6b139SCaroline Tice if (log) 696324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, 697324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), ret_val); 698ceb6b139SCaroline Tice 699ceb6b139SCaroline Tice return ret_val; 70030fdc8d8SChris Lattner } 70130fdc8d8SChris Lattner 702949e8221SGreg Clayton uint32_t 703949e8221SGreg Clayton SBProcess::GetUniqueID() 704949e8221SGreg Clayton { 705949e8221SGreg Clayton uint32_t ret_val = 0; 706949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 707949e8221SGreg Clayton if (process_sp) 708949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 7095160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 710949e8221SGreg Clayton if (log) 711324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, 712324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), ret_val); 713949e8221SGreg Clayton return ret_val; 714949e8221SGreg Clayton } 715949e8221SGreg Clayton 716cf386e24SJohnny Chen ByteOrder 717cf386e24SJohnny Chen SBProcess::GetByteOrder () const 718cf386e24SJohnny Chen { 719cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 720acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 721acdbe816SGreg Clayton if (process_sp) 722acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 723cf386e24SJohnny Chen 7245160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 725cf386e24SJohnny Chen if (log) 726324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetByteOrder () => %d", 727324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), byteOrder); 728cf386e24SJohnny Chen 729cf386e24SJohnny Chen return byteOrder; 730cf386e24SJohnny Chen } 731cf386e24SJohnny Chen 73230fdc8d8SChris Lattner uint32_t 73330fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 73430fdc8d8SChris Lattner { 735ceb6b139SCaroline Tice uint32_t size = 0; 736acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 737acdbe816SGreg Clayton if (process_sp) 738acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 739ceb6b139SCaroline Tice 7405160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 741ceb6b139SCaroline Tice if (log) 742324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", 743324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), size); 744ceb6b139SCaroline Tice 745ceb6b139SCaroline Tice return size; 74630fdc8d8SChris Lattner } 74730fdc8d8SChris Lattner 74830fdc8d8SChris Lattner SBError 74930fdc8d8SChris Lattner SBProcess::Continue () 75030fdc8d8SChris Lattner { 7515160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 752ceb6b139SCaroline Tice 75330fdc8d8SChris Lattner SBError sb_error; 754acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 7550c74e78dSGreg Clayton 756acdbe816SGreg Clayton if (log) 757324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::Continue ()...", 758324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 759acdbe816SGreg Clayton 760acdbe816SGreg Clayton if (process_sp) 761acdbe816SGreg Clayton { 762acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 763acdbe816SGreg Clayton 764dc6224e0SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution ()) 765dc6224e0SGreg Clayton sb_error.ref() = process_sp->Resume (); 766dc6224e0SGreg Clayton else 767dc6224e0SGreg Clayton sb_error.ref() = process_sp->ResumeSynchronous (NULL); 7685d5028b5SGreg Clayton } 76930fdc8d8SChris Lattner else 77030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 77130fdc8d8SChris Lattner 772ceb6b139SCaroline Tice if (log) 773ceb6b139SCaroline Tice { 774ceb6b139SCaroline Tice SBStream sstr; 775ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 776324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", 777324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 778324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 779ceb6b139SCaroline Tice } 780ceb6b139SCaroline Tice 78130fdc8d8SChris Lattner return sb_error; 78230fdc8d8SChris Lattner } 78330fdc8d8SChris Lattner 78430fdc8d8SChris Lattner 78530fdc8d8SChris Lattner SBError 78630fdc8d8SChris Lattner SBProcess::Destroy () 78730fdc8d8SChris Lattner { 78830fdc8d8SChris Lattner SBError sb_error; 789acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 790acdbe816SGreg Clayton if (process_sp) 7916779606aSGreg Clayton { 792acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 793ede3193bSJason Molenda sb_error.SetError(process_sp->Destroy(false)); 7946779606aSGreg Clayton } 79530fdc8d8SChris Lattner else 79630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 79730fdc8d8SChris Lattner 7985160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7994838131bSGreg Clayton if (log) 8004838131bSGreg Clayton { 8014838131bSGreg Clayton SBStream sstr; 8024838131bSGreg Clayton sb_error.GetDescription (sstr); 8036779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 804324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 805324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 8064838131bSGreg Clayton } 8074838131bSGreg Clayton 80830fdc8d8SChris Lattner return sb_error; 80930fdc8d8SChris Lattner } 81030fdc8d8SChris Lattner 81130fdc8d8SChris Lattner 81230fdc8d8SChris Lattner SBError 81330fdc8d8SChris Lattner SBProcess::Stop () 81430fdc8d8SChris Lattner { 81530fdc8d8SChris Lattner SBError sb_error; 816acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 817acdbe816SGreg Clayton if (process_sp) 818af67cecdSGreg Clayton { 819acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 820acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 821af67cecdSGreg Clayton } 82230fdc8d8SChris Lattner else 82330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 824ceb6b139SCaroline Tice 8255160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 826ceb6b139SCaroline Tice if (log) 827ceb6b139SCaroline Tice { 828ceb6b139SCaroline Tice SBStream sstr; 829ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 83093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 831324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 832324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 833ceb6b139SCaroline Tice } 834ceb6b139SCaroline Tice 83530fdc8d8SChris Lattner return sb_error; 83630fdc8d8SChris Lattner } 83730fdc8d8SChris Lattner 83830fdc8d8SChris Lattner SBError 83930fdc8d8SChris Lattner SBProcess::Kill () 84030fdc8d8SChris Lattner { 84130fdc8d8SChris Lattner SBError sb_error; 842acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 843acdbe816SGreg Clayton if (process_sp) 844af67cecdSGreg Clayton { 845acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 846ede3193bSJason Molenda sb_error.SetError (process_sp->Destroy(true)); 847af67cecdSGreg Clayton } 84830fdc8d8SChris Lattner else 84930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 850ceb6b139SCaroline Tice 8515160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 852ceb6b139SCaroline Tice if (log) 853ceb6b139SCaroline Tice { 854ceb6b139SCaroline Tice SBStream sstr; 855ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 85693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 857324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 858324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 859ceb6b139SCaroline Tice } 860ceb6b139SCaroline Tice 86130fdc8d8SChris Lattner return sb_error; 86230fdc8d8SChris Lattner } 86330fdc8d8SChris Lattner 86430fdc8d8SChris Lattner SBError 86530fdc8d8SChris Lattner SBProcess::Detach () 86630fdc8d8SChris Lattner { 867acff8950SJim Ingham // FIXME: This should come from a process default. 868acff8950SJim Ingham bool keep_stopped = false; 869acff8950SJim Ingham return Detach (keep_stopped); 870acff8950SJim Ingham } 871acff8950SJim Ingham 872acff8950SJim Ingham SBError 873acff8950SJim Ingham SBProcess::Detach (bool keep_stopped) 874acff8950SJim Ingham { 87530fdc8d8SChris Lattner SBError sb_error; 876acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 877acdbe816SGreg Clayton if (process_sp) 878af67cecdSGreg Clayton { 879acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 880acff8950SJim Ingham sb_error.SetError (process_sp->Detach(keep_stopped)); 881af67cecdSGreg Clayton } 88230fdc8d8SChris Lattner else 88330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 88430fdc8d8SChris Lattner 88530fdc8d8SChris Lattner return sb_error; 88630fdc8d8SChris Lattner } 88730fdc8d8SChris Lattner 88830fdc8d8SChris Lattner SBError 8894838131bSGreg Clayton SBProcess::Signal (int signo) 89030fdc8d8SChris Lattner { 89130fdc8d8SChris Lattner SBError sb_error; 892acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 893acdbe816SGreg Clayton if (process_sp) 894af67cecdSGreg Clayton { 895acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 896acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 897af67cecdSGreg Clayton } 89830fdc8d8SChris Lattner else 89930fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 9005160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9014838131bSGreg Clayton if (log) 9024838131bSGreg Clayton { 9034838131bSGreg Clayton SBStream sstr; 9044838131bSGreg Clayton sb_error.GetDescription (sstr); 9054838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 906324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), signo, 907324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData()); 9084838131bSGreg Clayton } 90930fdc8d8SChris Lattner return sb_error; 91030fdc8d8SChris Lattner } 91130fdc8d8SChris Lattner 912802dc402STodd Fiala SBUnixSignals 913802dc402STodd Fiala SBProcess::GetUnixSignals() 914802dc402STodd Fiala { 915802dc402STodd Fiala SBUnixSignals sb_unix_signals; 916802dc402STodd Fiala ProcessSP process_sp(GetSP()); 917802dc402STodd Fiala if (process_sp) 918802dc402STodd Fiala { 919802dc402STodd Fiala sb_unix_signals.SetSP(process_sp); 920802dc402STodd Fiala } 921802dc402STodd Fiala 922802dc402STodd Fiala return sb_unix_signals; 923802dc402STodd Fiala } 924802dc402STodd Fiala 925cfc0935eSJim Ingham void 926cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 927cfc0935eSJim Ingham { 928cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 929cfc0935eSJim Ingham if (process_sp) 930cfc0935eSJim Ingham { 931cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 932cfc0935eSJim Ingham } 933cfc0935eSJim Ingham } 934cfc0935eSJim Ingham 93530fdc8d8SChris Lattner SBThread 9364838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 93730fdc8d8SChris Lattner { 9384838131bSGreg Clayton SBThread sb_thread; 93917a6ad05SGreg Clayton ThreadSP thread_sp; 940acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 941acdbe816SGreg Clayton if (process_sp) 942af67cecdSGreg Clayton { 9437fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9447fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 9455bf72c46SHafiz Abid Qadeer Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9467fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 94717a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 948af67cecdSGreg Clayton } 9494838131bSGreg Clayton 9505160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9514838131bSGreg Clayton if (log) 952d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)", 953324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), tid, 954324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 9554838131bSGreg Clayton 9564838131bSGreg Clayton return sb_thread; 95730fdc8d8SChris Lattner } 95830fdc8d8SChris Lattner 95918b46896SJim Ingham SBThread 96018b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 96118b46896SJim Ingham { 96218b46896SJim Ingham SBThread sb_thread; 96318b46896SJim Ingham ThreadSP thread_sp; 96418b46896SJim Ingham ProcessSP process_sp(GetSP()); 96518b46896SJim Ingham if (process_sp) 96618b46896SJim Ingham { 96718b46896SJim Ingham Process::StopLocker stop_locker; 96818b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 9695bf72c46SHafiz Abid Qadeer Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 97018b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 97118b46896SJim Ingham sb_thread.SetThread (thread_sp); 97218b46896SJim Ingham } 97318b46896SJim Ingham 9745160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 97518b46896SJim Ingham if (log) 97618b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 977324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), index_id, 978324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get())); 97918b46896SJim Ingham 98018b46896SJim Ingham return sb_thread; 98118b46896SJim Ingham } 98218b46896SJim Ingham 98330fdc8d8SChris Lattner StateType 98430fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 98530fdc8d8SChris Lattner { 9865160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 987ceb6b139SCaroline Tice 988ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 989ceb6b139SCaroline Tice 990ceb6b139SCaroline Tice if (log) 991324a1036SSaleem Abdulrasool log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", 992324a1036SSaleem Abdulrasool static_cast<void*>(event.get()), 993750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 994ceb6b139SCaroline Tice 995ceb6b139SCaroline Tice return ret_val; 99630fdc8d8SChris Lattner } 99730fdc8d8SChris Lattner 99830fdc8d8SChris Lattner bool 99930fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 100030fdc8d8SChris Lattner { 10016611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 100230fdc8d8SChris Lattner } 100330fdc8d8SChris Lattner 10040161b49cSJim Ingham size_t 10050161b49cSJim Ingham SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event) 10060161b49cSJim Ingham { 10070161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 10080161b49cSJim Ingham } 10090161b49cSJim Ingham 10100161b49cSJim Ingham const char * 10110161b49cSJim Ingham SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx) 10120161b49cSJim Ingham { 10130161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 10140161b49cSJim Ingham } 10150161b49cSJim Ingham 101630fdc8d8SChris Lattner SBProcess 101730fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 101830fdc8d8SChris Lattner { 10196611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 102030fdc8d8SChris Lattner return process; 102130fdc8d8SChris Lattner } 102230fdc8d8SChris Lattner 1023e6bc6cb9SJim Ingham bool 102406d2855fSIlia K SBProcess::GetInterruptedFromEvent (const SBEvent &event) 102506d2855fSIlia K { 102606d2855fSIlia K return Process::ProcessEventData::GetInterruptedFromEvent(event.get()); 102706d2855fSIlia K } 102806d2855fSIlia K 102906d2855fSIlia K bool 1030e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 1031e6bc6cb9SJim Ingham { 1032f9e5dc16SIlia K return event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass(); 1033e6bc6cb9SJim Ingham } 103430fdc8d8SChris Lattner 103530fdc8d8SChris Lattner SBBroadcaster 103630fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 103730fdc8d8SChris Lattner { 10385160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1039ceb6b139SCaroline Tice 1040acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1041acdbe816SGreg Clayton 1042acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 1043ceb6b139SCaroline Tice 1044ceb6b139SCaroline Tice if (log) 1045324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", 1046324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), 1047324a1036SSaleem Abdulrasool static_cast<void*>(broadcaster.get())); 1048ceb6b139SCaroline Tice 104930fdc8d8SChris Lattner return broadcaster; 105030fdc8d8SChris Lattner } 105130fdc8d8SChris Lattner 10524bddaeb5SJim Ingham const char * 10534bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 10544bddaeb5SJim Ingham { 10554bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 10564bddaeb5SJim Ingham } 10574bddaeb5SJim Ingham 105830fdc8d8SChris Lattner size_t 105930fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 106030fdc8d8SChris Lattner { 10615160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1062ceb6b139SCaroline Tice 106330fdc8d8SChris Lattner size_t bytes_read = 0; 106430fdc8d8SChris Lattner 1065acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1066acdbe816SGreg Clayton 10674838131bSGreg Clayton if (log) 1068d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 1069324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1070324a1036SSaleem Abdulrasool static_cast<void*>(dst), static_cast<uint64_t>(dst_len), 1071324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get())); 10724838131bSGreg Clayton 1073acdbe816SGreg Clayton if (process_sp) 107430fdc8d8SChris Lattner { 10757fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10767fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10777fdf9ef1SGreg Clayton { 1078acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10797fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 10807fdf9ef1SGreg Clayton } 10817fdf9ef1SGreg Clayton else 10827fdf9ef1SGreg Clayton { 1083c9858e4dSGreg Clayton if (log) 1084324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", 1085324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 10867fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10877fdf9ef1SGreg Clayton } 108830fdc8d8SChris Lattner } 108930fdc8d8SChris Lattner else 109030fdc8d8SChris Lattner { 109130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 109230fdc8d8SChris Lattner } 109330fdc8d8SChris Lattner 1094ceb6b139SCaroline Tice if (log) 109593aa84e8SGreg Clayton { 109693aa84e8SGreg Clayton SBStream sstr; 109793aa84e8SGreg Clayton sb_error.GetDescription (sstr); 1098d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1099324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1100324a1036SSaleem Abdulrasool static_cast<void*>(dst), static_cast<uint64_t>(dst_len), 1101324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData(), 1102324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_read)); 110393aa84e8SGreg Clayton } 1104ceb6b139SCaroline Tice 110530fdc8d8SChris Lattner return bytes_read; 110630fdc8d8SChris Lattner } 110730fdc8d8SChris Lattner 110830fdc8d8SChris Lattner size_t 1109e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 1110e91b7957SGreg Clayton { 1111e91b7957SGreg Clayton size_t bytes_read = 0; 1112acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1113acdbe816SGreg Clayton if (process_sp) 1114e91b7957SGreg Clayton { 11157fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11167fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11177fdf9ef1SGreg Clayton { 1118acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11197fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 11207fdf9ef1SGreg Clayton } 11217fdf9ef1SGreg Clayton else 11227fdf9ef1SGreg Clayton { 11235160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1124c9858e4dSGreg Clayton if (log) 1125324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", 1126324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11277fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11287fdf9ef1SGreg Clayton } 1129e91b7957SGreg Clayton } 1130e91b7957SGreg Clayton else 1131e91b7957SGreg Clayton { 1132e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1133e91b7957SGreg Clayton } 1134e91b7957SGreg Clayton return bytes_read; 1135e91b7957SGreg Clayton } 1136e91b7957SGreg Clayton 1137e91b7957SGreg Clayton uint64_t 1138e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 1139e91b7957SGreg Clayton { 11407fdf9ef1SGreg Clayton uint64_t value = 0; 1141acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1142acdbe816SGreg Clayton if (process_sp) 1143e91b7957SGreg Clayton { 11447fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11457fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11467fdf9ef1SGreg Clayton { 1147acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11487fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 11497fdf9ef1SGreg Clayton } 11507fdf9ef1SGreg Clayton else 11517fdf9ef1SGreg Clayton { 11525160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1153c9858e4dSGreg Clayton if (log) 1154324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", 1155324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11567fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11577fdf9ef1SGreg Clayton } 1158e91b7957SGreg Clayton } 1159e91b7957SGreg Clayton else 1160e91b7957SGreg Clayton { 1161e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1162e91b7957SGreg Clayton } 11637fdf9ef1SGreg Clayton return value; 1164e91b7957SGreg Clayton } 1165e91b7957SGreg Clayton 1166e91b7957SGreg Clayton lldb::addr_t 1167e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 1168e91b7957SGreg Clayton { 1169e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1170acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1171acdbe816SGreg Clayton if (process_sp) 1172e91b7957SGreg Clayton { 11737fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11747fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11757fdf9ef1SGreg Clayton { 1176acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11777fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 11787fdf9ef1SGreg Clayton } 11797fdf9ef1SGreg Clayton else 11807fdf9ef1SGreg Clayton { 11815160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1182c9858e4dSGreg Clayton if (log) 1183324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", 1184324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 11857fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11867fdf9ef1SGreg Clayton } 1187e91b7957SGreg Clayton } 1188e91b7957SGreg Clayton else 1189e91b7957SGreg Clayton { 1190e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1191e91b7957SGreg Clayton } 1192e91b7957SGreg Clayton return ptr; 1193e91b7957SGreg Clayton } 1194e91b7957SGreg Clayton 1195e91b7957SGreg Clayton size_t 119630fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 119730fdc8d8SChris Lattner { 119830fdc8d8SChris Lattner size_t bytes_written = 0; 119930fdc8d8SChris Lattner 12005160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1201acdbe816SGreg Clayton 1202acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1203acdbe816SGreg Clayton 12044838131bSGreg Clayton if (log) 1205d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1206324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1207324a1036SSaleem Abdulrasool static_cast<const void*>(src), 1208324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 1209324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get())); 12104838131bSGreg Clayton 1211acdbe816SGreg Clayton if (process_sp) 121230fdc8d8SChris Lattner { 12137fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12147fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12157fdf9ef1SGreg Clayton { 1216acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 12177fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 12187fdf9ef1SGreg Clayton } 12197fdf9ef1SGreg Clayton else 12207fdf9ef1SGreg Clayton { 1221c9858e4dSGreg Clayton if (log) 1222324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", 1223324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 12247fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12257fdf9ef1SGreg Clayton } 122630fdc8d8SChris Lattner } 122730fdc8d8SChris Lattner 12284838131bSGreg Clayton if (log) 12294838131bSGreg Clayton { 12304838131bSGreg Clayton SBStream sstr; 12314838131bSGreg Clayton sb_error.GetDescription (sstr); 1232d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1233324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), addr, 1234324a1036SSaleem Abdulrasool static_cast<const void*>(src), 1235324a1036SSaleem Abdulrasool static_cast<uint64_t>(src_len), 1236324a1036SSaleem Abdulrasool static_cast<void*>(sb_error.get()), sstr.GetData(), 1237324a1036SSaleem Abdulrasool static_cast<uint64_t>(bytes_written)); 12384838131bSGreg Clayton } 12394838131bSGreg Clayton 124030fdc8d8SChris Lattner return bytes_written; 124130fdc8d8SChris Lattner } 124230fdc8d8SChris Lattner 1243dde9cff3SCaroline Tice bool 1244dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1245dde9cff3SCaroline Tice { 1246da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1247da7bc7d0SGreg Clayton 1248acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1249acdbe816SGreg Clayton if (process_sp) 1250dde9cff3SCaroline Tice { 1251dde9cff3SCaroline Tice char path[PATH_MAX]; 1252dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1253acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 12541d273166SGreg Clayton const char *exe_name = NULL; 12551d273166SGreg Clayton if (exe_module) 12561d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 12571d273166SGreg Clayton 1258d01b2953SDaniel Malea strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1259acdbe816SGreg Clayton process_sp->GetID(), 1260ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 12611d273166SGreg Clayton GetNumThreads(), 126205faeb71SGreg Clayton exe_name ? ", executable = " : "", 12631d273166SGreg Clayton exe_name ? exe_name : ""); 1264dde9cff3SCaroline Tice } 1265dde9cff3SCaroline Tice else 1266da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1267dde9cff3SCaroline Tice 1268dde9cff3SCaroline Tice return true; 1269dde9cff3SCaroline Tice } 12708f343b09SGreg Clayton 12718f343b09SGreg Clayton uint32_t 1272f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1273f9ef60d2SJohnny Chen { 12745160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1275f9ef60d2SJohnny Chen 1276f9ef60d2SJohnny Chen uint32_t num = 0; 1277f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1278f9ef60d2SJohnny Chen if (process_sp) 1279f9ef60d2SJohnny Chen { 1280f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1281f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1282f9ef60d2SJohnny Chen if (log) 1283f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1284324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get()), num); 1285f9ef60d2SJohnny Chen } 1286f9ef60d2SJohnny Chen else 1287f9ef60d2SJohnny Chen { 1288f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1289f9ef60d2SJohnny Chen } 1290f9ef60d2SJohnny Chen return num; 1291f9ef60d2SJohnny Chen } 1292f9ef60d2SJohnny Chen 1293f9ef60d2SJohnny Chen uint32_t 12948f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 12958f343b09SGreg Clayton { 1296acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1297acdbe816SGreg Clayton if (process_sp) 1298af67cecdSGreg Clayton { 12997fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13007fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 13017fdf9ef1SGreg Clayton { 1302acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1303acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1304af67cecdSGreg Clayton } 13057fdf9ef1SGreg Clayton else 13067fdf9ef1SGreg Clayton { 13075160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1308c9858e4dSGreg Clayton if (log) 1309324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", 1310324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 13117fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 13127fdf9ef1SGreg Clayton } 13137fdf9ef1SGreg Clayton } 13148f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 13158f343b09SGreg Clayton } 13168f343b09SGreg Clayton 13178f343b09SGreg Clayton lldb::SBError 13188f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 13198f343b09SGreg Clayton { 13208f343b09SGreg Clayton lldb::SBError sb_error; 1321acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1322acdbe816SGreg Clayton if (process_sp) 1323af67cecdSGreg Clayton { 13247fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13257fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 13267fdf9ef1SGreg Clayton { 1327acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1328acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1329af67cecdSGreg Clayton } 13308f343b09SGreg Clayton else 13317fdf9ef1SGreg Clayton { 13325160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1333c9858e4dSGreg Clayton if (log) 1334324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", 1335324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 13367fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 13377fdf9ef1SGreg Clayton } 13387fdf9ef1SGreg Clayton } 13397fdf9ef1SGreg Clayton else 13408f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 13418f343b09SGreg Clayton return sb_error; 13428f343b09SGreg Clayton } 13438c71337aSJason Molenda 1344a332978bSJason Molenda lldb::SBError 1345a332978bSJason Molenda SBProcess::SendEventData (const char *event_data) 1346a332978bSJason Molenda { 1347a332978bSJason Molenda lldb::SBError sb_error; 1348a332978bSJason Molenda ProcessSP process_sp(GetSP()); 1349a332978bSJason Molenda if (process_sp) 1350a332978bSJason Molenda { 1351a332978bSJason Molenda Process::StopLocker stop_locker; 1352a332978bSJason Molenda if (stop_locker.TryLock(&process_sp->GetRunLock())) 1353a332978bSJason Molenda { 1354a332978bSJason Molenda Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1355a332978bSJason Molenda sb_error.SetError (process_sp->SendEventData (event_data)); 1356a332978bSJason Molenda } 1357a332978bSJason Molenda else 1358a332978bSJason Molenda { 1359a332978bSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1360a332978bSJason Molenda if (log) 1361324a1036SSaleem Abdulrasool log->Printf ("SBProcess(%p)::SendEventData() => error: process is running", 1362324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 1363a332978bSJason Molenda sb_error.SetErrorString("process is running"); 1364a332978bSJason Molenda } 1365a332978bSJason Molenda } 1366a332978bSJason Molenda else 1367a332978bSJason Molenda sb_error.SetErrorString("invalid process"); 1368a332978bSJason Molenda return sb_error; 1369a332978bSJason Molenda } 1370a332978bSJason Molenda 13718c71337aSJason Molenda uint32_t 137295d005c7SJason Molenda SBProcess::GetNumExtendedBacktraceTypes () 13738c71337aSJason Molenda { 13748c71337aSJason Molenda ProcessSP process_sp(GetSP()); 13758c71337aSJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 13768c71337aSJason Molenda { 13778c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 137895d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 13798c71337aSJason Molenda } 13808c71337aSJason Molenda return 0; 13818c71337aSJason Molenda } 13828c71337aSJason Molenda 13838c71337aSJason Molenda const char * 138495d005c7SJason Molenda SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx) 13858c71337aSJason Molenda { 13868c71337aSJason Molenda ProcessSP process_sp(GetSP()); 13878c71337aSJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 13888c71337aSJason Molenda { 13898c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1390008c45f1SJason Molenda const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes(); 13918c71337aSJason Molenda if (idx < names.size()) 13928c71337aSJason Molenda { 13938c71337aSJason Molenda return names[idx].AsCString(); 13948c71337aSJason Molenda } 13958c71337aSJason Molenda else 13968c71337aSJason Molenda { 13978c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 13988c71337aSJason Molenda if (log) 1399324a1036SSaleem Abdulrasool log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds", 1400324a1036SSaleem Abdulrasool static_cast<void*>(process_sp.get())); 14018c71337aSJason Molenda } 14028c71337aSJason Molenda } 14038c71337aSJason Molenda return NULL; 14048c71337aSJason Molenda } 1405a51ea382SKuba Brecka 1406a51ea382SKuba Brecka SBThreadCollection 1407a51ea382SKuba Brecka SBProcess::GetHistoryThreads (addr_t addr) 1408a51ea382SKuba Brecka { 1409a51ea382SKuba Brecka ProcessSP process_sp(GetSP()); 1410a51ea382SKuba Brecka SBThreadCollection threads; 1411a51ea382SKuba Brecka if (process_sp) 1412a51ea382SKuba Brecka { 1413a51ea382SKuba Brecka threads = SBThreadCollection(process_sp->GetHistoryThreads(addr)); 1414a51ea382SKuba Brecka } 1415a51ea382SKuba Brecka return threads; 1416a51ea382SKuba Brecka } 141763927548SKuba Brecka 141863927548SKuba Brecka bool 141963927548SKuba Brecka SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type) 142063927548SKuba Brecka { 142163927548SKuba Brecka ProcessSP process_sp(GetSP()); 142263927548SKuba Brecka if (! process_sp) 142363927548SKuba Brecka return false; 142463927548SKuba Brecka 142563927548SKuba Brecka InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type); 142663927548SKuba Brecka 142763927548SKuba Brecka if (! runtime_sp.get()) 142863927548SKuba Brecka return false; 142963927548SKuba Brecka 143063927548SKuba Brecka return runtime_sp->IsActive(); 143163927548SKuba Brecka } 1432