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" 41dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 424c5de699SEli Friedman #include "lldb/API/SBStringList.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)); 1519631aae2SJames McIlree 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))...", 1534e0fe8abSGreg Clayton m_opaque_wp.lock().get(), 1549631aae2SJames McIlree argv, 1559631aae2SJames McIlree envp, 1569631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1579631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1589631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1599631aae2SJames McIlree working_directory ? working_directory : "NULL", 1609631aae2SJames McIlree launch_flags, 1619631aae2SJames McIlree stop_at_entry, 1629631aae2SJames McIlree error.get()); 1639631aae2SJames McIlree } 1649631aae2SJames McIlree 165acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 166acdbe816SGreg Clayton if (process_sp) 1679631aae2SJames McIlree { 168acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 169acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1709631aae2SJames McIlree { 171982c9762SGreg Clayton if (stop_at_entry) 172982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 173982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 174982c9762SGreg Clayton stdout_path, 175982c9762SGreg Clayton stderr_path, 176982c9762SGreg Clayton working_directory, 177982c9762SGreg Clayton launch_flags); 178acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 179982c9762SGreg Clayton if (exe_module) 18014715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 181982c9762SGreg Clayton if (argv) 182982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 183982c9762SGreg Clayton if (envp) 184982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 185acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1869631aae2SJames McIlree } 1879631aae2SJames McIlree else 1889631aae2SJames McIlree { 1899631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1909631aae2SJames McIlree } 1919631aae2SJames McIlree } 1929631aae2SJames McIlree else 1939631aae2SJames McIlree { 1949631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1959631aae2SJames McIlree } 1969631aae2SJames McIlree 1979631aae2SJames McIlree if (log) { 1989631aae2SJames McIlree SBStream sstr; 1999631aae2SJames McIlree error.GetDescription (sstr); 200acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData()); 2019631aae2SJames McIlree } 2029631aae2SJames McIlree 2039631aae2SJames McIlree return error.Success(); 2049631aae2SJames McIlree } 2059631aae2SJames McIlree 2069631aae2SJames McIlree bool 2079631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 2089631aae2SJames McIlree { 209acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 210acdbe816SGreg Clayton if (process_sp) 2119631aae2SJames McIlree { 212acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 213acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 2149631aae2SJames McIlree { 215144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 216144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 217acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 2189631aae2SJames McIlree } 2199631aae2SJames McIlree else 2209631aae2SJames McIlree { 2219631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 2229631aae2SJames McIlree } 2239631aae2SJames McIlree } 2249631aae2SJames McIlree else 2259631aae2SJames McIlree { 2269631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 2279631aae2SJames McIlree } 2289631aae2SJames McIlree 2295160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2309631aae2SJames McIlree if (log) { 2319631aae2SJames McIlree SBStream sstr; 2329631aae2SJames McIlree error.GetDescription (sstr); 233d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData()); 2349631aae2SJames McIlree } 2359631aae2SJames McIlree 2369631aae2SJames McIlree return error.Success(); 2379631aae2SJames McIlree } 2389631aae2SJames McIlree 23930fdc8d8SChris Lattner 24030fdc8d8SChris Lattner uint32_t 24130fdc8d8SChris Lattner SBProcess::GetNumThreads () 24230fdc8d8SChris Lattner { 2435160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 244ceb6b139SCaroline Tice 245ceb6b139SCaroline Tice uint32_t num_threads = 0; 246acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 247acdbe816SGreg Clayton if (process_sp) 24830fdc8d8SChris Lattner { 2497fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2507fdf9ef1SGreg Clayton 2517fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 252acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 253acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 25430fdc8d8SChris Lattner } 255ceb6b139SCaroline Tice 256ceb6b139SCaroline Tice if (log) 257acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads); 258ceb6b139SCaroline Tice 259ceb6b139SCaroline Tice return num_threads; 26030fdc8d8SChris Lattner } 26130fdc8d8SChris Lattner 26230fdc8d8SChris Lattner SBThread 2632976d00aSJim Ingham SBProcess::GetSelectedThread () const 26430fdc8d8SChris Lattner { 2655160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 266ceb6b139SCaroline Tice 26730fdc8d8SChris Lattner SBThread sb_thread; 26817a6ad05SGreg Clayton ThreadSP thread_sp; 269acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 270acdbe816SGreg Clayton if (process_sp) 271af67cecdSGreg Clayton { 272acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 273acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 27417a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 275af67cecdSGreg Clayton } 276ceb6b139SCaroline Tice 277ceb6b139SCaroline Tice if (log) 278ceb6b139SCaroline Tice { 279acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get()); 280ceb6b139SCaroline Tice } 281ceb6b139SCaroline Tice 28230fdc8d8SChris Lattner return sb_thread; 28330fdc8d8SChris Lattner } 28430fdc8d8SChris Lattner 285a4d8747dSGreg Clayton SBThread 286a4d8747dSGreg Clayton SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) 287a4d8747dSGreg Clayton { 2885160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 289a4d8747dSGreg Clayton 290a4d8747dSGreg Clayton SBThread sb_thread; 291a4d8747dSGreg Clayton ThreadSP thread_sp; 292a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 293a4d8747dSGreg Clayton if (process_sp) 294a4d8747dSGreg Clayton { 295a4d8747dSGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 296a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 297a4d8747dSGreg Clayton sb_thread.SetThread (thread_sp); 298a4d8747dSGreg Clayton } 299a4d8747dSGreg Clayton 300a4d8747dSGreg Clayton if (log) 301a4d8747dSGreg Clayton log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", process_sp.get(), tid, context, thread_sp.get()); 302a4d8747dSGreg Clayton 303a4d8747dSGreg Clayton return sb_thread; 304a4d8747dSGreg Clayton } 305a4d8747dSGreg Clayton 30630fdc8d8SChris Lattner SBTarget 30730fdc8d8SChris Lattner SBProcess::GetTarget() const 30830fdc8d8SChris Lattner { 3095160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 310ceb6b139SCaroline Tice 31130fdc8d8SChris Lattner SBTarget sb_target; 312b9556accSGreg Clayton TargetSP target_sp; 313acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 314acdbe816SGreg Clayton if (process_sp) 315b9556accSGreg Clayton { 316acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 317b9556accSGreg Clayton sb_target.SetSP (target_sp); 318b9556accSGreg Clayton } 319ceb6b139SCaroline Tice 320ceb6b139SCaroline Tice if (log) 321acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get()); 322ceb6b139SCaroline Tice 32330fdc8d8SChris Lattner return sb_target; 32430fdc8d8SChris Lattner } 32530fdc8d8SChris Lattner 32630fdc8d8SChris Lattner 32730fdc8d8SChris Lattner size_t 32830fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 32930fdc8d8SChris Lattner { 3305160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 331ceb6b139SCaroline Tice 332ceb6b139SCaroline Tice size_t ret_val = 0; 333acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 334acdbe816SGreg Clayton if (process_sp) 33530fdc8d8SChris Lattner { 33630fdc8d8SChris Lattner Error error; 337acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 33830fdc8d8SChris Lattner } 339ceb6b139SCaroline Tice 340ceb6b139SCaroline Tice if (log) 341779f9213SSylvestre Ledru log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %zu", 342acdbe816SGreg Clayton process_sp.get(), 34393aa84e8SGreg Clayton src, 34493aa84e8SGreg Clayton (uint32_t) src_len, 34593aa84e8SGreg Clayton ret_val); 346ceb6b139SCaroline Tice 347ceb6b139SCaroline Tice return ret_val; 34830fdc8d8SChris Lattner } 34930fdc8d8SChris Lattner 35030fdc8d8SChris Lattner size_t 35130fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 35230fdc8d8SChris Lattner { 353cfd1acedSGreg Clayton size_t bytes_read = 0; 354acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 355acdbe816SGreg Clayton if (process_sp) 35630fdc8d8SChris Lattner { 35730fdc8d8SChris Lattner Error error; 358acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 35930fdc8d8SChris Lattner } 360ceb6b139SCaroline Tice 3615160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 362ceb6b139SCaroline Tice if (log) 363d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 36443e0af06SGreg Clayton process_sp.get(), 36543e0af06SGreg Clayton (int) bytes_read, 36643e0af06SGreg Clayton dst, 36743e0af06SGreg Clayton (uint64_t)dst_len, 36843e0af06SGreg Clayton (uint64_t)bytes_read); 369ceb6b139SCaroline Tice 370cfd1acedSGreg Clayton return bytes_read; 37130fdc8d8SChris Lattner } 37230fdc8d8SChris Lattner 37330fdc8d8SChris Lattner size_t 37430fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 37530fdc8d8SChris Lattner { 376cfd1acedSGreg Clayton size_t bytes_read = 0; 377acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 378acdbe816SGreg Clayton if (process_sp) 37930fdc8d8SChris Lattner { 38030fdc8d8SChris Lattner Error error; 381acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 38230fdc8d8SChris Lattner } 383ceb6b139SCaroline Tice 3845160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 385ceb6b139SCaroline Tice if (log) 386d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 38743e0af06SGreg Clayton process_sp.get(), 38843e0af06SGreg Clayton (int) bytes_read, 38943e0af06SGreg Clayton dst, 39043e0af06SGreg Clayton (uint64_t)dst_len, 39143e0af06SGreg Clayton (uint64_t)bytes_read); 392ceb6b139SCaroline Tice 393cfd1acedSGreg Clayton return bytes_read; 39430fdc8d8SChris Lattner } 39530fdc8d8SChris Lattner 396ab3b8b22SHan Ming Ong size_t 397ab3b8b22SHan Ming Ong SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const 398ab3b8b22SHan Ming Ong { 399ab3b8b22SHan Ming Ong size_t bytes_read = 0; 400ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 401ab3b8b22SHan Ming Ong if (process_sp) 402ab3b8b22SHan Ming Ong { 403ab3b8b22SHan Ming Ong Error error; 404ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error); 405ab3b8b22SHan Ming Ong } 406ab3b8b22SHan Ming Ong 4075160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 408ab3b8b22SHan Ming Ong if (log) 409d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 410ab3b8b22SHan Ming Ong process_sp.get(), 411ab3b8b22SHan Ming Ong (int) bytes_read, 412ab3b8b22SHan Ming Ong dst, 413ab3b8b22SHan Ming Ong (uint64_t)dst_len, 414ab3b8b22SHan Ming Ong (uint64_t)bytes_read); 415ab3b8b22SHan Ming Ong 416ab3b8b22SHan Ming Ong return bytes_read; 417ab3b8b22SHan Ming Ong } 418ab3b8b22SHan Ming Ong 41930fdc8d8SChris Lattner void 4202976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 42130fdc8d8SChris Lattner { 42230fdc8d8SChris Lattner if (out == NULL) 42330fdc8d8SChris Lattner return; 42430fdc8d8SChris Lattner 425acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 426acdbe816SGreg Clayton if (process_sp) 42730fdc8d8SChris Lattner { 42830fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 42930fdc8d8SChris Lattner char message[1024]; 43030fdc8d8SChris Lattner int message_len = ::snprintf (message, 43130fdc8d8SChris Lattner sizeof (message), 432d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 433acdbe816SGreg Clayton process_sp->GetID(), 43430fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 43530fdc8d8SChris Lattner 43630fdc8d8SChris Lattner if (message_len > 0) 43730fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 43830fdc8d8SChris Lattner } 43930fdc8d8SChris Lattner } 44030fdc8d8SChris Lattner 44130fdc8d8SChris Lattner void 4422976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 44330fdc8d8SChris Lattner { 444acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 445acdbe816SGreg Clayton if (process_sp) 44630fdc8d8SChris Lattner { 44730fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 44830fdc8d8SChris Lattner char message[1024]; 44930fdc8d8SChris Lattner ::snprintf (message, 45030fdc8d8SChris Lattner sizeof (message), 451d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 452acdbe816SGreg Clayton process_sp->GetID(), 45330fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 45430fdc8d8SChris Lattner 45530fdc8d8SChris Lattner result.AppendMessage (message); 45630fdc8d8SChris Lattner } 45730fdc8d8SChris Lattner } 45830fdc8d8SChris Lattner 45930fdc8d8SChris Lattner bool 4602976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 46130fdc8d8SChris Lattner { 462acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 463acdbe816SGreg Clayton if (process_sp) 464af67cecdSGreg Clayton { 465acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 466acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 467af67cecdSGreg Clayton } 46830fdc8d8SChris Lattner return false; 46930fdc8d8SChris Lattner } 47030fdc8d8SChris Lattner 47130fdc8d8SChris Lattner bool 472ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid) 473ea561dcfSGreg Clayton { 4745160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 475ceb6b139SCaroline Tice 476ceb6b139SCaroline Tice bool ret_val = false; 477acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 478acdbe816SGreg Clayton if (process_sp) 479af67cecdSGreg Clayton { 480acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 481acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 482af67cecdSGreg Clayton } 483ceb6b139SCaroline Tice 484ceb6b139SCaroline Tice if (log) 485d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s", 486acdbe816SGreg Clayton process_sp.get(), tid, (ret_val ? "true" : "false")); 487ceb6b139SCaroline Tice 488ceb6b139SCaroline Tice return ret_val; 48930fdc8d8SChris Lattner } 49030fdc8d8SChris Lattner 49118b46896SJim Ingham bool 49218b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 49318b46896SJim Ingham { 4945160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 49518b46896SJim Ingham 49618b46896SJim Ingham bool ret_val = false; 49718b46896SJim Ingham ProcessSP process_sp(GetSP()); 49818b46896SJim Ingham if (process_sp) 49918b46896SJim Ingham { 50018b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 50118b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 50218b46896SJim Ingham } 50318b46896SJim Ingham 50418b46896SJim Ingham if (log) 50518b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 50618b46896SJim Ingham process_sp.get(), index_id, (ret_val ? "true" : "false")); 50718b46896SJim Ingham 50818b46896SJim Ingham return ret_val; 50918b46896SJim Ingham } 51018b46896SJim Ingham 51130fdc8d8SChris Lattner SBThread 51230fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 51330fdc8d8SChris Lattner { 5145160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 515ceb6b139SCaroline Tice 51617a6ad05SGreg Clayton SBThread sb_thread; 51717a6ad05SGreg Clayton ThreadSP thread_sp; 518acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 519acdbe816SGreg Clayton if (process_sp) 520af67cecdSGreg Clayton { 5217fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5227fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 523acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 5247fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 52517a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 526af67cecdSGreg Clayton } 527ceb6b139SCaroline Tice 528ceb6b139SCaroline Tice if (log) 529ceb6b139SCaroline Tice { 53093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 531acdbe816SGreg Clayton process_sp.get(), (uint32_t) index, thread_sp.get()); 532ceb6b139SCaroline Tice } 533ceb6b139SCaroline Tice 53417a6ad05SGreg Clayton return sb_thread; 53530fdc8d8SChris Lattner } 53630fdc8d8SChris Lattner 537bf2956a2SJim Ingham uint32_t 538*5e8dce4dSJason Molenda SBProcess::GetNumQueues () 539*5e8dce4dSJason Molenda { 540*5e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 541*5e8dce4dSJason Molenda 542*5e8dce4dSJason Molenda uint32_t num_queues = 0; 543*5e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 544*5e8dce4dSJason Molenda if (process_sp) 545*5e8dce4dSJason Molenda { 546*5e8dce4dSJason Molenda Process::StopLocker stop_locker; 547*5e8dce4dSJason Molenda 548*5e8dce4dSJason Molenda Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 549*5e8dce4dSJason Molenda num_queues = process_sp->GetQueueList().GetSize(); 550*5e8dce4dSJason Molenda } 551*5e8dce4dSJason Molenda 552*5e8dce4dSJason Molenda if (log) 553*5e8dce4dSJason Molenda log->Printf ("SBProcess(%p)::GetNumQueues () => %d", process_sp.get(), num_queues); 554*5e8dce4dSJason Molenda 555*5e8dce4dSJason Molenda return num_queues; 556*5e8dce4dSJason Molenda } 557*5e8dce4dSJason Molenda 558*5e8dce4dSJason Molenda SBQueue 559*5e8dce4dSJason Molenda SBProcess::GetQueueAtIndex (size_t index) 560*5e8dce4dSJason Molenda { 561*5e8dce4dSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 562*5e8dce4dSJason Molenda 563*5e8dce4dSJason Molenda SBQueue sb_queue; 564*5e8dce4dSJason Molenda QueueSP queue_sp; 565*5e8dce4dSJason Molenda ProcessSP process_sp(GetSP()); 566*5e8dce4dSJason Molenda if (process_sp) 567*5e8dce4dSJason Molenda { 568*5e8dce4dSJason Molenda Process::StopLocker stop_locker; 569*5e8dce4dSJason Molenda Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 570*5e8dce4dSJason Molenda queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); 571*5e8dce4dSJason Molenda sb_queue.SetQueue (queue_sp); 572*5e8dce4dSJason Molenda } 573*5e8dce4dSJason Molenda 574*5e8dce4dSJason Molenda if (log) 575*5e8dce4dSJason Molenda { 576*5e8dce4dSJason Molenda log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)", 577*5e8dce4dSJason Molenda process_sp.get(), (uint32_t) index, queue_sp.get()); 578*5e8dce4dSJason Molenda } 579*5e8dce4dSJason Molenda 580*5e8dce4dSJason Molenda return sb_queue; 581*5e8dce4dSJason Molenda } 582*5e8dce4dSJason Molenda 583*5e8dce4dSJason Molenda 584*5e8dce4dSJason Molenda uint32_t 585bf2956a2SJim Ingham SBProcess::GetStopID(bool include_expression_stops) 586bf2956a2SJim Ingham { 587bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 588bf2956a2SJim Ingham if (process_sp) 589bf2956a2SJim Ingham { 590bf2956a2SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 591bf2956a2SJim Ingham if (include_expression_stops) 592bf2956a2SJim Ingham return process_sp->GetStopID(); 593bf2956a2SJim Ingham else 594bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 595bf2956a2SJim Ingham } 596bf2956a2SJim Ingham return 0; 597bf2956a2SJim Ingham } 598bf2956a2SJim Ingham 59930fdc8d8SChris Lattner StateType 60030fdc8d8SChris Lattner SBProcess::GetState () 60130fdc8d8SChris Lattner { 602ceb6b139SCaroline Tice 603ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 604acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 605acdbe816SGreg Clayton if (process_sp) 606af67cecdSGreg Clayton { 607acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 608acdbe816SGreg Clayton ret_val = process_sp->GetState(); 609af67cecdSGreg Clayton } 610ceb6b139SCaroline Tice 6115160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 612ceb6b139SCaroline Tice if (log) 613cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 614acdbe816SGreg Clayton process_sp.get(), 615750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 616ceb6b139SCaroline Tice 617ceb6b139SCaroline Tice return ret_val; 61830fdc8d8SChris Lattner } 61930fdc8d8SChris Lattner 62030fdc8d8SChris Lattner 62130fdc8d8SChris Lattner int 62230fdc8d8SChris Lattner SBProcess::GetExitStatus () 62330fdc8d8SChris Lattner { 6244838131bSGreg Clayton int exit_status = 0; 625acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 626acdbe816SGreg Clayton if (process_sp) 627af67cecdSGreg Clayton { 628acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 629acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 630af67cecdSGreg Clayton } 6315160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6324838131bSGreg Clayton if (log) 6334838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 634acdbe816SGreg Clayton process_sp.get(), exit_status, exit_status); 6354838131bSGreg Clayton 6364838131bSGreg Clayton return exit_status; 63730fdc8d8SChris Lattner } 63830fdc8d8SChris Lattner 63930fdc8d8SChris Lattner const char * 64030fdc8d8SChris Lattner SBProcess::GetExitDescription () 64130fdc8d8SChris Lattner { 6424838131bSGreg Clayton const char *exit_desc = NULL; 643acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 644acdbe816SGreg Clayton if (process_sp) 645af67cecdSGreg Clayton { 646acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 647acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 648af67cecdSGreg Clayton } 6495160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6504838131bSGreg Clayton if (log) 6514838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 652acdbe816SGreg Clayton process_sp.get(), exit_desc); 6534838131bSGreg Clayton return exit_desc; 65430fdc8d8SChris Lattner } 65530fdc8d8SChris Lattner 65630fdc8d8SChris Lattner lldb::pid_t 65730fdc8d8SChris Lattner SBProcess::GetProcessID () 65830fdc8d8SChris Lattner { 659ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 660acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 661acdbe816SGreg Clayton if (process_sp) 662acdbe816SGreg Clayton ret_val = process_sp->GetID(); 663ceb6b139SCaroline Tice 6645160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 665ceb6b139SCaroline Tice if (log) 666d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, process_sp.get(), ret_val); 667ceb6b139SCaroline Tice 668ceb6b139SCaroline Tice return ret_val; 66930fdc8d8SChris Lattner } 67030fdc8d8SChris Lattner 671949e8221SGreg Clayton uint32_t 672949e8221SGreg Clayton SBProcess::GetUniqueID() 673949e8221SGreg Clayton { 674949e8221SGreg Clayton uint32_t ret_val = 0; 675949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 676949e8221SGreg Clayton if (process_sp) 677949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 6785160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 679949e8221SGreg Clayton if (log) 680949e8221SGreg Clayton log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, process_sp.get(), ret_val); 681949e8221SGreg Clayton return ret_val; 682949e8221SGreg Clayton } 683949e8221SGreg Clayton 684cf386e24SJohnny Chen ByteOrder 685cf386e24SJohnny Chen SBProcess::GetByteOrder () const 686cf386e24SJohnny Chen { 687cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 688acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 689acdbe816SGreg Clayton if (process_sp) 690acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 691cf386e24SJohnny Chen 6925160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 693cf386e24SJohnny Chen if (log) 694acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder); 695cf386e24SJohnny Chen 696cf386e24SJohnny Chen return byteOrder; 697cf386e24SJohnny Chen } 698cf386e24SJohnny Chen 69930fdc8d8SChris Lattner uint32_t 70030fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 70130fdc8d8SChris Lattner { 702ceb6b139SCaroline Tice uint32_t size = 0; 703acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 704acdbe816SGreg Clayton if (process_sp) 705acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 706ceb6b139SCaroline Tice 7075160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 708ceb6b139SCaroline Tice if (log) 709acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size); 710ceb6b139SCaroline Tice 711ceb6b139SCaroline Tice return size; 71230fdc8d8SChris Lattner } 71330fdc8d8SChris Lattner 71430fdc8d8SChris Lattner SBError 71530fdc8d8SChris Lattner SBProcess::Continue () 71630fdc8d8SChris Lattner { 7175160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 718ceb6b139SCaroline Tice 71930fdc8d8SChris Lattner SBError sb_error; 720acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 7210c74e78dSGreg Clayton 722acdbe816SGreg Clayton if (log) 723acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get()); 724acdbe816SGreg Clayton 725acdbe816SGreg Clayton if (process_sp) 726acdbe816SGreg Clayton { 727acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 728acdbe816SGreg Clayton 729acdbe816SGreg Clayton Error error (process_sp->Resume()); 7305d5028b5SGreg Clayton if (error.Success()) 7315d5028b5SGreg Clayton { 732acdbe816SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 7334838131bSGreg Clayton { 7344838131bSGreg Clayton if (log) 735acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get()); 736acdbe816SGreg Clayton process_sp->WaitForProcessToStop (NULL); 7375d5028b5SGreg Clayton } 7384838131bSGreg Clayton } 7395d5028b5SGreg Clayton sb_error.SetError(error); 7405d5028b5SGreg Clayton } 74130fdc8d8SChris Lattner else 74230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 74330fdc8d8SChris Lattner 744ceb6b139SCaroline Tice if (log) 745ceb6b139SCaroline Tice { 746ceb6b139SCaroline Tice SBStream sstr; 747ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 748acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData()); 749ceb6b139SCaroline Tice } 750ceb6b139SCaroline Tice 75130fdc8d8SChris Lattner return sb_error; 75230fdc8d8SChris Lattner } 75330fdc8d8SChris Lattner 75430fdc8d8SChris Lattner 75530fdc8d8SChris Lattner SBError 75630fdc8d8SChris Lattner SBProcess::Destroy () 75730fdc8d8SChris Lattner { 75830fdc8d8SChris Lattner SBError sb_error; 759acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 760acdbe816SGreg Clayton if (process_sp) 7616779606aSGreg Clayton { 762acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 763acdbe816SGreg Clayton sb_error.SetError(process_sp->Destroy()); 7646779606aSGreg Clayton } 76530fdc8d8SChris Lattner else 76630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 76730fdc8d8SChris Lattner 7685160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7694838131bSGreg Clayton if (log) 7704838131bSGreg Clayton { 7714838131bSGreg Clayton SBStream sstr; 7724838131bSGreg Clayton sb_error.GetDescription (sstr); 7736779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 774acdbe816SGreg Clayton process_sp.get(), 7756779606aSGreg Clayton sb_error.get(), 7766779606aSGreg Clayton sstr.GetData()); 7774838131bSGreg Clayton } 7784838131bSGreg Clayton 77930fdc8d8SChris Lattner return sb_error; 78030fdc8d8SChris Lattner } 78130fdc8d8SChris Lattner 78230fdc8d8SChris Lattner 78330fdc8d8SChris Lattner SBError 78430fdc8d8SChris Lattner SBProcess::Stop () 78530fdc8d8SChris Lattner { 78630fdc8d8SChris Lattner SBError sb_error; 787acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 788acdbe816SGreg Clayton if (process_sp) 789af67cecdSGreg Clayton { 790acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 791acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 792af67cecdSGreg Clayton } 79330fdc8d8SChris Lattner else 79430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 795ceb6b139SCaroline Tice 7965160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 797ceb6b139SCaroline Tice if (log) 798ceb6b139SCaroline Tice { 799ceb6b139SCaroline Tice SBStream sstr; 800ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 80193aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 802acdbe816SGreg Clayton process_sp.get(), 80393aa84e8SGreg Clayton sb_error.get(), 804750cd175SCaroline Tice sstr.GetData()); 805ceb6b139SCaroline Tice } 806ceb6b139SCaroline Tice 80730fdc8d8SChris Lattner return sb_error; 80830fdc8d8SChris Lattner } 80930fdc8d8SChris Lattner 81030fdc8d8SChris Lattner SBError 81130fdc8d8SChris Lattner SBProcess::Kill () 81230fdc8d8SChris Lattner { 81330fdc8d8SChris Lattner SBError sb_error; 814acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 815acdbe816SGreg Clayton if (process_sp) 816af67cecdSGreg Clayton { 817acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 818acdbe816SGreg Clayton sb_error.SetError (process_sp->Destroy()); 819af67cecdSGreg Clayton } 82030fdc8d8SChris Lattner else 82130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 822ceb6b139SCaroline Tice 8235160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 824ceb6b139SCaroline Tice if (log) 825ceb6b139SCaroline Tice { 826ceb6b139SCaroline Tice SBStream sstr; 827ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 82893aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 829acdbe816SGreg Clayton process_sp.get(), 83093aa84e8SGreg Clayton sb_error.get(), 831750cd175SCaroline Tice sstr.GetData()); 832ceb6b139SCaroline Tice } 833ceb6b139SCaroline Tice 83430fdc8d8SChris Lattner return sb_error; 83530fdc8d8SChris Lattner } 83630fdc8d8SChris Lattner 83730fdc8d8SChris Lattner SBError 83830fdc8d8SChris Lattner SBProcess::Detach () 83930fdc8d8SChris Lattner { 840acff8950SJim Ingham // FIXME: This should come from a process default. 841acff8950SJim Ingham bool keep_stopped = false; 842acff8950SJim Ingham return Detach (keep_stopped); 843acff8950SJim Ingham } 844acff8950SJim Ingham 845acff8950SJim Ingham SBError 846acff8950SJim Ingham SBProcess::Detach (bool keep_stopped) 847acff8950SJim Ingham { 84830fdc8d8SChris Lattner SBError sb_error; 849acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 850acdbe816SGreg Clayton if (process_sp) 851af67cecdSGreg Clayton { 852acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 853acff8950SJim Ingham sb_error.SetError (process_sp->Detach(keep_stopped)); 854af67cecdSGreg Clayton } 85530fdc8d8SChris Lattner else 85630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 85730fdc8d8SChris Lattner 85830fdc8d8SChris Lattner return sb_error; 85930fdc8d8SChris Lattner } 86030fdc8d8SChris Lattner 86130fdc8d8SChris Lattner SBError 8624838131bSGreg Clayton SBProcess::Signal (int signo) 86330fdc8d8SChris Lattner { 86430fdc8d8SChris Lattner SBError sb_error; 865acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 866acdbe816SGreg Clayton if (process_sp) 867af67cecdSGreg Clayton { 868acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 869acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 870af67cecdSGreg Clayton } 87130fdc8d8SChris Lattner else 87230fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 8735160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8744838131bSGreg Clayton if (log) 8754838131bSGreg Clayton { 8764838131bSGreg Clayton SBStream sstr; 8774838131bSGreg Clayton sb_error.GetDescription (sstr); 8784838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 879acdbe816SGreg Clayton process_sp.get(), 8804838131bSGreg Clayton signo, 8814838131bSGreg Clayton sb_error.get(), 8824838131bSGreg Clayton sstr.GetData()); 8834838131bSGreg Clayton } 88430fdc8d8SChris Lattner return sb_error; 88530fdc8d8SChris Lattner } 88630fdc8d8SChris Lattner 887cfc0935eSJim Ingham void 888cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 889cfc0935eSJim Ingham { 890cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 891cfc0935eSJim Ingham if (process_sp) 892cfc0935eSJim Ingham { 893cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 894cfc0935eSJim Ingham } 895cfc0935eSJim Ingham } 896cfc0935eSJim Ingham 89730fdc8d8SChris Lattner SBThread 8984838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 89930fdc8d8SChris Lattner { 9004838131bSGreg Clayton SBThread sb_thread; 90117a6ad05SGreg Clayton ThreadSP thread_sp; 902acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 903acdbe816SGreg Clayton if (process_sp) 904af67cecdSGreg Clayton { 905acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9067fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9077fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 9087fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 90917a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 910af67cecdSGreg Clayton } 9114838131bSGreg Clayton 9125160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9134838131bSGreg Clayton if (log) 9144838131bSGreg Clayton { 915d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)", 916acdbe816SGreg Clayton process_sp.get(), 9174838131bSGreg Clayton tid, 91817a6ad05SGreg Clayton thread_sp.get()); 9194838131bSGreg Clayton } 9204838131bSGreg Clayton 9214838131bSGreg Clayton return sb_thread; 92230fdc8d8SChris Lattner } 92330fdc8d8SChris Lattner 92418b46896SJim Ingham SBThread 92518b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 92618b46896SJim Ingham { 92718b46896SJim Ingham SBThread sb_thread; 92818b46896SJim Ingham ThreadSP thread_sp; 92918b46896SJim Ingham ProcessSP process_sp(GetSP()); 93018b46896SJim Ingham if (process_sp) 93118b46896SJim Ingham { 93218b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 93318b46896SJim Ingham Process::StopLocker stop_locker; 93418b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 93518b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 93618b46896SJim Ingham sb_thread.SetThread (thread_sp); 93718b46896SJim Ingham } 93818b46896SJim Ingham 9395160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 94018b46896SJim Ingham if (log) 94118b46896SJim Ingham { 94218b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 94318b46896SJim Ingham process_sp.get(), 94418b46896SJim Ingham index_id, 94518b46896SJim Ingham thread_sp.get()); 94618b46896SJim Ingham } 94718b46896SJim Ingham 94818b46896SJim Ingham return sb_thread; 94918b46896SJim Ingham } 95018b46896SJim Ingham 95130fdc8d8SChris Lattner StateType 95230fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 95330fdc8d8SChris Lattner { 9545160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 955ceb6b139SCaroline Tice 956ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 957ceb6b139SCaroline Tice 958ceb6b139SCaroline Tice if (log) 959cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 960750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 961ceb6b139SCaroline Tice 962ceb6b139SCaroline Tice return ret_val; 96330fdc8d8SChris Lattner } 96430fdc8d8SChris Lattner 96530fdc8d8SChris Lattner bool 96630fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 96730fdc8d8SChris Lattner { 9686611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 96930fdc8d8SChris Lattner } 97030fdc8d8SChris Lattner 9710161b49cSJim Ingham size_t 9720161b49cSJim Ingham SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event) 9730161b49cSJim Ingham { 9740161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 9750161b49cSJim Ingham } 9760161b49cSJim Ingham 9770161b49cSJim Ingham const char * 9780161b49cSJim Ingham SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx) 9790161b49cSJim Ingham { 9800161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 9810161b49cSJim Ingham } 9820161b49cSJim Ingham 98330fdc8d8SChris Lattner SBProcess 98430fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 98530fdc8d8SChris Lattner { 9866611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 98730fdc8d8SChris Lattner return process; 98830fdc8d8SChris Lattner } 98930fdc8d8SChris Lattner 990e6bc6cb9SJim Ingham bool 991e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 992e6bc6cb9SJim Ingham { 9934bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 994e6bc6cb9SJim Ingham } 99530fdc8d8SChris Lattner 99630fdc8d8SChris Lattner SBBroadcaster 99730fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 99830fdc8d8SChris Lattner { 9995160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1000ceb6b139SCaroline Tice 1001acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1002acdbe816SGreg Clayton 1003acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 1004ceb6b139SCaroline Tice 1005ceb6b139SCaroline Tice if (log) 1006acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 1007750cd175SCaroline Tice broadcaster.get()); 1008ceb6b139SCaroline Tice 100930fdc8d8SChris Lattner return broadcaster; 101030fdc8d8SChris Lattner } 101130fdc8d8SChris Lattner 10124bddaeb5SJim Ingham const char * 10134bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 10144bddaeb5SJim Ingham { 10154bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 10164bddaeb5SJim Ingham } 10174bddaeb5SJim Ingham 101830fdc8d8SChris Lattner size_t 101930fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 102030fdc8d8SChris Lattner { 10215160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1022ceb6b139SCaroline Tice 102330fdc8d8SChris Lattner size_t bytes_read = 0; 102430fdc8d8SChris Lattner 1025acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1026acdbe816SGreg Clayton 10274838131bSGreg Clayton if (log) 10284838131bSGreg Clayton { 1029d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 1030acdbe816SGreg Clayton process_sp.get(), 10314838131bSGreg Clayton addr, 10324838131bSGreg Clayton dst, 103343e0af06SGreg Clayton (uint64_t)dst_len, 10344838131bSGreg Clayton sb_error.get()); 10354838131bSGreg Clayton } 10364838131bSGreg Clayton 1037acdbe816SGreg Clayton if (process_sp) 103830fdc8d8SChris Lattner { 10397fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10407fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10417fdf9ef1SGreg Clayton { 1042acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10437fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 10447fdf9ef1SGreg Clayton } 10457fdf9ef1SGreg Clayton else 10467fdf9ef1SGreg Clayton { 1047c9858e4dSGreg Clayton if (log) 1048c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get()); 10497fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10507fdf9ef1SGreg Clayton } 105130fdc8d8SChris Lattner } 105230fdc8d8SChris Lattner else 105330fdc8d8SChris Lattner { 105430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 105530fdc8d8SChris Lattner } 105630fdc8d8SChris Lattner 1057ceb6b139SCaroline Tice if (log) 105893aa84e8SGreg Clayton { 105993aa84e8SGreg Clayton SBStream sstr; 106093aa84e8SGreg Clayton sb_error.GetDescription (sstr); 1061d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1062acdbe816SGreg Clayton process_sp.get(), 106393aa84e8SGreg Clayton addr, 106493aa84e8SGreg Clayton dst, 106543e0af06SGreg Clayton (uint64_t)dst_len, 106693aa84e8SGreg Clayton sb_error.get(), 106793aa84e8SGreg Clayton sstr.GetData(), 106843e0af06SGreg Clayton (uint64_t)bytes_read); 106993aa84e8SGreg Clayton } 1070ceb6b139SCaroline Tice 107130fdc8d8SChris Lattner return bytes_read; 107230fdc8d8SChris Lattner } 107330fdc8d8SChris Lattner 107430fdc8d8SChris Lattner size_t 1075e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 1076e91b7957SGreg Clayton { 1077e91b7957SGreg Clayton size_t bytes_read = 0; 1078acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1079acdbe816SGreg Clayton if (process_sp) 1080e91b7957SGreg Clayton { 10817fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10827fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10837fdf9ef1SGreg Clayton { 1084acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10857fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 10867fdf9ef1SGreg Clayton } 10877fdf9ef1SGreg Clayton else 10887fdf9ef1SGreg Clayton { 10895160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1090c9858e4dSGreg Clayton if (log) 1091c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get()); 10927fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10937fdf9ef1SGreg Clayton } 1094e91b7957SGreg Clayton } 1095e91b7957SGreg Clayton else 1096e91b7957SGreg Clayton { 1097e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1098e91b7957SGreg Clayton } 1099e91b7957SGreg Clayton return bytes_read; 1100e91b7957SGreg Clayton } 1101e91b7957SGreg Clayton 1102e91b7957SGreg Clayton uint64_t 1103e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 1104e91b7957SGreg Clayton { 11057fdf9ef1SGreg Clayton uint64_t value = 0; 1106acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1107acdbe816SGreg Clayton if (process_sp) 1108e91b7957SGreg Clayton { 11097fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11107fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11117fdf9ef1SGreg Clayton { 1112acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11137fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 11147fdf9ef1SGreg Clayton } 11157fdf9ef1SGreg Clayton else 11167fdf9ef1SGreg Clayton { 11175160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1118c9858e4dSGreg Clayton if (log) 1119c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get()); 11207fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11217fdf9ef1SGreg Clayton } 1122e91b7957SGreg Clayton } 1123e91b7957SGreg Clayton else 1124e91b7957SGreg Clayton { 1125e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1126e91b7957SGreg Clayton } 11277fdf9ef1SGreg Clayton return value; 1128e91b7957SGreg Clayton } 1129e91b7957SGreg Clayton 1130e91b7957SGreg Clayton lldb::addr_t 1131e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 1132e91b7957SGreg Clayton { 1133e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1134acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1135acdbe816SGreg Clayton if (process_sp) 1136e91b7957SGreg Clayton { 11377fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11387fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11397fdf9ef1SGreg Clayton { 1140acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11417fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 11427fdf9ef1SGreg Clayton } 11437fdf9ef1SGreg Clayton else 11447fdf9ef1SGreg Clayton { 11455160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1146c9858e4dSGreg Clayton if (log) 1147c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get()); 11487fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11497fdf9ef1SGreg Clayton } 1150e91b7957SGreg Clayton } 1151e91b7957SGreg Clayton else 1152e91b7957SGreg Clayton { 1153e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1154e91b7957SGreg Clayton } 1155e91b7957SGreg Clayton return ptr; 1156e91b7957SGreg Clayton } 1157e91b7957SGreg Clayton 1158e91b7957SGreg Clayton size_t 115930fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 116030fdc8d8SChris Lattner { 116130fdc8d8SChris Lattner size_t bytes_written = 0; 116230fdc8d8SChris Lattner 11635160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1164acdbe816SGreg Clayton 1165acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1166acdbe816SGreg Clayton 11674838131bSGreg Clayton if (log) 11684838131bSGreg Clayton { 1169d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1170acdbe816SGreg Clayton process_sp.get(), 11714838131bSGreg Clayton addr, 11724838131bSGreg Clayton src, 117343e0af06SGreg Clayton (uint64_t)src_len, 11744838131bSGreg Clayton sb_error.get()); 11754838131bSGreg Clayton } 11764838131bSGreg Clayton 1177acdbe816SGreg Clayton if (process_sp) 117830fdc8d8SChris Lattner { 11797fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11807fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11817fdf9ef1SGreg Clayton { 1182acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11837fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 11847fdf9ef1SGreg Clayton } 11857fdf9ef1SGreg Clayton else 11867fdf9ef1SGreg Clayton { 1187c9858e4dSGreg Clayton if (log) 1188c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get()); 11897fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11907fdf9ef1SGreg Clayton } 119130fdc8d8SChris Lattner } 119230fdc8d8SChris Lattner 11934838131bSGreg Clayton if (log) 11944838131bSGreg Clayton { 11954838131bSGreg Clayton SBStream sstr; 11964838131bSGreg Clayton sb_error.GetDescription (sstr); 1197d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1198acdbe816SGreg Clayton process_sp.get(), 11994838131bSGreg Clayton addr, 12004838131bSGreg Clayton src, 120143e0af06SGreg Clayton (uint64_t)src_len, 12024838131bSGreg Clayton sb_error.get(), 12034838131bSGreg Clayton sstr.GetData(), 120443e0af06SGreg Clayton (uint64_t)bytes_written); 12054838131bSGreg Clayton } 12064838131bSGreg Clayton 120730fdc8d8SChris Lattner return bytes_written; 120830fdc8d8SChris Lattner } 120930fdc8d8SChris Lattner 1210dde9cff3SCaroline Tice bool 1211dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1212dde9cff3SCaroline Tice { 1213da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1214da7bc7d0SGreg Clayton 1215acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1216acdbe816SGreg Clayton if (process_sp) 1217dde9cff3SCaroline Tice { 1218dde9cff3SCaroline Tice char path[PATH_MAX]; 1219dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1220acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 12211d273166SGreg Clayton const char *exe_name = NULL; 12221d273166SGreg Clayton if (exe_module) 12231d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 12241d273166SGreg Clayton 1225d01b2953SDaniel Malea strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1226acdbe816SGreg Clayton process_sp->GetID(), 1227ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 12281d273166SGreg Clayton GetNumThreads(), 122905faeb71SGreg Clayton exe_name ? ", executable = " : "", 12301d273166SGreg Clayton exe_name ? exe_name : ""); 1231dde9cff3SCaroline Tice } 1232dde9cff3SCaroline Tice else 1233da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1234dde9cff3SCaroline Tice 1235dde9cff3SCaroline Tice return true; 1236dde9cff3SCaroline Tice } 12378f343b09SGreg Clayton 12388f343b09SGreg Clayton uint32_t 1239f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1240f9ef60d2SJohnny Chen { 12415160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1242f9ef60d2SJohnny Chen 1243f9ef60d2SJohnny Chen uint32_t num = 0; 1244f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1245f9ef60d2SJohnny Chen if (process_sp) 1246f9ef60d2SJohnny Chen { 1247f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1248f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1249f9ef60d2SJohnny Chen if (log) 1250f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1251f9ef60d2SJohnny Chen process_sp.get(), num); 1252f9ef60d2SJohnny Chen } 1253f9ef60d2SJohnny Chen else 1254f9ef60d2SJohnny Chen { 1255f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1256f9ef60d2SJohnny Chen } 1257f9ef60d2SJohnny Chen return num; 1258f9ef60d2SJohnny Chen } 1259f9ef60d2SJohnny Chen 1260f9ef60d2SJohnny Chen uint32_t 12618f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 12628f343b09SGreg Clayton { 1263acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1264acdbe816SGreg Clayton if (process_sp) 1265af67cecdSGreg Clayton { 12667fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12677fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12687fdf9ef1SGreg Clayton { 1269acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1270acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1271af67cecdSGreg Clayton } 12727fdf9ef1SGreg Clayton else 12737fdf9ef1SGreg Clayton { 12745160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1275c9858e4dSGreg Clayton if (log) 1276c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get()); 12777fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12787fdf9ef1SGreg Clayton } 12797fdf9ef1SGreg Clayton } 12808f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 12818f343b09SGreg Clayton } 12828f343b09SGreg Clayton 12838f343b09SGreg Clayton lldb::SBError 12848f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 12858f343b09SGreg Clayton { 12868f343b09SGreg Clayton lldb::SBError sb_error; 1287acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1288acdbe816SGreg Clayton if (process_sp) 1289af67cecdSGreg Clayton { 12907fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12917fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12927fdf9ef1SGreg Clayton { 1293acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1294acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1295af67cecdSGreg Clayton } 12968f343b09SGreg Clayton else 12977fdf9ef1SGreg Clayton { 12985160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1299c9858e4dSGreg Clayton if (log) 1300c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get()); 13017fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 13027fdf9ef1SGreg Clayton } 13037fdf9ef1SGreg Clayton } 13047fdf9ef1SGreg Clayton else 13058f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 13068f343b09SGreg Clayton return sb_error; 13078f343b09SGreg Clayton } 13088c71337aSJason Molenda 13098c71337aSJason Molenda uint32_t 131095d005c7SJason Molenda SBProcess::GetNumExtendedBacktraceTypes () 13118c71337aSJason Molenda { 13128c71337aSJason Molenda ProcessSP process_sp(GetSP()); 13138c71337aSJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 13148c71337aSJason Molenda { 13158c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 131695d005c7SJason Molenda return runtime->GetExtendedBacktraceTypes().size(); 13178c71337aSJason Molenda } 13188c71337aSJason Molenda return 0; 13198c71337aSJason Molenda } 13208c71337aSJason Molenda 13218c71337aSJason Molenda const char * 132295d005c7SJason Molenda SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx) 13238c71337aSJason Molenda { 13248c71337aSJason Molenda ProcessSP process_sp(GetSP()); 13258c71337aSJason Molenda if (process_sp && process_sp->GetSystemRuntime()) 13268c71337aSJason Molenda { 13278c71337aSJason Molenda SystemRuntime *runtime = process_sp->GetSystemRuntime(); 1328008c45f1SJason Molenda const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes(); 13298c71337aSJason Molenda if (idx < names.size()) 13308c71337aSJason Molenda { 13318c71337aSJason Molenda return names[idx].AsCString(); 13328c71337aSJason Molenda } 13338c71337aSJason Molenda else 13348c71337aSJason Molenda { 13358c71337aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 13368c71337aSJason Molenda if (log) 133795d005c7SJason Molenda log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds", process_sp.get()); 13388c71337aSJason Molenda } 13398c71337aSJason Molenda } 13408c71337aSJason Molenda return NULL; 13418c71337aSJason Molenda } 1342