blob: 5231b4bc1add41ebd4969c3a4f0fd9ab46055593 [file] [log] [blame]
Chris Lattner30fdc8d2010-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
Daniel Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Eli Friedman4c5de692010-06-09 07:44:37 +000012#include "lldb/API/SBProcess.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013
Virgile Bellobdae3782013-08-28 12:14:27 +000014// C Includes
15#include <inttypes.h>
16
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017#include "lldb/lldb-defines.h"
18#include "lldb/lldb-types.h"
19
Jim Ingham40af72e2010-06-15 19:49:27 +000020#include "lldb/Interpreter/Args.h"
Greg Clayton5d5028b2010-10-06 03:53:16 +000021#include "lldb/Core/Debugger.h"
Caroline Ticeceb6b132010-10-26 03:11:13 +000022#include "lldb/Core/Log.h"
Greg Clayton1f746072012-08-29 21:13:06 +000023#include "lldb/Core/Module.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024#include "lldb/Core/State.h"
25#include "lldb/Core/Stream.h"
26#include "lldb/Core/StreamFile.h"
27#include "lldb/Target/Process.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028#include "lldb/Target/RegisterContext.h"
Jason Molenda8c713372013-11-05 11:00:35 +000029#include "lldb/Target/SystemRuntime.h"
Greg Clayton66111032010-06-23 01:19:29 +000030#include "lldb/Target/Target.h"
31#include "lldb/Target/Thread.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032
33// Project includes
34
Eli Friedman4c5de692010-06-09 07:44:37 +000035#include "lldb/API/SBBroadcaster.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000036#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton0e615682012-02-24 05:03:03 +000037#include "lldb/API/SBDebugger.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000038#include "lldb/API/SBEvent.h"
Greg Clayton0e615682012-02-24 05:03:03 +000039#include "lldb/API/SBFileSpec.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000040#include "lldb/API/SBThread.h"
Kuba Breckaa51ea382014-09-06 01:33:13 +000041#include "lldb/API/SBThreadCollection.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000042#include "lldb/API/SBStream.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000043#include "lldb/API/SBStringList.h"
Todd Fiala802dc4022014-06-23 19:30:49 +000044#include "lldb/API/SBUnixSignals.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045
46using namespace lldb;
47using namespace lldb_private;
48
49
Chris Lattner30fdc8d2010-06-08 16:52:24 +000050SBProcess::SBProcess () :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000051 m_opaque_wp()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000052{
53}
54
55
56//----------------------------------------------------------------------
57// SBProcess constructor
58//----------------------------------------------------------------------
59
60SBProcess::SBProcess (const SBProcess& rhs) :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000061 m_opaque_wp (rhs.m_opaque_wp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000062{
63}
64
65
66SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000067 m_opaque_wp (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000068{
69}
70
Greg Claytonefabb122010-11-05 23:17:00 +000071const SBProcess&
72SBProcess::operator = (const SBProcess& rhs)
73{
74 if (this != &rhs)
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000075 m_opaque_wp = rhs.m_opaque_wp;
Greg Claytonefabb122010-11-05 23:17:00 +000076 return *this;
77}
78
Chris Lattner30fdc8d2010-06-08 16:52:24 +000079//----------------------------------------------------------------------
80// Destructor
81//----------------------------------------------------------------------
82SBProcess::~SBProcess()
83{
84}
85
Jim Ingham4bddaeb2012-02-16 06:50:00 +000086const char *
87SBProcess::GetBroadcasterClassName ()
88{
89 return Process::GetStaticBroadcasterClass().AsCString();
90}
91
Jim Inghamd7b30ef2012-10-26 19:18:04 +000092const char *
93SBProcess::GetPluginName ()
94{
95 ProcessSP process_sp(GetSP());
96 if (process_sp)
97 {
Greg Clayton57abc5d2013-05-10 21:47:16 +000098 return process_sp->GetPluginName().GetCString();
Jim Inghamd7b30ef2012-10-26 19:18:04 +000099 }
100 return "<Unknown>";
101}
102
103const char *
104SBProcess::GetShortPluginName ()
105{
106 ProcessSP process_sp(GetSP());
107 if (process_sp)
108 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000109 return process_sp->GetPluginName().GetCString();
Jim Inghamd7b30ef2012-10-26 19:18:04 +0000110 }
111 return "<Unknown>";
112}
113
114
Greg Claytonb9556ac2012-01-30 07:41:31 +0000115lldb::ProcessSP
116SBProcess::GetSP() const
117{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000118 return m_opaque_wp.lock();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000119}
120
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000121void
Greg Claytonb9556ac2012-01-30 07:41:31 +0000122SBProcess::SetSP (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000123{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000124 m_opaque_wp = process_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000125}
126
127void
128SBProcess::Clear ()
129{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000130 m_opaque_wp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000131}
132
133
134bool
135SBProcess::IsValid() const
136{
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000137 ProcessSP process_sp(m_opaque_wp.lock());
138 return ((bool) process_sp && process_sp->IsValid());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000139}
140
James McIlree9631aae2011-03-04 00:31:13 +0000141bool
142SBProcess::RemoteLaunch (char const **argv,
143 char const **envp,
144 const char *stdin_path,
145 const char *stdout_path,
146 const char *stderr_path,
147 const char *working_directory,
148 uint32_t launch_flags,
149 bool stop_at_entry,
150 lldb::SBError& error)
151{
Greg Clayton5160ce52013-03-27 23:08:40 +0000152 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000153 if (log)
James McIlree9631aae2011-03-04 00:31:13 +0000154 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))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000155 static_cast<void*>(m_opaque_wp.lock().get()),
156 static_cast<void*>(argv), static_cast<void*>(envp),
157 stdin_path ? stdin_path : "NULL",
158 stdout_path ? stdout_path : "NULL",
159 stderr_path ? stderr_path : "NULL",
James McIlree9631aae2011-03-04 00:31:13 +0000160 working_directory ? working_directory : "NULL",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000161 launch_flags, stop_at_entry,
162 static_cast<void*>(error.get()));
163
Greg Claytonacdbe812012-01-30 09:04:36 +0000164 ProcessSP process_sp(GetSP());
165 if (process_sp)
James McIlree9631aae2011-03-04 00:31:13 +0000166 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000167 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
168 if (process_sp->GetState() == eStateConnected)
James McIlree9631aae2011-03-04 00:31:13 +0000169 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000170 if (stop_at_entry)
171 launch_flags |= eLaunchFlagStopAtEntry;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000172 ProcessLaunchInfo launch_info (stdin_path,
Greg Claytonc9858e42012-04-06 02:17:47 +0000173 stdout_path,
174 stderr_path,
175 working_directory,
176 launch_flags);
177 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
178 if (exe_module)
Greg Clayton14715c62013-06-29 00:10:32 +0000179 launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
Greg Claytonc9858e42012-04-06 02:17:47 +0000180 if (argv)
181 launch_info.GetArguments().AppendArguments (argv);
182 if (envp)
183 launch_info.GetEnvironmentEntries ().SetArguments (envp);
184 error.SetError (process_sp->Launch (launch_info));
James McIlree9631aae2011-03-04 00:31:13 +0000185 }
186 else
187 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000188 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
James McIlree9631aae2011-03-04 00:31:13 +0000189 }
190 }
191 else
192 {
193 error.SetErrorString ("unable to attach pid");
194 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000195
James McIlree9631aae2011-03-04 00:31:13 +0000196 if (log) {
197 SBStream sstr;
198 error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000199 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s",
200 static_cast<void*>(process_sp.get()),
201 static_cast<void*>(error.get()), sstr.GetData());
James McIlree9631aae2011-03-04 00:31:13 +0000202 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000203
James McIlree9631aae2011-03-04 00:31:13 +0000204 return error.Success();
205}
206
207bool
208SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
209{
Greg Claytonacdbe812012-01-30 09:04:36 +0000210 ProcessSP process_sp(GetSP());
211 if (process_sp)
James McIlree9631aae2011-03-04 00:31:13 +0000212 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000213 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
214 if (process_sp->GetState() == eStateConnected)
James McIlree9631aae2011-03-04 00:31:13 +0000215 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000216 ProcessAttachInfo attach_info;
217 attach_info.SetProcessID (pid);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000218 error.SetError (process_sp->Attach (attach_info));
James McIlree9631aae2011-03-04 00:31:13 +0000219 }
220 else
221 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000222 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
James McIlree9631aae2011-03-04 00:31:13 +0000223 }
224 }
225 else
226 {
227 error.SetErrorString ("unable to attach pid");
228 }
229
Greg Clayton5160ce52013-03-27 23:08:40 +0000230 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
James McIlree9631aae2011-03-04 00:31:13 +0000231 if (log) {
232 SBStream sstr;
233 error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000234 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s",
235 static_cast<void*>(process_sp.get()), pid,
236 static_cast<void*>(error.get()), sstr.GetData());
James McIlree9631aae2011-03-04 00:31:13 +0000237 }
238
239 return error.Success();
240}
241
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000242
243uint32_t
244SBProcess::GetNumThreads ()
245{
Greg Clayton5160ce52013-03-27 23:08:40 +0000246 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000247
Caroline Ticeceb6b132010-10-26 03:11:13 +0000248 uint32_t num_threads = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000249 ProcessSP process_sp(GetSP());
250 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000251 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000252 Process::StopLocker stop_locker;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000253
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000254 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Claytonacdbe812012-01-30 09:04:36 +0000255 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000256 num_threads = process_sp->GetThreadList().GetSize(can_update);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000257 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000258
259 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000260 log->Printf ("SBProcess(%p)::GetNumThreads () => %d",
261 static_cast<void*>(process_sp.get()), num_threads);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000262
263 return num_threads;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000264}
265
266SBThread
Jim Ingham2976d002010-08-26 21:32:51 +0000267SBProcess::GetSelectedThread () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000268{
Greg Clayton5160ce52013-03-27 23:08:40 +0000269 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000270
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000271 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000272 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000273 ProcessSP process_sp(GetSP());
274 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000275 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000276 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
277 thread_sp = process_sp->GetThreadList().GetSelectedThread();
Greg Clayton17a6ad02012-01-30 02:53:15 +0000278 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000279 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000280
281 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000282 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)",
283 static_cast<void*>(process_sp.get()),
284 static_cast<void*>(thread_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000285
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000286 return sb_thread;
287}
288
Greg Claytona4d87472013-01-18 23:41:08 +0000289SBThread
290SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context)
291{
Greg Clayton5160ce52013-03-27 23:08:40 +0000292 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000293
Greg Claytona4d87472013-01-18 23:41:08 +0000294 SBThread sb_thread;
295 ThreadSP thread_sp;
296 ProcessSP process_sp(GetSP());
297 if (process_sp)
298 {
299 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
300 thread_sp = process_sp->CreateOSPluginThread(tid, context);
301 sb_thread.SetThread (thread_sp);
302 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000303
Greg Claytona4d87472013-01-18 23:41:08 +0000304 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000305 log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)",
306 static_cast<void*>(process_sp.get()), tid, context,
307 static_cast<void*>(thread_sp.get()));
308
Greg Claytona4d87472013-01-18 23:41:08 +0000309 return sb_thread;
310}
311
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000312SBTarget
313SBProcess::GetTarget() const
314{
Greg Clayton5160ce52013-03-27 23:08:40 +0000315 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000316
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000317 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000318 TargetSP target_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000319 ProcessSP process_sp(GetSP());
320 if (process_sp)
Greg Claytonb9556ac2012-01-30 07:41:31 +0000321 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000322 target_sp = process_sp->GetTarget().shared_from_this();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000323 sb_target.SetSP (target_sp);
324 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000325
Caroline Ticeceb6b132010-10-26 03:11:13 +0000326 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000327 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)",
328 static_cast<void*>(process_sp.get()),
329 static_cast<void*>(target_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000330
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000331 return sb_target;
332}
333
334
335size_t
336SBProcess::PutSTDIN (const char *src, size_t src_len)
337{
Greg Clayton5160ce52013-03-27 23:08:40 +0000338 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000339
Caroline Ticeceb6b132010-10-26 03:11:13 +0000340 size_t ret_val = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000341 ProcessSP process_sp(GetSP());
342 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000343 {
344 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000345 ret_val = process_sp->PutSTDIN (src, src_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000346 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000347
Caroline Ticeceb6b132010-10-26 03:11:13 +0000348 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000349 log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 ") => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000350 static_cast<void*>(process_sp.get()), src,
351 static_cast<uint64_t>(src_len),
352 static_cast<uint64_t>(ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000353
354 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000355}
356
357size_t
358SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
359{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000360 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000361 ProcessSP process_sp(GetSP());
362 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000363 {
364 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000365 bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000366 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000367
Greg Clayton5160ce52013-03-27 23:08:40 +0000368 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000369 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000370 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000371 static_cast<void*>(process_sp.get()),
372 static_cast<int>(bytes_read), dst,
373 static_cast<uint64_t>(dst_len),
374 static_cast<uint64_t>(bytes_read));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000375
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000376 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000377}
378
379size_t
380SBProcess::GetSTDERR (char *dst, size_t dst_len) const
381{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000382 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000383 ProcessSP process_sp(GetSP());
384 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000385 {
386 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000387 bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000388 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000389
Greg Clayton5160ce52013-03-27 23:08:40 +0000390 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000391 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000392 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000393 static_cast<void*>(process_sp.get()),
394 static_cast<int>(bytes_read), dst,
395 static_cast<uint64_t>(dst_len),
396 static_cast<uint64_t>(bytes_read));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000397
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000398 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000399}
400
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000401size_t
402SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const
403{
404 size_t bytes_read = 0;
405 ProcessSP process_sp(GetSP());
406 if (process_sp)
407 {
408 Error error;
409 bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error);
410 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000411
Greg Clayton5160ce52013-03-27 23:08:40 +0000412 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000413 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000414 log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000415 static_cast<void*>(process_sp.get()),
416 static_cast<int>(bytes_read), dst,
417 static_cast<uint64_t>(dst_len),
418 static_cast<uint64_t>(bytes_read));
419
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000420 return bytes_read;
421}
422
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000423void
Jim Ingham2976d002010-08-26 21:32:51 +0000424SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000425{
426 if (out == NULL)
427 return;
428
Greg Claytonacdbe812012-01-30 09:04:36 +0000429 ProcessSP process_sp(GetSP());
430 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000431 {
432 const StateType event_state = SBProcess::GetStateFromEvent (event);
433 char message[1024];
434 int message_len = ::snprintf (message,
435 sizeof (message),
Daniel Malead01b2952012-11-29 21:49:15 +0000436 "Process %" PRIu64 " %s\n",
Greg Claytonacdbe812012-01-30 09:04:36 +0000437 process_sp->GetID(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000438 SBDebugger::StateAsCString (event_state));
439
440 if (message_len > 0)
441 ::fwrite (message, 1, message_len, out);
442 }
443}
444
445void
Jim Ingham2976d002010-08-26 21:32:51 +0000446SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000447{
Greg Claytonacdbe812012-01-30 09:04:36 +0000448 ProcessSP process_sp(GetSP());
449 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000450 {
451 const StateType event_state = SBProcess::GetStateFromEvent (event);
452 char message[1024];
453 ::snprintf (message,
454 sizeof (message),
Daniel Malead01b2952012-11-29 21:49:15 +0000455 "Process %" PRIu64 " %s\n",
Greg Claytonacdbe812012-01-30 09:04:36 +0000456 process_sp->GetID(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000457 SBDebugger::StateAsCString (event_state));
458
459 result.AppendMessage (message);
460 }
461}
462
463bool
Jim Ingham2976d002010-08-26 21:32:51 +0000464SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000465{
Greg Claytonacdbe812012-01-30 09:04:36 +0000466 ProcessSP process_sp(GetSP());
467 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000468 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000469 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
470 return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000471 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000472 return false;
473}
474
475bool
Greg Claytonea561dc2012-10-12 23:32:11 +0000476SBProcess::SetSelectedThreadByID (lldb::tid_t tid)
477{
Greg Clayton5160ce52013-03-27 23:08:40 +0000478 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000479
Caroline Ticeceb6b132010-10-26 03:11:13 +0000480 bool ret_val = false;
Greg Claytonacdbe812012-01-30 09:04:36 +0000481 ProcessSP process_sp(GetSP());
482 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000483 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000484 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
485 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000486 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000487
488 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000489 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000490 static_cast<void*>(process_sp.get()), tid,
491 (ret_val ? "true" : "false"));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000492
493 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000494}
495
Jim Ingham18b46892012-07-13 20:18:18 +0000496bool
497SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
498{
Greg Clayton5160ce52013-03-27 23:08:40 +0000499 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000500
501 bool ret_val = false;
502 ProcessSP process_sp(GetSP());
503 if (process_sp)
504 {
505 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
506 ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
507 }
508
509 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000510 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
511 static_cast<void*>(process_sp.get()), index_id,
512 (ret_val ? "true" : "false"));
Jim Ingham18b46892012-07-13 20:18:18 +0000513
514 return ret_val;
515}
516
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000517SBThread
518SBProcess::GetThreadAtIndex (size_t index)
519{
Greg Clayton5160ce52013-03-27 23:08:40 +0000520 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000521
Greg Clayton17a6ad02012-01-30 02:53:15 +0000522 SBThread sb_thread;
523 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000524 ProcessSP process_sp(GetSP());
525 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000526 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000527 Process::StopLocker stop_locker;
528 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Claytonacdbe812012-01-30 09:04:36 +0000529 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000530 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000531 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000532 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000533
534 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000535 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000536 static_cast<void*>(process_sp.get()),
537 static_cast<uint32_t>(index),
538 static_cast<void*>(thread_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000539
Greg Clayton17a6ad02012-01-30 02:53:15 +0000540 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000541}
542
Jim Inghambf2956a22013-01-08 23:22:42 +0000543uint32_t
Jason Molenda5e8dce42013-12-13 00:29:16 +0000544SBProcess::GetNumQueues ()
545{
546 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
547
548 uint32_t num_queues = 0;
549 ProcessSP process_sp(GetSP());
550 if (process_sp)
551 {
552 Process::StopLocker stop_locker;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000553
Jason Molenda5e8dce42013-12-13 00:29:16 +0000554 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
555 num_queues = process_sp->GetQueueList().GetSize();
556 }
557
558 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000559 log->Printf ("SBProcess(%p)::GetNumQueues () => %d",
560 static_cast<void*>(process_sp.get()), num_queues);
Jason Molenda5e8dce42013-12-13 00:29:16 +0000561
562 return num_queues;
563}
564
565SBQueue
566SBProcess::GetQueueAtIndex (size_t index)
567{
568 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
569
570 SBQueue sb_queue;
571 QueueSP queue_sp;
572 ProcessSP process_sp(GetSP());
573 if (process_sp)
574 {
575 Process::StopLocker stop_locker;
576 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
577 queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
578 sb_queue.SetQueue (queue_sp);
579 }
580
581 if (log)
Jason Molenda5e8dce42013-12-13 00:29:16 +0000582 log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000583 static_cast<void*>(process_sp.get()),
584 static_cast<uint32_t>(index),
585 static_cast<void*>(queue_sp.get()));
Jason Molenda5e8dce42013-12-13 00:29:16 +0000586
587 return sb_queue;
588}
589
590
591uint32_t
Jim Inghambf2956a22013-01-08 23:22:42 +0000592SBProcess::GetStopID(bool include_expression_stops)
593{
594 ProcessSP process_sp(GetSP());
595 if (process_sp)
596 {
597 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
598 if (include_expression_stops)
599 return process_sp->GetStopID();
600 else
601 return process_sp->GetLastNaturalStopID();
602 }
603 return 0;
604}
605
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000606StateType
607SBProcess::GetState ()
608{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000609
Caroline Ticeceb6b132010-10-26 03:11:13 +0000610 StateType ret_val = eStateInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000611 ProcessSP process_sp(GetSP());
612 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000613 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000614 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
615 ret_val = process_sp->GetState();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000616 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000617
Greg Clayton5160ce52013-03-27 23:08:40 +0000618 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000619 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000620 log->Printf ("SBProcess(%p)::GetState () => %s",
621 static_cast<void*>(process_sp.get()),
Caroline Tice750cd172010-10-26 23:49:36 +0000622 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000623
624 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000625}
626
627
628int
629SBProcess::GetExitStatus ()
630{
Greg Clayton48381312010-10-30 04:51:46 +0000631 int exit_status = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000632 ProcessSP process_sp(GetSP());
633 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000634 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000635 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
636 exit_status = process_sp->GetExitStatus ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000637 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000638 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000639 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000640 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
641 static_cast<void*>(process_sp.get()), exit_status,
642 exit_status);
Greg Clayton48381312010-10-30 04:51:46 +0000643
644 return exit_status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000645}
646
647const char *
648SBProcess::GetExitDescription ()
649{
Greg Clayton48381312010-10-30 04:51:46 +0000650 const char *exit_desc = NULL;
Greg Claytonacdbe812012-01-30 09:04:36 +0000651 ProcessSP process_sp(GetSP());
652 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000653 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000654 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
655 exit_desc = process_sp->GetExitDescription ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000656 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000657 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000658 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000659 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
660 static_cast<void*>(process_sp.get()), exit_desc);
Greg Clayton48381312010-10-30 04:51:46 +0000661 return exit_desc;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000662}
663
664lldb::pid_t
665SBProcess::GetProcessID ()
666{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000667 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Claytonacdbe812012-01-30 09:04:36 +0000668 ProcessSP process_sp(GetSP());
669 if (process_sp)
670 ret_val = process_sp->GetID();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000671
Greg Clayton5160ce52013-03-27 23:08:40 +0000672 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000673 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000674 log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64,
675 static_cast<void*>(process_sp.get()), ret_val);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000676
677 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000678}
679
Greg Clayton949e8222013-01-16 17:29:04 +0000680uint32_t
681SBProcess::GetUniqueID()
682{
683 uint32_t ret_val = 0;
684 ProcessSP process_sp(GetSP());
685 if (process_sp)
686 ret_val = process_sp->GetUniqueID();
Greg Clayton5160ce52013-03-27 23:08:40 +0000687 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton949e8222013-01-16 17:29:04 +0000688 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000689 log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32,
690 static_cast<void*>(process_sp.get()), ret_val);
Greg Clayton949e8222013-01-16 17:29:04 +0000691 return ret_val;
692}
693
Johnny Chencf386e22011-03-01 22:56:31 +0000694ByteOrder
695SBProcess::GetByteOrder () const
696{
697 ByteOrder byteOrder = eByteOrderInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000698 ProcessSP process_sp(GetSP());
699 if (process_sp)
700 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000701
Greg Clayton5160ce52013-03-27 23:08:40 +0000702 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chencf386e22011-03-01 22:56:31 +0000703 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000704 log->Printf ("SBProcess(%p)::GetByteOrder () => %d",
705 static_cast<void*>(process_sp.get()), byteOrder);
Johnny Chencf386e22011-03-01 22:56:31 +0000706
707 return byteOrder;
708}
709
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000710uint32_t
711SBProcess::GetAddressByteSize () const
712{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000713 uint32_t size = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000714 ProcessSP process_sp(GetSP());
715 if (process_sp)
716 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000717
Greg Clayton5160ce52013-03-27 23:08:40 +0000718 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000719 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000720 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d",
721 static_cast<void*>(process_sp.get()), size);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000722
723 return size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000724}
725
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000726SBError
727SBProcess::Continue ()
728{
Greg Clayton5160ce52013-03-27 23:08:40 +0000729 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000730
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000731 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000732 ProcessSP process_sp(GetSP());
733
734 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000735 log->Printf ("SBProcess(%p)::Continue ()...",
736 static_cast<void*>(process_sp.get()));
Greg Claytonacdbe812012-01-30 09:04:36 +0000737
738 if (process_sp)
Greg Clayton5d5028b2010-10-06 03:53:16 +0000739 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000740 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000741
Greg Claytonacdbe812012-01-30 09:04:36 +0000742 Error error (process_sp->Resume());
Greg Clayton5d5028b2010-10-06 03:53:16 +0000743 if (error.Success())
744 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000745 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Clayton48381312010-10-30 04:51:46 +0000746 {
747 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000748 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...",
749 static_cast<void*>(process_sp.get()));
Greg Claytonacdbe812012-01-30 09:04:36 +0000750 process_sp->WaitForProcessToStop (NULL);
Greg Clayton48381312010-10-30 04:51:46 +0000751 }
Greg Clayton5d5028b2010-10-06 03:53:16 +0000752 }
753 sb_error.SetError(error);
754 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000755 else
756 sb_error.SetErrorString ("SBProcess is invalid");
757
Caroline Ticeceb6b132010-10-26 03:11:13 +0000758 if (log)
759 {
760 SBStream sstr;
761 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000762 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s",
763 static_cast<void*>(process_sp.get()),
764 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000765 }
766
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000767 return sb_error;
768}
769
770
771SBError
772SBProcess::Destroy ()
773{
774 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000775 ProcessSP process_sp(GetSP());
776 if (process_sp)
Greg Clayton6779606a2011-01-22 23:43:18 +0000777 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000778 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
779 sb_error.SetError(process_sp->Destroy());
Greg Clayton6779606a2011-01-22 23:43:18 +0000780 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000781 else
782 sb_error.SetErrorString ("SBProcess is invalid");
783
Greg Clayton5160ce52013-03-27 23:08:40 +0000784 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000785 if (log)
786 {
787 SBStream sstr;
788 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000789 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
790 static_cast<void*>(process_sp.get()),
791 static_cast<void*>(sb_error.get()), sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000792 }
793
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000794 return sb_error;
795}
796
797
798SBError
799SBProcess::Stop ()
800{
801 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000802 ProcessSP process_sp(GetSP());
803 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000804 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000805 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
806 sb_error.SetError (process_sp->Halt());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000807 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000808 else
809 sb_error.SetErrorString ("SBProcess is invalid");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000810
Greg Clayton5160ce52013-03-27 23:08:40 +0000811 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000812 if (log)
813 {
814 SBStream sstr;
815 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000816 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
817 static_cast<void*>(process_sp.get()),
818 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000819 }
820
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000821 return sb_error;
822}
823
824SBError
825SBProcess::Kill ()
826{
827 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000828 ProcessSP process_sp(GetSP());
829 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000830 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000831 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
832 sb_error.SetError (process_sp->Destroy());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000833 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000834 else
835 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000836
Greg Clayton5160ce52013-03-27 23:08:40 +0000837 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000838 if (log)
839 {
840 SBStream sstr;
841 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000842 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
843 static_cast<void*>(process_sp.get()),
844 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000845 }
846
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000847 return sb_error;
848}
849
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000850SBError
851SBProcess::Detach ()
852{
Jim Inghamacff8952013-05-02 00:27:30 +0000853 // FIXME: This should come from a process default.
854 bool keep_stopped = false;
855 return Detach (keep_stopped);
856}
857
858SBError
859SBProcess::Detach (bool keep_stopped)
860{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000861 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000862 ProcessSP process_sp(GetSP());
863 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000864 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000865 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Jim Inghamacff8952013-05-02 00:27:30 +0000866 sb_error.SetError (process_sp->Detach(keep_stopped));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000867 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000868 else
869 sb_error.SetErrorString ("SBProcess is invalid");
870
871 return sb_error;
872}
873
874SBError
Greg Clayton48381312010-10-30 04:51:46 +0000875SBProcess::Signal (int signo)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000876{
877 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000878 ProcessSP process_sp(GetSP());
879 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000880 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000881 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
882 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000883 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000884 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000885 sb_error.SetErrorString ("SBProcess is invalid");
Greg Clayton5160ce52013-03-27 23:08:40 +0000886 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000887 if (log)
888 {
889 SBStream sstr;
890 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000891 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
892 static_cast<void*>(process_sp.get()), signo,
893 static_cast<void*>(sb_error.get()), sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000894 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000895 return sb_error;
896}
897
Todd Fiala802dc4022014-06-23 19:30:49 +0000898SBUnixSignals
899SBProcess::GetUnixSignals()
900{
901 SBUnixSignals sb_unix_signals;
902 ProcessSP process_sp(GetSP());
903 if (process_sp)
904 {
905 sb_unix_signals.SetSP(process_sp);
906 }
907
908 return sb_unix_signals;
909}
910
Jim Inghamcfc09352012-07-27 23:57:19 +0000911void
912SBProcess::SendAsyncInterrupt ()
913{
914 ProcessSP process_sp(GetSP());
915 if (process_sp)
916 {
917 process_sp->SendAsyncInterrupt ();
918 }
919}
920
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000921SBThread
Greg Clayton48381312010-10-30 04:51:46 +0000922SBProcess::GetThreadByID (tid_t tid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000923{
Greg Clayton48381312010-10-30 04:51:46 +0000924 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000925 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000926 ProcessSP process_sp(GetSP());
927 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000928 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000929 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000930 Process::StopLocker stop_locker;
931 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
932 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000933 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000934 }
Greg Clayton48381312010-10-30 04:51:46 +0000935
Greg Clayton5160ce52013-03-27 23:08:40 +0000936 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000937 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000938 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000939 static_cast<void*>(process_sp.get()), tid,
940 static_cast<void*>(thread_sp.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000941
942 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000943}
944
Jim Ingham18b46892012-07-13 20:18:18 +0000945SBThread
946SBProcess::GetThreadByIndexID (uint32_t index_id)
947{
948 SBThread sb_thread;
949 ThreadSP thread_sp;
950 ProcessSP process_sp(GetSP());
951 if (process_sp)
952 {
953 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
954 Process::StopLocker stop_locker;
955 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
956 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
957 sb_thread.SetThread (thread_sp);
958 }
959
Greg Clayton5160ce52013-03-27 23:08:40 +0000960 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000961 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000962 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
963 static_cast<void*>(process_sp.get()), index_id,
964 static_cast<void*>(thread_sp.get()));
Jim Ingham18b46892012-07-13 20:18:18 +0000965
966 return sb_thread;
967}
968
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000969StateType
970SBProcess::GetStateFromEvent (const SBEvent &event)
971{
Greg Clayton5160ce52013-03-27 23:08:40 +0000972 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000973
Caroline Ticeceb6b132010-10-26 03:11:13 +0000974 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000975
Caroline Ticeceb6b132010-10-26 03:11:13 +0000976 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000977 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
978 static_cast<void*>(event.get()),
Caroline Tice750cd172010-10-26 23:49:36 +0000979 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000980
981 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000982}
983
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000984bool
985SBProcess::GetRestartedFromEvent (const SBEvent &event)
986{
Greg Clayton66111032010-06-23 01:19:29 +0000987 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000988}
989
Jim Ingham0161b492013-02-09 01:29:05 +0000990size_t
991SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
992{
993 return Process::ProcessEventData::GetNumRestartedReasons(event.get());
994}
995
996const char *
997SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
998{
999 return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
1000}
1001
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001002SBProcess
1003SBProcess::GetProcessFromEvent (const SBEvent &event)
1004{
Greg Clayton66111032010-06-23 01:19:29 +00001005 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001006 return process;
1007}
1008
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001009bool
1010SBProcess::EventIsProcessEvent (const SBEvent &event)
1011{
Jim Ingham4bddaeb2012-02-16 06:50:00 +00001012 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001013}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001014
1015SBBroadcaster
1016SBProcess::GetBroadcaster () const
1017{
Greg Clayton5160ce52013-03-27 23:08:40 +00001018 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001019
Greg Claytonacdbe812012-01-30 09:04:36 +00001020 ProcessSP process_sp(GetSP());
1021
1022 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001023
1024 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001025 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
1026 static_cast<void*>(process_sp.get()),
1027 static_cast<void*>(broadcaster.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001028
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001029 return broadcaster;
1030}
1031
Jim Ingham4bddaeb2012-02-16 06:50:00 +00001032const char *
1033SBProcess::GetBroadcasterClass ()
1034{
1035 return Process::GetStaticBroadcasterClass().AsCString();
1036}
1037
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001038size_t
1039SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
1040{
Greg Clayton5160ce52013-03-27 23:08:40 +00001041 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001042
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001043 size_t bytes_read = 0;
1044
Greg Claytonacdbe812012-01-30 09:04:36 +00001045 ProcessSP process_sp(GetSP());
1046
Greg Clayton48381312010-10-30 04:51:46 +00001047 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001048 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001049 static_cast<void*>(process_sp.get()), addr,
1050 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1051 static_cast<void*>(sb_error.get()));
1052
Greg Claytonacdbe812012-01-30 09:04:36 +00001053 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001054 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001055 Process::StopLocker stop_locker;
1056 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1057 {
1058 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1059 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
1060 }
1061 else
1062 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001063 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001064 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running",
1065 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001066 sb_error.SetErrorString("process is running");
1067 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001068 }
1069 else
1070 {
1071 sb_error.SetErrorString ("SBProcess is invalid");
1072 }
1073
Caroline Ticeceb6b132010-10-26 03:11:13 +00001074 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +00001075 {
1076 SBStream sstr;
1077 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001078 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001079 static_cast<void*>(process_sp.get()), addr,
1080 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1081 static_cast<void*>(sb_error.get()), sstr.GetData(),
1082 static_cast<uint64_t>(bytes_read));
Greg Clayton93aa84e2010-10-29 04:59:35 +00001083 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001084
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001085 return bytes_read;
1086}
1087
1088size_t
Greg Claytone91b7952011-12-15 03:14:23 +00001089SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1090{
1091 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001092 ProcessSP process_sp(GetSP());
1093 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001094 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001095 Process::StopLocker stop_locker;
1096 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1097 {
1098 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1099 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
1100 }
1101 else
1102 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001103 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001104 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001105 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running",
1106 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001107 sb_error.SetErrorString("process is running");
1108 }
Greg Claytone91b7952011-12-15 03:14:23 +00001109 }
1110 else
1111 {
1112 sb_error.SetErrorString ("SBProcess is invalid");
1113 }
1114 return bytes_read;
1115}
1116
1117uint64_t
1118SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1119{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001120 uint64_t value = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001121 ProcessSP process_sp(GetSP());
1122 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001123 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001124 Process::StopLocker stop_locker;
1125 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1126 {
1127 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1128 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
1129 }
1130 else
1131 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001132 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001133 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001134 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running",
1135 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001136 sb_error.SetErrorString("process is running");
1137 }
Greg Claytone91b7952011-12-15 03:14:23 +00001138 }
1139 else
1140 {
1141 sb_error.SetErrorString ("SBProcess is invalid");
1142 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001143 return value;
Greg Claytone91b7952011-12-15 03:14:23 +00001144}
1145
1146lldb::addr_t
1147SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1148{
1149 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Claytonacdbe812012-01-30 09:04:36 +00001150 ProcessSP process_sp(GetSP());
1151 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001152 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001153 Process::StopLocker stop_locker;
1154 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1155 {
1156 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1157 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1158 }
1159 else
1160 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001161 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001162 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001163 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running",
1164 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001165 sb_error.SetErrorString("process is running");
1166 }
Greg Claytone91b7952011-12-15 03:14:23 +00001167 }
1168 else
1169 {
1170 sb_error.SetErrorString ("SBProcess is invalid");
1171 }
1172 return ptr;
1173}
1174
1175size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001176SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1177{
1178 size_t bytes_written = 0;
1179
Greg Clayton5160ce52013-03-27 23:08:40 +00001180 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonacdbe812012-01-30 09:04:36 +00001181
1182 ProcessSP process_sp(GetSP());
1183
Greg Clayton48381312010-10-30 04:51:46 +00001184 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001185 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001186 static_cast<void*>(process_sp.get()), addr,
1187 static_cast<const void*>(src),
1188 static_cast<uint64_t>(src_len),
1189 static_cast<void*>(sb_error.get()));
Greg Clayton48381312010-10-30 04:51:46 +00001190
Greg Claytonacdbe812012-01-30 09:04:36 +00001191 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001192 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001193 Process::StopLocker stop_locker;
1194 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1195 {
1196 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1197 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1198 }
1199 else
1200 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001201 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001202 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running",
1203 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001204 sb_error.SetErrorString("process is running");
1205 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001206 }
1207
Greg Clayton48381312010-10-30 04:51:46 +00001208 if (log)
1209 {
1210 SBStream sstr;
1211 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001212 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001213 static_cast<void*>(process_sp.get()), addr,
1214 static_cast<const void*>(src),
1215 static_cast<uint64_t>(src_len),
1216 static_cast<void*>(sb_error.get()), sstr.GetData(),
1217 static_cast<uint64_t>(bytes_written));
Greg Clayton48381312010-10-30 04:51:46 +00001218 }
1219
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001220 return bytes_written;
1221}
1222
Caroline Ticedde9cff2010-09-20 05:20:02 +00001223bool
1224SBProcess::GetDescription (SBStream &description)
1225{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001226 Stream &strm = description.ref();
1227
Greg Claytonacdbe812012-01-30 09:04:36 +00001228 ProcessSP process_sp(GetSP());
1229 if (process_sp)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001230 {
1231 char path[PATH_MAX];
1232 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Claytonacdbe812012-01-30 09:04:36 +00001233 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton1d273162010-10-06 03:09:58 +00001234 const char *exe_name = NULL;
1235 if (exe_module)
1236 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1237
Daniel Malead01b2952012-11-29 21:49:15 +00001238 strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
Greg Claytonacdbe812012-01-30 09:04:36 +00001239 process_sp->GetID(),
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001240 lldb_private::StateAsCString (GetState()),
1241 GetNumThreads(),
1242 exe_name ? ", executable = " : "",
1243 exe_name ? exe_name : "");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001244 }
1245 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001246 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001247
1248 return true;
1249}
Greg Clayton8f343b02010-11-04 01:54:29 +00001250
1251uint32_t
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001252SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1253{
Greg Clayton5160ce52013-03-27 23:08:40 +00001254 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001255
1256 uint32_t num = 0;
1257 ProcessSP process_sp(GetSP());
1258 if (process_sp)
1259 {
1260 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1261 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001262 if (log)
1263 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001264 static_cast<void*>(process_sp.get()), num);
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001265 }
1266 else
1267 {
1268 sb_error.SetErrorString ("SBProcess is invalid");
1269 }
1270 return num;
1271}
1272
1273uint32_t
Greg Clayton8f343b02010-11-04 01:54:29 +00001274SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1275{
Greg Claytonacdbe812012-01-30 09:04:36 +00001276 ProcessSP process_sp(GetSP());
1277 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001278 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001279 Process::StopLocker stop_locker;
1280 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1281 {
1282 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1283 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1284 }
1285 else
1286 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001287 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001288 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001289 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running",
1290 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001291 sb_error.SetErrorString("process is running");
1292 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001293 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001294 return LLDB_INVALID_IMAGE_TOKEN;
1295}
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001296
Greg Clayton8f343b02010-11-04 01:54:29 +00001297lldb::SBError
1298SBProcess::UnloadImage (uint32_t image_token)
1299{
1300 lldb::SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +00001301 ProcessSP process_sp(GetSP());
1302 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001303 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001304 Process::StopLocker stop_locker;
1305 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1306 {
1307 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1308 sb_error.SetError (process_sp->UnloadImage (image_token));
1309 }
1310 else
1311 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001312 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001313 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001314 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running",
1315 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001316 sb_error.SetErrorString("process is running");
1317 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001318 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001319 else
1320 sb_error.SetErrorString("invalid process");
1321 return sb_error;
1322}
Jason Molenda8c713372013-11-05 11:00:35 +00001323
Jason Molendaa3329782014-03-29 18:54:20 +00001324lldb::SBError
1325SBProcess::SendEventData (const char *event_data)
1326{
1327 lldb::SBError sb_error;
1328 ProcessSP process_sp(GetSP());
1329 if (process_sp)
1330 {
1331 Process::StopLocker stop_locker;
1332 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1333 {
1334 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1335 sb_error.SetError (process_sp->SendEventData (event_data));
1336 }
1337 else
1338 {
1339 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1340 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001341 log->Printf ("SBProcess(%p)::SendEventData() => error: process is running",
1342 static_cast<void*>(process_sp.get()));
Jason Molendaa3329782014-03-29 18:54:20 +00001343 sb_error.SetErrorString("process is running");
1344 }
1345 }
1346 else
1347 sb_error.SetErrorString("invalid process");
1348 return sb_error;
1349}
1350
Jason Molenda8c713372013-11-05 11:00:35 +00001351uint32_t
Jason Molenda95d005c2013-11-06 03:07:33 +00001352SBProcess::GetNumExtendedBacktraceTypes ()
Jason Molenda8c713372013-11-05 11:00:35 +00001353{
1354 ProcessSP process_sp(GetSP());
1355 if (process_sp && process_sp->GetSystemRuntime())
1356 {
1357 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda95d005c2013-11-06 03:07:33 +00001358 return runtime->GetExtendedBacktraceTypes().size();
Jason Molenda8c713372013-11-05 11:00:35 +00001359 }
1360 return 0;
1361}
1362
1363const char *
Jason Molenda95d005c2013-11-06 03:07:33 +00001364SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx)
Jason Molenda8c713372013-11-05 11:00:35 +00001365{
1366 ProcessSP process_sp(GetSP());
1367 if (process_sp && process_sp->GetSystemRuntime())
1368 {
1369 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda008c45f2013-11-12 23:33:32 +00001370 const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes();
Jason Molenda8c713372013-11-05 11:00:35 +00001371 if (idx < names.size())
1372 {
1373 return names[idx].AsCString();
1374 }
1375 else
1376 {
1377 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1378 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001379 log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds",
1380 static_cast<void*>(process_sp.get()));
Jason Molenda8c713372013-11-05 11:00:35 +00001381 }
1382 }
1383 return NULL;
1384}
Kuba Breckaa51ea382014-09-06 01:33:13 +00001385
1386SBThreadCollection
1387SBProcess::GetHistoryThreads (addr_t addr)
1388{
1389 ProcessSP process_sp(GetSP());
1390 SBThreadCollection threads;
1391 if (process_sp)
1392 {
1393 threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1394 }
1395 return threads;
1396}
Kuba Brecka63927542014-10-11 01:59:32 +00001397
1398bool
1399SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type)
1400{
1401 ProcessSP process_sp(GetSP());
1402 if (! process_sp)
1403 return false;
1404
1405 InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type);
1406
1407 if (! runtime_sp.get())
1408 return false;
1409
1410 return runtime_sp->IsActive();
1411}