blob: c9062bd0a2128aca8c89b1f4b7069d828ba1cc36 [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
Greg Clayton538eb822010-11-05 23:17:00 +000064const SBProcess&
65SBProcess::operator = (const SBProcess& rhs)
66{
67 if (this != &rhs)
68 m_opaque_sp = rhs.m_opaque_sp;
69 return *this;
70}
71
Chris Lattner24943d22010-06-08 16:52:24 +000072//----------------------------------------------------------------------
73// Destructor
74//----------------------------------------------------------------------
75SBProcess::~SBProcess()
76{
77}
78
79void
80SBProcess::SetProcess (const ProcessSP &process_sp)
81{
Greg Clayton63094e02010-06-23 01:19:29 +000082 m_opaque_sp = process_sp;
Chris Lattner24943d22010-06-08 16:52:24 +000083}
84
85void
86SBProcess::Clear ()
87{
Greg Clayton63094e02010-06-23 01:19:29 +000088 m_opaque_sp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +000089}
90
91
92bool
93SBProcess::IsValid() const
94{
Greg Clayton63094e02010-06-23 01:19:29 +000095 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000096}
97
James McIlree38093402011-03-04 00:31:13 +000098bool
99SBProcess::RemoteLaunch (char const **argv,
100 char const **envp,
101 const char *stdin_path,
102 const char *stdout_path,
103 const char *stderr_path,
104 const char *working_directory,
105 uint32_t launch_flags,
106 bool stop_at_entry,
107 lldb::SBError& error)
108{
109 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
110 if (log) {
111 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))...",
112 m_opaque_sp.get(),
113 argv,
114 envp,
115 stdin_path ? stdin_path : "NULL",
116 stdout_path ? stdout_path : "NULL",
117 stderr_path ? stderr_path : "NULL",
118 working_directory ? working_directory : "NULL",
119 launch_flags,
120 stop_at_entry,
121 error.get());
122 }
123
124 if (m_opaque_sp)
125 {
126 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
127 if (m_opaque_sp->GetState() == eStateConnected)
128 {
129 error.SetError (m_opaque_sp->Launch (argv, envp, launch_flags, stdin_path, stdout_path, stderr_path, working_directory));
130 }
131 else
132 {
133 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
134 }
135 }
136 else
137 {
138 error.SetErrorString ("unable to attach pid");
139 }
140
141 if (log) {
142 SBStream sstr;
143 error.GetDescription (sstr);
Johnny Chen42da4da2011-03-05 01:20:11 +0000144 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s", m_opaque_sp.get(), error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000145 }
146
147 return error.Success();
148}
149
150bool
151SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
152{
153 if (m_opaque_sp)
154 {
155 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
156 if (m_opaque_sp->GetState() == eStateConnected)
157 {
158 error.SetError (m_opaque_sp->Attach (pid));
159 }
160 else
161 {
162 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
163 }
164 }
165 else
166 {
167 error.SetErrorString ("unable to attach pid");
168 }
169
170 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
171 if (log) {
172 SBStream sstr;
173 error.GetDescription (sstr);
Johnny Chen42da4da2011-03-05 01:20:11 +0000174 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%d) => SBError (%p): %s", m_opaque_sp.get(), pid, error.get(), sstr.GetData());
James McIlree38093402011-03-04 00:31:13 +0000175 }
176
177 return error.Success();
178}
179
Chris Lattner24943d22010-06-08 16:52:24 +0000180
181uint32_t
182SBProcess::GetNumThreads ()
183{
Greg Claytone005f2c2010-11-06 01:53:30 +0000184 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000185
Caroline Tice7826c882010-10-26 03:11:13 +0000186 uint32_t num_threads = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000187 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000188 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000189 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Chris Lattner24943d22010-06-08 16:52:24 +0000190 const bool can_update = true;
Caroline Tice7826c882010-10-26 03:11:13 +0000191 num_threads = m_opaque_sp->GetThreadList().GetSize(can_update);
Chris Lattner24943d22010-06-08 16:52:24 +0000192 }
Caroline Tice7826c882010-10-26 03:11:13 +0000193
194 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000195 log->Printf ("SBProcess(%p)::GetNumThreads () => %d", m_opaque_sp.get(), num_threads);
Caroline Tice7826c882010-10-26 03:11:13 +0000196
197 return num_threads;
Chris Lattner24943d22010-06-08 16:52:24 +0000198}
199
200SBThread
Jim Inghamc8332952010-08-26 21:32:51 +0000201SBProcess::GetSelectedThread () const
Chris Lattner24943d22010-06-08 16:52:24 +0000202{
Greg Claytone005f2c2010-11-06 01:53:30 +0000203 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000204
Chris Lattner24943d22010-06-08 16:52:24 +0000205 SBThread sb_thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000206 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000207 {
208 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Jim Inghamc8332952010-08-26 21:32:51 +0000209 sb_thread.SetThread (m_opaque_sp->GetThreadList().GetSelectedThread());
Greg Claytonbdcda462010-12-20 20:49:23 +0000210 }
Caroline Tice7826c882010-10-26 03:11:13 +0000211
212 if (log)
213 {
Greg Claytona66ba462010-10-30 04:51:46 +0000214 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)", m_opaque_sp.get(), sb_thread.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000215 }
216
Chris Lattner24943d22010-06-08 16:52:24 +0000217 return sb_thread;
218}
219
220SBTarget
221SBProcess::GetTarget() const
222{
Greg Claytone005f2c2010-11-06 01:53:30 +0000223 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000224
Chris Lattner24943d22010-06-08 16:52:24 +0000225 SBTarget sb_target;
Greg Clayton63094e02010-06-23 01:19:29 +0000226 if (m_opaque_sp)
227 sb_target = m_opaque_sp->GetTarget().GetSP();
Caroline Tice7826c882010-10-26 03:11:13 +0000228
229 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000230 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), sb_target.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000231
Chris Lattner24943d22010-06-08 16:52:24 +0000232 return sb_target;
233}
234
235
236size_t
237SBProcess::PutSTDIN (const char *src, size_t src_len)
238{
Greg Claytone005f2c2010-11-06 01:53:30 +0000239 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000240
Caroline Tice7826c882010-10-26 03:11:13 +0000241 size_t ret_val = 0;
Greg Claytonbdcda462010-12-20 20:49:23 +0000242 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000243 {
244 Error error;
Caroline Tice7826c882010-10-26 03:11:13 +0000245 ret_val = m_opaque_sp->PutSTDIN (src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000246 }
Caroline Tice7826c882010-10-26 03:11:13 +0000247
248 if (log)
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000249 log->Printf ("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%d) => %lu",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000250 m_opaque_sp.get(),
251 src,
252 (uint32_t) src_len,
253 ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000254
255 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000256}
257
258size_t
259SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
260{
Greg Clayton49ce6822010-10-31 03:01:06 +0000261 size_t bytes_read = 0;
Greg Claytonbdcda462010-12-20 20:49:23 +0000262 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000263 {
264 Error error;
Greg Clayton49ce6822010-10-31 03:01:06 +0000265 bytes_read = m_opaque_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000266 }
Caroline Tice7826c882010-10-26 03:11:13 +0000267
Greg Claytone005f2c2010-11-06 01:53:30 +0000268 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000269 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000270 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%zu) => %zu",
271 m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000272
Greg Clayton49ce6822010-10-31 03:01:06 +0000273 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000274}
275
276size_t
277SBProcess::GetSTDERR (char *dst, size_t dst_len) const
278{
Greg Clayton49ce6822010-10-31 03:01:06 +0000279 size_t bytes_read = 0;
Greg Claytonbdcda462010-12-20 20:49:23 +0000280 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000281 {
282 Error error;
Greg Clayton49ce6822010-10-31 03:01:06 +0000283 bytes_read = m_opaque_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000284 }
Caroline Tice7826c882010-10-26 03:11:13 +0000285
Greg Claytone005f2c2010-11-06 01:53:30 +0000286 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000287 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000288 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%zu) => %zu",
289 m_opaque_sp.get(), (int) bytes_read, dst, dst_len, bytes_read);
Caroline Tice7826c882010-10-26 03:11:13 +0000290
Greg Clayton49ce6822010-10-31 03:01:06 +0000291 return bytes_read;
Chris Lattner24943d22010-06-08 16:52:24 +0000292}
293
294void
Jim Inghamc8332952010-08-26 21:32:51 +0000295SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner24943d22010-06-08 16:52:24 +0000296{
297 if (out == NULL)
298 return;
299
Greg Claytonbdcda462010-12-20 20:49:23 +0000300 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000301 {
302 const StateType event_state = SBProcess::GetStateFromEvent (event);
303 char message[1024];
304 int message_len = ::snprintf (message,
305 sizeof (message),
306 "Process %d %s\n",
Greg Clayton63094e02010-06-23 01:19:29 +0000307 m_opaque_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000308 SBDebugger::StateAsCString (event_state));
309
310 if (message_len > 0)
311 ::fwrite (message, 1, message_len, out);
312 }
313}
314
315void
Jim Inghamc8332952010-08-26 21:32:51 +0000316SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner24943d22010-06-08 16:52:24 +0000317{
Greg Claytonbdcda462010-12-20 20:49:23 +0000318 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000319 {
320 const StateType event_state = SBProcess::GetStateFromEvent (event);
321 char message[1024];
322 ::snprintf (message,
323 sizeof (message),
324 "Process %d %s\n",
Greg Clayton63094e02010-06-23 01:19:29 +0000325 m_opaque_sp->GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +0000326 SBDebugger::StateAsCString (event_state));
327
328 result.AppendMessage (message);
329 }
330}
331
332bool
Jim Inghamc8332952010-08-26 21:32:51 +0000333SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner24943d22010-06-08 16:52:24 +0000334{
Greg Claytonbdcda462010-12-20 20:49:23 +0000335 if (m_opaque_sp)
336 {
337 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Jim Inghamc8332952010-08-26 21:32:51 +0000338 return m_opaque_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonbdcda462010-12-20 20:49:23 +0000339 }
Chris Lattner24943d22010-06-08 16:52:24 +0000340 return false;
341}
342
343bool
Jim Inghamc8332952010-08-26 21:32:51 +0000344SBProcess::SetSelectedThreadByID (uint32_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000345{
Greg Claytone005f2c2010-11-06 01:53:30 +0000346 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000347
Caroline Tice7826c882010-10-26 03:11:13 +0000348 bool ret_val = false;
Greg Claytonbdcda462010-12-20 20:49:23 +0000349 if (m_opaque_sp)
350 {
351 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Caroline Tice7826c882010-10-26 03:11:13 +0000352 ret_val = m_opaque_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonbdcda462010-12-20 20:49:23 +0000353 }
Caroline Tice7826c882010-10-26 03:11:13 +0000354
355 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000356 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4x) => %s",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000357 m_opaque_sp.get(), tid, (ret_val ? "true" : "false"));
Caroline Tice7826c882010-10-26 03:11:13 +0000358
359 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000360}
361
362SBThread
363SBProcess::GetThreadAtIndex (size_t index)
364{
Greg Claytone005f2c2010-11-06 01:53:30 +0000365 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000366
Chris Lattner24943d22010-06-08 16:52:24 +0000367 SBThread thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000368 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000369 {
370 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000371 thread.SetThread (m_opaque_sp->GetThreadList().GetThreadAtIndex(index));
Greg Claytonbdcda462010-12-20 20:49:23 +0000372 }
Caroline Tice7826c882010-10-26 03:11:13 +0000373
374 if (log)
375 {
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000376 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Greg Claytona66ba462010-10-30 04:51:46 +0000377 m_opaque_sp.get(), (uint32_t) index, thread.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000378 }
379
Chris Lattner24943d22010-06-08 16:52:24 +0000380 return thread;
381}
382
383StateType
384SBProcess::GetState ()
385{
Caroline Tice7826c882010-10-26 03:11:13 +0000386
Caroline Tice7826c882010-10-26 03:11:13 +0000387 StateType ret_val = eStateInvalid;
Greg Claytonbdcda462010-12-20 20:49:23 +0000388 if (m_opaque_sp)
389 {
390 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Caroline Tice7826c882010-10-26 03:11:13 +0000391 ret_val = m_opaque_sp->GetState();
Greg Claytonbdcda462010-12-20 20:49:23 +0000392 }
Caroline Tice7826c882010-10-26 03:11:13 +0000393
Greg Claytone005f2c2010-11-06 01:53:30 +0000394 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000395 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000396 log->Printf ("SBProcess(%p)::GetState () => %s",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000397 m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000398 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000399
400 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000401}
402
403
404int
405SBProcess::GetExitStatus ()
406{
Greg Claytona66ba462010-10-30 04:51:46 +0000407 int exit_status = 0;
408 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000409 {
410 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Claytona66ba462010-10-30 04:51:46 +0000411 exit_status = m_opaque_sp->GetExitStatus ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000412 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000413 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000414 if (log)
415 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
416 m_opaque_sp.get(), exit_status, exit_status);
417
418 return exit_status;
Chris Lattner24943d22010-06-08 16:52:24 +0000419}
420
421const char *
422SBProcess::GetExitDescription ()
423{
Greg Claytona66ba462010-10-30 04:51:46 +0000424 const char *exit_desc = NULL;
Greg Claytonbdcda462010-12-20 20:49:23 +0000425 if (m_opaque_sp)
426 {
427 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Claytona66ba462010-10-30 04:51:46 +0000428 exit_desc = m_opaque_sp->GetExitDescription ();
Greg Claytonbdcda462010-12-20 20:49:23 +0000429 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000430 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000431 if (log)
432 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
433 m_opaque_sp.get(), exit_desc);
434 return exit_desc;
Chris Lattner24943d22010-06-08 16:52:24 +0000435}
436
437lldb::pid_t
438SBProcess::GetProcessID ()
439{
Caroline Tice7826c882010-10-26 03:11:13 +0000440 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Clayton63094e02010-06-23 01:19:29 +0000441 if (m_opaque_sp)
Caroline Tice7826c882010-10-26 03:11:13 +0000442 ret_val = m_opaque_sp->GetID();
443
Greg Claytone005f2c2010-11-06 01:53:30 +0000444 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000445 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000446 log->Printf ("SBProcess(%p)::GetProcessID () => %d", m_opaque_sp.get(), ret_val);
Caroline Tice7826c882010-10-26 03:11:13 +0000447
448 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000449}
450
Johnny Chen60a544f2011-03-01 22:56:31 +0000451ByteOrder
452SBProcess::GetByteOrder () const
453{
454 ByteOrder byteOrder = eByteOrderInvalid;
455 if (m_opaque_sp)
456 byteOrder = m_opaque_sp->GetTarget().GetArchitecture().GetByteOrder();
457
458 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
459 if (log)
460 log->Printf ("SBProcess(%p)::GetByteOrder () => %d", m_opaque_sp.get(), byteOrder);
461
462 return byteOrder;
463}
464
Chris Lattner24943d22010-06-08 16:52:24 +0000465uint32_t
466SBProcess::GetAddressByteSize () const
467{
Caroline Tice7826c882010-10-26 03:11:13 +0000468 uint32_t size = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000469 if (m_opaque_sp)
Greg Clayton395fc332011-02-15 21:59:32 +0000470 size = m_opaque_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Tice7826c882010-10-26 03:11:13 +0000471
Greg Claytone005f2c2010-11-06 01:53:30 +0000472 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000473 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000474 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d", m_opaque_sp.get(), size);
Caroline Tice7826c882010-10-26 03:11:13 +0000475
476 return size;
Chris Lattner24943d22010-06-08 16:52:24 +0000477}
478
Chris Lattner24943d22010-06-08 16:52:24 +0000479SBError
480SBProcess::Continue ()
481{
Greg Claytone005f2c2010-11-06 01:53:30 +0000482 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000483 if (log)
484 log->Printf ("SBProcess(%p)::Continue ()...", m_opaque_sp.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000485
Chris Lattner24943d22010-06-08 16:52:24 +0000486 SBError sb_error;
Greg Claytonde1dd812011-06-24 03:21:43 +0000487 if (m_opaque_sp)
Greg Clayton1a3083a2010-10-06 03:53:16 +0000488 {
Greg Claytonde1dd812011-06-24 03:21:43 +0000489 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
490
Greg Clayton1a3083a2010-10-06 03:53:16 +0000491 Error error (m_opaque_sp->Resume());
492 if (error.Success())
493 {
494 if (m_opaque_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Claytona66ba462010-10-30 04:51:46 +0000495 {
496 if (log)
497 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...", m_opaque_sp.get());
Greg Clayton1a3083a2010-10-06 03:53:16 +0000498 m_opaque_sp->WaitForProcessToStop (NULL);
Greg Claytona66ba462010-10-30 04:51:46 +0000499 }
Greg Clayton1a3083a2010-10-06 03:53:16 +0000500 }
501 sb_error.SetError(error);
502 }
Chris Lattner24943d22010-06-08 16:52:24 +0000503 else
504 sb_error.SetErrorString ("SBProcess is invalid");
505
Caroline Tice7826c882010-10-26 03:11:13 +0000506 if (log)
507 {
508 SBStream sstr;
509 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000510 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s", m_opaque_sp.get(), sb_error.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000511 }
512
Chris Lattner24943d22010-06-08 16:52:24 +0000513 return sb_error;
514}
515
516
517SBError
518SBProcess::Destroy ()
519{
520 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000521 if (m_opaque_sp)
Greg Clayton72e1c782011-01-22 23:43:18 +0000522 {
523 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000524 sb_error.SetError(m_opaque_sp->Destroy());
Greg Clayton72e1c782011-01-22 23:43:18 +0000525 }
Chris Lattner24943d22010-06-08 16:52:24 +0000526 else
527 sb_error.SetErrorString ("SBProcess is invalid");
528
Greg Claytone005f2c2010-11-06 01:53:30 +0000529 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000530 if (log)
531 {
532 SBStream sstr;
533 sb_error.GetDescription (sstr);
Greg Clayton72e1c782011-01-22 23:43:18 +0000534 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
535 m_opaque_sp.get(),
536 sb_error.get(),
537 sstr.GetData());
Greg Claytona66ba462010-10-30 04:51:46 +0000538 }
539
Chris Lattner24943d22010-06-08 16:52:24 +0000540 return sb_error;
541}
542
543
544SBError
545SBProcess::Stop ()
546{
547 SBError sb_error;
Greg Claytonde1dd812011-06-24 03:21:43 +0000548 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000549 {
550 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000551 sb_error.SetError (m_opaque_sp->Halt());
Greg Claytonbdcda462010-12-20 20:49:23 +0000552 }
Chris Lattner24943d22010-06-08 16:52:24 +0000553 else
554 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000555
Greg Claytone005f2c2010-11-06 01:53:30 +0000556 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000557 if (log)
558 {
559 SBStream sstr;
560 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000561 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
562 m_opaque_sp.get(),
563 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000564 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000565 }
566
Chris Lattner24943d22010-06-08 16:52:24 +0000567 return sb_error;
568}
569
570SBError
571SBProcess::Kill ()
572{
573 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000574 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000575 {
576 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000577 sb_error.SetError (m_opaque_sp->Destroy());
Greg Claytonbdcda462010-12-20 20:49:23 +0000578 }
Chris Lattner24943d22010-06-08 16:52:24 +0000579 else
580 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Tice7826c882010-10-26 03:11:13 +0000581
Greg Claytone005f2c2010-11-06 01:53:30 +0000582 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000583 if (log)
584 {
585 SBStream sstr;
586 sb_error.GetDescription (sstr);
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000587 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
588 m_opaque_sp.get(),
589 sb_error.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000590 sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000591 }
592
Chris Lattner24943d22010-06-08 16:52:24 +0000593 return sb_error;
594}
595
Chris Lattner24943d22010-06-08 16:52:24 +0000596SBError
597SBProcess::Detach ()
598{
599 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000600 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000601 {
602 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000603 sb_error.SetError (m_opaque_sp->Detach());
Greg Claytonbdcda462010-12-20 20:49:23 +0000604 }
Chris Lattner24943d22010-06-08 16:52:24 +0000605 else
606 sb_error.SetErrorString ("SBProcess is invalid");
607
608 return sb_error;
609}
610
611SBError
Greg Claytona66ba462010-10-30 04:51:46 +0000612SBProcess::Signal (int signo)
Chris Lattner24943d22010-06-08 16:52:24 +0000613{
614 SBError sb_error;
Greg Clayton63094e02010-06-23 01:19:29 +0000615 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000616 {
617 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Claytona66ba462010-10-30 04:51:46 +0000618 sb_error.SetError (m_opaque_sp->Signal (signo));
Greg Claytonbdcda462010-12-20 20:49:23 +0000619 }
Chris Lattner24943d22010-06-08 16:52:24 +0000620 else
621 sb_error.SetErrorString ("SBProcess is invalid");
Greg Claytone005f2c2010-11-06 01:53:30 +0000622 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000623 if (log)
624 {
625 SBStream sstr;
626 sb_error.GetDescription (sstr);
627 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
628 m_opaque_sp.get(),
629 signo,
630 sb_error.get(),
631 sstr.GetData());
632 }
Chris Lattner24943d22010-06-08 16:52:24 +0000633 return sb_error;
634}
635
Chris Lattner24943d22010-06-08 16:52:24 +0000636SBThread
Greg Claytona66ba462010-10-30 04:51:46 +0000637SBProcess::GetThreadByID (tid_t tid)
Chris Lattner24943d22010-06-08 16:52:24 +0000638{
Greg Claytona66ba462010-10-30 04:51:46 +0000639 SBThread sb_thread;
Greg Clayton63094e02010-06-23 01:19:29 +0000640 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000641 {
642 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Claytona66ba462010-10-30 04:51:46 +0000643 sb_thread.SetThread (m_opaque_sp->GetThreadList().FindThreadByID ((tid_t) tid));
Greg Claytonbdcda462010-12-20 20:49:23 +0000644 }
Greg Claytona66ba462010-10-30 04:51:46 +0000645
Greg Claytone005f2c2010-11-06 01:53:30 +0000646 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000647 if (log)
648 {
649 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4x) => SBThread (%p)",
650 m_opaque_sp.get(),
651 tid,
652 sb_thread.get());
653 }
654
655 return sb_thread;
Chris Lattner24943d22010-06-08 16:52:24 +0000656}
657
Chris Lattner24943d22010-06-08 16:52:24 +0000658StateType
659SBProcess::GetStateFromEvent (const SBEvent &event)
660{
Greg Claytone005f2c2010-11-06 01:53:30 +0000661 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000662
Caroline Tice7826c882010-10-26 03:11:13 +0000663 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
664
665 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000666 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s", event.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000667 lldb_private::StateAsCString (ret_val));
Caroline Tice7826c882010-10-26 03:11:13 +0000668
669 return ret_val;
Chris Lattner24943d22010-06-08 16:52:24 +0000670}
671
Chris Lattner24943d22010-06-08 16:52:24 +0000672bool
673SBProcess::GetRestartedFromEvent (const SBEvent &event)
674{
Greg Clayton63094e02010-06-23 01:19:29 +0000675 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000676}
677
678SBProcess
679SBProcess::GetProcessFromEvent (const SBEvent &event)
680{
Greg Clayton63094e02010-06-23 01:19:29 +0000681 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000682 return process;
683}
684
685
686SBBroadcaster
687SBProcess::GetBroadcaster () const
688{
Greg Claytone005f2c2010-11-06 01:53:30 +0000689 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000690
Greg Clayton63094e02010-06-23 01:19:29 +0000691 SBBroadcaster broadcaster(m_opaque_sp.get(), false);
Caroline Tice7826c882010-10-26 03:11:13 +0000692
693 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000694 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)", m_opaque_sp.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000695 broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000696
Chris Lattner24943d22010-06-08 16:52:24 +0000697 return broadcaster;
698}
699
700lldb_private::Process *
701SBProcess::operator->() const
702{
Greg Clayton63094e02010-06-23 01:19:29 +0000703 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000704}
705
706size_t
707SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
708{
Greg Claytone005f2c2010-11-06 01:53:30 +0000709 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000710
Chris Lattner24943d22010-06-08 16:52:24 +0000711 size_t bytes_read = 0;
712
Greg Claytona66ba462010-10-30 04:51:46 +0000713 if (log)
714 {
715 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p))...",
716 m_opaque_sp.get(),
717 addr,
718 dst,
719 (uint32_t) dst_len,
720 sb_error.get());
721 }
722
Greg Claytonbdcda462010-12-20 20:49:23 +0000723 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000724 {
725 Error error;
Greg Claytonbdcda462010-12-20 20:49:23 +0000726 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000727 bytes_read = m_opaque_sp->ReadMemory (addr, dst, dst_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000728 sb_error.SetError (error);
729 }
730 else
731 {
732 sb_error.SetErrorString ("SBProcess is invalid");
733 }
734
Caroline Tice7826c882010-10-26 03:11:13 +0000735 if (log)
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000736 {
737 SBStream sstr;
738 sb_error.GetDescription (sstr);
Greg Claytona66ba462010-10-30 04:51:46 +0000739 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%llx, dst=%p, dst_len=%zu, SBError (%p): %s) => %d",
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000740 m_opaque_sp.get(),
741 addr,
742 dst,
743 (uint32_t) dst_len,
744 sb_error.get(),
745 sstr.GetData(),
746 (uint32_t) bytes_read);
747 }
Caroline Tice7826c882010-10-26 03:11:13 +0000748
Chris Lattner24943d22010-06-08 16:52:24 +0000749 return bytes_read;
750}
751
752size_t
753SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
754{
755 size_t bytes_written = 0;
756
Greg Claytone005f2c2010-11-06 01:53:30 +0000757 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000758 if (log)
759 {
760 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p))...",
761 m_opaque_sp.get(),
762 addr,
763 src,
764 (uint32_t) src_len,
765 sb_error.get());
766 }
767
Greg Claytonbdcda462010-12-20 20:49:23 +0000768 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000769 {
770 Error error;
Greg Claytonbdcda462010-12-20 20:49:23 +0000771 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000772 bytes_written = m_opaque_sp->WriteMemory (addr, src, src_len, error);
Chris Lattner24943d22010-06-08 16:52:24 +0000773 sb_error.SetError (error);
774 }
775
Greg Claytona66ba462010-10-30 04:51:46 +0000776 if (log)
777 {
778 SBStream sstr;
779 sb_error.GetDescription (sstr);
780 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%llx, src=%p, dst_len=%zu, SBError (%p): %s) => %d",
781 m_opaque_sp.get(),
782 addr,
783 src,
784 (uint32_t) src_len,
785 sb_error.get(),
786 sstr.GetData(),
787 (uint32_t) bytes_written);
788 }
789
Chris Lattner24943d22010-06-08 16:52:24 +0000790 return bytes_written;
791}
792
793// Mimic shared pointer...
794lldb_private::Process *
795SBProcess::get() const
796{
Greg Clayton63094e02010-06-23 01:19:29 +0000797 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000798}
799
Caroline Tice98f930f2010-09-20 05:20:02 +0000800bool
801SBProcess::GetDescription (SBStream &description)
802{
803 if (m_opaque_sp)
804 {
805 char path[PATH_MAX];
806 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Clayton5beb99d2011-08-11 02:48:45 +0000807 Module *exe_module = m_opaque_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton5c4c7462010-10-06 03:09:58 +0000808 const char *exe_name = NULL;
809 if (exe_module)
810 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
811
Greg Claytond8c62532010-10-07 04:19:01 +0000812 description.Printf ("SBProcess: pid = %d, state = %s, threads = %d%s%s",
Greg Clayton5c4c7462010-10-06 03:09:58 +0000813 m_opaque_sp->GetID(),
Caroline Tice7826c882010-10-26 03:11:13 +0000814 lldb_private::StateAsCString (GetState()),
Greg Clayton5c4c7462010-10-06 03:09:58 +0000815 GetNumThreads(),
Greg Claytond8c62532010-10-07 04:19:01 +0000816 exe_name ? ", executable = " : "",
Greg Clayton5c4c7462010-10-06 03:09:58 +0000817 exe_name ? exe_name : "");
Caroline Tice98f930f2010-09-20 05:20:02 +0000818 }
819 else
820 description.Printf ("No value");
821
822 return true;
823}
Greg Clayton0baa3942010-11-04 01:54:29 +0000824
825uint32_t
826SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
827{
828 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000829 {
830 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton0e0fd1c2010-12-05 20:38:01 +0000831 return m_opaque_sp->LoadImage (*sb_image_spec, sb_error.ref());
Greg Claytonbdcda462010-12-20 20:49:23 +0000832 }
Greg Clayton0baa3942010-11-04 01:54:29 +0000833 return LLDB_INVALID_IMAGE_TOKEN;
834}
835
836lldb::SBError
837SBProcess::UnloadImage (uint32_t image_token)
838{
839 lldb::SBError sb_error;
840 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000841 {
842 Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
Greg Clayton0baa3942010-11-04 01:54:29 +0000843 sb_error.SetError (m_opaque_sp->UnloadImage (image_token));
Greg Claytonbdcda462010-12-20 20:49:23 +0000844 }
Greg Clayton0baa3942010-11-04 01:54:29 +0000845 else
846 sb_error.SetErrorString("invalid process");
847 return sb_error;
848}
849
850