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 { 146*5160ce5cSGreg 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 225*5160ce5cSGreg 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 { 239*5160ce5cSGreg 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 { 261*5160ce5cSGreg 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 { 284*5160ce5cSGreg 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 { 305*5160ce5cSGreg 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 { 326*5160ce5cSGreg 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 357*5160ce5cSGreg 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 380*5160ce5cSGreg 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 403*5160ce5cSGreg 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 { 470*5160ce5cSGreg 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 { 490*5160ce5cSGreg 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 { 510*5160ce5cSGreg 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 560*5160ce5cSGreg 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 } 580*5160ce5cSGreg 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 } 598*5160ce5cSGreg 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 613*5160ce5cSGreg 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(); 627*5160ce5cSGreg 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 641*5160ce5cSGreg 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 656*5160ce5cSGreg 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 { 666*5160ce5cSGreg 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 717*5160ce5cSGreg 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 745*5160ce5cSGreg 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 772*5160ce5cSGreg 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 { 78930fdc8d8SChris Lattner SBError sb_error; 790acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 791acdbe816SGreg Clayton if (process_sp) 792af67cecdSGreg Clayton { 793acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 794acdbe816SGreg Clayton sb_error.SetError (process_sp->Detach()); 795af67cecdSGreg Clayton } 79630fdc8d8SChris Lattner else 79730fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 79830fdc8d8SChris Lattner 79930fdc8d8SChris Lattner return sb_error; 80030fdc8d8SChris Lattner } 80130fdc8d8SChris Lattner 80230fdc8d8SChris Lattner SBError 8034838131bSGreg Clayton SBProcess::Signal (int signo) 80430fdc8d8SChris Lattner { 80530fdc8d8SChris Lattner SBError sb_error; 806acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 807acdbe816SGreg Clayton if (process_sp) 808af67cecdSGreg Clayton { 809acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 810acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 811af67cecdSGreg Clayton } 81230fdc8d8SChris Lattner else 81330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 814*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8154838131bSGreg Clayton if (log) 8164838131bSGreg Clayton { 8174838131bSGreg Clayton SBStream sstr; 8184838131bSGreg Clayton sb_error.GetDescription (sstr); 8194838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 820acdbe816SGreg Clayton process_sp.get(), 8214838131bSGreg Clayton signo, 8224838131bSGreg Clayton sb_error.get(), 8234838131bSGreg Clayton sstr.GetData()); 8244838131bSGreg Clayton } 82530fdc8d8SChris Lattner return sb_error; 82630fdc8d8SChris Lattner } 82730fdc8d8SChris Lattner 828cfc0935eSJim Ingham void 829cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 830cfc0935eSJim Ingham { 831cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 832cfc0935eSJim Ingham if (process_sp) 833cfc0935eSJim Ingham { 834cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 835cfc0935eSJim Ingham } 836cfc0935eSJim Ingham } 837cfc0935eSJim Ingham 83830fdc8d8SChris Lattner SBThread 8394838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 84030fdc8d8SChris Lattner { 8414838131bSGreg Clayton SBThread sb_thread; 84217a6ad05SGreg Clayton ThreadSP thread_sp; 843acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 844acdbe816SGreg Clayton if (process_sp) 845af67cecdSGreg Clayton { 846acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 8477fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8487fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 8497fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 85017a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 851af67cecdSGreg Clayton } 8524838131bSGreg Clayton 853*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8544838131bSGreg Clayton if (log) 8554838131bSGreg Clayton { 856d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)", 857acdbe816SGreg Clayton process_sp.get(), 8584838131bSGreg Clayton tid, 85917a6ad05SGreg Clayton thread_sp.get()); 8604838131bSGreg Clayton } 8614838131bSGreg Clayton 8624838131bSGreg Clayton return sb_thread; 86330fdc8d8SChris Lattner } 86430fdc8d8SChris Lattner 86518b46896SJim Ingham SBThread 86618b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 86718b46896SJim Ingham { 86818b46896SJim Ingham SBThread sb_thread; 86918b46896SJim Ingham ThreadSP thread_sp; 87018b46896SJim Ingham ProcessSP process_sp(GetSP()); 87118b46896SJim Ingham if (process_sp) 87218b46896SJim Ingham { 87318b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 87418b46896SJim Ingham Process::StopLocker stop_locker; 87518b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 87618b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 87718b46896SJim Ingham sb_thread.SetThread (thread_sp); 87818b46896SJim Ingham } 87918b46896SJim Ingham 880*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 88118b46896SJim Ingham if (log) 88218b46896SJim Ingham { 88318b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 88418b46896SJim Ingham process_sp.get(), 88518b46896SJim Ingham index_id, 88618b46896SJim Ingham thread_sp.get()); 88718b46896SJim Ingham } 88818b46896SJim Ingham 88918b46896SJim Ingham return sb_thread; 89018b46896SJim Ingham } 89118b46896SJim Ingham 89230fdc8d8SChris Lattner StateType 89330fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 89430fdc8d8SChris Lattner { 895*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 896ceb6b139SCaroline Tice 897ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 898ceb6b139SCaroline Tice 899ceb6b139SCaroline Tice if (log) 900cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 901750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 902ceb6b139SCaroline Tice 903ceb6b139SCaroline Tice return ret_val; 90430fdc8d8SChris Lattner } 90530fdc8d8SChris Lattner 90630fdc8d8SChris Lattner bool 90730fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 90830fdc8d8SChris Lattner { 9096611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 91030fdc8d8SChris Lattner } 91130fdc8d8SChris Lattner 9120161b49cSJim Ingham size_t 9130161b49cSJim Ingham SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event) 9140161b49cSJim Ingham { 9150161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 9160161b49cSJim Ingham } 9170161b49cSJim Ingham 9180161b49cSJim Ingham const char * 9190161b49cSJim Ingham SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx) 9200161b49cSJim Ingham { 9210161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 9220161b49cSJim Ingham } 9230161b49cSJim Ingham 92430fdc8d8SChris Lattner SBProcess 92530fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 92630fdc8d8SChris Lattner { 9276611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 92830fdc8d8SChris Lattner return process; 92930fdc8d8SChris Lattner } 93030fdc8d8SChris Lattner 931e6bc6cb9SJim Ingham bool 932e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 933e6bc6cb9SJim Ingham { 9344bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 935e6bc6cb9SJim Ingham } 93630fdc8d8SChris Lattner 93730fdc8d8SChris Lattner SBBroadcaster 93830fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 93930fdc8d8SChris Lattner { 940*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 941ceb6b139SCaroline Tice 942acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 943acdbe816SGreg Clayton 944acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 945ceb6b139SCaroline Tice 946ceb6b139SCaroline Tice if (log) 947acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 948750cd175SCaroline Tice broadcaster.get()); 949ceb6b139SCaroline Tice 95030fdc8d8SChris Lattner return broadcaster; 95130fdc8d8SChris Lattner } 95230fdc8d8SChris Lattner 9534bddaeb5SJim Ingham const char * 9544bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 9554bddaeb5SJim Ingham { 9564bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 9574bddaeb5SJim Ingham } 9584bddaeb5SJim Ingham 95930fdc8d8SChris Lattner size_t 96030fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 96130fdc8d8SChris Lattner { 962*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 963ceb6b139SCaroline Tice 96430fdc8d8SChris Lattner size_t bytes_read = 0; 96530fdc8d8SChris Lattner 966acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 967acdbe816SGreg Clayton 9684838131bSGreg Clayton if (log) 9694838131bSGreg Clayton { 970d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 971acdbe816SGreg Clayton process_sp.get(), 9724838131bSGreg Clayton addr, 9734838131bSGreg Clayton dst, 97443e0af06SGreg Clayton (uint64_t)dst_len, 9754838131bSGreg Clayton sb_error.get()); 9764838131bSGreg Clayton } 9774838131bSGreg Clayton 978acdbe816SGreg Clayton if (process_sp) 97930fdc8d8SChris Lattner { 9807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9817fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9827fdf9ef1SGreg Clayton { 983acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9847fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 9857fdf9ef1SGreg Clayton } 9867fdf9ef1SGreg Clayton else 9877fdf9ef1SGreg Clayton { 988c9858e4dSGreg Clayton if (log) 989c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get()); 9907fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9917fdf9ef1SGreg Clayton } 99230fdc8d8SChris Lattner } 99330fdc8d8SChris Lattner else 99430fdc8d8SChris Lattner { 99530fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 99630fdc8d8SChris Lattner } 99730fdc8d8SChris Lattner 998ceb6b139SCaroline Tice if (log) 99993aa84e8SGreg Clayton { 100093aa84e8SGreg Clayton SBStream sstr; 100193aa84e8SGreg Clayton sb_error.GetDescription (sstr); 1002d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1003acdbe816SGreg Clayton process_sp.get(), 100493aa84e8SGreg Clayton addr, 100593aa84e8SGreg Clayton dst, 100643e0af06SGreg Clayton (uint64_t)dst_len, 100793aa84e8SGreg Clayton sb_error.get(), 100893aa84e8SGreg Clayton sstr.GetData(), 100943e0af06SGreg Clayton (uint64_t)bytes_read); 101093aa84e8SGreg Clayton } 1011ceb6b139SCaroline Tice 101230fdc8d8SChris Lattner return bytes_read; 101330fdc8d8SChris Lattner } 101430fdc8d8SChris Lattner 101530fdc8d8SChris Lattner size_t 1016e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 1017e91b7957SGreg Clayton { 1018e91b7957SGreg Clayton size_t bytes_read = 0; 1019acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1020acdbe816SGreg Clayton if (process_sp) 1021e91b7957SGreg Clayton { 10227fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10237fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10247fdf9ef1SGreg Clayton { 1025acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10267fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 10277fdf9ef1SGreg Clayton } 10287fdf9ef1SGreg Clayton else 10297fdf9ef1SGreg Clayton { 1030*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1031c9858e4dSGreg Clayton if (log) 1032c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get()); 10337fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10347fdf9ef1SGreg Clayton } 1035e91b7957SGreg Clayton } 1036e91b7957SGreg Clayton else 1037e91b7957SGreg Clayton { 1038e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1039e91b7957SGreg Clayton } 1040e91b7957SGreg Clayton return bytes_read; 1041e91b7957SGreg Clayton } 1042e91b7957SGreg Clayton 1043e91b7957SGreg Clayton uint64_t 1044e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 1045e91b7957SGreg Clayton { 10467fdf9ef1SGreg Clayton uint64_t value = 0; 1047acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1048acdbe816SGreg Clayton if (process_sp) 1049e91b7957SGreg Clayton { 10507fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10517fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10527fdf9ef1SGreg Clayton { 1053acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10547fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 10557fdf9ef1SGreg Clayton } 10567fdf9ef1SGreg Clayton else 10577fdf9ef1SGreg Clayton { 1058*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1059c9858e4dSGreg Clayton if (log) 1060c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get()); 10617fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10627fdf9ef1SGreg Clayton } 1063e91b7957SGreg Clayton } 1064e91b7957SGreg Clayton else 1065e91b7957SGreg Clayton { 1066e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1067e91b7957SGreg Clayton } 10687fdf9ef1SGreg Clayton return value; 1069e91b7957SGreg Clayton } 1070e91b7957SGreg Clayton 1071e91b7957SGreg Clayton lldb::addr_t 1072e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 1073e91b7957SGreg Clayton { 1074e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1075acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1076acdbe816SGreg Clayton if (process_sp) 1077e91b7957SGreg Clayton { 10787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10797fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10807fdf9ef1SGreg Clayton { 1081acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10827fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 10837fdf9ef1SGreg Clayton } 10847fdf9ef1SGreg Clayton else 10857fdf9ef1SGreg Clayton { 1086*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1087c9858e4dSGreg Clayton if (log) 1088c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get()); 10897fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10907fdf9ef1SGreg Clayton } 1091e91b7957SGreg Clayton } 1092e91b7957SGreg Clayton else 1093e91b7957SGreg Clayton { 1094e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1095e91b7957SGreg Clayton } 1096e91b7957SGreg Clayton return ptr; 1097e91b7957SGreg Clayton } 1098e91b7957SGreg Clayton 1099e91b7957SGreg Clayton size_t 110030fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 110130fdc8d8SChris Lattner { 110230fdc8d8SChris Lattner size_t bytes_written = 0; 110330fdc8d8SChris Lattner 1104*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1105acdbe816SGreg Clayton 1106acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1107acdbe816SGreg Clayton 11084838131bSGreg Clayton if (log) 11094838131bSGreg Clayton { 1110d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1111acdbe816SGreg Clayton process_sp.get(), 11124838131bSGreg Clayton addr, 11134838131bSGreg Clayton src, 111443e0af06SGreg Clayton (uint64_t)src_len, 11154838131bSGreg Clayton sb_error.get()); 11164838131bSGreg Clayton } 11174838131bSGreg Clayton 1118acdbe816SGreg Clayton if (process_sp) 111930fdc8d8SChris Lattner { 11207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11217fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11227fdf9ef1SGreg Clayton { 1123acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11247fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 11257fdf9ef1SGreg Clayton } 11267fdf9ef1SGreg Clayton else 11277fdf9ef1SGreg Clayton { 1128c9858e4dSGreg Clayton if (log) 1129c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get()); 11307fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11317fdf9ef1SGreg Clayton } 113230fdc8d8SChris Lattner } 113330fdc8d8SChris Lattner 11344838131bSGreg Clayton if (log) 11354838131bSGreg Clayton { 11364838131bSGreg Clayton SBStream sstr; 11374838131bSGreg Clayton sb_error.GetDescription (sstr); 1138d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1139acdbe816SGreg Clayton process_sp.get(), 11404838131bSGreg Clayton addr, 11414838131bSGreg Clayton src, 114243e0af06SGreg Clayton (uint64_t)src_len, 11434838131bSGreg Clayton sb_error.get(), 11444838131bSGreg Clayton sstr.GetData(), 114543e0af06SGreg Clayton (uint64_t)bytes_written); 11464838131bSGreg Clayton } 11474838131bSGreg Clayton 114830fdc8d8SChris Lattner return bytes_written; 114930fdc8d8SChris Lattner } 115030fdc8d8SChris Lattner 1151dde9cff3SCaroline Tice bool 1152dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1153dde9cff3SCaroline Tice { 1154da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1155da7bc7d0SGreg Clayton 1156acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1157acdbe816SGreg Clayton if (process_sp) 1158dde9cff3SCaroline Tice { 1159dde9cff3SCaroline Tice char path[PATH_MAX]; 1160dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1161acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 11621d273166SGreg Clayton const char *exe_name = NULL; 11631d273166SGreg Clayton if (exe_module) 11641d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 11651d273166SGreg Clayton 1166d01b2953SDaniel Malea strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1167acdbe816SGreg Clayton process_sp->GetID(), 1168ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 11691d273166SGreg Clayton GetNumThreads(), 117005faeb71SGreg Clayton exe_name ? ", executable = " : "", 11711d273166SGreg Clayton exe_name ? exe_name : ""); 1172dde9cff3SCaroline Tice } 1173dde9cff3SCaroline Tice else 1174da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1175dde9cff3SCaroline Tice 1176dde9cff3SCaroline Tice return true; 1177dde9cff3SCaroline Tice } 11788f343b09SGreg Clayton 11798f343b09SGreg Clayton uint32_t 1180f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1181f9ef60d2SJohnny Chen { 1182*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1183f9ef60d2SJohnny Chen 1184f9ef60d2SJohnny Chen uint32_t num = 0; 1185f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1186f9ef60d2SJohnny Chen if (process_sp) 1187f9ef60d2SJohnny Chen { 1188f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1189f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1190f9ef60d2SJohnny Chen if (log) 1191f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1192f9ef60d2SJohnny Chen process_sp.get(), num); 1193f9ef60d2SJohnny Chen } 1194f9ef60d2SJohnny Chen else 1195f9ef60d2SJohnny Chen { 1196f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1197f9ef60d2SJohnny Chen } 1198f9ef60d2SJohnny Chen return num; 1199f9ef60d2SJohnny Chen } 1200f9ef60d2SJohnny Chen 1201f9ef60d2SJohnny Chen uint32_t 12028f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 12038f343b09SGreg Clayton { 1204acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1205acdbe816SGreg Clayton if (process_sp) 1206af67cecdSGreg Clayton { 12077fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12087fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12097fdf9ef1SGreg Clayton { 1210acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1211acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1212af67cecdSGreg Clayton } 12137fdf9ef1SGreg Clayton else 12147fdf9ef1SGreg Clayton { 1215*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1216c9858e4dSGreg Clayton if (log) 1217c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get()); 12187fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12197fdf9ef1SGreg Clayton } 12207fdf9ef1SGreg Clayton } 12218f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 12228f343b09SGreg Clayton } 12238f343b09SGreg Clayton 12248f343b09SGreg Clayton lldb::SBError 12258f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 12268f343b09SGreg Clayton { 12278f343b09SGreg Clayton lldb::SBError sb_error; 1228acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1229acdbe816SGreg Clayton if (process_sp) 1230af67cecdSGreg Clayton { 12317fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12327fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12337fdf9ef1SGreg Clayton { 1234acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1235acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1236af67cecdSGreg Clayton } 12378f343b09SGreg Clayton else 12387fdf9ef1SGreg Clayton { 1239*5160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1240c9858e4dSGreg Clayton if (log) 1241c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get()); 12427fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12437fdf9ef1SGreg Clayton } 12447fdf9ef1SGreg Clayton } 12457fdf9ef1SGreg Clayton else 12468f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 12478f343b09SGreg Clayton return sb_error; 12488f343b09SGreg Clayton } 1249