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 { 1469631aae2SJames McIlree LogSP 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 2259631aae2SJames McIlree LogSP 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 { 2392d4edfbcSGreg Clayton LogSP 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 { 2612d4edfbcSGreg Clayton LogSP 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 281*a4d8747dSGreg Clayton SBThread 282*a4d8747dSGreg Clayton SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) 283*a4d8747dSGreg Clayton { 284*a4d8747dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 285*a4d8747dSGreg Clayton 286*a4d8747dSGreg Clayton SBThread sb_thread; 287*a4d8747dSGreg Clayton ThreadSP thread_sp; 288*a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 289*a4d8747dSGreg Clayton if (process_sp) 290*a4d8747dSGreg Clayton { 291*a4d8747dSGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 292*a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 293*a4d8747dSGreg Clayton sb_thread.SetThread (thread_sp); 294*a4d8747dSGreg Clayton } 295*a4d8747dSGreg Clayton 296*a4d8747dSGreg Clayton if (log) 297*a4d8747dSGreg Clayton log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", process_sp.get(), tid, context, thread_sp.get()); 298*a4d8747dSGreg Clayton 299*a4d8747dSGreg Clayton return sb_thread; 300*a4d8747dSGreg Clayton } 301*a4d8747dSGreg Clayton 30230fdc8d8SChris Lattner SBTarget 30330fdc8d8SChris Lattner SBProcess::GetTarget() const 30430fdc8d8SChris Lattner { 3052d4edfbcSGreg Clayton LogSP 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 { 3262d4edfbcSGreg Clayton LogSP 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 3572d4edfbcSGreg Clayton LogSP 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 3802d4edfbcSGreg Clayton LogSP 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 403ab3b8b22SHan Ming Ong LogSP 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 { 4702d4edfbcSGreg Clayton LogSP 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 { 49018b46896SJim Ingham LogSP 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 { 5102d4edfbcSGreg Clayton LogSP 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 5602d4edfbcSGreg Clayton LogSP 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 } 5802d4edfbcSGreg Clayton LogSP 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 } 5982d4edfbcSGreg Clayton LogSP 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 6132d4edfbcSGreg Clayton LogSP 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(); 627949e8221SGreg Clayton LogSP 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 641cf386e24SJohnny Chen LogSP 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 6562d4edfbcSGreg Clayton LogSP 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 { 6662d4edfbcSGreg Clayton LogSP 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 7172d4edfbcSGreg Clayton LogSP 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 7452d4edfbcSGreg Clayton LogSP 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 7722d4edfbcSGreg Clayton LogSP 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"); 8142d4edfbcSGreg Clayton LogSP 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 8532d4edfbcSGreg Clayton LogSP 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 88018b46896SJim Ingham LogSP 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 { 8952d4edfbcSGreg Clayton LogSP 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 91230fdc8d8SChris Lattner SBProcess 91330fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 91430fdc8d8SChris Lattner { 9156611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 91630fdc8d8SChris Lattner return process; 91730fdc8d8SChris Lattner } 91830fdc8d8SChris Lattner 919e6bc6cb9SJim Ingham bool 920e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 921e6bc6cb9SJim Ingham { 9224bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 923e6bc6cb9SJim Ingham } 92430fdc8d8SChris Lattner 92530fdc8d8SChris Lattner SBBroadcaster 92630fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 92730fdc8d8SChris Lattner { 9282d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 929ceb6b139SCaroline Tice 930acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 931acdbe816SGreg Clayton 932acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 933ceb6b139SCaroline Tice 934ceb6b139SCaroline Tice if (log) 935acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 936750cd175SCaroline Tice broadcaster.get()); 937ceb6b139SCaroline Tice 93830fdc8d8SChris Lattner return broadcaster; 93930fdc8d8SChris Lattner } 94030fdc8d8SChris Lattner 9414bddaeb5SJim Ingham const char * 9424bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 9434bddaeb5SJim Ingham { 9444bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 9454bddaeb5SJim Ingham } 9464bddaeb5SJim Ingham 94730fdc8d8SChris Lattner size_t 94830fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 94930fdc8d8SChris Lattner { 9502d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 951ceb6b139SCaroline Tice 95230fdc8d8SChris Lattner size_t bytes_read = 0; 95330fdc8d8SChris Lattner 954acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 955acdbe816SGreg Clayton 9564838131bSGreg Clayton if (log) 9574838131bSGreg Clayton { 958d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 959acdbe816SGreg Clayton process_sp.get(), 9604838131bSGreg Clayton addr, 9614838131bSGreg Clayton dst, 96243e0af06SGreg Clayton (uint64_t)dst_len, 9634838131bSGreg Clayton sb_error.get()); 9644838131bSGreg Clayton } 9654838131bSGreg Clayton 966acdbe816SGreg Clayton if (process_sp) 96730fdc8d8SChris Lattner { 9687fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9697fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9707fdf9ef1SGreg Clayton { 971acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9727fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 9737fdf9ef1SGreg Clayton } 9747fdf9ef1SGreg Clayton else 9757fdf9ef1SGreg Clayton { 976c9858e4dSGreg Clayton if (log) 977c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get()); 9787fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 9797fdf9ef1SGreg Clayton } 98030fdc8d8SChris Lattner } 98130fdc8d8SChris Lattner else 98230fdc8d8SChris Lattner { 98330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 98430fdc8d8SChris Lattner } 98530fdc8d8SChris Lattner 986ceb6b139SCaroline Tice if (log) 98793aa84e8SGreg Clayton { 98893aa84e8SGreg Clayton SBStream sstr; 98993aa84e8SGreg Clayton sb_error.GetDescription (sstr); 990d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 991acdbe816SGreg Clayton process_sp.get(), 99293aa84e8SGreg Clayton addr, 99393aa84e8SGreg Clayton dst, 99443e0af06SGreg Clayton (uint64_t)dst_len, 99593aa84e8SGreg Clayton sb_error.get(), 99693aa84e8SGreg Clayton sstr.GetData(), 99743e0af06SGreg Clayton (uint64_t)bytes_read); 99893aa84e8SGreg Clayton } 999ceb6b139SCaroline Tice 100030fdc8d8SChris Lattner return bytes_read; 100130fdc8d8SChris Lattner } 100230fdc8d8SChris Lattner 100330fdc8d8SChris Lattner size_t 1004e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 1005e91b7957SGreg Clayton { 1006e91b7957SGreg Clayton size_t bytes_read = 0; 1007acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1008acdbe816SGreg Clayton if (process_sp) 1009e91b7957SGreg Clayton { 10107fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10117fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10127fdf9ef1SGreg Clayton { 1013acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10147fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 10157fdf9ef1SGreg Clayton } 10167fdf9ef1SGreg Clayton else 10177fdf9ef1SGreg Clayton { 1018c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1019c9858e4dSGreg Clayton if (log) 1020c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get()); 10217fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10227fdf9ef1SGreg Clayton } 1023e91b7957SGreg Clayton } 1024e91b7957SGreg Clayton else 1025e91b7957SGreg Clayton { 1026e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1027e91b7957SGreg Clayton } 1028e91b7957SGreg Clayton return bytes_read; 1029e91b7957SGreg Clayton } 1030e91b7957SGreg Clayton 1031e91b7957SGreg Clayton uint64_t 1032e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 1033e91b7957SGreg Clayton { 10347fdf9ef1SGreg Clayton uint64_t value = 0; 1035acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1036acdbe816SGreg Clayton if (process_sp) 1037e91b7957SGreg Clayton { 10387fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10397fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10407fdf9ef1SGreg Clayton { 1041acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10427fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 10437fdf9ef1SGreg Clayton } 10447fdf9ef1SGreg Clayton else 10457fdf9ef1SGreg Clayton { 1046c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1047c9858e4dSGreg Clayton if (log) 1048c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get()); 10497fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10507fdf9ef1SGreg Clayton } 1051e91b7957SGreg Clayton } 1052e91b7957SGreg Clayton else 1053e91b7957SGreg Clayton { 1054e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1055e91b7957SGreg Clayton } 10567fdf9ef1SGreg Clayton return value; 1057e91b7957SGreg Clayton } 1058e91b7957SGreg Clayton 1059e91b7957SGreg Clayton lldb::addr_t 1060e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 1061e91b7957SGreg Clayton { 1062e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1063acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1064acdbe816SGreg Clayton if (process_sp) 1065e91b7957SGreg Clayton { 10667fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10677fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10687fdf9ef1SGreg Clayton { 1069acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10707fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 10717fdf9ef1SGreg Clayton } 10727fdf9ef1SGreg Clayton else 10737fdf9ef1SGreg Clayton { 1074c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1075c9858e4dSGreg Clayton if (log) 1076c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get()); 10777fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10787fdf9ef1SGreg Clayton } 1079e91b7957SGreg Clayton } 1080e91b7957SGreg Clayton else 1081e91b7957SGreg Clayton { 1082e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1083e91b7957SGreg Clayton } 1084e91b7957SGreg Clayton return ptr; 1085e91b7957SGreg Clayton } 1086e91b7957SGreg Clayton 1087e91b7957SGreg Clayton size_t 108830fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 108930fdc8d8SChris Lattner { 109030fdc8d8SChris Lattner size_t bytes_written = 0; 109130fdc8d8SChris Lattner 10922d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1093acdbe816SGreg Clayton 1094acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1095acdbe816SGreg Clayton 10964838131bSGreg Clayton if (log) 10974838131bSGreg Clayton { 1098d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1099acdbe816SGreg Clayton process_sp.get(), 11004838131bSGreg Clayton addr, 11014838131bSGreg Clayton src, 110243e0af06SGreg Clayton (uint64_t)src_len, 11034838131bSGreg Clayton sb_error.get()); 11044838131bSGreg Clayton } 11054838131bSGreg Clayton 1106acdbe816SGreg Clayton if (process_sp) 110730fdc8d8SChris Lattner { 11087fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11097fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11107fdf9ef1SGreg Clayton { 1111acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11127fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 11137fdf9ef1SGreg Clayton } 11147fdf9ef1SGreg Clayton else 11157fdf9ef1SGreg Clayton { 1116c9858e4dSGreg Clayton if (log) 1117c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get()); 11187fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11197fdf9ef1SGreg Clayton } 112030fdc8d8SChris Lattner } 112130fdc8d8SChris Lattner 11224838131bSGreg Clayton if (log) 11234838131bSGreg Clayton { 11244838131bSGreg Clayton SBStream sstr; 11254838131bSGreg Clayton sb_error.GetDescription (sstr); 1126d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1127acdbe816SGreg Clayton process_sp.get(), 11284838131bSGreg Clayton addr, 11294838131bSGreg Clayton src, 113043e0af06SGreg Clayton (uint64_t)src_len, 11314838131bSGreg Clayton sb_error.get(), 11324838131bSGreg Clayton sstr.GetData(), 113343e0af06SGreg Clayton (uint64_t)bytes_written); 11344838131bSGreg Clayton } 11354838131bSGreg Clayton 113630fdc8d8SChris Lattner return bytes_written; 113730fdc8d8SChris Lattner } 113830fdc8d8SChris Lattner 1139dde9cff3SCaroline Tice bool 1140dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1141dde9cff3SCaroline Tice { 1142da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1143da7bc7d0SGreg Clayton 1144acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1145acdbe816SGreg Clayton if (process_sp) 1146dde9cff3SCaroline Tice { 1147dde9cff3SCaroline Tice char path[PATH_MAX]; 1148dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1149acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 11501d273166SGreg Clayton const char *exe_name = NULL; 11511d273166SGreg Clayton if (exe_module) 11521d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 11531d273166SGreg Clayton 1154d01b2953SDaniel Malea strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1155acdbe816SGreg Clayton process_sp->GetID(), 1156ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 11571d273166SGreg Clayton GetNumThreads(), 115805faeb71SGreg Clayton exe_name ? ", executable = " : "", 11591d273166SGreg Clayton exe_name ? exe_name : ""); 1160dde9cff3SCaroline Tice } 1161dde9cff3SCaroline Tice else 1162da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1163dde9cff3SCaroline Tice 1164dde9cff3SCaroline Tice return true; 1165dde9cff3SCaroline Tice } 11668f343b09SGreg Clayton 11678f343b09SGreg Clayton uint32_t 1168f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1169f9ef60d2SJohnny Chen { 1170f9ef60d2SJohnny Chen LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1171f9ef60d2SJohnny Chen 1172f9ef60d2SJohnny Chen uint32_t num = 0; 1173f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1174f9ef60d2SJohnny Chen if (process_sp) 1175f9ef60d2SJohnny Chen { 1176f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1177f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1178f9ef60d2SJohnny Chen if (log) 1179f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1180f9ef60d2SJohnny Chen process_sp.get(), num); 1181f9ef60d2SJohnny Chen } 1182f9ef60d2SJohnny Chen else 1183f9ef60d2SJohnny Chen { 1184f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1185f9ef60d2SJohnny Chen } 1186f9ef60d2SJohnny Chen return num; 1187f9ef60d2SJohnny Chen } 1188f9ef60d2SJohnny Chen 1189f9ef60d2SJohnny Chen uint32_t 11908f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 11918f343b09SGreg Clayton { 1192acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1193acdbe816SGreg Clayton if (process_sp) 1194af67cecdSGreg Clayton { 11957fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11967fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11977fdf9ef1SGreg Clayton { 1198acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1199acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1200af67cecdSGreg Clayton } 12017fdf9ef1SGreg Clayton else 12027fdf9ef1SGreg Clayton { 1203c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1204c9858e4dSGreg Clayton if (log) 1205c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get()); 12067fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12077fdf9ef1SGreg Clayton } 12087fdf9ef1SGreg Clayton } 12098f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 12108f343b09SGreg Clayton } 12118f343b09SGreg Clayton 12128f343b09SGreg Clayton lldb::SBError 12138f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 12148f343b09SGreg Clayton { 12158f343b09SGreg Clayton lldb::SBError sb_error; 1216acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1217acdbe816SGreg Clayton if (process_sp) 1218af67cecdSGreg Clayton { 12197fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12207fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12217fdf9ef1SGreg Clayton { 1222acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1223acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1224af67cecdSGreg Clayton } 12258f343b09SGreg Clayton else 12267fdf9ef1SGreg Clayton { 1227c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1228c9858e4dSGreg Clayton if (log) 1229c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get()); 12307fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12317fdf9ef1SGreg Clayton } 12327fdf9ef1SGreg Clayton } 12337fdf9ef1SGreg Clayton else 12348f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 12358f343b09SGreg Clayton return sb_error; 12368f343b09SGreg Clayton } 1237