blob: 23152aa43d55dc5e332f0adcf58afafd823c2df6 [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"
Chris Lattner24943d22010-06-08 16:52:24 +000016#include "lldb/Core/DataBufferHeap.h"
17#include "lldb/Core/DataExtractor.h"
Greg Clayton1a3083a2010-10-06 03:53:16 +000018#include "lldb/Core/Debugger.h"
Caroline Tice7826c882010-10-26 03:11:13 +000019#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000020#include "lldb/Core/State.h"
21#include "lldb/Core/Stream.h"
22#include "lldb/Core/StreamFile.h"
23#include "lldb/Target/Process.h"
Chris Lattner24943d22010-06-08 16:52:24 +000024#include "lldb/Target/RegisterContext.h"
Greg Clayton63094e02010-06-23 01:19:29 +000025#include "lldb/Target/Target.h"
26#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000027
28// Project includes
29
Eli Friedman7a62c8b2010-06-09 07:44:37 +000030#include "lldb/API/SBBroadcaster.h"
31#include "lldb/API/SBDebugger.h"
32#include "lldb/API/SBCommandReturnObject.h"
33#include "lldb/API/SBEvent.h"
34#include "lldb/API/SBThread.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000035#include "lldb/API/SBStream.h"
Eli Friedman7a62c8b2010-06-09 07:44:37 +000036#include "lldb/API/SBStringList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000037
38using namespace lldb;
39using namespace lldb_private;
40
41
42
43SBProcess::SBProcess () :
Greg Clayton63094e02010-06-23 01:19:29 +000044 m_opaque_sp()
Chris Lattner24943d22010-06-08 16:52:24 +000045{
46}
47
48
49//----------------------------------------------------------------------
50// SBProcess constructor
51//----------------------------------------------------------------------
52
53SBProcess::SBProcess (const SBProcess& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000054 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000055{
56}
57
58
59SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000060 m_opaque_sp (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000061{
62}
63
64//----------------------------------------------------------------------
65// Destructor
66//----------------------------------------------------------------------
67SBProcess::~SBProcess()
68{
69}
70
71void
72SBProcess::SetProcess (const ProcessSP &process_sp)
73{
Greg Clayton63094e02010-06-23 01:19:29 +000074 m_opaque_sp = process_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000075}
76
77void
78SBProcess::Clear ()
79{
Greg Clayton63094e02010-06-23 01:19:29 +000080 m_opaque_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +000081}
82
83
84bool
85SBProcess::IsValid() const
86{
Greg Clayton63094e02010-06-23 01:19:29 +000087 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000088}
89
90
91uint32_t
92SBProcess::GetNumThreads ()
93{
Caroline Tice7826c882010-10-26 03:11:13 +000094 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
95
Caroline Tice7826c882010-10-26 03:11:13 +000096 uint32_t num_threads = 0;
Greg Clayton63094e02010-06-23 01:19:29 +000097 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000098 {
99 const bool can_update = true;
Caroline Tice7826c882010-10-26 03:11:13 +0000100 num_threads = m_opaque_sp->GetThreadList().GetSize(can_update);
Chris Lattner24943d22010-06-08 16:52:24 +0000101 }
Caroline Tice7826c882010-10-26 03:11:13 +0000102
103 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000104 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", m_opaque_sp.get(), num_threads);
Caroline Tice7826c882010-10-26 03:11:13 +0000105
106 return num_threads;
Chris Lattner24943d22010-06-08 16:52:24 +0000107}
108
109SBThread
Jim Inghamc8332952010-08-26 21:32:51 +0000110SBProcess::GetSelectedThread () const
Chris Lattner24943d22010-06-08 16:52:24 +0000111{
Caroline Tice7826c882010-10-26 03:11:13 +0000112 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
113
Chris Lattner24943d22010-06-08 16:52:24 +0000114 SBThread sb_thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000115 if (m_opaque_sp)
Jim Inghamc8332952010-08-26 21:32:51 +0000116 sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread());
Caroline Tice7826c882010-10-26 03:11:13 +0000117
118 if (log)
119 {
Greg Claytona66ba462010-10-30 04:51:46 +0000120 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), sb_thread.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000121 }
122
Chris Lattner24943d22010-06-08 16:52:24 +0000123 return sb_thread;
124}
125
126SBTarget
127SBProcess::GetTarget() const
128{
Caroline Tice7826c882010-10-26 03:11:13 +0000129 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
130
Chris Lattner24943d22010-06-08 16:52:24 +0000131 SBTarget sb_target;
Greg Clayton63094e02010-06-23 01:19:29 +0000132 if (m_opaque_sp)
133 sb_target = m_opaque_sp->GetTarget().GetSP();
Caroline Tice7826c882010-10-26 03:11:13 +0000134
135 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000136 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), sb_target.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000137
Chris Lattner24943d22010-06-08 16:52:24 +0000138 return sb_target;
139}
140
141
142size_t
143SBProcess::PutSTDIN (const char *src, size_t src_len)
144{
Caroline Tice7826c882010-10-26 03:11:13 +0000145 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
146
Caroline Tice7826c882010-10-26 03:11:13 +0000147 size_t ret_val = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000148 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000149 {
150 Error error;
Caroline Tice7826c882010-10-26 03:11:13 +0000151 ret_val = m_opaque_sp->PutSTDIN (src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000152 }
Caroline Tice7826c882010-10-26 03:11:13 +0000153
154 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000155 log->Printf ("SBProcess(%p)::PutSTDIN (src='%s', src_len=%d) => %d",
156 m_opaque_sp.get(),
157 src,
158 (uint32_t) src_len,
159 ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000160
161 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000162}
163
164size_t
165SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
166{
Caroline Tice7826c882010-10-26 03:11:13 +0000167 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
168
Caroline Tice7826c882010-10-26 03:11:13 +0000169 size_t ret_val = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000170 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000171 {
172 Error error;
Caroline Tice7826c882010-10-26 03:11:13 +0000173 ret_val = m_opaque_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000174 }
Caroline Tice7826c882010-10-26 03:11:13 +0000175
176 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000177 log->Printf ("SBProcess(%p)::GetSTDOUT (dst='%.*s', dst_len=%d) => %d",
178 m_opaque_sp.get(),
179 (uint32_t) dst_len,
180 dst,
181 (uint32_t) dst_len,
182 (uint32_t) ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000183
184 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000185}
186
187size_t
188SBProcess::GetSTDERR (char *dst, size_t dst_len) const
189{
Caroline Tice7826c882010-10-26 03:11:13 +0000190 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
191
Caroline Tice7826c882010-10-26 03:11:13 +0000192 size_t ret_val = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000193 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000194 {
195 Error error;
Caroline Tice7826c882010-10-26 03:11:13 +0000196 ret_val = m_opaque_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000197 }
Caroline Tice7826c882010-10-26 03:11:13 +0000198
199 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000200 log->Printf ("SBProcess(%p)::GetSTDERR (dst='%.*s', dst_len=%d) => %d",
201 m_opaque_sp.get(),
202 (uint32_t) dst_len,
203 dst,
204 (uint32_t) dst_len,
205 (uint32_t) ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000206
207 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000208}
209
210void
Jim Inghamc8332952010-08-26 21:32:51 +0000211SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner24943d22010-06-08 16:52:24 +0000212{
213 if (out == NULL)
214 return;
215
Greg Clayton63094e02010-06-23 01:19:29 +0000216 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000217 {
218 const StateType event_state = SBProcess::GetStateFromEvent (event);
219 char message[1024];
220 int message_len = ::snprintf (message,
221 sizeof (message),
222 "Process %d %s\n",
Greg Clayton63094e02010-06-23 01:19:29 +0000223 m_opaque_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000224 SBDebugger::StateAsCString (event_state));
225
226 if (message_len > 0)
227 ::fwrite (message, 1, message_len, out);
228 }
229}
230
231void
Jim Inghamc8332952010-08-26 21:32:51 +0000232SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000233{
Greg Clayton63094e02010-06-23 01:19:29 +0000234 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000235 {
236 const StateType event_state = SBProcess::GetStateFromEvent (event);
237 char message[1024];
238 ::snprintf (message,
239 sizeof (message),
240 "Process %d %s\n",
Greg Clayton63094e02010-06-23 01:19:29 +0000241 m_opaque_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000242 SBDebugger::StateAsCString (event_state));
243
244 result.AppendMessage (message);
245 }
246}
247
248bool
Jim Inghamc8332952010-08-26 21:32:51 +0000249SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner24943d22010-06-08 16:52:24 +0000250{
Greg Clayton63094e02010-06-23 01:19:29 +0000251 if (m_opaque_sp != NULL)
Jim Inghamc8332952010-08-26 21:32:51 +0000252 return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000253 return false;
254}
255
256bool
Jim Inghamc8332952010-08-26 21:32:51 +0000257SBProcess::SetSelectedThreadByID (uint32_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000258{
Caroline Tice7826c882010-10-26 03:11:13 +0000259 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
260
Caroline Tice7826c882010-10-26 03:11:13 +0000261 bool ret_val = false;
Greg Clayton63094e02010-06-23 01:19:29 +0000262 if (m_opaque_sp != NULL)
Caroline Tice7826c882010-10-26 03:11:13 +0000263 ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid);
264
265 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000266 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=%d) => '%s'",
267 m_opaque_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000268
269 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000270}
271
272SBThread
273SBProcess::GetThreadAtIndex (size_t index)
274{
Caroline Tice7826c882010-10-26 03:11:13 +0000275 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
276
Chris Lattner24943d22010-06-08 16:52:24 +0000277 SBThread thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000278 if (m_opaque_sp)
279 thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index));
Caroline Tice7826c882010-10-26 03:11:13 +0000280
281 if (log)
282 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000283 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000284 m_opaque_sp.get(), (uint32_t) index, thread.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000285 }
286
Chris Lattner24943d22010-06-08 16:52:24 +0000287 return thread;
288}
289
290StateType
291SBProcess::GetState ()
292{
Caroline Tice7826c882010-10-26 03:11:13 +0000293
Caroline Tice7826c882010-10-26 03:11:13 +0000294 StateType ret_val = eStateInvalid;
Greg Clayton63094e02010-06-23 01:19:29 +0000295 if (m_opaque_sp != NULL)
Caroline Tice7826c882010-10-26 03:11:13 +0000296 ret_val = m_opaque_sp->GetState();
297
Greg Claytona66ba462010-10-30 04:51:46 +0000298 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000299 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000300 log->Printf ("SBProcess(%p)::GetState () => '%s'",
301 m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000302 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000303
304 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000305}
306
307
308int
309SBProcess::GetExitStatus ()
310{
Greg Claytona66ba462010-10-30 04:51:46 +0000311 int exit_status = 0;
312 if (m_opaque_sp)
313 exit_status = m_opaque_sp->GetExitStatus ();
314 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
315 if (log)
316 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
317 m_opaque_sp.get(), exit_status, exit_status);
318
319 return exit_status;
Chris Lattner24943d22010-06-08 16:52:24 +0000320}
321
322const char *
323SBProcess::GetExitDescription ()
324{
Greg Claytona66ba462010-10-30 04:51:46 +0000325 const char *exit_desc = NULL;
Greg Clayton63094e02010-06-23 01:19:29 +0000326 if (m_opaque_sp != NULL)
Greg Claytona66ba462010-10-30 04:51:46 +0000327 exit_desc = m_opaque_sp->GetExitDescription ();
328 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
329 if (log)
330 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
331 m_opaque_sp.get(), exit_desc);
332 return exit_desc;
Chris Lattner24943d22010-06-08 16:52:24 +0000333}
334
335lldb::pid_t
336SBProcess::GetProcessID ()
337{
Caroline Tice7826c882010-10-26 03:11:13 +0000338 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Clayton63094e02010-06-23 01:19:29 +0000339 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000340 ret_val = m_opaque_sp->GetID();
341
Greg Claytona66ba462010-10-30 04:51:46 +0000342 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000343 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000344 log->Printf ("SBProcess(%p)::GetProcessID () => %d", m_opaque_sp.get(), ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000345
346 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000347}
348
349uint32_t
350SBProcess::GetAddressByteSize () const
351{
Caroline Tice7826c882010-10-26 03:11:13 +0000352 uint32_t size = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000353 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000354 size = m_opaque_sp->GetAddressByteSize();
355
Greg Claytona66ba462010-10-30 04:51:46 +0000356 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000357 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000358 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size);
Caroline Tice7826c882010-10-26 03:11:13 +0000359
360 return size;
Chris Lattner24943d22010-06-08 16:52:24 +0000361}
362
Chris Lattner24943d22010-06-08 16:52:24 +0000363SBError
364SBProcess::Continue ()
365{
Greg Claytona66ba462010-10-30 04:51:46 +0000366 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
367 if (log)
368 log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000369
Chris Lattner24943d22010-06-08 16:52:24 +0000370 SBError sb_error;
371 if (IsValid())
Greg Clayton1a3083a2010-10-06 03:53:16 +0000372 {
373 Error error (m_opaque_sp->Resume());
374 if (error.Success())
375 {
376 if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Claytona66ba462010-10-30 04:51:46 +0000377 {
378 if (log)
379 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000380 m_opaque_sp->WaitForProcessToStop (NULL);
Greg Claytona66ba462010-10-30 04:51:46 +0000381 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000382 }
383 sb_error.SetError(error);
384 }
Chris Lattner24943d22010-06-08 16:52:24 +0000385 else
386 sb_error.SetErrorString ("SBProcess is invalid");
387
Caroline Tice7826c882010-10-26 03:11:13 +0000388 if (log)
389 {
390 SBStream sstr;
391 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000392 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000393 }
394
Chris Lattner24943d22010-06-08 16:52:24 +0000395 return sb_error;
396}
397
398
399SBError
400SBProcess::Destroy ()
401{
402 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000403 if (m_opaque_sp)
404 sb_error.SetError(m_opaque_sp->Destroy());
Chris Lattner24943d22010-06-08 16:52:24 +0000405 else
406 sb_error.SetErrorString ("SBProcess is invalid");
407
Greg Claytona66ba462010-10-30 04:51:46 +0000408 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
409 if (log)
410 {
411 SBStream sstr;
412 sb_error.GetDescription (sstr);
413 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData());
414 }
415
Chris Lattner24943d22010-06-08 16:52:24 +0000416 return sb_error;
417}
418
419
420SBError
421SBProcess::Stop ()
422{
Caroline Tice7826c882010-10-26 03:11:13 +0000423
Chris Lattner24943d22010-06-08 16:52:24 +0000424 SBError sb_error;
425 if (IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +0000426 sb_error.SetError (m_opaque_sp->Halt());
Chris Lattner24943d22010-06-08 16:52:24 +0000427 else
428 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000429
Caroline Tice926060e2010-10-29 21:48:37 +0000430 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000431 if (log)
432 {
433 SBStream sstr;
434 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000435 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
436 m_opaque_sp.get(),
437 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000438 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000439 }
440
Chris Lattner24943d22010-06-08 16:52:24 +0000441 return sb_error;
442}
443
444SBError
445SBProcess::Kill ()
446{
Caroline Tice7826c882010-10-26 03:11:13 +0000447
Chris Lattner24943d22010-06-08 16:52:24 +0000448 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000449 if (m_opaque_sp)
450 sb_error.SetError (m_opaque_sp->Destroy());
Chris Lattner24943d22010-06-08 16:52:24 +0000451 else
452 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000453
Caroline Tice926060e2010-10-29 21:48:37 +0000454 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000455 if (log)
456 {
457 SBStream sstr;
458 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000459 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
460 m_opaque_sp.get(),
461 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000462 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000463 }
464
Chris Lattner24943d22010-06-08 16:52:24 +0000465 return sb_error;
466}
467
468
469SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000470SBProcess::AttachByName (const char *name, bool wait_for_launch) // DEPRECATED
Chris Lattner24943d22010-06-08 16:52:24 +0000471{
472 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000473 if (m_opaque_sp)
474 sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch));
Chris Lattner24943d22010-06-08 16:52:24 +0000475 else
476 sb_error.SetErrorString ("SBProcess is invalid");
477 return sb_error;
478}
479
480lldb::pid_t
Greg Claytona66ba462010-10-30 04:51:46 +0000481SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED
Chris Lattner24943d22010-06-08 16:52:24 +0000482{
483 Attach (attach_pid);
484 return GetProcessID();
485}
486
Caroline Ticedfc91c32010-09-15 18:29:06 +0000487
Chris Lattner24943d22010-06-08 16:52:24 +0000488SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000489SBProcess::Attach (lldb::pid_t attach_pid) // DEPRECATED
Chris Lattner24943d22010-06-08 16:52:24 +0000490{
491 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000492 if (m_opaque_sp)
493 sb_error.SetError (m_opaque_sp->Attach (attach_pid));
Chris Lattner24943d22010-06-08 16:52:24 +0000494 else
495 sb_error.SetErrorString ("SBProcess is invalid");
496 return sb_error;
497}
498
499SBError
500SBProcess::Detach ()
501{
502 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000503 if (m_opaque_sp)
504 sb_error.SetError (m_opaque_sp->Detach());
Chris Lattner24943d22010-06-08 16:52:24 +0000505 else
506 sb_error.SetErrorString ("SBProcess is invalid");
507
508 return sb_error;
509}
510
511SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000512SBProcess::Signal (int signo)
Chris Lattner24943d22010-06-08 16:52:24 +0000513{
514 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000515 if (m_opaque_sp)
Greg Claytona66ba462010-10-30 04:51:46 +0000516 sb_error.SetError (m_opaque_sp->Signal (signo));
Chris Lattner24943d22010-06-08 16:52:24 +0000517 else
518 sb_error.SetErrorString ("SBProcess is invalid");
Greg Claytona66ba462010-10-30 04:51:46 +0000519 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
520 if (log)
521 {
522 SBStream sstr;
523 sb_error.GetDescription (sstr);
524 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
525 m_opaque_sp.get(),
526 signo,
527 sb_error.get(),
528 sstr.GetData());
529 }
Chris Lattner24943d22010-06-08 16:52:24 +0000530 return sb_error;
531}
532
Chris Lattner24943d22010-06-08 16:52:24 +0000533SBThread
Greg Claytona66ba462010-10-30 04:51:46 +0000534SBProcess::GetThreadByID (tid_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000535{
Greg Claytona66ba462010-10-30 04:51:46 +0000536 SBThread sb_thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000537 if (m_opaque_sp)
Greg Claytona66ba462010-10-30 04:51:46 +0000538 sb_thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) tid));
539
540 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
541 if (log)
542 {
543 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4x) => SBThread (%p)",
544 m_opaque_sp.get(),
545 tid,
546 sb_thread.get());
547 }
548
549 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000550}
551
Chris Lattner24943d22010-06-08 16:52:24 +0000552StateType
553SBProcess::GetStateFromEvent (const SBEvent &event)
554{
Caroline Tice7826c882010-10-26 03:11:13 +0000555 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
556
Caroline Tice7826c882010-10-26 03:11:13 +0000557 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
558
559 if (log)
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000560 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => '%s'", event.get(),
561 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000562
563 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000564}
565
Chris Lattner24943d22010-06-08 16:52:24 +0000566bool
567SBProcess::GetRestartedFromEvent (const SBEvent &event)
568{
Greg Clayton63094e02010-06-23 01:19:29 +0000569 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000570}
571
572SBProcess
573SBProcess::GetProcessFromEvent (const SBEvent &event)
574{
Greg Clayton63094e02010-06-23 01:19:29 +0000575 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000576 return process;
577}
578
579
580SBBroadcaster
581SBProcess::GetBroadcaster () const
582{
Caroline Tice7826c882010-10-26 03:11:13 +0000583 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
584
Greg Clayton63094e02010-06-23 01:19:29 +0000585 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000586
587 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000588 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000589 broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000590
Chris Lattner24943d22010-06-08 16:52:24 +0000591 return broadcaster;
592}
593
594lldb_private::Process *
595SBProcess::operator->() const
596{
Greg Clayton63094e02010-06-23 01:19:29 +0000597 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000598}
599
600size_t
601SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
602{
Caroline Tice7826c882010-10-26 03:11:13 +0000603 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
604
Chris Lattner24943d22010-06-08 16:52:24 +0000605 size_t bytes_read = 0;
606
Greg Claytona66ba462010-10-30 04:51:46 +0000607 if (log)
608 {
609 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...",
610 m_opaque_sp.get(),
611 addr,
612 dst,
613 (uint32_t) dst_len,
614 sb_error.get());
615 }
616
Chris Lattner24943d22010-06-08 16:52:24 +0000617 if (IsValid())
618 {
619 Error error;
Greg Clayton63094e02010-06-23 01:19:29 +0000620 bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000621 sb_error.SetError (error);
622 }
623 else
624 {
625 sb_error.SetErrorString ("SBProcess is invalid");
626 }
627
Caroline Tice7826c882010-10-26 03:11:13 +0000628 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000629 {
630 SBStream sstr;
631 sb_error.GetDescription (sstr);
Greg Claytona66ba462010-10-30 04:51:46 +0000632 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %d",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000633 m_opaque_sp.get(),
634 addr,
635 dst,
636 (uint32_t) dst_len,
637 sb_error.get(),
638 sstr.GetData(),
639 (uint32_t) bytes_read);
640 }
Caroline Tice7826c882010-10-26 03:11:13 +0000641
Chris Lattner24943d22010-06-08 16:52:24 +0000642 return bytes_read;
643}
644
645size_t
646SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
647{
648 size_t bytes_written = 0;
649
Greg Claytona66ba462010-10-30 04:51:46 +0000650 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
651 if (log)
652 {
653 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...",
654 m_opaque_sp.get(),
655 addr,
656 src,
657 (uint32_t) src_len,
658 sb_error.get());
659 }
660
Chris Lattner24943d22010-06-08 16:52:24 +0000661 if (IsValid())
662 {
663 Error error;
Greg Clayton63094e02010-06-23 01:19:29 +0000664 bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000665 sb_error.SetError (error);
666 }
667
Greg Claytona66ba462010-10-30 04:51:46 +0000668 if (log)
669 {
670 SBStream sstr;
671 sb_error.GetDescription (sstr);
672 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %d",
673 m_opaque_sp.get(),
674 addr,
675 src,
676 (uint32_t) src_len,
677 sb_error.get(),
678 sstr.GetData(),
679 (uint32_t) bytes_written);
680 }
681
Chris Lattner24943d22010-06-08 16:52:24 +0000682 return bytes_written;
683}
684
685// Mimic shared pointer...
686lldb_private::Process *
687SBProcess::get() const
688{
Greg Clayton63094e02010-06-23 01:19:29 +0000689 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000690}
691
Caroline Tice98f930f2010-09-20 05:20:02 +0000692bool
693SBProcess::GetDescription (SBStream &description)
694{
695 if (m_opaque_sp)
696 {
697 char path[PATH_MAX];
698 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Clayton5c4c7462010-10-06 03:09:58 +0000699 Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModule ().get();
700 const char *exe_name = NULL;
701 if (exe_module)
702 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
703
Greg Claytond8c62532010-10-07 04:19:01 +0000704 description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s",
Greg Clayton5c4c7462010-10-06 03:09:58 +0000705 m_opaque_sp->GetID(),
Caroline Tice7826c882010-10-26 03:11:13 +0000706 lldb_private::StateAsCString (GetState()),
Greg Clayton5c4c7462010-10-06 03:09:58 +0000707 GetNumThreads(),
Greg Claytond8c62532010-10-07 04:19:01 +0000708 exe_name ? ", executable = " : "",
Greg Clayton5c4c7462010-10-06 03:09:58 +0000709 exe_name ? exe_name : "");
Caroline Tice98f930f2010-09-20 05:20:02 +0000710 }
711 else
712 description.Printf ("No value");
713
714 return true;
715}