blob: 0cae975de40cfafc7c2d61795434a67744cc2c06 [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"
18#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"
29#include "lldb/API/SBDebugger.h"
30#include "lldb/API/SBCommandReturnObject.h"
31#include "lldb/API/SBEvent.h"
32#include "lldb/API/SBThread.h"
33#include "lldb/API/SBStringList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000034
35using namespace lldb;
36using namespace lldb_private;
37
38
39
40SBProcess::SBProcess () :
Greg Clayton63094e02010-06-23 01:19:29 +000041 m_opaque_sp()
Chris Lattner24943d22010-06-08 16:52:24 +000042{
43}
44
45
46//----------------------------------------------------------------------
47// SBProcess constructor
48//----------------------------------------------------------------------
49
50SBProcess::SBProcess (const SBProcess& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000051 m_opaque_sp (rhs.m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000052{
53}
54
55
56SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000057 m_opaque_sp (process_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000058{
59}
60
61//----------------------------------------------------------------------
62// Destructor
63//----------------------------------------------------------------------
64SBProcess::~SBProcess()
65{
66}
67
68void
69SBProcess::SetProcess (const ProcessSP &process_sp)
70{
Greg Clayton63094e02010-06-23 01:19:29 +000071 m_opaque_sp = process_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000072}
73
74void
75SBProcess::Clear ()
76{
Greg Clayton63094e02010-06-23 01:19:29 +000077 m_opaque_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +000078}
79
80
81bool
82SBProcess::IsValid() const
83{
Greg Clayton63094e02010-06-23 01:19:29 +000084 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000085}
86
87
88uint32_t
89SBProcess::GetNumThreads ()
90{
Greg Clayton63094e02010-06-23 01:19:29 +000091 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000092 {
93 const bool can_update = true;
Greg Clayton63094e02010-06-23 01:19:29 +000094 return m_opaque_sp->GetThreadList().GetSize(can_update);
Chris Lattner24943d22010-06-08 16:52:24 +000095 }
96 return 0;
97}
98
99SBThread
Jim Inghamc8332952010-08-26 21:32:51 +0000100SBProcess::GetSelectedThread () const
Chris Lattner24943d22010-06-08 16:52:24 +0000101{
102 SBThread sb_thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000103 if (m_opaque_sp)
Jim Inghamc8332952010-08-26 21:32:51 +0000104 sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread());
Chris Lattner24943d22010-06-08 16:52:24 +0000105 return sb_thread;
106}
107
108SBTarget
109SBProcess::GetTarget() const
110{
111 SBTarget sb_target;
Greg Clayton63094e02010-06-23 01:19:29 +0000112 if (m_opaque_sp)
113 sb_target = m_opaque_sp->GetTarget().GetSP();
Chris Lattner24943d22010-06-08 16:52:24 +0000114 return sb_target;
115}
116
117
118size_t
119SBProcess::PutSTDIN (const char *src, size_t src_len)
120{
Greg Clayton63094e02010-06-23 01:19:29 +0000121 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000122 {
123 Error error;
Greg Clayton63094e02010-06-23 01:19:29 +0000124 return m_opaque_sp->PutSTDIN (src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000125 }
126 else
127 return 0;
128}
129
130size_t
131SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
132{
Greg Clayton63094e02010-06-23 01:19:29 +0000133 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000134 {
135 Error error;
Greg Clayton63094e02010-06-23 01:19:29 +0000136 return m_opaque_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000137 }
138 else
139 return 0;
140}
141
142size_t
143SBProcess::GetSTDERR (char *dst, size_t dst_len) const
144{
Greg Clayton63094e02010-06-23 01:19:29 +0000145 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000146 {
147 Error error;
Greg Clayton63094e02010-06-23 01:19:29 +0000148 return m_opaque_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000149 }
150 else
151 return 0;
152}
153
154void
Jim Inghamc8332952010-08-26 21:32:51 +0000155SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner24943d22010-06-08 16:52:24 +0000156{
157 if (out == NULL)
158 return;
159
Greg Clayton63094e02010-06-23 01:19:29 +0000160 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000161 {
162 const StateType event_state = SBProcess::GetStateFromEvent (event);
163 char message[1024];
164 int message_len = ::snprintf (message,
165 sizeof (message),
166 "Process %d %s\n",
Greg Clayton63094e02010-06-23 01:19:29 +0000167 m_opaque_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000168 SBDebugger::StateAsCString (event_state));
169
170 if (message_len > 0)
171 ::fwrite (message, 1, message_len, out);
172 }
173}
174
175void
Jim Inghamc8332952010-08-26 21:32:51 +0000176SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000177{
Greg Clayton63094e02010-06-23 01:19:29 +0000178 if (m_opaque_sp != NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000179 {
180 const StateType event_state = SBProcess::GetStateFromEvent (event);
181 char message[1024];
182 ::snprintf (message,
183 sizeof (message),
184 "Process %d %s\n",
Greg Clayton63094e02010-06-23 01:19:29 +0000185 m_opaque_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000186 SBDebugger::StateAsCString (event_state));
187
188 result.AppendMessage (message);
189 }
190}
191
192bool
Jim Inghamc8332952010-08-26 21:32:51 +0000193SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner24943d22010-06-08 16:52:24 +0000194{
Greg Clayton63094e02010-06-23 01:19:29 +0000195 if (m_opaque_sp != NULL)
Jim Inghamc8332952010-08-26 21:32:51 +0000196 return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Chris Lattner24943d22010-06-08 16:52:24 +0000197 return false;
198}
199
200bool
Jim Inghamc8332952010-08-26 21:32:51 +0000201SBProcess::SetSelectedThreadByID (uint32_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000202{
Greg Clayton63094e02010-06-23 01:19:29 +0000203 if (m_opaque_sp != NULL)
Jim Inghamc8332952010-08-26 21:32:51 +0000204 return m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid);
Chris Lattner24943d22010-06-08 16:52:24 +0000205 return false;
206}
207
208SBThread
209SBProcess::GetThreadAtIndex (size_t index)
210{
211 SBThread thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000212 if (m_opaque_sp)
213 thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index));
Chris Lattner24943d22010-06-08 16:52:24 +0000214 return thread;
215}
216
217StateType
218SBProcess::GetState ()
219{
Greg Clayton63094e02010-06-23 01:19:29 +0000220 if (m_opaque_sp != NULL)
221 return m_opaque_sp->GetState();
Chris Lattner24943d22010-06-08 16:52:24 +0000222 else
223 return eStateInvalid;
224}
225
226
227int
228SBProcess::GetExitStatus ()
229{
Greg Clayton63094e02010-06-23 01:19:29 +0000230 if (m_opaque_sp != NULL)
231 return m_opaque_sp->GetExitStatus ();
Chris Lattner24943d22010-06-08 16:52:24 +0000232 else
233 return 0;
234}
235
236const char *
237SBProcess::GetExitDescription ()
238{
Greg Clayton63094e02010-06-23 01:19:29 +0000239 if (m_opaque_sp != NULL)
240 return m_opaque_sp->GetExitDescription ();
Chris Lattner24943d22010-06-08 16:52:24 +0000241 else
242 return NULL;
243}
244
245lldb::pid_t
246SBProcess::GetProcessID ()
247{
Greg Clayton63094e02010-06-23 01:19:29 +0000248 if (m_opaque_sp)
249 return m_opaque_sp->GetID();
Chris Lattner24943d22010-06-08 16:52:24 +0000250 else
251 return LLDB_INVALID_PROCESS_ID;
252}
253
254uint32_t
255SBProcess::GetAddressByteSize () const
256{
Greg Clayton63094e02010-06-23 01:19:29 +0000257 if (m_opaque_sp)
258 return m_opaque_sp->GetAddressByteSize();
Chris Lattner24943d22010-06-08 16:52:24 +0000259 else
260 return 0;
261}
262
Chris Lattner24943d22010-06-08 16:52:24 +0000263bool
264SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result)
265{
266 bool state_changed = false;
267
268 if (IsValid())
269 {
270 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000271 StateType state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000272
273 while (StateIsStoppedState (state))
274 {
Greg Clayton63094e02010-06-23 01:19:29 +0000275 state = m_opaque_sp->WaitForStateChangedEvents (NULL, event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000276 SBEvent event (event_sp);
Jim Inghamc8332952010-08-26 21:32:51 +0000277 AppendEventStateReport (event, result);
Chris Lattner24943d22010-06-08 16:52:24 +0000278 state_changed = true;
279 }
280 }
281 return state_changed;
282}
283
284SBError
285SBProcess::Continue ()
286{
287 SBError sb_error;
288 if (IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +0000289 sb_error.SetError(m_opaque_sp->Resume());
Chris Lattner24943d22010-06-08 16:52:24 +0000290 else
291 sb_error.SetErrorString ("SBProcess is invalid");
292
293 return sb_error;
294}
295
296
297SBError
298SBProcess::Destroy ()
299{
300 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000301 if (m_opaque_sp)
302 sb_error.SetError(m_opaque_sp->Destroy());
Chris Lattner24943d22010-06-08 16:52:24 +0000303 else
304 sb_error.SetErrorString ("SBProcess is invalid");
305
306 return sb_error;
307}
308
309
310SBError
311SBProcess::Stop ()
312{
313 SBError sb_error;
314 if (IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +0000315 sb_error.SetError (m_opaque_sp->Halt());
Chris Lattner24943d22010-06-08 16:52:24 +0000316 else
317 sb_error.SetErrorString ("SBProcess is invalid");
318 return sb_error;
319}
320
321SBError
322SBProcess::Kill ()
323{
324 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000325 if (m_opaque_sp)
326 sb_error.SetError (m_opaque_sp->Destroy());
Chris Lattner24943d22010-06-08 16:52:24 +0000327 else
328 sb_error.SetErrorString ("SBProcess is invalid");
329 return sb_error;
330}
331
332
333SBError
334SBProcess::AttachByName (const char *name, bool wait_for_launch)
335{
336 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000337 if (m_opaque_sp)
338 sb_error.SetError (m_opaque_sp->Attach (name, wait_for_launch));
Chris Lattner24943d22010-06-08 16:52:24 +0000339 else
340 sb_error.SetErrorString ("SBProcess is invalid");
341 return sb_error;
342}
343
344lldb::pid_t
Caroline Ticedfc91c32010-09-15 18:29:06 +0000345SBProcess::AttachByPID (lldb::pid_t attach_pid) // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t)
Chris Lattner24943d22010-06-08 16:52:24 +0000346{
347 Attach (attach_pid);
348 return GetProcessID();
349}
350
Caroline Ticedfc91c32010-09-15 18:29:06 +0000351
Chris Lattner24943d22010-06-08 16:52:24 +0000352SBError
353SBProcess::Attach (lldb::pid_t attach_pid)
354{
355 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000356 if (m_opaque_sp)
357 sb_error.SetError (m_opaque_sp->Attach (attach_pid));
Chris Lattner24943d22010-06-08 16:52:24 +0000358 else
359 sb_error.SetErrorString ("SBProcess is invalid");
360 return sb_error;
361}
362
363SBError
364SBProcess::Detach ()
365{
366 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000367 if (m_opaque_sp)
368 sb_error.SetError (m_opaque_sp->Detach());
Chris Lattner24943d22010-06-08 16:52:24 +0000369 else
370 sb_error.SetErrorString ("SBProcess is invalid");
371
372 return sb_error;
373}
374
375SBError
376SBProcess::Signal (int signal)
377{
378 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000379 if (m_opaque_sp)
380 sb_error.SetError (m_opaque_sp->Signal (signal));
Chris Lattner24943d22010-06-08 16:52:24 +0000381 else
382 sb_error.SetErrorString ("SBProcess is invalid");
383 return sb_error;
384}
385
Chris Lattner24943d22010-06-08 16:52:24 +0000386SBThread
387SBProcess::GetThreadByID (tid_t sb_thread_id)
388{
389 SBThread thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000390 if (m_opaque_sp)
391 thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id));
Chris Lattner24943d22010-06-08 16:52:24 +0000392 return thread;
393}
394
Chris Lattner24943d22010-06-08 16:52:24 +0000395StateType
396SBProcess::GetStateFromEvent (const SBEvent &event)
397{
Greg Clayton63094e02010-06-23 01:19:29 +0000398 return Process::ProcessEventData::GetStateFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000399}
400
Chris Lattner24943d22010-06-08 16:52:24 +0000401bool
402SBProcess::GetRestartedFromEvent (const SBEvent &event)
403{
Greg Clayton63094e02010-06-23 01:19:29 +0000404 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000405}
406
407SBProcess
408SBProcess::GetProcessFromEvent (const SBEvent &event)
409{
Greg Clayton63094e02010-06-23 01:19:29 +0000410 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000411 return process;
412}
413
414
415SBBroadcaster
416SBProcess::GetBroadcaster () const
417{
Greg Clayton63094e02010-06-23 01:19:29 +0000418 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Chris Lattner24943d22010-06-08 16:52:24 +0000419 return broadcaster;
420}
421
422lldb_private::Process *
423SBProcess::operator->() const
424{
Greg Clayton63094e02010-06-23 01:19:29 +0000425 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000426}
427
428size_t
429SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
430{
431 size_t bytes_read = 0;
432
433 if (IsValid())
434 {
435 Error error;
Greg Clayton63094e02010-06-23 01:19:29 +0000436 bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000437 sb_error.SetError (error);
438 }
439 else
440 {
441 sb_error.SetErrorString ("SBProcess is invalid");
442 }
443
444 return bytes_read;
445}
446
447size_t
448SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
449{
450 size_t bytes_written = 0;
451
452 if (IsValid())
453 {
454 Error error;
Greg Clayton63094e02010-06-23 01:19:29 +0000455 bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000456 sb_error.SetError (error);
457 }
458
459 return bytes_written;
460}
461
462// Mimic shared pointer...
463lldb_private::Process *
464SBProcess::get() const
465{
Greg Clayton63094e02010-06-23 01:19:29 +0000466 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000467}
468