blob: ae7f4de66583300c6b19512549a78795b2476d10 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBProcess.cpp -------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Eli Friedman7a62c8b2010-06-09 07:44:37 +000010#include "lldb/API/SBProcess.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
12#include "lldb/lldb-defines.h"
13#include "lldb/lldb-types.h"
14
Jim Ingham84cdc152010-06-15 19:49:27 +000015#include "lldb/Interpreter/Args.h"
Greg Clayton1a3083a2010-10-06 03:53:16 +000016#include "lldb/Core/Debugger.h"
Caroline Tice7826c882010-10-26 03:11:13 +000017#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018#include "lldb/Core/State.h"
19#include "lldb/Core/Stream.h"
20#include "lldb/Core/StreamFile.h"
21#include "lldb/Target/Process.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Target/RegisterContext.h"
Greg Clayton63094e02010-06-23 01:19:29 +000023#include "lldb/Target/Target.h"
24#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025
26// Project includes
27
Eli Friedman7a62c8b2010-06-09 07:44:37 +000028#include "lldb/API/SBBroadcaster.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000029#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton0a8dcac2012-02-24 05:03:03 +000030#include "lldb/API/SBDebugger.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000031#include "lldb/API/SBEvent.h"
Greg Clayton0a8dcac2012-02-24 05:03:03 +000032#include "lldb/API/SBFileSpec.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000033#include "lldb/API/SBThread.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000034#include "lldb/API/SBStream.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000035#include "lldb/API/SBStringList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000036
37using namespace lldb;
38using namespace lldb_private;
39
40
Chris Lattner24943d22010-06-08 16:52:24 +000041SBProcess::SBProcess () :
Greg Clayton63094e02010-06-23 01:19:29 +000042 m_opaque_sp()
Chris Lattner24943d22010-06-08 16:52:24 +000043{
44}
45
46
47//----------------------------------------------------------------------
48// SBProcess constructor
49//----------------------------------------------------------------------
50
51SBProcess::SBProcess (const SBProcess& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000052 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000053{
54}
55
56
57SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000058 m_opaque_sp (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000059{
60}
61
Greg Clayton538eb822010-11-05 23:17:00 +000062const SBProcess&
63SBProcess::operator = (const SBProcess& rhs)
64{
65 if (this != &rhs)
66 m_opaque_sp = rhs.m_opaque_sp;
67 return *this;
68}
69
Chris Lattner24943d22010-06-08 16:52:24 +000070//----------------------------------------------------------------------
71// Destructor
72//----------------------------------------------------------------------
73SBProcess::~SBProcess()
74{
75}
76
Jim Ingham5a15e692012-02-16 06:50:00 +000077const char *
78SBProcess::GetBroadcasterClassName ()
79{
80 return Process::GetStaticBroadcasterClass().AsCString();
81}
82
Greg Clayton334d33a2012-01-30 07:41:31 +000083lldb::ProcessSP
84SBProcess::GetSP() const
85{
86 return m_opaque_sp;
87}
88
Chris Lattner24943d22010-06-08 16:52:24 +000089void
Greg Clayton334d33a2012-01-30 07:41:31 +000090SBProcess::SetSP (const ProcessSP &process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000091{
Greg Clayton63094e02010-06-23 01:19:29 +000092 m_opaque_sp = process_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000093}
94
95void
96SBProcess::Clear ()
97{
Greg Clayton63094e02010-06-23 01:19:29 +000098 m_opaque_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +000099}
100
101
102bool
103SBProcess::IsValid() const
104{
Greg Clayton63094e02010-06-23 01:19:29 +0000105 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000106}
107
James McIlree38093402011-03-04 00:31:13 +0000108bool
109SBProcess::RemoteLaunch (char const **argv,
110 char const **envp,
111 const char *stdin_path,
112 const char *stdout_path,
113 const char *stderr_path,
114 const char *working_directory,
115 uint32_t launch_flags,
116 bool stop_at_entry,
117 lldb::SBError& error)
118{
119 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
120 if (log) {
121 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))...",
122 m_opaque_sp.get(),
123 argv,
124 envp,
125 stdin_path ? stdin_path : "NULL",
126 stdout_path ? stdout_path : "NULL",
127 stderr_path ? stderr_path : "NULL",
128 working_directory ? working_directory : "NULL",
129 launch_flags,
130 stop_at_entry,
131 error.get());
132 }
133
Greg Clayton0416bdf2012-01-30 09:04:36 +0000134 ProcessSP process_sp(GetSP());
135 if (process_sp)
James McIlree38093402011-03-04 00:31:13 +0000136 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000137 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
138 if (process_sp->GetState() == eStateConnected)
James McIlree38093402011-03-04 00:31:13 +0000139 {
Greg Clayton36bc5ea2011-11-03 21:22:33 +0000140 if (stop_at_entry)
141 launch_flags |= eLaunchFlagStopAtEntry;
142 ProcessLaunchInfo launch_info (stdin_path,
143 stdout_path,
144 stderr_path,
145 working_directory,
146 launch_flags);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000147 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton36bc5ea2011-11-03 21:22:33 +0000148 if (exe_module)
149 launch_info.SetExecutableFile(exe_module->GetFileSpec(), true);
150 if (argv)
151 launch_info.GetArguments().AppendArguments (argv);
152 if (envp)
153 launch_info.GetEnvironmentEntries ().SetArguments (envp);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000154 error.SetError (process_sp->Launch (launch_info));
James McIlree38093402011-03-04 00:31:13 +0000155 }
156 else
157 {
158 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
159 }
160 }
161 else
162 {
163 error.SetErrorString ("unable to attach pid");
164 }
165
166 if (log) {
167 SBStream sstr;
168 error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000169 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", process_sp.get(), error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000170 }
171
172 return error.Success();
173}
174
175bool
176SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
177{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000178 ProcessSP process_sp(GetSP());
179 if (process_sp)
James McIlree38093402011-03-04 00:31:13 +0000180 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000181 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
182 if (process_sp->GetState() == eStateConnected)
James McIlree38093402011-03-04 00:31:13 +0000183 {
Greg Clayton527154d2011-11-15 03:53:30 +0000184 ProcessAttachInfo attach_info;
185 attach_info.SetProcessID (pid);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000186 error.SetError (process_sp->Attach (attach_info));
James McIlree38093402011-03-04 00:31:13 +0000187 }
188 else
189 {
190 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
191 }
192 }
193 else
194 {
195 error.SetErrorString ("unable to attach pid");
196 }
197
198 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
199 if (log) {
200 SBStream sstr;
201 error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000202 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%llu) => SBError (%p): %s", process_sp.get(), pid, error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000203 }
204
205 return error.Success();
206}
207
Chris Lattner24943d22010-06-08 16:52:24 +0000208
209uint32_t
210SBProcess::GetNumThreads ()
211{
Greg Claytone005f2c2010-11-06 01:53:30 +0000212 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000213
Caroline Tice7826c882010-10-26 03:11:13 +0000214 uint32_t num_threads = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000215 ProcessSP process_sp(GetSP());
216 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000217 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000218 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000219 const bool can_update = true;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000220 num_threads = process_sp->GetThreadList().GetSize(can_update);
Chris Lattner24943d22010-06-08 16:52:24 +0000221 }
Caroline Tice7826c882010-10-26 03:11:13 +0000222
223 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000224 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", process_sp.get(), num_threads);
Caroline Tice7826c882010-10-26 03:11:13 +0000225
226 return num_threads;
Chris Lattner24943d22010-06-08 16:52:24 +0000227}
228
229SBThread
Jim Inghamc8332952010-08-26 21:32:51 +0000230SBProcess::GetSelectedThread () const
Chris Lattner24943d22010-06-08 16:52:24 +0000231{
Greg Claytone005f2c2010-11-06 01:53:30 +0000232 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000233
Chris Lattner24943d22010-06-08 16:52:24 +0000234 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000235 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000236 ProcessSP process_sp(GetSP());
237 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000238 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000239 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
240 thread_sp = process_sp->GetThreadList().GetSelectedThread();
Greg Clayton90c52142012-01-30 02:53:15 +0000241 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000242 }
Caroline Tice7826c882010-10-26 03:11:13 +0000243
244 if (log)
245 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000246 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", process_sp.get(), thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000247 }
248
Chris Lattner24943d22010-06-08 16:52:24 +0000249 return sb_thread;
250}
251
252SBTarget
253SBProcess::GetTarget() const
254{
Greg Claytone005f2c2010-11-06 01:53:30 +0000255 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000256
Chris Lattner24943d22010-06-08 16:52:24 +0000257 SBTarget sb_target;
Greg Clayton334d33a2012-01-30 07:41:31 +0000258 TargetSP target_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000259 ProcessSP process_sp(GetSP());
260 if (process_sp)
Greg Clayton334d33a2012-01-30 07:41:31 +0000261 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000262 target_sp = process_sp->GetTarget().shared_from_this();
Greg Clayton334d33a2012-01-30 07:41:31 +0000263 sb_target.SetSP (target_sp);
264 }
Caroline Tice7826c882010-10-26 03:11:13 +0000265
266 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000267 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", process_sp.get(), target_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000268
Chris Lattner24943d22010-06-08 16:52:24 +0000269 return sb_target;
270}
271
272
273size_t
274SBProcess::PutSTDIN (const char *src, size_t src_len)
275{
Greg Claytone005f2c2010-11-06 01:53:30 +0000276 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000277
Caroline Tice7826c882010-10-26 03:11:13 +0000278 size_t ret_val = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000279 ProcessSP process_sp(GetSP());
280 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000281 {
282 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000283 ret_val = process_sp->PutSTDIN (src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000284 }
Caroline Tice7826c882010-10-26 03:11:13 +0000285
286 if (log)
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000287 log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000288 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000289 src,
290 (uint32_t) src_len,
291 ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000292
293 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000294}
295
296size_t
297SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
298{
Greg Clayton49ce6822010-10-31 03:01:06 +0000299 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000300 ProcessSP process_sp(GetSP());
301 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000302 {
303 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000304 bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000305 }
Caroline Tice7826c882010-10-26 03:11:13 +0000306
Greg Claytone005f2c2010-11-06 01:53:30 +0000307 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000308 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000309 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000310 process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000311
Greg Clayton49ce6822010-10-31 03:01:06 +0000312 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000313}
314
315size_t
316SBProcess::GetSTDERR (char *dst, size_t dst_len) const
317{
Greg Clayton49ce6822010-10-31 03:01:06 +0000318 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000319 ProcessSP process_sp(GetSP());
320 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000321 {
322 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000323 bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000324 }
Caroline Tice7826c882010-10-26 03:11:13 +0000325
Greg Claytone005f2c2010-11-06 01:53:30 +0000326 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000327 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000328 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000329 process_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000330
Greg Clayton49ce6822010-10-31 03:01:06 +0000331 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000332}
333
334void
Jim Inghamc8332952010-08-26 21:32:51 +0000335SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner24943d22010-06-08 16:52:24 +0000336{
337 if (out == NULL)
338 return;
339
Greg Clayton0416bdf2012-01-30 09:04:36 +0000340 ProcessSP process_sp(GetSP());
341 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000342 {
343 const StateType event_state = SBProcess::GetStateFromEvent (event);
344 char message[1024];
345 int message_len = ::snprintf (message,
346 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000347 "Process %llu %s\n",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000348 process_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000349 SBDebugger::StateAsCString (event_state));
350
351 if (message_len > 0)
352 ::fwrite (message, 1, message_len, out);
353 }
354}
355
356void
Jim Inghamc8332952010-08-26 21:32:51 +0000357SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000358{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000359 ProcessSP process_sp(GetSP());
360 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000361 {
362 const StateType event_state = SBProcess::GetStateFromEvent (event);
363 char message[1024];
364 ::snprintf (message,
365 sizeof (message),
Greg Clayton444e35b2011-10-19 18:09:39 +0000366 "Process %llu %s\n",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000367 process_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000368 SBDebugger::StateAsCString (event_state));
369
370 result.AppendMessage (message);
371 }
372}
373
374bool
Jim Inghamc8332952010-08-26 21:32:51 +0000375SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner24943d22010-06-08 16:52:24 +0000376{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000377 ProcessSP process_sp(GetSP());
378 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000379 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000380 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
381 return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonbdcda462010-12-20 20:49:23 +0000382 }
Chris Lattner24943d22010-06-08 16:52:24 +0000383 return false;
384}
385
386bool
Jim Inghamc8332952010-08-26 21:32:51 +0000387SBProcess::SetSelectedThreadByID (uint32_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000388{
Greg Claytone005f2c2010-11-06 01:53:30 +0000389 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000390
Caroline Tice7826c882010-10-26 03:11:13 +0000391 bool ret_val = false;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000392 ProcessSP process_sp(GetSP());
393 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000394 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000395 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
396 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonbdcda462010-12-20 20:49:23 +0000397 }
Caroline Tice7826c882010-10-26 03:11:13 +0000398
399 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000400 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000401 process_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000402
403 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000404}
405
406SBThread
407SBProcess::GetThreadAtIndex (size_t index)
408{
Greg Claytone005f2c2010-11-06 01:53:30 +0000409 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000410
Greg Clayton90c52142012-01-30 02:53:15 +0000411 SBThread sb_thread;
412 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000413 ProcessSP process_sp(GetSP());
414 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000415 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000416 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
417 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index);
Greg Clayton90c52142012-01-30 02:53:15 +0000418 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000419 }
Caroline Tice7826c882010-10-26 03:11:13 +0000420
421 if (log)
422 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000423 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000424 process_sp.get(), (uint32_t) index, thread_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000425 }
426
Greg Clayton90c52142012-01-30 02:53:15 +0000427 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000428}
429
430StateType
431SBProcess::GetState ()
432{
Caroline Tice7826c882010-10-26 03:11:13 +0000433
Caroline Tice7826c882010-10-26 03:11:13 +0000434 StateType ret_val = eStateInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000435 ProcessSP process_sp(GetSP());
436 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000437 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000438 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
439 ret_val = process_sp->GetState();
Greg Claytonbdcda462010-12-20 20:49:23 +0000440 }
Caroline Tice7826c882010-10-26 03:11:13 +0000441
Greg Claytone005f2c2010-11-06 01:53:30 +0000442 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000443 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000444 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000445 process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000446 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000447
448 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000449}
450
451
452int
453SBProcess::GetExitStatus ()
454{
Greg Claytona66ba462010-10-30 04:51:46 +0000455 int exit_status = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000456 ProcessSP process_sp(GetSP());
457 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000458 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000459 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
460 exit_status = process_sp->GetExitStatus ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000461 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000462 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000463 if (log)
464 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000465 process_sp.get(), exit_status, exit_status);
Greg Claytona66ba462010-10-30 04:51:46 +0000466
467 return exit_status;
Chris Lattner24943d22010-06-08 16:52:24 +0000468}
469
470const char *
471SBProcess::GetExitDescription ()
472{
Greg Claytona66ba462010-10-30 04:51:46 +0000473 const char *exit_desc = NULL;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000474 ProcessSP process_sp(GetSP());
475 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000476 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000477 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
478 exit_desc = process_sp->GetExitDescription ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000479 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000480 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000481 if (log)
482 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000483 process_sp.get(), exit_desc);
Greg Claytona66ba462010-10-30 04:51:46 +0000484 return exit_desc;
Chris Lattner24943d22010-06-08 16:52:24 +0000485}
486
487lldb::pid_t
488SBProcess::GetProcessID ()
489{
Caroline Tice7826c882010-10-26 03:11:13 +0000490 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000491 ProcessSP process_sp(GetSP());
492 if (process_sp)
493 ret_val = process_sp->GetID();
Caroline Tice7826c882010-10-26 03:11:13 +0000494
Greg Claytone005f2c2010-11-06 01:53:30 +0000495 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000496 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000497 log->Printf ("SBProcess(%p)::GetProcessID () => %llu", process_sp.get(), ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000498
499 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000500}
501
Johnny Chen60a544f2011-03-01 22:56:31 +0000502ByteOrder
503SBProcess::GetByteOrder () const
504{
505 ByteOrder byteOrder = eByteOrderInvalid;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000506 ProcessSP process_sp(GetSP());
507 if (process_sp)
508 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Johnny Chen60a544f2011-03-01 22:56:31 +0000509
510 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
511 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000512 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", process_sp.get(), byteOrder);
Johnny Chen60a544f2011-03-01 22:56:31 +0000513
514 return byteOrder;
515}
516
Chris Lattner24943d22010-06-08 16:52:24 +0000517uint32_t
518SBProcess::GetAddressByteSize () const
519{
Caroline Tice7826c882010-10-26 03:11:13 +0000520 uint32_t size = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000521 ProcessSP process_sp(GetSP());
522 if (process_sp)
523 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Tice7826c882010-10-26 03:11:13 +0000524
Greg Claytone005f2c2010-11-06 01:53:30 +0000525 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000526 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000527 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", process_sp.get(), size);
Caroline Tice7826c882010-10-26 03:11:13 +0000528
529 return size;
Chris Lattner24943d22010-06-08 16:52:24 +0000530}
531
Chris Lattner24943d22010-06-08 16:52:24 +0000532SBError
533SBProcess::Continue ()
534{
Greg Claytone005f2c2010-11-06 01:53:30 +0000535 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000536
Chris Lattner24943d22010-06-08 16:52:24 +0000537 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000538 ProcessSP process_sp(GetSP());
539
540 if (log)
541 log->Printf ("SBProcess(%p)::Continue ()...", process_sp.get());
542
543 if (process_sp)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000544 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000545 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytonde1dd812011-06-24 03:21:43 +0000546
Greg Clayton0416bdf2012-01-30 09:04:36 +0000547 Error error (process_sp->Resume());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000548 if (error.Success())
549 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000550 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Claytona66ba462010-10-30 04:51:46 +0000551 {
552 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000553 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", process_sp.get());
554 process_sp->WaitForProcessToStop (NULL);
Greg Claytona66ba462010-10-30 04:51:46 +0000555 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000556 }
557 sb_error.SetError(error);
558 }
Chris Lattner24943d22010-06-08 16:52:24 +0000559 else
560 sb_error.SetErrorString ("SBProcess is invalid");
561
Caroline Tice7826c882010-10-26 03:11:13 +0000562 if (log)
563 {
564 SBStream sstr;
565 sb_error.GetDescription (sstr);
Greg Clayton0416bdf2012-01-30 09:04:36 +0000566 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", process_sp.get(), sb_error.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000567 }
568
Chris Lattner24943d22010-06-08 16:52:24 +0000569 return sb_error;
570}
571
572
573SBError
574SBProcess::Destroy ()
575{
576 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000577 ProcessSP process_sp(GetSP());
578 if (process_sp)
Greg Clayton72e1c782011-01-22 23:43:18 +0000579 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000580 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
581 sb_error.SetError(process_sp->Destroy());
Greg Clayton72e1c782011-01-22 23:43:18 +0000582 }
Chris Lattner24943d22010-06-08 16:52:24 +0000583 else
584 sb_error.SetErrorString ("SBProcess is invalid");
585
Greg Claytone005f2c2010-11-06 01:53:30 +0000586 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000587 if (log)
588 {
589 SBStream sstr;
590 sb_error.GetDescription (sstr);
Greg Clayton72e1c782011-01-22 23:43:18 +0000591 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000592 process_sp.get(),
Greg Clayton72e1c782011-01-22 23:43:18 +0000593 sb_error.get(),
594 sstr.GetData());
Greg Claytona66ba462010-10-30 04:51:46 +0000595 }
596
Chris Lattner24943d22010-06-08 16:52:24 +0000597 return sb_error;
598}
599
600
601SBError
602SBProcess::Stop ()
603{
604 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000605 ProcessSP process_sp(GetSP());
606 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000607 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000608 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
609 sb_error.SetError (process_sp->Halt());
Greg Claytonbdcda462010-12-20 20:49:23 +0000610 }
Chris Lattner24943d22010-06-08 16:52:24 +0000611 else
612 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000613
Greg Claytone005f2c2010-11-06 01:53:30 +0000614 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000615 if (log)
616 {
617 SBStream sstr;
618 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000619 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000620 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000621 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000622 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000623 }
624
Chris Lattner24943d22010-06-08 16:52:24 +0000625 return sb_error;
626}
627
628SBError
629SBProcess::Kill ()
630{
631 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000632 ProcessSP process_sp(GetSP());
633 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000634 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000635 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
636 sb_error.SetError (process_sp->Destroy());
Greg Claytonbdcda462010-12-20 20:49:23 +0000637 }
Chris Lattner24943d22010-06-08 16:52:24 +0000638 else
639 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000640
Greg Claytone005f2c2010-11-06 01:53:30 +0000641 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000642 if (log)
643 {
644 SBStream sstr;
645 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000646 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000647 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000648 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000649 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000650 }
651
Chris Lattner24943d22010-06-08 16:52:24 +0000652 return sb_error;
653}
654
Chris Lattner24943d22010-06-08 16:52:24 +0000655SBError
656SBProcess::Detach ()
657{
658 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000659 ProcessSP process_sp(GetSP());
660 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000661 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000662 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
663 sb_error.SetError (process_sp->Detach());
Greg Claytonbdcda462010-12-20 20:49:23 +0000664 }
Chris Lattner24943d22010-06-08 16:52:24 +0000665 else
666 sb_error.SetErrorString ("SBProcess is invalid");
667
668 return sb_error;
669}
670
671SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000672SBProcess::Signal (int signo)
Chris Lattner24943d22010-06-08 16:52:24 +0000673{
674 SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000675 ProcessSP process_sp(GetSP());
676 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000677 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000678 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
679 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonbdcda462010-12-20 20:49:23 +0000680 }
Chris Lattner24943d22010-06-08 16:52:24 +0000681 else
682 sb_error.SetErrorString ("SBProcess is invalid");
Greg Claytone005f2c2010-11-06 01:53:30 +0000683 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000684 if (log)
685 {
686 SBStream sstr;
687 sb_error.GetDescription (sstr);
688 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000689 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000690 signo,
691 sb_error.get(),
692 sstr.GetData());
693 }
Chris Lattner24943d22010-06-08 16:52:24 +0000694 return sb_error;
695}
696
Chris Lattner24943d22010-06-08 16:52:24 +0000697SBThread
Greg Claytona66ba462010-10-30 04:51:46 +0000698SBProcess::GetThreadByID (tid_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000699{
Greg Claytona66ba462010-10-30 04:51:46 +0000700 SBThread sb_thread;
Greg Clayton90c52142012-01-30 02:53:15 +0000701 ThreadSP thread_sp;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000702 ProcessSP process_sp(GetSP());
703 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000704 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000705 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
706 thread_sp = process_sp->GetThreadList().FindThreadByID (tid);
Greg Clayton90c52142012-01-30 02:53:15 +0000707 sb_thread.SetThread (thread_sp);
Greg Claytonbdcda462010-12-20 20:49:23 +0000708 }
Greg Claytona66ba462010-10-30 04:51:46 +0000709
Greg Claytone005f2c2010-11-06 01:53:30 +0000710 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000711 if (log)
712 {
Greg Claytond9919d32011-12-01 23:28:38 +0000713 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4llx) => SBThread (%p)",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000714 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000715 tid,
Greg Clayton90c52142012-01-30 02:53:15 +0000716 thread_sp.get());
Greg Claytona66ba462010-10-30 04:51:46 +0000717 }
718
719 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000720}
721
Chris Lattner24943d22010-06-08 16:52:24 +0000722StateType
723SBProcess::GetStateFromEvent (const SBEvent &event)
724{
Greg Claytone005f2c2010-11-06 01:53:30 +0000725 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000726
Caroline Tice7826c882010-10-26 03:11:13 +0000727 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
728
729 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000730 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000731 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000732
733 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000734}
735
Chris Lattner24943d22010-06-08 16:52:24 +0000736bool
737SBProcess::GetRestartedFromEvent (const SBEvent &event)
738{
Greg Clayton63094e02010-06-23 01:19:29 +0000739 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000740}
741
742SBProcess
743SBProcess::GetProcessFromEvent (const SBEvent &event)
744{
Greg Clayton63094e02010-06-23 01:19:29 +0000745 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000746 return process;
747}
748
Jim Ingham28e23862012-02-08 05:23:15 +0000749bool
750SBProcess::EventIsProcessEvent (const SBEvent &event)
751{
Jim Ingham5a15e692012-02-16 06:50:00 +0000752 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Ingham28e23862012-02-08 05:23:15 +0000753}
Chris Lattner24943d22010-06-08 16:52:24 +0000754
755SBBroadcaster
756SBProcess::GetBroadcaster () const
757{
Greg Claytone005f2c2010-11-06 01:53:30 +0000758 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000759
Greg Clayton0416bdf2012-01-30 09:04:36 +0000760 ProcessSP process_sp(GetSP());
761
762 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000763
764 if (log)
Greg Clayton0416bdf2012-01-30 09:04:36 +0000765 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", process_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000766 broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000767
Chris Lattner24943d22010-06-08 16:52:24 +0000768 return broadcaster;
769}
770
Jim Ingham5a15e692012-02-16 06:50:00 +0000771const char *
772SBProcess::GetBroadcasterClass ()
773{
774 return Process::GetStaticBroadcasterClass().AsCString();
775}
776
Chris Lattner24943d22010-06-08 16:52:24 +0000777size_t
778SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
779{
Greg Claytone005f2c2010-11-06 01:53:30 +0000780 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000781
Chris Lattner24943d22010-06-08 16:52:24 +0000782 size_t bytes_read = 0;
783
Greg Clayton0416bdf2012-01-30 09:04:36 +0000784 ProcessSP process_sp(GetSP());
785
Greg Claytona66ba462010-10-30 04:51:46 +0000786 if (log)
787 {
788 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000789 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000790 addr,
791 dst,
Greg Claytonbae39c52011-12-03 00:46:21 +0000792 dst_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000793 sb_error.get());
794 }
Greg Clayton0416bdf2012-01-30 09:04:36 +0000795
796 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000797 {
798 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000799 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
800 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000801 sb_error.SetError (error);
802 }
803 else
804 {
805 sb_error.SetErrorString ("SBProcess is invalid");
806 }
807
Caroline Tice7826c882010-10-26 03:11:13 +0000808 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000809 {
810 SBStream sstr;
811 sb_error.GetDescription (sstr);
Greg Claytonbae39c52011-12-03 00:46:21 +0000812 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000813 process_sp.get(),
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000814 addr,
815 dst,
Greg Claytonbae39c52011-12-03 00:46:21 +0000816 dst_len,
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000817 sb_error.get(),
818 sstr.GetData(),
Greg Claytonbae39c52011-12-03 00:46:21 +0000819 bytes_read);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000820 }
Caroline Tice7826c882010-10-26 03:11:13 +0000821
Chris Lattner24943d22010-06-08 16:52:24 +0000822 return bytes_read;
823}
824
825size_t
Greg Clayton4a2e3372011-12-15 03:14:23 +0000826SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
827{
828 size_t bytes_read = 0;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000829 ProcessSP process_sp(GetSP());
830 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000831 {
832 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000833 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
834 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, error);
Greg Clayton4a2e3372011-12-15 03:14:23 +0000835 sb_error.SetError (error);
836 }
837 else
838 {
839 sb_error.SetErrorString ("SBProcess is invalid");
840 }
841 return bytes_read;
842}
843
844uint64_t
845SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
846{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000847 ProcessSP process_sp(GetSP());
848 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000849 {
850 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000851 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
852 uint64_t value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, error);
Greg Clayton4a2e3372011-12-15 03:14:23 +0000853 sb_error.SetError (error);
854 return value;
855 }
856 else
857 {
858 sb_error.SetErrorString ("SBProcess is invalid");
859 }
860 return 0;
861}
862
863lldb::addr_t
864SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
865{
866 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000867 ProcessSP process_sp(GetSP());
868 if (process_sp)
Greg Clayton4a2e3372011-12-15 03:14:23 +0000869 {
870 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000871 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
872 ptr = process_sp->ReadPointerFromMemory (addr, error);
Greg Clayton4a2e3372011-12-15 03:14:23 +0000873 sb_error.SetError (error);
874 }
875 else
876 {
877 sb_error.SetErrorString ("SBProcess is invalid");
878 }
879 return ptr;
880}
881
882size_t
Chris Lattner24943d22010-06-08 16:52:24 +0000883SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
884{
885 size_t bytes_written = 0;
886
Greg Claytone005f2c2010-11-06 01:53:30 +0000887 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton0416bdf2012-01-30 09:04:36 +0000888
889 ProcessSP process_sp(GetSP());
890
Greg Claytona66ba462010-10-30 04:51:46 +0000891 if (log)
892 {
893 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000894 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000895 addr,
896 src,
Greg Claytonbae39c52011-12-03 00:46:21 +0000897 src_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000898 sb_error.get());
899 }
900
Greg Clayton0416bdf2012-01-30 09:04:36 +0000901 if (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000902 {
903 Error error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000904 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
905 bytes_written = process_sp->WriteMemory (addr, src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000906 sb_error.SetError (error);
907 }
908
Greg Claytona66ba462010-10-30 04:51:46 +0000909 if (log)
910 {
911 SBStream sstr;
912 sb_error.GetDescription (sstr);
Greg Claytonbae39c52011-12-03 00:46:21 +0000913 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %zu",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000914 process_sp.get(),
Greg Claytona66ba462010-10-30 04:51:46 +0000915 addr,
916 src,
Greg Claytonbae39c52011-12-03 00:46:21 +0000917 src_len,
Greg Claytona66ba462010-10-30 04:51:46 +0000918 sb_error.get(),
919 sstr.GetData(),
Greg Claytonbae39c52011-12-03 00:46:21 +0000920 bytes_written);
Greg Claytona66ba462010-10-30 04:51:46 +0000921 }
922
Chris Lattner24943d22010-06-08 16:52:24 +0000923 return bytes_written;
924}
925
Caroline Tice98f930f2010-09-20 05:20:02 +0000926bool
927SBProcess::GetDescription (SBStream &description)
928{
Greg Clayton96154be2011-11-13 06:57:31 +0000929 Stream &strm = description.ref();
930
Greg Clayton0416bdf2012-01-30 09:04:36 +0000931 ProcessSP process_sp(GetSP());
932 if (process_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +0000933 {
934 char path[PATH_MAX];
935 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Clayton0416bdf2012-01-30 09:04:36 +0000936 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton5c4c7462010-10-06 03:09:58 +0000937 const char *exe_name = NULL;
938 if (exe_module)
939 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
940
Greg Clayton96154be2011-11-13 06:57:31 +0000941 strm.Printf ("SBProcess: pid = %llu, state = %s, threads = %d%s%s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000942 process_sp->GetID(),
Greg Clayton96154be2011-11-13 06:57:31 +0000943 lldb_private::StateAsCString (GetState()),
944 GetNumThreads(),
945 exe_name ? ", executable = " : "",
946 exe_name ? exe_name : "");
Caroline Tice98f930f2010-09-20 05:20:02 +0000947 }
948 else
Greg Clayton96154be2011-11-13 06:57:31 +0000949 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +0000950
951 return true;
952}
Greg Clayton0baa3942010-11-04 01:54:29 +0000953
954uint32_t
955SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
956{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000957 ProcessSP process_sp(GetSP());
958 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000959 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000960 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
961 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
Greg Claytonbdcda462010-12-20 20:49:23 +0000962 }
Greg Clayton0baa3942010-11-04 01:54:29 +0000963 return LLDB_INVALID_IMAGE_TOKEN;
964}
965
966lldb::SBError
967SBProcess::UnloadImage (uint32_t image_token)
968{
969 lldb::SBError sb_error;
Greg Clayton0416bdf2012-01-30 09:04:36 +0000970 ProcessSP process_sp(GetSP());
971 if (process_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000972 {
Greg Clayton0416bdf2012-01-30 09:04:36 +0000973 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
974 sb_error.SetError (process_sp->UnloadImage (image_token));
Greg Claytonbdcda462010-12-20 20:49:23 +0000975 }
Greg Clayton0baa3942010-11-04 01:54:29 +0000976 else
977 sb_error.SetErrorString("invalid process");
978 return sb_error;
979}