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 1430fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner 1740af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 185d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 19ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 201f746071SGreg Clayton #include "lldb/Core/Module.h" 2130fdc8d8SChris Lattner #include "lldb/Core/State.h" 2230fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2330fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2430fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2530fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 266611103cSGreg Clayton #include "lldb/Target/Target.h" 276611103cSGreg Clayton #include "lldb/Target/Thread.h" 2830fdc8d8SChris Lattner 2930fdc8d8SChris Lattner // Project includes 3030fdc8d8SChris Lattner 314c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 324c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 330e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 344c5de699SEli Friedman #include "lldb/API/SBEvent.h" 350e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 364c5de699SEli Friedman #include "lldb/API/SBThread.h" 37dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 384c5de699SEli Friedman #include "lldb/API/SBStringList.h" 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner using namespace lldb; 4130fdc8d8SChris Lattner using namespace lldb_private; 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner 4430fdc8d8SChris Lattner SBProcess::SBProcess () : 454e0fe8abSGreg Clayton m_opaque_wp() 4630fdc8d8SChris Lattner { 4730fdc8d8SChris Lattner } 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner 5030fdc8d8SChris Lattner //---------------------------------------------------------------------- 5130fdc8d8SChris Lattner // SBProcess constructor 5230fdc8d8SChris Lattner //---------------------------------------------------------------------- 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 554e0fe8abSGreg Clayton m_opaque_wp (rhs.m_opaque_wp) 5630fdc8d8SChris Lattner { 5730fdc8d8SChris Lattner } 5830fdc8d8SChris Lattner 5930fdc8d8SChris Lattner 6030fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 614e0fe8abSGreg Clayton m_opaque_wp (process_sp) 6230fdc8d8SChris Lattner { 6330fdc8d8SChris Lattner } 6430fdc8d8SChris Lattner 65efabb123SGreg Clayton const SBProcess& 66efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 67efabb123SGreg Clayton { 68efabb123SGreg Clayton if (this != &rhs) 694e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 70efabb123SGreg Clayton return *this; 71efabb123SGreg Clayton } 72efabb123SGreg Clayton 7330fdc8d8SChris Lattner //---------------------------------------------------------------------- 7430fdc8d8SChris Lattner // Destructor 7530fdc8d8SChris Lattner //---------------------------------------------------------------------- 7630fdc8d8SChris Lattner SBProcess::~SBProcess() 7730fdc8d8SChris Lattner { 7830fdc8d8SChris Lattner } 7930fdc8d8SChris Lattner 804bddaeb5SJim Ingham const char * 814bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName () 824bddaeb5SJim Ingham { 834bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 844bddaeb5SJim Ingham } 854bddaeb5SJim Ingham 86d7b30ef9SJim Ingham const char * 87d7b30ef9SJim Ingham SBProcess::GetPluginName () 88d7b30ef9SJim Ingham { 89d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 90d7b30ef9SJim Ingham if (process_sp) 91d7b30ef9SJim Ingham { 92d7b30ef9SJim Ingham return process_sp->GetPluginName(); 93d7b30ef9SJim Ingham } 94d7b30ef9SJim Ingham return "<Unknown>"; 95d7b30ef9SJim Ingham } 96d7b30ef9SJim Ingham 97d7b30ef9SJim Ingham const char * 98d7b30ef9SJim Ingham SBProcess::GetShortPluginName () 99d7b30ef9SJim Ingham { 100d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 101d7b30ef9SJim Ingham if (process_sp) 102d7b30ef9SJim Ingham { 103d7b30ef9SJim Ingham return process_sp->GetShortPluginName(); 104d7b30ef9SJim Ingham } 105d7b30ef9SJim Ingham return "<Unknown>"; 106d7b30ef9SJim Ingham } 107d7b30ef9SJim Ingham 108d7b30ef9SJim Ingham 109b9556accSGreg Clayton lldb::ProcessSP 110b9556accSGreg Clayton SBProcess::GetSP() const 111b9556accSGreg Clayton { 1124e0fe8abSGreg Clayton return m_opaque_wp.lock(); 113b9556accSGreg Clayton } 114b9556accSGreg Clayton 11530fdc8d8SChris Lattner void 116b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 11730fdc8d8SChris Lattner { 1184e0fe8abSGreg Clayton m_opaque_wp = process_sp; 11930fdc8d8SChris Lattner } 12030fdc8d8SChris Lattner 12130fdc8d8SChris Lattner void 12230fdc8d8SChris Lattner SBProcess::Clear () 12330fdc8d8SChris Lattner { 1244e0fe8abSGreg Clayton m_opaque_wp.reset(); 12530fdc8d8SChris Lattner } 12630fdc8d8SChris Lattner 12730fdc8d8SChris Lattner 12830fdc8d8SChris Lattner bool 12930fdc8d8SChris Lattner SBProcess::IsValid() const 13030fdc8d8SChris Lattner { 1314fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1324fc6cb9cSJim Ingham return ((bool) process_sp && process_sp->IsValid()); 13330fdc8d8SChris Lattner } 13430fdc8d8SChris Lattner 1359631aae2SJames McIlree bool 1369631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1379631aae2SJames McIlree char const **envp, 1389631aae2SJames McIlree const char *stdin_path, 1399631aae2SJames McIlree const char *stdout_path, 1409631aae2SJames McIlree const char *stderr_path, 1419631aae2SJames McIlree const char *working_directory, 1429631aae2SJames McIlree uint32_t launch_flags, 1439631aae2SJames McIlree bool stop_at_entry, 1449631aae2SJames McIlree lldb::SBError& error) 1459631aae2SJames McIlree { 1465160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1479631aae2SJames McIlree if (log) { 1489631aae2SJames 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))...", 1494e0fe8abSGreg Clayton m_opaque_wp.lock().get(), 1509631aae2SJames McIlree argv, 1519631aae2SJames McIlree envp, 1529631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1539631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1549631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1559631aae2SJames McIlree working_directory ? working_directory : "NULL", 1569631aae2SJames McIlree launch_flags, 1579631aae2SJames McIlree stop_at_entry, 1589631aae2SJames McIlree error.get()); 1599631aae2SJames McIlree } 1609631aae2SJames McIlree 161acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 162acdbe816SGreg Clayton if (process_sp) 1639631aae2SJames McIlree { 164acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 165acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1669631aae2SJames McIlree { 167982c9762SGreg Clayton if (stop_at_entry) 168982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 169982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 170982c9762SGreg Clayton stdout_path, 171982c9762SGreg Clayton stderr_path, 172982c9762SGreg Clayton working_directory, 173982c9762SGreg Clayton launch_flags); 174acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 175982c9762SGreg Clayton if (exe_module) 176982c9762SGreg Clayton launch_info.SetExecutableFile(exe_module->GetFileSpec(), true); 177982c9762SGreg Clayton if (argv) 178982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 179982c9762SGreg Clayton if (envp) 180982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 181acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1829631aae2SJames McIlree } 1839631aae2SJames McIlree else 1849631aae2SJames McIlree { 1859631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1869631aae2SJames McIlree } 1879631aae2SJames McIlree } 1889631aae2SJames McIlree else 1899631aae2SJames McIlree { 1909631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1919631aae2SJames McIlree } 1929631aae2SJames McIlree 1939631aae2SJames McIlree if (log) { 1949631aae2SJames McIlree SBStream sstr; 1959631aae2SJames McIlree error.GetDescription (sstr); 196acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData()); 1979631aae2SJames McIlree } 1989631aae2SJames McIlree 1999631aae2SJames McIlree return error.Success(); 2009631aae2SJames McIlree } 2019631aae2SJames McIlree 2029631aae2SJames McIlree bool 2039631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 2049631aae2SJames McIlree { 205acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 206acdbe816SGreg Clayton if (process_sp) 2079631aae2SJames McIlree { 208acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 209acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 2109631aae2SJames McIlree { 211144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 212144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 213acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 2149631aae2SJames McIlree } 2159631aae2SJames McIlree else 2169631aae2SJames McIlree { 2179631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 2189631aae2SJames McIlree } 2199631aae2SJames McIlree } 2209631aae2SJames McIlree else 2219631aae2SJames McIlree { 2229631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 2239631aae2SJames McIlree } 2249631aae2SJames McIlree 2255160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2269631aae2SJames McIlree if (log) { 2279631aae2SJames McIlree SBStream sstr; 2289631aae2SJames McIlree error.GetDescription (sstr); 229d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData()); 2309631aae2SJames McIlree } 2319631aae2SJames McIlree 2329631aae2SJames McIlree return error.Success(); 2339631aae2SJames McIlree } 2349631aae2SJames McIlree 23530fdc8d8SChris Lattner 23630fdc8d8SChris Lattner uint32_t 23730fdc8d8SChris Lattner SBProcess::GetNumThreads () 23830fdc8d8SChris Lattner { 2395160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 240ceb6b139SCaroline Tice 241ceb6b139SCaroline Tice uint32_t num_threads = 0; 242acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 243acdbe816SGreg Clayton if (process_sp) 24430fdc8d8SChris Lattner { 2457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2467fdf9ef1SGreg Clayton 2477fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 248acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 249acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 25030fdc8d8SChris Lattner } 251ceb6b139SCaroline Tice 252ceb6b139SCaroline Tice if (log) 253acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads); 254ceb6b139SCaroline Tice 255ceb6b139SCaroline Tice return num_threads; 25630fdc8d8SChris Lattner } 25730fdc8d8SChris Lattner 25830fdc8d8SChris Lattner SBThread 2592976d00aSJim Ingham SBProcess::GetSelectedThread () const 26030fdc8d8SChris Lattner { 2615160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 262ceb6b139SCaroline Tice 26330fdc8d8SChris Lattner SBThread sb_thread; 26417a6ad05SGreg Clayton ThreadSP thread_sp; 265acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 266acdbe816SGreg Clayton if (process_sp) 267af67cecdSGreg Clayton { 268acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 269acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 27017a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 271af67cecdSGreg Clayton } 272ceb6b139SCaroline Tice 273ceb6b139SCaroline Tice if (log) 274ceb6b139SCaroline Tice { 275acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get()); 276ceb6b139SCaroline Tice } 277ceb6b139SCaroline Tice 27830fdc8d8SChris Lattner return sb_thread; 27930fdc8d8SChris Lattner } 28030fdc8d8SChris Lattner 281a4d8747dSGreg Clayton SBThread 282a4d8747dSGreg Clayton SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) 283a4d8747dSGreg Clayton { 2845160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 285a4d8747dSGreg Clayton 286a4d8747dSGreg Clayton SBThread sb_thread; 287a4d8747dSGreg Clayton ThreadSP thread_sp; 288a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 289a4d8747dSGreg Clayton if (process_sp) 290a4d8747dSGreg Clayton { 291a4d8747dSGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 292a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 293a4d8747dSGreg Clayton sb_thread.SetThread (thread_sp); 294a4d8747dSGreg Clayton } 295a4d8747dSGreg Clayton 296a4d8747dSGreg Clayton if (log) 297a4d8747dSGreg Clayton log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", process_sp.get(), tid, context, thread_sp.get()); 298a4d8747dSGreg Clayton 299a4d8747dSGreg Clayton return sb_thread; 300a4d8747dSGreg Clayton } 301a4d8747dSGreg Clayton 30230fdc8d8SChris Lattner SBTarget 30330fdc8d8SChris Lattner SBProcess::GetTarget() const 30430fdc8d8SChris Lattner { 3055160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 306ceb6b139SCaroline Tice 30730fdc8d8SChris Lattner SBTarget sb_target; 308b9556accSGreg Clayton TargetSP target_sp; 309acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 310acdbe816SGreg Clayton if (process_sp) 311b9556accSGreg Clayton { 312acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 313b9556accSGreg Clayton sb_target.SetSP (target_sp); 314b9556accSGreg Clayton } 315ceb6b139SCaroline Tice 316ceb6b139SCaroline Tice if (log) 317acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get()); 318ceb6b139SCaroline Tice 31930fdc8d8SChris Lattner return sb_target; 32030fdc8d8SChris Lattner } 32130fdc8d8SChris Lattner 32230fdc8d8SChris Lattner 32330fdc8d8SChris Lattner size_t 32430fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 32530fdc8d8SChris Lattner { 3265160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 327ceb6b139SCaroline Tice 328ceb6b139SCaroline Tice size_t ret_val = 0; 329acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 330acdbe816SGreg Clayton if (process_sp) 33130fdc8d8SChris Lattner { 33230fdc8d8SChris Lattner Error error; 333acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 33430fdc8d8SChris Lattner } 335ceb6b139SCaroline Tice 336ceb6b139SCaroline Tice if (log) 337fd54b368SJason Molenda log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu", 338acdbe816SGreg Clayton process_sp.get(), 33993aa84e8SGreg Clayton src, 34093aa84e8SGreg Clayton (uint32_t) src_len, 34193aa84e8SGreg Clayton ret_val); 342ceb6b139SCaroline Tice 343ceb6b139SCaroline Tice return ret_val; 34430fdc8d8SChris Lattner } 34530fdc8d8SChris Lattner 34630fdc8d8SChris Lattner size_t 34730fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 34830fdc8d8SChris Lattner { 349cfd1acedSGreg Clayton size_t bytes_read = 0; 350acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 351acdbe816SGreg Clayton if (process_sp) 35230fdc8d8SChris Lattner { 35330fdc8d8SChris Lattner Error error; 354acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 35530fdc8d8SChris Lattner } 356ceb6b139SCaroline Tice 3575160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 358ceb6b139SCaroline Tice if (log) 359d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 36043e0af06SGreg Clayton process_sp.get(), 36143e0af06SGreg Clayton (int) bytes_read, 36243e0af06SGreg Clayton dst, 36343e0af06SGreg Clayton (uint64_t)dst_len, 36443e0af06SGreg Clayton (uint64_t)bytes_read); 365ceb6b139SCaroline Tice 366cfd1acedSGreg Clayton return bytes_read; 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner 36930fdc8d8SChris Lattner size_t 37030fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 37130fdc8d8SChris Lattner { 372cfd1acedSGreg Clayton size_t bytes_read = 0; 373acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 374acdbe816SGreg Clayton if (process_sp) 37530fdc8d8SChris Lattner { 37630fdc8d8SChris Lattner Error error; 377acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 37830fdc8d8SChris Lattner } 379ceb6b139SCaroline Tice 3805160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 381ceb6b139SCaroline Tice if (log) 382d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 38343e0af06SGreg Clayton process_sp.get(), 38443e0af06SGreg Clayton (int) bytes_read, 38543e0af06SGreg Clayton dst, 38643e0af06SGreg Clayton (uint64_t)dst_len, 38743e0af06SGreg Clayton (uint64_t)bytes_read); 388ceb6b139SCaroline Tice 389cfd1acedSGreg Clayton return bytes_read; 39030fdc8d8SChris Lattner } 39130fdc8d8SChris Lattner 392ab3b8b22SHan Ming Ong size_t 393ab3b8b22SHan Ming Ong SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const 394ab3b8b22SHan Ming Ong { 395ab3b8b22SHan Ming Ong size_t bytes_read = 0; 396ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 397ab3b8b22SHan Ming Ong if (process_sp) 398ab3b8b22SHan Ming Ong { 399ab3b8b22SHan Ming Ong Error error; 400ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error); 401ab3b8b22SHan Ming Ong } 402ab3b8b22SHan Ming Ong 4035160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 404ab3b8b22SHan Ming Ong if (log) 405d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 406ab3b8b22SHan Ming Ong process_sp.get(), 407ab3b8b22SHan Ming Ong (int) bytes_read, 408ab3b8b22SHan Ming Ong dst, 409ab3b8b22SHan Ming Ong (uint64_t)dst_len, 410ab3b8b22SHan Ming Ong (uint64_t)bytes_read); 411ab3b8b22SHan Ming Ong 412ab3b8b22SHan Ming Ong return bytes_read; 413ab3b8b22SHan Ming Ong } 414ab3b8b22SHan Ming Ong 41530fdc8d8SChris Lattner void 4162976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 41730fdc8d8SChris Lattner { 41830fdc8d8SChris Lattner if (out == NULL) 41930fdc8d8SChris Lattner return; 42030fdc8d8SChris Lattner 421acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 422acdbe816SGreg Clayton if (process_sp) 42330fdc8d8SChris Lattner { 42430fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 42530fdc8d8SChris Lattner char message[1024]; 42630fdc8d8SChris Lattner int message_len = ::snprintf (message, 42730fdc8d8SChris Lattner sizeof (message), 428d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 429acdbe816SGreg Clayton process_sp->GetID(), 43030fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 43130fdc8d8SChris Lattner 43230fdc8d8SChris Lattner if (message_len > 0) 43330fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 43430fdc8d8SChris Lattner } 43530fdc8d8SChris Lattner } 43630fdc8d8SChris Lattner 43730fdc8d8SChris Lattner void 4382976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 43930fdc8d8SChris Lattner { 440acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 441acdbe816SGreg Clayton if (process_sp) 44230fdc8d8SChris Lattner { 44330fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 44430fdc8d8SChris Lattner char message[1024]; 44530fdc8d8SChris Lattner ::snprintf (message, 44630fdc8d8SChris Lattner sizeof (message), 447d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 448acdbe816SGreg Clayton process_sp->GetID(), 44930fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 45030fdc8d8SChris Lattner 45130fdc8d8SChris Lattner result.AppendMessage (message); 45230fdc8d8SChris Lattner } 45330fdc8d8SChris Lattner } 45430fdc8d8SChris Lattner 45530fdc8d8SChris Lattner bool 4562976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 45730fdc8d8SChris Lattner { 458acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 459acdbe816SGreg Clayton if (process_sp) 460af67cecdSGreg Clayton { 461acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 462acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 463af67cecdSGreg Clayton } 46430fdc8d8SChris Lattner return false; 46530fdc8d8SChris Lattner } 46630fdc8d8SChris Lattner 46730fdc8d8SChris Lattner bool 468ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid) 469ea561dcfSGreg Clayton { 4705160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 471ceb6b139SCaroline Tice 472ceb6b139SCaroline Tice bool ret_val = false; 473acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 474acdbe816SGreg Clayton if (process_sp) 475af67cecdSGreg Clayton { 476acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 477acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 478af67cecdSGreg Clayton } 479ceb6b139SCaroline Tice 480ceb6b139SCaroline Tice if (log) 481d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s", 482acdbe816SGreg Clayton process_sp.get(), tid, (ret_val ? "true" : "false")); 483ceb6b139SCaroline Tice 484ceb6b139SCaroline Tice return ret_val; 48530fdc8d8SChris Lattner } 48630fdc8d8SChris Lattner 48718b46896SJim Ingham bool 48818b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 48918b46896SJim Ingham { 4905160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 49118b46896SJim Ingham 49218b46896SJim Ingham bool ret_val = false; 49318b46896SJim Ingham ProcessSP process_sp(GetSP()); 49418b46896SJim Ingham if (process_sp) 49518b46896SJim Ingham { 49618b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 49718b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 49818b46896SJim Ingham } 49918b46896SJim Ingham 50018b46896SJim Ingham if (log) 50118b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 50218b46896SJim Ingham process_sp.get(), index_id, (ret_val ? "true" : "false")); 50318b46896SJim Ingham 50418b46896SJim Ingham return ret_val; 50518b46896SJim Ingham } 50618b46896SJim Ingham 50730fdc8d8SChris Lattner SBThread 50830fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 50930fdc8d8SChris Lattner { 5105160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 511ceb6b139SCaroline Tice 51217a6ad05SGreg Clayton SBThread sb_thread; 51317a6ad05SGreg Clayton ThreadSP thread_sp; 514acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 515acdbe816SGreg Clayton if (process_sp) 516af67cecdSGreg Clayton { 5177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5187fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 519acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 5207fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 52117a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 522af67cecdSGreg Clayton } 523ceb6b139SCaroline Tice 524ceb6b139SCaroline Tice if (log) 525ceb6b139SCaroline Tice { 52693aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 527acdbe816SGreg Clayton process_sp.get(), (uint32_t) index, thread_sp.get()); 528ceb6b139SCaroline Tice } 529ceb6b139SCaroline Tice 53017a6ad05SGreg Clayton return sb_thread; 53130fdc8d8SChris Lattner } 53230fdc8d8SChris Lattner 533bf2956a2SJim Ingham uint32_t 534bf2956a2SJim Ingham SBProcess::GetStopID(bool include_expression_stops) 535bf2956a2SJim Ingham { 536bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 537bf2956a2SJim Ingham if (process_sp) 538bf2956a2SJim Ingham { 539bf2956a2SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 540bf2956a2SJim Ingham if (include_expression_stops) 541bf2956a2SJim Ingham return process_sp->GetStopID(); 542bf2956a2SJim Ingham else 543bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 544bf2956a2SJim Ingham } 545bf2956a2SJim Ingham return 0; 546bf2956a2SJim Ingham } 547bf2956a2SJim Ingham 54830fdc8d8SChris Lattner StateType 54930fdc8d8SChris Lattner SBProcess::GetState () 55030fdc8d8SChris Lattner { 551ceb6b139SCaroline Tice 552ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 553acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 554acdbe816SGreg Clayton if (process_sp) 555af67cecdSGreg Clayton { 556acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 557acdbe816SGreg Clayton ret_val = process_sp->GetState(); 558af67cecdSGreg Clayton } 559ceb6b139SCaroline Tice 5605160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 561ceb6b139SCaroline Tice if (log) 562cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 563acdbe816SGreg Clayton process_sp.get(), 564750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 565ceb6b139SCaroline Tice 566ceb6b139SCaroline Tice return ret_val; 56730fdc8d8SChris Lattner } 56830fdc8d8SChris Lattner 56930fdc8d8SChris Lattner 57030fdc8d8SChris Lattner int 57130fdc8d8SChris Lattner SBProcess::GetExitStatus () 57230fdc8d8SChris Lattner { 5734838131bSGreg Clayton int exit_status = 0; 574acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 575acdbe816SGreg Clayton if (process_sp) 576af67cecdSGreg Clayton { 577acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 578acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 579af67cecdSGreg Clayton } 5805160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5814838131bSGreg Clayton if (log) 5824838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 583acdbe816SGreg Clayton process_sp.get(), exit_status, exit_status); 5844838131bSGreg Clayton 5854838131bSGreg Clayton return exit_status; 58630fdc8d8SChris Lattner } 58730fdc8d8SChris Lattner 58830fdc8d8SChris Lattner const char * 58930fdc8d8SChris Lattner SBProcess::GetExitDescription () 59030fdc8d8SChris Lattner { 5914838131bSGreg Clayton const char *exit_desc = NULL; 592acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 593acdbe816SGreg Clayton if (process_sp) 594af67cecdSGreg Clayton { 595acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 596acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 597af67cecdSGreg Clayton } 5985160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5994838131bSGreg Clayton if (log) 6004838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 601acdbe816SGreg Clayton process_sp.get(), exit_desc); 6024838131bSGreg Clayton return exit_desc; 60330fdc8d8SChris Lattner } 60430fdc8d8SChris Lattner 60530fdc8d8SChris Lattner lldb::pid_t 60630fdc8d8SChris Lattner SBProcess::GetProcessID () 60730fdc8d8SChris Lattner { 608ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 609acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 610acdbe816SGreg Clayton if (process_sp) 611acdbe816SGreg Clayton ret_val = process_sp->GetID(); 612ceb6b139SCaroline Tice 6135160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 614ceb6b139SCaroline Tice if (log) 615d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, process_sp.get(), ret_val); 616ceb6b139SCaroline Tice 617ceb6b139SCaroline Tice return ret_val; 61830fdc8d8SChris Lattner } 61930fdc8d8SChris Lattner 620949e8221SGreg Clayton uint32_t 621949e8221SGreg Clayton SBProcess::GetUniqueID() 622949e8221SGreg Clayton { 623949e8221SGreg Clayton uint32_t ret_val = 0; 624949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 625949e8221SGreg Clayton if (process_sp) 626949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 6275160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 628949e8221SGreg Clayton if (log) 629949e8221SGreg Clayton log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, process_sp.get(), ret_val); 630949e8221SGreg Clayton return ret_val; 631949e8221SGreg Clayton } 632949e8221SGreg Clayton 633cf386e24SJohnny Chen ByteOrder 634cf386e24SJohnny Chen SBProcess::GetByteOrder () const 635cf386e24SJohnny Chen { 636cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 637acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 638acdbe816SGreg Clayton if (process_sp) 639acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 640cf386e24SJohnny Chen 6415160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 642cf386e24SJohnny Chen if (log) 643acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder); 644cf386e24SJohnny Chen 645cf386e24SJohnny Chen return byteOrder; 646cf386e24SJohnny Chen } 647cf386e24SJohnny Chen 64830fdc8d8SChris Lattner uint32_t 64930fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 65030fdc8d8SChris Lattner { 651ceb6b139SCaroline Tice uint32_t size = 0; 652acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 653acdbe816SGreg Clayton if (process_sp) 654acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 655ceb6b139SCaroline Tice 6565160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 657ceb6b139SCaroline Tice if (log) 658acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size); 659ceb6b139SCaroline Tice 660ceb6b139SCaroline Tice return size; 66130fdc8d8SChris Lattner } 66230fdc8d8SChris Lattner 66330fdc8d8SChris Lattner SBError 66430fdc8d8SChris Lattner SBProcess::Continue () 66530fdc8d8SChris Lattner { 6665160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 667ceb6b139SCaroline Tice 66830fdc8d8SChris Lattner SBError sb_error; 669acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 6700c74e78dSGreg Clayton 671acdbe816SGreg Clayton if (log) 672acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get()); 673acdbe816SGreg Clayton 674acdbe816SGreg Clayton if (process_sp) 675acdbe816SGreg Clayton { 676acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 677acdbe816SGreg Clayton 678acdbe816SGreg Clayton Error error (process_sp->Resume()); 6795d5028b5SGreg Clayton if (error.Success()) 6805d5028b5SGreg Clayton { 681acdbe816SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 6824838131bSGreg Clayton { 6834838131bSGreg Clayton if (log) 684acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get()); 685acdbe816SGreg Clayton process_sp->WaitForProcessToStop (NULL); 6865d5028b5SGreg Clayton } 6874838131bSGreg Clayton } 6885d5028b5SGreg Clayton sb_error.SetError(error); 6895d5028b5SGreg Clayton } 69030fdc8d8SChris Lattner else 69130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 69230fdc8d8SChris Lattner 693ceb6b139SCaroline Tice if (log) 694ceb6b139SCaroline Tice { 695ceb6b139SCaroline Tice SBStream sstr; 696ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 697acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData()); 698ceb6b139SCaroline Tice } 699ceb6b139SCaroline Tice 70030fdc8d8SChris Lattner return sb_error; 70130fdc8d8SChris Lattner } 70230fdc8d8SChris Lattner 70330fdc8d8SChris Lattner 70430fdc8d8SChris Lattner SBError 70530fdc8d8SChris Lattner SBProcess::Destroy () 70630fdc8d8SChris Lattner { 70730fdc8d8SChris Lattner SBError sb_error; 708acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 709acdbe816SGreg Clayton if (process_sp) 7106779606aSGreg Clayton { 711acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 712acdbe816SGreg Clayton sb_error.SetError(process_sp->Destroy()); 7136779606aSGreg Clayton } 71430fdc8d8SChris Lattner else 71530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 71630fdc8d8SChris Lattner 7175160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7184838131bSGreg Clayton if (log) 7194838131bSGreg Clayton { 7204838131bSGreg Clayton SBStream sstr; 7214838131bSGreg Clayton sb_error.GetDescription (sstr); 7226779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 723acdbe816SGreg Clayton process_sp.get(), 7246779606aSGreg Clayton sb_error.get(), 7256779606aSGreg Clayton sstr.GetData()); 7264838131bSGreg Clayton } 7274838131bSGreg Clayton 72830fdc8d8SChris Lattner return sb_error; 72930fdc8d8SChris Lattner } 73030fdc8d8SChris Lattner 73130fdc8d8SChris Lattner 73230fdc8d8SChris Lattner SBError 73330fdc8d8SChris Lattner SBProcess::Stop () 73430fdc8d8SChris Lattner { 73530fdc8d8SChris Lattner SBError sb_error; 736acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 737acdbe816SGreg Clayton if (process_sp) 738af67cecdSGreg Clayton { 739acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 740acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 741af67cecdSGreg Clayton } 74230fdc8d8SChris Lattner else 74330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 744ceb6b139SCaroline Tice 7455160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 746ceb6b139SCaroline Tice if (log) 747ceb6b139SCaroline Tice { 748ceb6b139SCaroline Tice SBStream sstr; 749ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 75093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 751acdbe816SGreg Clayton process_sp.get(), 75293aa84e8SGreg Clayton sb_error.get(), 753750cd175SCaroline Tice sstr.GetData()); 754ceb6b139SCaroline Tice } 755ceb6b139SCaroline Tice 75630fdc8d8SChris Lattner return sb_error; 75730fdc8d8SChris Lattner } 75830fdc8d8SChris Lattner 75930fdc8d8SChris Lattner SBError 76030fdc8d8SChris Lattner SBProcess::Kill () 76130fdc8d8SChris Lattner { 76230fdc8d8SChris Lattner SBError sb_error; 763acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 764acdbe816SGreg Clayton if (process_sp) 765af67cecdSGreg Clayton { 766acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 767acdbe816SGreg Clayton sb_error.SetError (process_sp->Destroy()); 768af67cecdSGreg Clayton } 76930fdc8d8SChris Lattner else 77030fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 771ceb6b139SCaroline Tice 7725160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 773ceb6b139SCaroline Tice if (log) 774ceb6b139SCaroline Tice { 775ceb6b139SCaroline Tice SBStream sstr; 776ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 77793aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 778acdbe816SGreg Clayton process_sp.get(), 77993aa84e8SGreg Clayton sb_error.get(), 780750cd175SCaroline Tice sstr.GetData()); 781ceb6b139SCaroline Tice } 782ceb6b139SCaroline Tice 78330fdc8d8SChris Lattner return sb_error; 78430fdc8d8SChris Lattner } 78530fdc8d8SChris Lattner 78630fdc8d8SChris Lattner SBError 78730fdc8d8SChris Lattner SBProcess::Detach () 78830fdc8d8SChris Lattner { 789*acff8950SJim Ingham // FIXME: This should come from a process default. 790*acff8950SJim Ingham bool keep_stopped = false; 791*acff8950SJim Ingham return Detach (keep_stopped); 792*acff8950SJim Ingham } 793*acff8950SJim Ingham 794*acff8950SJim Ingham SBError 795*acff8950SJim Ingham SBProcess::Detach (bool keep_stopped) 796*acff8950SJim Ingham { 79730fdc8d8SChris Lattner SBError sb_error; 798acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 799acdbe816SGreg Clayton if (process_sp) 800af67cecdSGreg Clayton { 801acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 802*acff8950SJim Ingham sb_error.SetError (process_sp->Detach(keep_stopped)); 803af67cecdSGreg Clayton } 80430fdc8d8SChris Lattner else 80530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 80630fdc8d8SChris Lattner 80730fdc8d8SChris Lattner return sb_error; 80830fdc8d8SChris Lattner } 80930fdc8d8SChris Lattner 81030fdc8d8SChris Lattner SBError 8114838131bSGreg Clayton SBProcess::Signal (int signo) 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->Signal (signo)); 819af67cecdSGreg Clayton } 82030fdc8d8SChris Lattner else 82130fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 8225160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8234838131bSGreg Clayton if (log) 8244838131bSGreg Clayton { 8254838131bSGreg Clayton SBStream sstr; 8264838131bSGreg Clayton sb_error.GetDescription (sstr); 8274838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 828acdbe816SGreg Clayton process_sp.get(), 8294838131bSGreg Clayton signo, 8304838131bSGreg Clayton sb_error.get(), 8314838131bSGreg Clayton sstr.GetData()); 8324838131bSGreg Clayton } 83330fdc8d8SChris Lattner return sb_error; 83430fdc8d8SChris Lattner } 83530fdc8d8SChris Lattner 836cfc0935eSJim Ingham void 837cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 838cfc0935eSJim Ingham { 839cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 840cfc0935eSJim Ingham if (process_sp) 841cfc0935eSJim Ingham { 842cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 843cfc0935eSJim Ingham } 844cfc0935eSJim Ingham } 845cfc0935eSJim Ingham 84630fdc8d8SChris Lattner SBThread 8474838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 84830fdc8d8SChris Lattner { 8494838131bSGreg Clayton SBThread sb_thread; 85017a6ad05SGreg Clayton ThreadSP thread_sp; 851acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 852acdbe816SGreg Clayton if (process_sp) 853af67cecdSGreg Clayton { 854acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 8557fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8567fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 8577fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 85817a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 859af67cecdSGreg Clayton } 8604838131bSGreg Clayton 8615160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8624838131bSGreg Clayton if (log) 8634838131bSGreg Clayton { 864d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)", 865acdbe816SGreg Clayton process_sp.get(), 8664838131bSGreg Clayton tid, 86717a6ad05SGreg Clayton thread_sp.get()); 8684838131bSGreg Clayton } 8694838131bSGreg Clayton 8704838131bSGreg Clayton return sb_thread; 87130fdc8d8SChris Lattner } 87230fdc8d8SChris Lattner 87318b46896SJim Ingham SBThread 87418b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 87518b46896SJim Ingham { 87618b46896SJim Ingham SBThread sb_thread; 87718b46896SJim Ingham ThreadSP thread_sp; 87818b46896SJim Ingham ProcessSP process_sp(GetSP()); 87918b46896SJim Ingham if (process_sp) 88018b46896SJim Ingham { 88118b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 88218b46896SJim Ingham Process::StopLocker stop_locker; 88318b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 88418b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 88518b46896SJim Ingham sb_thread.SetThread (thread_sp); 88618b46896SJim Ingham } 88718b46896SJim Ingham 8885160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 88918b46896SJim Ingham if (log) 89018b46896SJim Ingham { 89118b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 89218b46896SJim Ingham process_sp.get(), 89318b46896SJim Ingham index_id, 89418b46896SJim Ingham thread_sp.get()); 89518b46896SJim Ingham } 89618b46896SJim Ingham 89718b46896SJim Ingham return sb_thread; 89818b46896SJim Ingham } 89918b46896SJim Ingham 90030fdc8d8SChris Lattner StateType 90130fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 90230fdc8d8SChris Lattner { 9035160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 904ceb6b139SCaroline Tice 905ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 906ceb6b139SCaroline Tice 907ceb6b139SCaroline Tice if (log) 908cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 909750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 910ceb6b139SCaroline Tice 911ceb6b139SCaroline Tice return ret_val; 91230fdc8d8SChris Lattner } 91330fdc8d8SChris Lattner 91430fdc8d8SChris Lattner bool 91530fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 91630fdc8d8SChris Lattner { 9176611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 91830fdc8d8SChris Lattner } 91930fdc8d8SChris Lattner 9200161b49cSJim Ingham size_t 9210161b49cSJim Ingham SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event) 9220161b49cSJim Ingham { 9230161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 9240161b49cSJim Ingham } 9250161b49cSJim Ingham 9260161b49cSJim Ingham const char * 9270161b49cSJim Ingham SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx) 9280161b49cSJim Ingham { 9290161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 9300161b49cSJim Ingham } 9310161b49cSJim Ingham 93230fdc8d8SChris Lattner SBProcess 93330fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 93430fdc8d8SChris Lattner { 9356611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 93630fdc8d8SChris Lattner return process; 93730fdc8d8SChris Lattner } 93830fdc8d8SChris Lattner 939e6bc6cb9SJim Ingham bool 940e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 941e6bc6cb9SJim Ingham { 9424bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 943e6bc6cb9SJim Ingham } 94430fdc8d8SChris Lattner 94530fdc8d8SChris Lattner SBBroadcaster 94630fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 94730fdc8d8SChris Lattner { 9485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 949ceb6b139SCaroline Tice 950acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 951acdbe816SGreg Clayton 952acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 953ceb6b139SCaroline Tice 954ceb6b139SCaroline Tice if (log) 955acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 956750cd175SCaroline Tice broadcaster.get()); 957ceb6b139SCaroline Tice 95830fdc8d8SChris Lattner return broadcaster; 95930fdc8d8SChris Lattner } 96030fdc8d8SChris Lattner 9614bddaeb5SJim Ingham const char * 9624bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 9634bddaeb5SJim Ingham { 9644bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 9654bddaeb5SJim Ingham } 9664bddaeb5SJim Ingham 96730fdc8d8SChris Lattner size_t 96830fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 96930fdc8d8SChris Lattner { 9705160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 971ceb6b139SCaroline Tice 97230fdc8d8SChris Lattner size_t bytes_read = 0; 97330fdc8d8SChris Lattner 974acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 975acdbe816SGreg Clayton 9764838131bSGreg Clayton if (log) 9774838131bSGreg Clayton { 978d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 979acdbe816SGreg Clayton process_sp.get(), 9804838131bSGreg Clayton addr, 9814838131bSGreg Clayton dst, 98243e0af06SGreg Clayton (uint64_t)dst_len, 9834838131bSGreg Clayton sb_error.get()); 9844838131bSGreg Clayton } 9854838131bSGreg Clayton 986acdbe816SGreg Clayton if (process_sp) 98730fdc8d8SChris Lattner { 9887fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9897fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9907fdf9ef1SGreg Clayton { 991acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9927fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 9937fdf9ef1SGreg Clayton } 9947fdf9ef1SGreg Clayton else 9957fdf9ef1SGreg Clayton { 996c9858e4dSGreg Clayton if (log) 997c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get()); 9987fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9997fdf9ef1SGreg Clayton } 100030fdc8d8SChris Lattner } 100130fdc8d8SChris Lattner else 100230fdc8d8SChris Lattner { 100330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 100430fdc8d8SChris Lattner } 100530fdc8d8SChris Lattner 1006ceb6b139SCaroline Tice if (log) 100793aa84e8SGreg Clayton { 100893aa84e8SGreg Clayton SBStream sstr; 100993aa84e8SGreg Clayton sb_error.GetDescription (sstr); 1010d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1011acdbe816SGreg Clayton process_sp.get(), 101293aa84e8SGreg Clayton addr, 101393aa84e8SGreg Clayton dst, 101443e0af06SGreg Clayton (uint64_t)dst_len, 101593aa84e8SGreg Clayton sb_error.get(), 101693aa84e8SGreg Clayton sstr.GetData(), 101743e0af06SGreg Clayton (uint64_t)bytes_read); 101893aa84e8SGreg Clayton } 1019ceb6b139SCaroline Tice 102030fdc8d8SChris Lattner return bytes_read; 102130fdc8d8SChris Lattner } 102230fdc8d8SChris Lattner 102330fdc8d8SChris Lattner size_t 1024e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 1025e91b7957SGreg Clayton { 1026e91b7957SGreg Clayton size_t bytes_read = 0; 1027acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1028acdbe816SGreg Clayton if (process_sp) 1029e91b7957SGreg Clayton { 10307fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10317fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10327fdf9ef1SGreg Clayton { 1033acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10347fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 10357fdf9ef1SGreg Clayton } 10367fdf9ef1SGreg Clayton else 10377fdf9ef1SGreg Clayton { 10385160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1039c9858e4dSGreg Clayton if (log) 1040c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get()); 10417fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10427fdf9ef1SGreg Clayton } 1043e91b7957SGreg Clayton } 1044e91b7957SGreg Clayton else 1045e91b7957SGreg Clayton { 1046e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1047e91b7957SGreg Clayton } 1048e91b7957SGreg Clayton return bytes_read; 1049e91b7957SGreg Clayton } 1050e91b7957SGreg Clayton 1051e91b7957SGreg Clayton uint64_t 1052e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 1053e91b7957SGreg Clayton { 10547fdf9ef1SGreg Clayton uint64_t value = 0; 1055acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1056acdbe816SGreg Clayton if (process_sp) 1057e91b7957SGreg Clayton { 10587fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10597fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10607fdf9ef1SGreg Clayton { 1061acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10627fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 10637fdf9ef1SGreg Clayton } 10647fdf9ef1SGreg Clayton else 10657fdf9ef1SGreg Clayton { 10665160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1067c9858e4dSGreg Clayton if (log) 1068c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get()); 10697fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10707fdf9ef1SGreg Clayton } 1071e91b7957SGreg Clayton } 1072e91b7957SGreg Clayton else 1073e91b7957SGreg Clayton { 1074e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1075e91b7957SGreg Clayton } 10767fdf9ef1SGreg Clayton return value; 1077e91b7957SGreg Clayton } 1078e91b7957SGreg Clayton 1079e91b7957SGreg Clayton lldb::addr_t 1080e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 1081e91b7957SGreg Clayton { 1082e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1083acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1084acdbe816SGreg Clayton if (process_sp) 1085e91b7957SGreg Clayton { 10867fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10877fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10887fdf9ef1SGreg Clayton { 1089acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10907fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 10917fdf9ef1SGreg Clayton } 10927fdf9ef1SGreg Clayton else 10937fdf9ef1SGreg Clayton { 10945160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1095c9858e4dSGreg Clayton if (log) 1096c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get()); 10977fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10987fdf9ef1SGreg Clayton } 1099e91b7957SGreg Clayton } 1100e91b7957SGreg Clayton else 1101e91b7957SGreg Clayton { 1102e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1103e91b7957SGreg Clayton } 1104e91b7957SGreg Clayton return ptr; 1105e91b7957SGreg Clayton } 1106e91b7957SGreg Clayton 1107e91b7957SGreg Clayton size_t 110830fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 110930fdc8d8SChris Lattner { 111030fdc8d8SChris Lattner size_t bytes_written = 0; 111130fdc8d8SChris Lattner 11125160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1113acdbe816SGreg Clayton 1114acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1115acdbe816SGreg Clayton 11164838131bSGreg Clayton if (log) 11174838131bSGreg Clayton { 1118d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1119acdbe816SGreg Clayton process_sp.get(), 11204838131bSGreg Clayton addr, 11214838131bSGreg Clayton src, 112243e0af06SGreg Clayton (uint64_t)src_len, 11234838131bSGreg Clayton sb_error.get()); 11244838131bSGreg Clayton } 11254838131bSGreg Clayton 1126acdbe816SGreg Clayton if (process_sp) 112730fdc8d8SChris Lattner { 11287fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11297fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11307fdf9ef1SGreg Clayton { 1131acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11327fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 11337fdf9ef1SGreg Clayton } 11347fdf9ef1SGreg Clayton else 11357fdf9ef1SGreg Clayton { 1136c9858e4dSGreg Clayton if (log) 1137c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get()); 11387fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11397fdf9ef1SGreg Clayton } 114030fdc8d8SChris Lattner } 114130fdc8d8SChris Lattner 11424838131bSGreg Clayton if (log) 11434838131bSGreg Clayton { 11444838131bSGreg Clayton SBStream sstr; 11454838131bSGreg Clayton sb_error.GetDescription (sstr); 1146d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1147acdbe816SGreg Clayton process_sp.get(), 11484838131bSGreg Clayton addr, 11494838131bSGreg Clayton src, 115043e0af06SGreg Clayton (uint64_t)src_len, 11514838131bSGreg Clayton sb_error.get(), 11524838131bSGreg Clayton sstr.GetData(), 115343e0af06SGreg Clayton (uint64_t)bytes_written); 11544838131bSGreg Clayton } 11554838131bSGreg Clayton 115630fdc8d8SChris Lattner return bytes_written; 115730fdc8d8SChris Lattner } 115830fdc8d8SChris Lattner 1159dde9cff3SCaroline Tice bool 1160dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1161dde9cff3SCaroline Tice { 1162da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1163da7bc7d0SGreg Clayton 1164acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1165acdbe816SGreg Clayton if (process_sp) 1166dde9cff3SCaroline Tice { 1167dde9cff3SCaroline Tice char path[PATH_MAX]; 1168dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1169acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 11701d273166SGreg Clayton const char *exe_name = NULL; 11711d273166SGreg Clayton if (exe_module) 11721d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 11731d273166SGreg Clayton 1174d01b2953SDaniel Malea strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1175acdbe816SGreg Clayton process_sp->GetID(), 1176ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 11771d273166SGreg Clayton GetNumThreads(), 117805faeb71SGreg Clayton exe_name ? ", executable = " : "", 11791d273166SGreg Clayton exe_name ? exe_name : ""); 1180dde9cff3SCaroline Tice } 1181dde9cff3SCaroline Tice else 1182da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1183dde9cff3SCaroline Tice 1184dde9cff3SCaroline Tice return true; 1185dde9cff3SCaroline Tice } 11868f343b09SGreg Clayton 11878f343b09SGreg Clayton uint32_t 1188f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1189f9ef60d2SJohnny Chen { 11905160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1191f9ef60d2SJohnny Chen 1192f9ef60d2SJohnny Chen uint32_t num = 0; 1193f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1194f9ef60d2SJohnny Chen if (process_sp) 1195f9ef60d2SJohnny Chen { 1196f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1197f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1198f9ef60d2SJohnny Chen if (log) 1199f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1200f9ef60d2SJohnny Chen process_sp.get(), num); 1201f9ef60d2SJohnny Chen } 1202f9ef60d2SJohnny Chen else 1203f9ef60d2SJohnny Chen { 1204f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1205f9ef60d2SJohnny Chen } 1206f9ef60d2SJohnny Chen return num; 1207f9ef60d2SJohnny Chen } 1208f9ef60d2SJohnny Chen 1209f9ef60d2SJohnny Chen uint32_t 12108f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 12118f343b09SGreg Clayton { 1212acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1213acdbe816SGreg Clayton if (process_sp) 1214af67cecdSGreg Clayton { 12157fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12167fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12177fdf9ef1SGreg Clayton { 1218acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1219acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1220af67cecdSGreg Clayton } 12217fdf9ef1SGreg Clayton else 12227fdf9ef1SGreg Clayton { 12235160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1224c9858e4dSGreg Clayton if (log) 1225c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get()); 12267fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12277fdf9ef1SGreg Clayton } 12287fdf9ef1SGreg Clayton } 12298f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 12308f343b09SGreg Clayton } 12318f343b09SGreg Clayton 12328f343b09SGreg Clayton lldb::SBError 12338f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 12348f343b09SGreg Clayton { 12358f343b09SGreg Clayton lldb::SBError sb_error; 1236acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1237acdbe816SGreg Clayton if (process_sp) 1238af67cecdSGreg Clayton { 12397fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12407fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12417fdf9ef1SGreg Clayton { 1242acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1243acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1244af67cecdSGreg Clayton } 12458f343b09SGreg Clayton else 12467fdf9ef1SGreg Clayton { 12475160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1248c9858e4dSGreg Clayton if (log) 1249c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get()); 12507fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12517fdf9ef1SGreg Clayton } 12527fdf9ef1SGreg Clayton } 12537fdf9ef1SGreg Clayton else 12548f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 12558f343b09SGreg Clayton return sb_error; 12568f343b09SGreg Clayton } 1257