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 14*bdae3787SVirgile Bello // C Includes 15*bdae3787SVirgile Bello #include <inttypes.h> 16*bdae3787SVirgile Bello 1730fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1830fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1930fdc8d8SChris Lattner 2040af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 215d5028b5SGreg Clayton #include "lldb/Core/Debugger.h" 22ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 231f746071SGreg Clayton #include "lldb/Core/Module.h" 2430fdc8d8SChris Lattner #include "lldb/Core/State.h" 2530fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2630fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2730fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2830fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 296611103cSGreg Clayton #include "lldb/Target/Target.h" 306611103cSGreg Clayton #include "lldb/Target/Thread.h" 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner // Project includes 3330fdc8d8SChris Lattner 344c5de699SEli Friedman #include "lldb/API/SBBroadcaster.h" 354c5de699SEli Friedman #include "lldb/API/SBCommandReturnObject.h" 360e615684SGreg Clayton #include "lldb/API/SBDebugger.h" 374c5de699SEli Friedman #include "lldb/API/SBEvent.h" 380e615684SGreg Clayton #include "lldb/API/SBFileSpec.h" 394c5de699SEli Friedman #include "lldb/API/SBThread.h" 40dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 414c5de699SEli Friedman #include "lldb/API/SBStringList.h" 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner using namespace lldb; 4430fdc8d8SChris Lattner using namespace lldb_private; 4530fdc8d8SChris Lattner 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner SBProcess::SBProcess () : 484e0fe8abSGreg Clayton m_opaque_wp() 4930fdc8d8SChris Lattner { 5030fdc8d8SChris Lattner } 5130fdc8d8SChris Lattner 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner //---------------------------------------------------------------------- 5430fdc8d8SChris Lattner // SBProcess constructor 5530fdc8d8SChris Lattner //---------------------------------------------------------------------- 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) : 584e0fe8abSGreg Clayton m_opaque_wp (rhs.m_opaque_wp) 5930fdc8d8SChris Lattner { 6030fdc8d8SChris Lattner } 6130fdc8d8SChris Lattner 6230fdc8d8SChris Lattner 6330fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) : 644e0fe8abSGreg Clayton m_opaque_wp (process_sp) 6530fdc8d8SChris Lattner { 6630fdc8d8SChris Lattner } 6730fdc8d8SChris Lattner 68efabb123SGreg Clayton const SBProcess& 69efabb123SGreg Clayton SBProcess::operator = (const SBProcess& rhs) 70efabb123SGreg Clayton { 71efabb123SGreg Clayton if (this != &rhs) 724e0fe8abSGreg Clayton m_opaque_wp = rhs.m_opaque_wp; 73efabb123SGreg Clayton return *this; 74efabb123SGreg Clayton } 75efabb123SGreg Clayton 7630fdc8d8SChris Lattner //---------------------------------------------------------------------- 7730fdc8d8SChris Lattner // Destructor 7830fdc8d8SChris Lattner //---------------------------------------------------------------------- 7930fdc8d8SChris Lattner SBProcess::~SBProcess() 8030fdc8d8SChris Lattner { 8130fdc8d8SChris Lattner } 8230fdc8d8SChris Lattner 834bddaeb5SJim Ingham const char * 844bddaeb5SJim Ingham SBProcess::GetBroadcasterClassName () 854bddaeb5SJim Ingham { 864bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 874bddaeb5SJim Ingham } 884bddaeb5SJim Ingham 89d7b30ef9SJim Ingham const char * 90d7b30ef9SJim Ingham SBProcess::GetPluginName () 91d7b30ef9SJim Ingham { 92d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 93d7b30ef9SJim Ingham if (process_sp) 94d7b30ef9SJim Ingham { 9557abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 96d7b30ef9SJim Ingham } 97d7b30ef9SJim Ingham return "<Unknown>"; 98d7b30ef9SJim Ingham } 99d7b30ef9SJim Ingham 100d7b30ef9SJim Ingham const char * 101d7b30ef9SJim Ingham SBProcess::GetShortPluginName () 102d7b30ef9SJim Ingham { 103d7b30ef9SJim Ingham ProcessSP process_sp(GetSP()); 104d7b30ef9SJim Ingham if (process_sp) 105d7b30ef9SJim Ingham { 10657abc5d6SGreg Clayton return process_sp->GetPluginName().GetCString(); 107d7b30ef9SJim Ingham } 108d7b30ef9SJim Ingham return "<Unknown>"; 109d7b30ef9SJim Ingham } 110d7b30ef9SJim Ingham 111d7b30ef9SJim Ingham 112b9556accSGreg Clayton lldb::ProcessSP 113b9556accSGreg Clayton SBProcess::GetSP() const 114b9556accSGreg Clayton { 1154e0fe8abSGreg Clayton return m_opaque_wp.lock(); 116b9556accSGreg Clayton } 117b9556accSGreg Clayton 11830fdc8d8SChris Lattner void 119b9556accSGreg Clayton SBProcess::SetSP (const ProcessSP &process_sp) 12030fdc8d8SChris Lattner { 1214e0fe8abSGreg Clayton m_opaque_wp = process_sp; 12230fdc8d8SChris Lattner } 12330fdc8d8SChris Lattner 12430fdc8d8SChris Lattner void 12530fdc8d8SChris Lattner SBProcess::Clear () 12630fdc8d8SChris Lattner { 1274e0fe8abSGreg Clayton m_opaque_wp.reset(); 12830fdc8d8SChris Lattner } 12930fdc8d8SChris Lattner 13030fdc8d8SChris Lattner 13130fdc8d8SChris Lattner bool 13230fdc8d8SChris Lattner SBProcess::IsValid() const 13330fdc8d8SChris Lattner { 1344fc6cb9cSJim Ingham ProcessSP process_sp(m_opaque_wp.lock()); 1354fc6cb9cSJim Ingham return ((bool) process_sp && process_sp->IsValid()); 13630fdc8d8SChris Lattner } 13730fdc8d8SChris Lattner 1389631aae2SJames McIlree bool 1399631aae2SJames McIlree SBProcess::RemoteLaunch (char const **argv, 1409631aae2SJames McIlree char const **envp, 1419631aae2SJames McIlree const char *stdin_path, 1429631aae2SJames McIlree const char *stdout_path, 1439631aae2SJames McIlree const char *stderr_path, 1449631aae2SJames McIlree const char *working_directory, 1459631aae2SJames McIlree uint32_t launch_flags, 1469631aae2SJames McIlree bool stop_at_entry, 1479631aae2SJames McIlree lldb::SBError& error) 1489631aae2SJames McIlree { 1495160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1509631aae2SJames McIlree if (log) { 1519631aae2SJames 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))...", 1524e0fe8abSGreg Clayton m_opaque_wp.lock().get(), 1539631aae2SJames McIlree argv, 1549631aae2SJames McIlree envp, 1559631aae2SJames McIlree stdin_path ? stdin_path : "NULL", 1569631aae2SJames McIlree stdout_path ? stdout_path : "NULL", 1579631aae2SJames McIlree stderr_path ? stderr_path : "NULL", 1589631aae2SJames McIlree working_directory ? working_directory : "NULL", 1599631aae2SJames McIlree launch_flags, 1609631aae2SJames McIlree stop_at_entry, 1619631aae2SJames McIlree error.get()); 1629631aae2SJames McIlree } 1639631aae2SJames McIlree 164acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 165acdbe816SGreg Clayton if (process_sp) 1669631aae2SJames McIlree { 167acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 168acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 1699631aae2SJames McIlree { 170982c9762SGreg Clayton if (stop_at_entry) 171982c9762SGreg Clayton launch_flags |= eLaunchFlagStopAtEntry; 172982c9762SGreg Clayton ProcessLaunchInfo launch_info (stdin_path, 173982c9762SGreg Clayton stdout_path, 174982c9762SGreg Clayton stderr_path, 175982c9762SGreg Clayton working_directory, 176982c9762SGreg Clayton launch_flags); 177acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 178982c9762SGreg Clayton if (exe_module) 17914715c68SGreg Clayton launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true); 180982c9762SGreg Clayton if (argv) 181982c9762SGreg Clayton launch_info.GetArguments().AppendArguments (argv); 182982c9762SGreg Clayton if (envp) 183982c9762SGreg Clayton launch_info.GetEnvironmentEntries ().SetArguments (envp); 184acdbe816SGreg Clayton error.SetError (process_sp->Launch (launch_info)); 1859631aae2SJames McIlree } 1869631aae2SJames McIlree else 1879631aae2SJames McIlree { 1889631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteLaunch"); 1899631aae2SJames McIlree } 1909631aae2SJames McIlree } 1919631aae2SJames McIlree else 1929631aae2SJames McIlree { 1939631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 1949631aae2SJames McIlree } 1959631aae2SJames McIlree 1969631aae2SJames McIlree if (log) { 1979631aae2SJames McIlree SBStream sstr; 1989631aae2SJames McIlree error.GetDescription (sstr); 199acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData()); 2009631aae2SJames McIlree } 2019631aae2SJames McIlree 2029631aae2SJames McIlree return error.Success(); 2039631aae2SJames McIlree } 2049631aae2SJames McIlree 2059631aae2SJames McIlree bool 2069631aae2SJames McIlree SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) 2079631aae2SJames McIlree { 208acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 209acdbe816SGreg Clayton if (process_sp) 2109631aae2SJames McIlree { 211acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 212acdbe816SGreg Clayton if (process_sp->GetState() == eStateConnected) 2139631aae2SJames McIlree { 214144f3a9cSGreg Clayton ProcessAttachInfo attach_info; 215144f3a9cSGreg Clayton attach_info.SetProcessID (pid); 216acdbe816SGreg Clayton error.SetError (process_sp->Attach (attach_info)); 2179631aae2SJames McIlree } 2189631aae2SJames McIlree else 2199631aae2SJames McIlree { 2209631aae2SJames McIlree error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID"); 2219631aae2SJames McIlree } 2229631aae2SJames McIlree } 2239631aae2SJames McIlree else 2249631aae2SJames McIlree { 2259631aae2SJames McIlree error.SetErrorString ("unable to attach pid"); 2269631aae2SJames McIlree } 2279631aae2SJames McIlree 2285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2299631aae2SJames McIlree if (log) { 2309631aae2SJames McIlree SBStream sstr; 2319631aae2SJames McIlree error.GetDescription (sstr); 232d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData()); 2339631aae2SJames McIlree } 2349631aae2SJames McIlree 2359631aae2SJames McIlree return error.Success(); 2369631aae2SJames McIlree } 2379631aae2SJames McIlree 23830fdc8d8SChris Lattner 23930fdc8d8SChris Lattner uint32_t 24030fdc8d8SChris Lattner SBProcess::GetNumThreads () 24130fdc8d8SChris Lattner { 2425160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 243ceb6b139SCaroline Tice 244ceb6b139SCaroline Tice uint32_t num_threads = 0; 245acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 246acdbe816SGreg Clayton if (process_sp) 24730fdc8d8SChris Lattner { 2487fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2497fdf9ef1SGreg Clayton 2507fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 251acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 252acdbe816SGreg Clayton num_threads = process_sp->GetThreadList().GetSize(can_update); 25330fdc8d8SChris Lattner } 254ceb6b139SCaroline Tice 255ceb6b139SCaroline Tice if (log) 256acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads); 257ceb6b139SCaroline Tice 258ceb6b139SCaroline Tice return num_threads; 25930fdc8d8SChris Lattner } 26030fdc8d8SChris Lattner 26130fdc8d8SChris Lattner SBThread 2622976d00aSJim Ingham SBProcess::GetSelectedThread () const 26330fdc8d8SChris Lattner { 2645160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 265ceb6b139SCaroline Tice 26630fdc8d8SChris Lattner SBThread sb_thread; 26717a6ad05SGreg Clayton ThreadSP thread_sp; 268acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 269acdbe816SGreg Clayton if (process_sp) 270af67cecdSGreg Clayton { 271acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 272acdbe816SGreg Clayton thread_sp = process_sp->GetThreadList().GetSelectedThread(); 27317a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 274af67cecdSGreg Clayton } 275ceb6b139SCaroline Tice 276ceb6b139SCaroline Tice if (log) 277ceb6b139SCaroline Tice { 278acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get()); 279ceb6b139SCaroline Tice } 280ceb6b139SCaroline Tice 28130fdc8d8SChris Lattner return sb_thread; 28230fdc8d8SChris Lattner } 28330fdc8d8SChris Lattner 284a4d8747dSGreg Clayton SBThread 285a4d8747dSGreg Clayton SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) 286a4d8747dSGreg Clayton { 2875160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 288a4d8747dSGreg Clayton 289a4d8747dSGreg Clayton SBThread sb_thread; 290a4d8747dSGreg Clayton ThreadSP thread_sp; 291a4d8747dSGreg Clayton ProcessSP process_sp(GetSP()); 292a4d8747dSGreg Clayton if (process_sp) 293a4d8747dSGreg Clayton { 294a4d8747dSGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 295a4d8747dSGreg Clayton thread_sp = process_sp->CreateOSPluginThread(tid, context); 296a4d8747dSGreg Clayton sb_thread.SetThread (thread_sp); 297a4d8747dSGreg Clayton } 298a4d8747dSGreg Clayton 299a4d8747dSGreg Clayton if (log) 300a4d8747dSGreg Clayton log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)", process_sp.get(), tid, context, thread_sp.get()); 301a4d8747dSGreg Clayton 302a4d8747dSGreg Clayton return sb_thread; 303a4d8747dSGreg Clayton } 304a4d8747dSGreg Clayton 30530fdc8d8SChris Lattner SBTarget 30630fdc8d8SChris Lattner SBProcess::GetTarget() const 30730fdc8d8SChris Lattner { 3085160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 309ceb6b139SCaroline Tice 31030fdc8d8SChris Lattner SBTarget sb_target; 311b9556accSGreg Clayton TargetSP target_sp; 312acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 313acdbe816SGreg Clayton if (process_sp) 314b9556accSGreg Clayton { 315acdbe816SGreg Clayton target_sp = process_sp->GetTarget().shared_from_this(); 316b9556accSGreg Clayton sb_target.SetSP (target_sp); 317b9556accSGreg Clayton } 318ceb6b139SCaroline Tice 319ceb6b139SCaroline Tice if (log) 320acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get()); 321ceb6b139SCaroline Tice 32230fdc8d8SChris Lattner return sb_target; 32330fdc8d8SChris Lattner } 32430fdc8d8SChris Lattner 32530fdc8d8SChris Lattner 32630fdc8d8SChris Lattner size_t 32730fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len) 32830fdc8d8SChris Lattner { 3295160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 330ceb6b139SCaroline Tice 331ceb6b139SCaroline Tice size_t ret_val = 0; 332acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 333acdbe816SGreg Clayton if (process_sp) 33430fdc8d8SChris Lattner { 33530fdc8d8SChris Lattner Error error; 336acdbe816SGreg Clayton ret_val = process_sp->PutSTDIN (src, src_len, error); 33730fdc8d8SChris Lattner } 338ceb6b139SCaroline Tice 339ceb6b139SCaroline Tice if (log) 340fd54b368SJason Molenda log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu", 341acdbe816SGreg Clayton process_sp.get(), 34293aa84e8SGreg Clayton src, 34393aa84e8SGreg Clayton (uint32_t) src_len, 34493aa84e8SGreg Clayton ret_val); 345ceb6b139SCaroline Tice 346ceb6b139SCaroline Tice return ret_val; 34730fdc8d8SChris Lattner } 34830fdc8d8SChris Lattner 34930fdc8d8SChris Lattner size_t 35030fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const 35130fdc8d8SChris Lattner { 352cfd1acedSGreg Clayton size_t bytes_read = 0; 353acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 354acdbe816SGreg Clayton if (process_sp) 35530fdc8d8SChris Lattner { 35630fdc8d8SChris Lattner Error error; 357acdbe816SGreg Clayton bytes_read = process_sp->GetSTDOUT (dst, dst_len, error); 35830fdc8d8SChris Lattner } 359ceb6b139SCaroline Tice 3605160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 361ceb6b139SCaroline Tice if (log) 362d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 36343e0af06SGreg Clayton process_sp.get(), 36443e0af06SGreg Clayton (int) bytes_read, 36543e0af06SGreg Clayton dst, 36643e0af06SGreg Clayton (uint64_t)dst_len, 36743e0af06SGreg Clayton (uint64_t)bytes_read); 368ceb6b139SCaroline Tice 369cfd1acedSGreg Clayton return bytes_read; 37030fdc8d8SChris Lattner } 37130fdc8d8SChris Lattner 37230fdc8d8SChris Lattner size_t 37330fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const 37430fdc8d8SChris Lattner { 375cfd1acedSGreg Clayton size_t bytes_read = 0; 376acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 377acdbe816SGreg Clayton if (process_sp) 37830fdc8d8SChris Lattner { 37930fdc8d8SChris Lattner Error error; 380acdbe816SGreg Clayton bytes_read = process_sp->GetSTDERR (dst, dst_len, error); 38130fdc8d8SChris Lattner } 382ceb6b139SCaroline Tice 3835160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 384ceb6b139SCaroline Tice if (log) 385d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 38643e0af06SGreg Clayton process_sp.get(), 38743e0af06SGreg Clayton (int) bytes_read, 38843e0af06SGreg Clayton dst, 38943e0af06SGreg Clayton (uint64_t)dst_len, 39043e0af06SGreg Clayton (uint64_t)bytes_read); 391ceb6b139SCaroline Tice 392cfd1acedSGreg Clayton return bytes_read; 39330fdc8d8SChris Lattner } 39430fdc8d8SChris Lattner 395ab3b8b22SHan Ming Ong size_t 396ab3b8b22SHan Ming Ong SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const 397ab3b8b22SHan Ming Ong { 398ab3b8b22SHan Ming Ong size_t bytes_read = 0; 399ab3b8b22SHan Ming Ong ProcessSP process_sp(GetSP()); 400ab3b8b22SHan Ming Ong if (process_sp) 401ab3b8b22SHan Ming Ong { 402ab3b8b22SHan Ming Ong Error error; 403ab3b8b22SHan Ming Ong bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error); 404ab3b8b22SHan Ming Ong } 405ab3b8b22SHan Ming Ong 4065160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 407ab3b8b22SHan Ming Ong if (log) 408d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64, 409ab3b8b22SHan Ming Ong process_sp.get(), 410ab3b8b22SHan Ming Ong (int) bytes_read, 411ab3b8b22SHan Ming Ong dst, 412ab3b8b22SHan Ming Ong (uint64_t)dst_len, 413ab3b8b22SHan Ming Ong (uint64_t)bytes_read); 414ab3b8b22SHan Ming Ong 415ab3b8b22SHan Ming Ong return bytes_read; 416ab3b8b22SHan Ming Ong } 417ab3b8b22SHan Ming Ong 41830fdc8d8SChris Lattner void 4192976d00aSJim Ingham SBProcess::ReportEventState (const SBEvent &event, FILE *out) const 42030fdc8d8SChris Lattner { 42130fdc8d8SChris Lattner if (out == NULL) 42230fdc8d8SChris Lattner return; 42330fdc8d8SChris Lattner 424acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 425acdbe816SGreg Clayton if (process_sp) 42630fdc8d8SChris Lattner { 42730fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 42830fdc8d8SChris Lattner char message[1024]; 42930fdc8d8SChris Lattner int message_len = ::snprintf (message, 43030fdc8d8SChris Lattner sizeof (message), 431d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 432acdbe816SGreg Clayton process_sp->GetID(), 43330fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 43430fdc8d8SChris Lattner 43530fdc8d8SChris Lattner if (message_len > 0) 43630fdc8d8SChris Lattner ::fwrite (message, 1, message_len, out); 43730fdc8d8SChris Lattner } 43830fdc8d8SChris Lattner } 43930fdc8d8SChris Lattner 44030fdc8d8SChris Lattner void 4412976d00aSJim Ingham SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result) 44230fdc8d8SChris Lattner { 443acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 444acdbe816SGreg Clayton if (process_sp) 44530fdc8d8SChris Lattner { 44630fdc8d8SChris Lattner const StateType event_state = SBProcess::GetStateFromEvent (event); 44730fdc8d8SChris Lattner char message[1024]; 44830fdc8d8SChris Lattner ::snprintf (message, 44930fdc8d8SChris Lattner sizeof (message), 450d01b2953SDaniel Malea "Process %" PRIu64 " %s\n", 451acdbe816SGreg Clayton process_sp->GetID(), 45230fdc8d8SChris Lattner SBDebugger::StateAsCString (event_state)); 45330fdc8d8SChris Lattner 45430fdc8d8SChris Lattner result.AppendMessage (message); 45530fdc8d8SChris Lattner } 45630fdc8d8SChris Lattner } 45730fdc8d8SChris Lattner 45830fdc8d8SChris Lattner bool 4592976d00aSJim Ingham SBProcess::SetSelectedThread (const SBThread &thread) 46030fdc8d8SChris Lattner { 461acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 462acdbe816SGreg Clayton if (process_sp) 463af67cecdSGreg Clayton { 464acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 465acdbe816SGreg Clayton return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); 466af67cecdSGreg Clayton } 46730fdc8d8SChris Lattner return false; 46830fdc8d8SChris Lattner } 46930fdc8d8SChris Lattner 47030fdc8d8SChris Lattner bool 471ea561dcfSGreg Clayton SBProcess::SetSelectedThreadByID (lldb::tid_t tid) 472ea561dcfSGreg Clayton { 4735160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 474ceb6b139SCaroline Tice 475ceb6b139SCaroline Tice bool ret_val = false; 476acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 477acdbe816SGreg Clayton if (process_sp) 478af67cecdSGreg Clayton { 479acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 480acdbe816SGreg Clayton ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); 481af67cecdSGreg Clayton } 482ceb6b139SCaroline Tice 483ceb6b139SCaroline Tice if (log) 484d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s", 485acdbe816SGreg Clayton process_sp.get(), tid, (ret_val ? "true" : "false")); 486ceb6b139SCaroline Tice 487ceb6b139SCaroline Tice return ret_val; 48830fdc8d8SChris Lattner } 48930fdc8d8SChris Lattner 49018b46896SJim Ingham bool 49118b46896SJim Ingham SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) 49218b46896SJim Ingham { 4935160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 49418b46896SJim Ingham 49518b46896SJim Ingham bool ret_val = false; 49618b46896SJim Ingham ProcessSP process_sp(GetSP()); 49718b46896SJim Ingham if (process_sp) 49818b46896SJim Ingham { 49918b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 50018b46896SJim Ingham ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); 50118b46896SJim Ingham } 50218b46896SJim Ingham 50318b46896SJim Ingham if (log) 50418b46896SJim Ingham log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s", 50518b46896SJim Ingham process_sp.get(), index_id, (ret_val ? "true" : "false")); 50618b46896SJim Ingham 50718b46896SJim Ingham return ret_val; 50818b46896SJim Ingham } 50918b46896SJim Ingham 51030fdc8d8SChris Lattner SBThread 51130fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index) 51230fdc8d8SChris Lattner { 5135160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 514ceb6b139SCaroline Tice 51517a6ad05SGreg Clayton SBThread sb_thread; 51617a6ad05SGreg Clayton ThreadSP thread_sp; 517acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 518acdbe816SGreg Clayton if (process_sp) 519af67cecdSGreg Clayton { 5207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5217fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 522acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 5237fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); 52417a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 525af67cecdSGreg Clayton } 526ceb6b139SCaroline Tice 527ceb6b139SCaroline Tice if (log) 528ceb6b139SCaroline Tice { 52993aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)", 530acdbe816SGreg Clayton process_sp.get(), (uint32_t) index, thread_sp.get()); 531ceb6b139SCaroline Tice } 532ceb6b139SCaroline Tice 53317a6ad05SGreg Clayton return sb_thread; 53430fdc8d8SChris Lattner } 53530fdc8d8SChris Lattner 536bf2956a2SJim Ingham uint32_t 537bf2956a2SJim Ingham SBProcess::GetStopID(bool include_expression_stops) 538bf2956a2SJim Ingham { 539bf2956a2SJim Ingham ProcessSP process_sp(GetSP()); 540bf2956a2SJim Ingham if (process_sp) 541bf2956a2SJim Ingham { 542bf2956a2SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 543bf2956a2SJim Ingham if (include_expression_stops) 544bf2956a2SJim Ingham return process_sp->GetStopID(); 545bf2956a2SJim Ingham else 546bf2956a2SJim Ingham return process_sp->GetLastNaturalStopID(); 547bf2956a2SJim Ingham } 548bf2956a2SJim Ingham return 0; 549bf2956a2SJim Ingham } 550bf2956a2SJim Ingham 55130fdc8d8SChris Lattner StateType 55230fdc8d8SChris Lattner SBProcess::GetState () 55330fdc8d8SChris Lattner { 554ceb6b139SCaroline Tice 555ceb6b139SCaroline Tice StateType ret_val = eStateInvalid; 556acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 557acdbe816SGreg Clayton if (process_sp) 558af67cecdSGreg Clayton { 559acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 560acdbe816SGreg Clayton ret_val = process_sp->GetState(); 561af67cecdSGreg Clayton } 562ceb6b139SCaroline Tice 5635160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 564ceb6b139SCaroline Tice if (log) 565cfd1acedSGreg Clayton log->Printf ("SBProcess(%p)::GetState () => %s", 566acdbe816SGreg Clayton process_sp.get(), 567750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 568ceb6b139SCaroline Tice 569ceb6b139SCaroline Tice return ret_val; 57030fdc8d8SChris Lattner } 57130fdc8d8SChris Lattner 57230fdc8d8SChris Lattner 57330fdc8d8SChris Lattner int 57430fdc8d8SChris Lattner SBProcess::GetExitStatus () 57530fdc8d8SChris Lattner { 5764838131bSGreg Clayton int exit_status = 0; 577acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 578acdbe816SGreg Clayton if (process_sp) 579af67cecdSGreg Clayton { 580acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 581acdbe816SGreg Clayton exit_status = process_sp->GetExitStatus (); 582af67cecdSGreg Clayton } 5835160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5844838131bSGreg Clayton if (log) 5854838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)", 586acdbe816SGreg Clayton process_sp.get(), exit_status, exit_status); 5874838131bSGreg Clayton 5884838131bSGreg Clayton return exit_status; 58930fdc8d8SChris Lattner } 59030fdc8d8SChris Lattner 59130fdc8d8SChris Lattner const char * 59230fdc8d8SChris Lattner SBProcess::GetExitDescription () 59330fdc8d8SChris Lattner { 5944838131bSGreg Clayton const char *exit_desc = NULL; 595acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 596acdbe816SGreg Clayton if (process_sp) 597af67cecdSGreg Clayton { 598acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 599acdbe816SGreg Clayton exit_desc = process_sp->GetExitDescription (); 600af67cecdSGreg Clayton } 6015160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6024838131bSGreg Clayton if (log) 6034838131bSGreg Clayton log->Printf ("SBProcess(%p)::GetExitDescription () => %s", 604acdbe816SGreg Clayton process_sp.get(), exit_desc); 6054838131bSGreg Clayton return exit_desc; 60630fdc8d8SChris Lattner } 60730fdc8d8SChris Lattner 60830fdc8d8SChris Lattner lldb::pid_t 60930fdc8d8SChris Lattner SBProcess::GetProcessID () 61030fdc8d8SChris Lattner { 611ceb6b139SCaroline Tice lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID; 612acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 613acdbe816SGreg Clayton if (process_sp) 614acdbe816SGreg Clayton ret_val = process_sp->GetID(); 615ceb6b139SCaroline Tice 6165160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 617ceb6b139SCaroline Tice if (log) 618d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64, process_sp.get(), ret_val); 619ceb6b139SCaroline Tice 620ceb6b139SCaroline Tice return ret_val; 62130fdc8d8SChris Lattner } 62230fdc8d8SChris Lattner 623949e8221SGreg Clayton uint32_t 624949e8221SGreg Clayton SBProcess::GetUniqueID() 625949e8221SGreg Clayton { 626949e8221SGreg Clayton uint32_t ret_val = 0; 627949e8221SGreg Clayton ProcessSP process_sp(GetSP()); 628949e8221SGreg Clayton if (process_sp) 629949e8221SGreg Clayton ret_val = process_sp->GetUniqueID(); 6305160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 631949e8221SGreg Clayton if (log) 632949e8221SGreg Clayton log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32, process_sp.get(), ret_val); 633949e8221SGreg Clayton return ret_val; 634949e8221SGreg Clayton } 635949e8221SGreg Clayton 636cf386e24SJohnny Chen ByteOrder 637cf386e24SJohnny Chen SBProcess::GetByteOrder () const 638cf386e24SJohnny Chen { 639cf386e24SJohnny Chen ByteOrder byteOrder = eByteOrderInvalid; 640acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 641acdbe816SGreg Clayton if (process_sp) 642acdbe816SGreg Clayton byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder(); 643cf386e24SJohnny Chen 6445160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 645cf386e24SJohnny Chen if (log) 646acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder); 647cf386e24SJohnny Chen 648cf386e24SJohnny Chen return byteOrder; 649cf386e24SJohnny Chen } 650cf386e24SJohnny Chen 65130fdc8d8SChris Lattner uint32_t 65230fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const 65330fdc8d8SChris Lattner { 654ceb6b139SCaroline Tice uint32_t size = 0; 655acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 656acdbe816SGreg Clayton if (process_sp) 657acdbe816SGreg Clayton size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize(); 658ceb6b139SCaroline Tice 6595160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 660ceb6b139SCaroline Tice if (log) 661acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size); 662ceb6b139SCaroline Tice 663ceb6b139SCaroline Tice return size; 66430fdc8d8SChris Lattner } 66530fdc8d8SChris Lattner 66630fdc8d8SChris Lattner SBError 66730fdc8d8SChris Lattner SBProcess::Continue () 66830fdc8d8SChris Lattner { 6695160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 670ceb6b139SCaroline Tice 67130fdc8d8SChris Lattner SBError sb_error; 672acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 6730c74e78dSGreg Clayton 674acdbe816SGreg Clayton if (log) 675acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get()); 676acdbe816SGreg Clayton 677acdbe816SGreg Clayton if (process_sp) 678acdbe816SGreg Clayton { 679acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 680acdbe816SGreg Clayton 681acdbe816SGreg Clayton Error error (process_sp->Resume()); 6825d5028b5SGreg Clayton if (error.Success()) 6835d5028b5SGreg Clayton { 684acdbe816SGreg Clayton if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false) 6854838131bSGreg Clayton { 6864838131bSGreg Clayton if (log) 687acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get()); 688acdbe816SGreg Clayton process_sp->WaitForProcessToStop (NULL); 6895d5028b5SGreg Clayton } 6904838131bSGreg Clayton } 6915d5028b5SGreg Clayton sb_error.SetError(error); 6925d5028b5SGreg Clayton } 69330fdc8d8SChris Lattner else 69430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 69530fdc8d8SChris Lattner 696ceb6b139SCaroline Tice if (log) 697ceb6b139SCaroline Tice { 698ceb6b139SCaroline Tice SBStream sstr; 699ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 700acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData()); 701ceb6b139SCaroline Tice } 702ceb6b139SCaroline Tice 70330fdc8d8SChris Lattner return sb_error; 70430fdc8d8SChris Lattner } 70530fdc8d8SChris Lattner 70630fdc8d8SChris Lattner 70730fdc8d8SChris Lattner SBError 70830fdc8d8SChris Lattner SBProcess::Destroy () 70930fdc8d8SChris Lattner { 71030fdc8d8SChris Lattner SBError sb_error; 711acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 712acdbe816SGreg Clayton if (process_sp) 7136779606aSGreg Clayton { 714acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 715acdbe816SGreg Clayton sb_error.SetError(process_sp->Destroy()); 7166779606aSGreg Clayton } 71730fdc8d8SChris Lattner else 71830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 71930fdc8d8SChris Lattner 7205160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7214838131bSGreg Clayton if (log) 7224838131bSGreg Clayton { 7234838131bSGreg Clayton SBStream sstr; 7244838131bSGreg Clayton sb_error.GetDescription (sstr); 7256779606aSGreg Clayton log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", 726acdbe816SGreg Clayton process_sp.get(), 7276779606aSGreg Clayton sb_error.get(), 7286779606aSGreg Clayton sstr.GetData()); 7294838131bSGreg Clayton } 7304838131bSGreg Clayton 73130fdc8d8SChris Lattner return sb_error; 73230fdc8d8SChris Lattner } 73330fdc8d8SChris Lattner 73430fdc8d8SChris Lattner 73530fdc8d8SChris Lattner SBError 73630fdc8d8SChris Lattner SBProcess::Stop () 73730fdc8d8SChris Lattner { 73830fdc8d8SChris Lattner SBError sb_error; 739acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 740acdbe816SGreg Clayton if (process_sp) 741af67cecdSGreg Clayton { 742acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 743acdbe816SGreg Clayton sb_error.SetError (process_sp->Halt()); 744af67cecdSGreg Clayton } 74530fdc8d8SChris Lattner else 74630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 747ceb6b139SCaroline Tice 7485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 749ceb6b139SCaroline Tice if (log) 750ceb6b139SCaroline Tice { 751ceb6b139SCaroline Tice SBStream sstr; 752ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 75393aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s", 754acdbe816SGreg Clayton process_sp.get(), 75593aa84e8SGreg Clayton sb_error.get(), 756750cd175SCaroline Tice sstr.GetData()); 757ceb6b139SCaroline Tice } 758ceb6b139SCaroline Tice 75930fdc8d8SChris Lattner return sb_error; 76030fdc8d8SChris Lattner } 76130fdc8d8SChris Lattner 76230fdc8d8SChris Lattner SBError 76330fdc8d8SChris Lattner SBProcess::Kill () 76430fdc8d8SChris Lattner { 76530fdc8d8SChris Lattner SBError sb_error; 766acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 767acdbe816SGreg Clayton if (process_sp) 768af67cecdSGreg Clayton { 769acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 770acdbe816SGreg Clayton sb_error.SetError (process_sp->Destroy()); 771af67cecdSGreg Clayton } 77230fdc8d8SChris Lattner else 77330fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 774ceb6b139SCaroline Tice 7755160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 776ceb6b139SCaroline Tice if (log) 777ceb6b139SCaroline Tice { 778ceb6b139SCaroline Tice SBStream sstr; 779ceb6b139SCaroline Tice sb_error.GetDescription (sstr); 78093aa84e8SGreg Clayton log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s", 781acdbe816SGreg Clayton process_sp.get(), 78293aa84e8SGreg Clayton sb_error.get(), 783750cd175SCaroline Tice sstr.GetData()); 784ceb6b139SCaroline Tice } 785ceb6b139SCaroline Tice 78630fdc8d8SChris Lattner return sb_error; 78730fdc8d8SChris Lattner } 78830fdc8d8SChris Lattner 78930fdc8d8SChris Lattner SBError 79030fdc8d8SChris Lattner SBProcess::Detach () 79130fdc8d8SChris Lattner { 792acff8950SJim Ingham // FIXME: This should come from a process default. 793acff8950SJim Ingham bool keep_stopped = false; 794acff8950SJim Ingham return Detach (keep_stopped); 795acff8950SJim Ingham } 796acff8950SJim Ingham 797acff8950SJim Ingham SBError 798acff8950SJim Ingham SBProcess::Detach (bool keep_stopped) 799acff8950SJim Ingham { 80030fdc8d8SChris Lattner SBError sb_error; 801acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 802acdbe816SGreg Clayton if (process_sp) 803af67cecdSGreg Clayton { 804acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 805acff8950SJim Ingham sb_error.SetError (process_sp->Detach(keep_stopped)); 806af67cecdSGreg Clayton } 80730fdc8d8SChris Lattner else 80830fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 80930fdc8d8SChris Lattner 81030fdc8d8SChris Lattner return sb_error; 81130fdc8d8SChris Lattner } 81230fdc8d8SChris Lattner 81330fdc8d8SChris Lattner SBError 8144838131bSGreg Clayton SBProcess::Signal (int signo) 81530fdc8d8SChris Lattner { 81630fdc8d8SChris Lattner SBError sb_error; 817acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 818acdbe816SGreg Clayton if (process_sp) 819af67cecdSGreg Clayton { 820acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 821acdbe816SGreg Clayton sb_error.SetError (process_sp->Signal (signo)); 822af67cecdSGreg Clayton } 82330fdc8d8SChris Lattner else 82430fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 8255160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8264838131bSGreg Clayton if (log) 8274838131bSGreg Clayton { 8284838131bSGreg Clayton SBStream sstr; 8294838131bSGreg Clayton sb_error.GetDescription (sstr); 8304838131bSGreg Clayton log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s", 831acdbe816SGreg Clayton process_sp.get(), 8324838131bSGreg Clayton signo, 8334838131bSGreg Clayton sb_error.get(), 8344838131bSGreg Clayton sstr.GetData()); 8354838131bSGreg Clayton } 83630fdc8d8SChris Lattner return sb_error; 83730fdc8d8SChris Lattner } 83830fdc8d8SChris Lattner 839cfc0935eSJim Ingham void 840cfc0935eSJim Ingham SBProcess::SendAsyncInterrupt () 841cfc0935eSJim Ingham { 842cfc0935eSJim Ingham ProcessSP process_sp(GetSP()); 843cfc0935eSJim Ingham if (process_sp) 844cfc0935eSJim Ingham { 845cfc0935eSJim Ingham process_sp->SendAsyncInterrupt (); 846cfc0935eSJim Ingham } 847cfc0935eSJim Ingham } 848cfc0935eSJim Ingham 84930fdc8d8SChris Lattner SBThread 8504838131bSGreg Clayton SBProcess::GetThreadByID (tid_t tid) 85130fdc8d8SChris Lattner { 8524838131bSGreg Clayton SBThread sb_thread; 85317a6ad05SGreg Clayton ThreadSP thread_sp; 854acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 855acdbe816SGreg Clayton if (process_sp) 856af67cecdSGreg Clayton { 857acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 8587fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8597fdf9ef1SGreg Clayton const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 8607fdf9ef1SGreg Clayton thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); 86117a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 862af67cecdSGreg Clayton } 8634838131bSGreg Clayton 8645160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8654838131bSGreg Clayton if (log) 8664838131bSGreg Clayton { 867d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)", 868acdbe816SGreg Clayton process_sp.get(), 8694838131bSGreg Clayton tid, 87017a6ad05SGreg Clayton thread_sp.get()); 8714838131bSGreg Clayton } 8724838131bSGreg Clayton 8734838131bSGreg Clayton return sb_thread; 87430fdc8d8SChris Lattner } 87530fdc8d8SChris Lattner 87618b46896SJim Ingham SBThread 87718b46896SJim Ingham SBProcess::GetThreadByIndexID (uint32_t index_id) 87818b46896SJim Ingham { 87918b46896SJim Ingham SBThread sb_thread; 88018b46896SJim Ingham ThreadSP thread_sp; 88118b46896SJim Ingham ProcessSP process_sp(GetSP()); 88218b46896SJim Ingham if (process_sp) 88318b46896SJim Ingham { 88418b46896SJim Ingham Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 88518b46896SJim Ingham Process::StopLocker stop_locker; 88618b46896SJim Ingham const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); 88718b46896SJim Ingham thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); 88818b46896SJim Ingham sb_thread.SetThread (thread_sp); 88918b46896SJim Ingham } 89018b46896SJim Ingham 8915160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 89218b46896SJim Ingham if (log) 89318b46896SJim Ingham { 89418b46896SJim Ingham log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)", 89518b46896SJim Ingham process_sp.get(), 89618b46896SJim Ingham index_id, 89718b46896SJim Ingham thread_sp.get()); 89818b46896SJim Ingham } 89918b46896SJim Ingham 90018b46896SJim Ingham return sb_thread; 90118b46896SJim Ingham } 90218b46896SJim Ingham 90330fdc8d8SChris Lattner StateType 90430fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event) 90530fdc8d8SChris Lattner { 9065160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 907ceb6b139SCaroline Tice 908ceb6b139SCaroline Tice StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get()); 909ceb6b139SCaroline Tice 910ceb6b139SCaroline Tice if (log) 911cfd1acedSGreg Clayton log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(), 912750cd175SCaroline Tice lldb_private::StateAsCString (ret_val)); 913ceb6b139SCaroline Tice 914ceb6b139SCaroline Tice return ret_val; 91530fdc8d8SChris Lattner } 91630fdc8d8SChris Lattner 91730fdc8d8SChris Lattner bool 91830fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event) 91930fdc8d8SChris Lattner { 9206611103cSGreg Clayton return Process::ProcessEventData::GetRestartedFromEvent (event.get()); 92130fdc8d8SChris Lattner } 92230fdc8d8SChris Lattner 9230161b49cSJim Ingham size_t 9240161b49cSJim Ingham SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event) 9250161b49cSJim Ingham { 9260161b49cSJim Ingham return Process::ProcessEventData::GetNumRestartedReasons(event.get()); 9270161b49cSJim Ingham } 9280161b49cSJim Ingham 9290161b49cSJim Ingham const char * 9300161b49cSJim Ingham SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx) 9310161b49cSJim Ingham { 9320161b49cSJim Ingham return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx); 9330161b49cSJim Ingham } 9340161b49cSJim Ingham 93530fdc8d8SChris Lattner SBProcess 93630fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event) 93730fdc8d8SChris Lattner { 9386611103cSGreg Clayton SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get())); 93930fdc8d8SChris Lattner return process; 94030fdc8d8SChris Lattner } 94130fdc8d8SChris Lattner 942e6bc6cb9SJim Ingham bool 943e6bc6cb9SJim Ingham SBProcess::EventIsProcessEvent (const SBEvent &event) 944e6bc6cb9SJim Ingham { 9454bddaeb5SJim Ingham return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0; 946e6bc6cb9SJim Ingham } 94730fdc8d8SChris Lattner 94830fdc8d8SChris Lattner SBBroadcaster 94930fdc8d8SChris Lattner SBProcess::GetBroadcaster () const 95030fdc8d8SChris Lattner { 9515160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 952ceb6b139SCaroline Tice 953acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 954acdbe816SGreg Clayton 955acdbe816SGreg Clayton SBBroadcaster broadcaster(process_sp.get(), false); 956ceb6b139SCaroline Tice 957ceb6b139SCaroline Tice if (log) 958acdbe816SGreg Clayton log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(), 959750cd175SCaroline Tice broadcaster.get()); 960ceb6b139SCaroline Tice 96130fdc8d8SChris Lattner return broadcaster; 96230fdc8d8SChris Lattner } 96330fdc8d8SChris Lattner 9644bddaeb5SJim Ingham const char * 9654bddaeb5SJim Ingham SBProcess::GetBroadcasterClass () 9664bddaeb5SJim Ingham { 9674bddaeb5SJim Ingham return Process::GetStaticBroadcasterClass().AsCString(); 9684bddaeb5SJim Ingham } 9694bddaeb5SJim Ingham 97030fdc8d8SChris Lattner size_t 97130fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error) 97230fdc8d8SChris Lattner { 9735160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 974ceb6b139SCaroline Tice 97530fdc8d8SChris Lattner size_t bytes_read = 0; 97630fdc8d8SChris Lattner 977acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 978acdbe816SGreg Clayton 9794838131bSGreg Clayton if (log) 9804838131bSGreg Clayton { 981d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...", 982acdbe816SGreg Clayton process_sp.get(), 9834838131bSGreg Clayton addr, 9844838131bSGreg Clayton dst, 98543e0af06SGreg Clayton (uint64_t)dst_len, 9864838131bSGreg Clayton sb_error.get()); 9874838131bSGreg Clayton } 9884838131bSGreg Clayton 989acdbe816SGreg Clayton if (process_sp) 99030fdc8d8SChris Lattner { 9917fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9927fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 9937fdf9ef1SGreg Clayton { 994acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 9957fdf9ef1SGreg Clayton bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); 9967fdf9ef1SGreg Clayton } 9977fdf9ef1SGreg Clayton else 9987fdf9ef1SGreg Clayton { 999c9858e4dSGreg Clayton if (log) 1000c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running", process_sp.get()); 10017fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10027fdf9ef1SGreg Clayton } 100330fdc8d8SChris Lattner } 100430fdc8d8SChris Lattner else 100530fdc8d8SChris Lattner { 100630fdc8d8SChris Lattner sb_error.SetErrorString ("SBProcess is invalid"); 100730fdc8d8SChris Lattner } 100830fdc8d8SChris Lattner 1009ceb6b139SCaroline Tice if (log) 101093aa84e8SGreg Clayton { 101193aa84e8SGreg Clayton SBStream sstr; 101293aa84e8SGreg Clayton sb_error.GetDescription (sstr); 1013d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1014acdbe816SGreg Clayton process_sp.get(), 101593aa84e8SGreg Clayton addr, 101693aa84e8SGreg Clayton dst, 101743e0af06SGreg Clayton (uint64_t)dst_len, 101893aa84e8SGreg Clayton sb_error.get(), 101993aa84e8SGreg Clayton sstr.GetData(), 102043e0af06SGreg Clayton (uint64_t)bytes_read); 102193aa84e8SGreg Clayton } 1022ceb6b139SCaroline Tice 102330fdc8d8SChris Lattner return bytes_read; 102430fdc8d8SChris Lattner } 102530fdc8d8SChris Lattner 102630fdc8d8SChris Lattner size_t 1027e91b7957SGreg Clayton SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) 1028e91b7957SGreg Clayton { 1029e91b7957SGreg Clayton size_t bytes_read = 0; 1030acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1031acdbe816SGreg Clayton if (process_sp) 1032e91b7957SGreg Clayton { 10337fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10347fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10357fdf9ef1SGreg Clayton { 1036acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10377fdf9ef1SGreg Clayton bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); 10387fdf9ef1SGreg Clayton } 10397fdf9ef1SGreg Clayton else 10407fdf9ef1SGreg Clayton { 10415160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1042c9858e4dSGreg Clayton if (log) 1043c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running", process_sp.get()); 10447fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10457fdf9ef1SGreg Clayton } 1046e91b7957SGreg Clayton } 1047e91b7957SGreg Clayton else 1048e91b7957SGreg Clayton { 1049e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1050e91b7957SGreg Clayton } 1051e91b7957SGreg Clayton return bytes_read; 1052e91b7957SGreg Clayton } 1053e91b7957SGreg Clayton 1054e91b7957SGreg Clayton uint64_t 1055e91b7957SGreg Clayton SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) 1056e91b7957SGreg Clayton { 10577fdf9ef1SGreg Clayton uint64_t value = 0; 1058acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1059acdbe816SGreg Clayton if (process_sp) 1060e91b7957SGreg Clayton { 10617fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10627fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10637fdf9ef1SGreg Clayton { 1064acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10657fdf9ef1SGreg Clayton value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); 10667fdf9ef1SGreg Clayton } 10677fdf9ef1SGreg Clayton else 10687fdf9ef1SGreg Clayton { 10695160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1070c9858e4dSGreg Clayton if (log) 1071c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running", process_sp.get()); 10727fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 10737fdf9ef1SGreg Clayton } 1074e91b7957SGreg Clayton } 1075e91b7957SGreg Clayton else 1076e91b7957SGreg Clayton { 1077e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1078e91b7957SGreg Clayton } 10797fdf9ef1SGreg Clayton return value; 1080e91b7957SGreg Clayton } 1081e91b7957SGreg Clayton 1082e91b7957SGreg Clayton lldb::addr_t 1083e91b7957SGreg Clayton SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) 1084e91b7957SGreg Clayton { 1085e91b7957SGreg Clayton lldb::addr_t ptr = LLDB_INVALID_ADDRESS; 1086acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1087acdbe816SGreg Clayton if (process_sp) 1088e91b7957SGreg Clayton { 10897fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10907fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 10917fdf9ef1SGreg Clayton { 1092acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 10937fdf9ef1SGreg Clayton ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); 10947fdf9ef1SGreg Clayton } 10957fdf9ef1SGreg Clayton else 10967fdf9ef1SGreg Clayton { 10975160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1098c9858e4dSGreg Clayton if (log) 1099c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running", process_sp.get()); 11007fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11017fdf9ef1SGreg Clayton } 1102e91b7957SGreg Clayton } 1103e91b7957SGreg Clayton else 1104e91b7957SGreg Clayton { 1105e91b7957SGreg Clayton sb_error.SetErrorString ("SBProcess is invalid"); 1106e91b7957SGreg Clayton } 1107e91b7957SGreg Clayton return ptr; 1108e91b7957SGreg Clayton } 1109e91b7957SGreg Clayton 1110e91b7957SGreg Clayton size_t 111130fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) 111230fdc8d8SChris Lattner { 111330fdc8d8SChris Lattner size_t bytes_written = 0; 111430fdc8d8SChris Lattner 11155160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1116acdbe816SGreg Clayton 1117acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1118acdbe816SGreg Clayton 11194838131bSGreg Clayton if (log) 11204838131bSGreg Clayton { 1121d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...", 1122acdbe816SGreg Clayton process_sp.get(), 11234838131bSGreg Clayton addr, 11244838131bSGreg Clayton src, 112543e0af06SGreg Clayton (uint64_t)src_len, 11264838131bSGreg Clayton sb_error.get()); 11274838131bSGreg Clayton } 11284838131bSGreg Clayton 1129acdbe816SGreg Clayton if (process_sp) 113030fdc8d8SChris Lattner { 11317fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11327fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 11337fdf9ef1SGreg Clayton { 1134acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 11357fdf9ef1SGreg Clayton bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); 11367fdf9ef1SGreg Clayton } 11377fdf9ef1SGreg Clayton else 11387fdf9ef1SGreg Clayton { 1139c9858e4dSGreg Clayton if (log) 1140c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running", process_sp.get()); 11417fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 11427fdf9ef1SGreg Clayton } 114330fdc8d8SChris Lattner } 114430fdc8d8SChris Lattner 11454838131bSGreg Clayton if (log) 11464838131bSGreg Clayton { 11474838131bSGreg Clayton SBStream sstr; 11484838131bSGreg Clayton sb_error.GetDescription (sstr); 1149d01b2953SDaniel Malea log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64, 1150acdbe816SGreg Clayton process_sp.get(), 11514838131bSGreg Clayton addr, 11524838131bSGreg Clayton src, 115343e0af06SGreg Clayton (uint64_t)src_len, 11544838131bSGreg Clayton sb_error.get(), 11554838131bSGreg Clayton sstr.GetData(), 115643e0af06SGreg Clayton (uint64_t)bytes_written); 11574838131bSGreg Clayton } 11584838131bSGreg Clayton 115930fdc8d8SChris Lattner return bytes_written; 116030fdc8d8SChris Lattner } 116130fdc8d8SChris Lattner 1162dde9cff3SCaroline Tice bool 1163dde9cff3SCaroline Tice SBProcess::GetDescription (SBStream &description) 1164dde9cff3SCaroline Tice { 1165da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1166da7bc7d0SGreg Clayton 1167acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1168acdbe816SGreg Clayton if (process_sp) 1169dde9cff3SCaroline Tice { 1170dde9cff3SCaroline Tice char path[PATH_MAX]; 1171dde9cff3SCaroline Tice GetTarget().GetExecutable().GetPath (path, sizeof(path)); 1172acdbe816SGreg Clayton Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer(); 11731d273166SGreg Clayton const char *exe_name = NULL; 11741d273166SGreg Clayton if (exe_module) 11751d273166SGreg Clayton exe_name = exe_module->GetFileSpec().GetFilename().AsCString(); 11761d273166SGreg Clayton 1177d01b2953SDaniel Malea strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s", 1178acdbe816SGreg Clayton process_sp->GetID(), 1179ceb6b139SCaroline Tice lldb_private::StateAsCString (GetState()), 11801d273166SGreg Clayton GetNumThreads(), 118105faeb71SGreg Clayton exe_name ? ", executable = " : "", 11821d273166SGreg Clayton exe_name ? exe_name : ""); 1183dde9cff3SCaroline Tice } 1184dde9cff3SCaroline Tice else 1185da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1186dde9cff3SCaroline Tice 1187dde9cff3SCaroline Tice return true; 1188dde9cff3SCaroline Tice } 11898f343b09SGreg Clayton 11908f343b09SGreg Clayton uint32_t 1191f9ef60d2SJohnny Chen SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const 1192f9ef60d2SJohnny Chen { 11935160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1194f9ef60d2SJohnny Chen 1195f9ef60d2SJohnny Chen uint32_t num = 0; 1196f9ef60d2SJohnny Chen ProcessSP process_sp(GetSP()); 1197f9ef60d2SJohnny Chen if (process_sp) 1198f9ef60d2SJohnny Chen { 1199f9ef60d2SJohnny Chen Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1200f9ef60d2SJohnny Chen sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); 1201f9ef60d2SJohnny Chen if (log) 1202f9ef60d2SJohnny Chen log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", 1203f9ef60d2SJohnny Chen process_sp.get(), num); 1204f9ef60d2SJohnny Chen } 1205f9ef60d2SJohnny Chen else 1206f9ef60d2SJohnny Chen { 1207f9ef60d2SJohnny Chen sb_error.SetErrorString ("SBProcess is invalid"); 1208f9ef60d2SJohnny Chen } 1209f9ef60d2SJohnny Chen return num; 1210f9ef60d2SJohnny Chen } 1211f9ef60d2SJohnny Chen 1212f9ef60d2SJohnny Chen uint32_t 12138f343b09SGreg Clayton SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error) 12148f343b09SGreg Clayton { 1215acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1216acdbe816SGreg Clayton if (process_sp) 1217af67cecdSGreg Clayton { 12187fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12197fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12207fdf9ef1SGreg Clayton { 1221acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1222acdbe816SGreg Clayton return process_sp->LoadImage (*sb_image_spec, sb_error.ref()); 1223af67cecdSGreg Clayton } 12247fdf9ef1SGreg Clayton else 12257fdf9ef1SGreg Clayton { 12265160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1227c9858e4dSGreg Clayton if (log) 1228c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::LoadImage() => error: process is running", process_sp.get()); 12297fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12307fdf9ef1SGreg Clayton } 12317fdf9ef1SGreg Clayton } 12328f343b09SGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 12338f343b09SGreg Clayton } 12348f343b09SGreg Clayton 12358f343b09SGreg Clayton lldb::SBError 12368f343b09SGreg Clayton SBProcess::UnloadImage (uint32_t image_token) 12378f343b09SGreg Clayton { 12388f343b09SGreg Clayton lldb::SBError sb_error; 1239acdbe816SGreg Clayton ProcessSP process_sp(GetSP()); 1240acdbe816SGreg Clayton if (process_sp) 1241af67cecdSGreg Clayton { 12427fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12437fdf9ef1SGreg Clayton if (stop_locker.TryLock(&process_sp->GetRunLock())) 12447fdf9ef1SGreg Clayton { 1245acdbe816SGreg Clayton Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); 1246acdbe816SGreg Clayton sb_error.SetError (process_sp->UnloadImage (image_token)); 1247af67cecdSGreg Clayton } 12488f343b09SGreg Clayton else 12497fdf9ef1SGreg Clayton { 12505160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1251c9858e4dSGreg Clayton if (log) 1252c9858e4dSGreg Clayton log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running", process_sp.get()); 12537fdf9ef1SGreg Clayton sb_error.SetErrorString("process is running"); 12547fdf9ef1SGreg Clayton } 12557fdf9ef1SGreg Clayton } 12567fdf9ef1SGreg Clayton else 12578f343b09SGreg Clayton sb_error.SetErrorString("invalid process"); 12588f343b09SGreg Clayton return sb_error; 12598f343b09SGreg Clayton } 1260