blob: d979db77eba2ba348ec2b492403ad603dd15650d [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 Claytondc6224e2014-10-21 01:00:42 +0000742 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution ())
743 sb_error.ref() = process_sp->Resume ();
744 else
745 sb_error.ref() = process_sp->ResumeSynchronous (NULL);
Greg Clayton5d5028b2010-10-06 03:53:16 +0000746 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000747 else
748 sb_error.SetErrorString ("SBProcess is invalid");
749
Caroline Ticeceb6b132010-10-26 03:11:13 +0000750 if (log)
751 {
752 SBStream sstr;
753 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000754 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s",
755 static_cast<void*>(process_sp.get()),
756 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000757 }
758
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000759 return sb_error;
760}
761
762
763SBError
764SBProcess::Destroy ()
765{
766 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000767 ProcessSP process_sp(GetSP());
768 if (process_sp)
Greg Clayton6779606a2011-01-22 23:43:18 +0000769 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000770 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
771 sb_error.SetError(process_sp->Destroy());
Greg Clayton6779606a2011-01-22 23:43:18 +0000772 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000773 else
774 sb_error.SetErrorString ("SBProcess is invalid");
775
Greg Clayton5160ce52013-03-27 23:08:40 +0000776 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000777 if (log)
778 {
779 SBStream sstr;
780 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000781 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
782 static_cast<void*>(process_sp.get()),
783 static_cast<void*>(sb_error.get()), sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000784 }
785
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000786 return sb_error;
787}
788
789
790SBError
791SBProcess::Stop ()
792{
793 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000794 ProcessSP process_sp(GetSP());
795 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000796 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000797 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
798 sb_error.SetError (process_sp->Halt());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000799 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000800 else
801 sb_error.SetErrorString ("SBProcess is invalid");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000802
Greg Clayton5160ce52013-03-27 23:08:40 +0000803 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000804 if (log)
805 {
806 SBStream sstr;
807 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000808 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
809 static_cast<void*>(process_sp.get()),
810 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000811 }
812
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000813 return sb_error;
814}
815
816SBError
817SBProcess::Kill ()
818{
819 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000820 ProcessSP process_sp(GetSP());
821 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000822 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000823 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
824 sb_error.SetError (process_sp->Destroy());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000825 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000826 else
827 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000828
Greg Clayton5160ce52013-03-27 23:08:40 +0000829 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000830 if (log)
831 {
832 SBStream sstr;
833 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000834 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
835 static_cast<void*>(process_sp.get()),
836 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000837 }
838
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000839 return sb_error;
840}
841
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000842SBError
843SBProcess::Detach ()
844{
Jim Inghamacff8952013-05-02 00:27:30 +0000845 // FIXME: This should come from a process default.
846 bool keep_stopped = false;
847 return Detach (keep_stopped);
848}
849
850SBError
851SBProcess::Detach (bool keep_stopped)
852{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000853 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000854 ProcessSP process_sp(GetSP());
855 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000856 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000857 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Jim Inghamacff8952013-05-02 00:27:30 +0000858 sb_error.SetError (process_sp->Detach(keep_stopped));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000859 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000860 else
861 sb_error.SetErrorString ("SBProcess is invalid");
862
863 return sb_error;
864}
865
866SBError
Greg Clayton48381312010-10-30 04:51:46 +0000867SBProcess::Signal (int signo)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000868{
869 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000870 ProcessSP process_sp(GetSP());
871 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000872 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000873 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
874 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000875 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000876 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000877 sb_error.SetErrorString ("SBProcess is invalid");
Greg Clayton5160ce52013-03-27 23:08:40 +0000878 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000879 if (log)
880 {
881 SBStream sstr;
882 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000883 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
884 static_cast<void*>(process_sp.get()), signo,
885 static_cast<void*>(sb_error.get()), sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000886 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000887 return sb_error;
888}
889
Todd Fiala802dc4022014-06-23 19:30:49 +0000890SBUnixSignals
891SBProcess::GetUnixSignals()
892{
893 SBUnixSignals sb_unix_signals;
894 ProcessSP process_sp(GetSP());
895 if (process_sp)
896 {
897 sb_unix_signals.SetSP(process_sp);
898 }
899
900 return sb_unix_signals;
901}
902
Jim Inghamcfc09352012-07-27 23:57:19 +0000903void
904SBProcess::SendAsyncInterrupt ()
905{
906 ProcessSP process_sp(GetSP());
907 if (process_sp)
908 {
909 process_sp->SendAsyncInterrupt ();
910 }
911}
912
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000913SBThread
Greg Clayton48381312010-10-30 04:51:46 +0000914SBProcess::GetThreadByID (tid_t tid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000915{
Greg Clayton48381312010-10-30 04:51:46 +0000916 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000917 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000918 ProcessSP process_sp(GetSP());
919 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000920 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000921 Process::StopLocker stop_locker;
922 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Hafiz Abid Qadeer5bf72c42015-02-11 16:37:17 +0000923 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000924 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000925 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000926 }
Greg Clayton48381312010-10-30 04:51:46 +0000927
Greg Clayton5160ce52013-03-27 23:08:40 +0000928 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000929 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000930 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000931 static_cast<void*>(process_sp.get()), tid,
932 static_cast<void*>(thread_sp.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000933
934 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000935}
936
Jim Ingham18b46892012-07-13 20:18:18 +0000937SBThread
938SBProcess::GetThreadByIndexID (uint32_t index_id)
939{
940 SBThread sb_thread;
941 ThreadSP thread_sp;
942 ProcessSP process_sp(GetSP());
943 if (process_sp)
944 {
Jim Ingham18b46892012-07-13 20:18:18 +0000945 Process::StopLocker stop_locker;
946 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Hafiz Abid Qadeer5bf72c42015-02-11 16:37:17 +0000947 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Jim Ingham18b46892012-07-13 20:18:18 +0000948 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
949 sb_thread.SetThread (thread_sp);
950 }
951
Greg Clayton5160ce52013-03-27 23:08:40 +0000952 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000953 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000954 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
955 static_cast<void*>(process_sp.get()), index_id,
956 static_cast<void*>(thread_sp.get()));
Jim Ingham18b46892012-07-13 20:18:18 +0000957
958 return sb_thread;
959}
960
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000961StateType
962SBProcess::GetStateFromEvent (const SBEvent &event)
963{
Greg Clayton5160ce52013-03-27 23:08:40 +0000964 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000965
Caroline Ticeceb6b132010-10-26 03:11:13 +0000966 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000967
Caroline Ticeceb6b132010-10-26 03:11:13 +0000968 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000969 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
970 static_cast<void*>(event.get()),
Caroline Tice750cd172010-10-26 23:49:36 +0000971 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000972
973 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000974}
975
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000976bool
977SBProcess::GetRestartedFromEvent (const SBEvent &event)
978{
Greg Clayton66111032010-06-23 01:19:29 +0000979 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000980}
981
Jim Ingham0161b492013-02-09 01:29:05 +0000982size_t
983SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
984{
985 return Process::ProcessEventData::GetNumRestartedReasons(event.get());
986}
987
988const char *
989SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
990{
991 return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
992}
993
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000994SBProcess
995SBProcess::GetProcessFromEvent (const SBEvent &event)
996{
Greg Clayton66111032010-06-23 01:19:29 +0000997 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000998 return process;
999}
1000
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001001bool
1002SBProcess::EventIsProcessEvent (const SBEvent &event)
1003{
Ilia Kf9e5dc12015-03-21 11:11:07 +00001004 return event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass();
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001005}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001006
1007SBBroadcaster
1008SBProcess::GetBroadcaster () const
1009{
Greg Clayton5160ce52013-03-27 23:08:40 +00001010 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001011
Greg Claytonacdbe812012-01-30 09:04:36 +00001012 ProcessSP process_sp(GetSP());
1013
1014 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001015
1016 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001017 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
1018 static_cast<void*>(process_sp.get()),
1019 static_cast<void*>(broadcaster.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001020
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001021 return broadcaster;
1022}
1023
Jim Ingham4bddaeb2012-02-16 06:50:00 +00001024const char *
1025SBProcess::GetBroadcasterClass ()
1026{
1027 return Process::GetStaticBroadcasterClass().AsCString();
1028}
1029
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001030size_t
1031SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
1032{
Greg Clayton5160ce52013-03-27 23:08:40 +00001033 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001034
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001035 size_t bytes_read = 0;
1036
Greg Claytonacdbe812012-01-30 09:04:36 +00001037 ProcessSP process_sp(GetSP());
1038
Greg Clayton48381312010-10-30 04:51:46 +00001039 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001040 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001041 static_cast<void*>(process_sp.get()), addr,
1042 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1043 static_cast<void*>(sb_error.get()));
1044
Greg Claytonacdbe812012-01-30 09:04:36 +00001045 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001046 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001047 Process::StopLocker stop_locker;
1048 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1049 {
1050 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1051 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
1052 }
1053 else
1054 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001055 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001056 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running",
1057 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001058 sb_error.SetErrorString("process is running");
1059 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001060 }
1061 else
1062 {
1063 sb_error.SetErrorString ("SBProcess is invalid");
1064 }
1065
Caroline Ticeceb6b132010-10-26 03:11:13 +00001066 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +00001067 {
1068 SBStream sstr;
1069 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001070 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001071 static_cast<void*>(process_sp.get()), addr,
1072 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1073 static_cast<void*>(sb_error.get()), sstr.GetData(),
1074 static_cast<uint64_t>(bytes_read));
Greg Clayton93aa84e2010-10-29 04:59:35 +00001075 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001076
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001077 return bytes_read;
1078}
1079
1080size_t
Greg Claytone91b7952011-12-15 03:14:23 +00001081SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1082{
1083 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001084 ProcessSP process_sp(GetSP());
1085 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001086 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001087 Process::StopLocker stop_locker;
1088 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1089 {
1090 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1091 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
1092 }
1093 else
1094 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001095 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001096 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001097 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running",
1098 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001099 sb_error.SetErrorString("process is running");
1100 }
Greg Claytone91b7952011-12-15 03:14:23 +00001101 }
1102 else
1103 {
1104 sb_error.SetErrorString ("SBProcess is invalid");
1105 }
1106 return bytes_read;
1107}
1108
1109uint64_t
1110SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1111{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001112 uint64_t value = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001113 ProcessSP process_sp(GetSP());
1114 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001115 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001116 Process::StopLocker stop_locker;
1117 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1118 {
1119 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1120 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
1121 }
1122 else
1123 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001124 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001125 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001126 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running",
1127 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001128 sb_error.SetErrorString("process is running");
1129 }
Greg Claytone91b7952011-12-15 03:14:23 +00001130 }
1131 else
1132 {
1133 sb_error.SetErrorString ("SBProcess is invalid");
1134 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001135 return value;
Greg Claytone91b7952011-12-15 03:14:23 +00001136}
1137
1138lldb::addr_t
1139SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1140{
1141 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Claytonacdbe812012-01-30 09:04:36 +00001142 ProcessSP process_sp(GetSP());
1143 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001144 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001145 Process::StopLocker stop_locker;
1146 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1147 {
1148 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1149 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1150 }
1151 else
1152 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001153 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001154 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001155 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running",
1156 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001157 sb_error.SetErrorString("process is running");
1158 }
Greg Claytone91b7952011-12-15 03:14:23 +00001159 }
1160 else
1161 {
1162 sb_error.SetErrorString ("SBProcess is invalid");
1163 }
1164 return ptr;
1165}
1166
1167size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001168SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1169{
1170 size_t bytes_written = 0;
1171
Greg Clayton5160ce52013-03-27 23:08:40 +00001172 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonacdbe812012-01-30 09:04:36 +00001173
1174 ProcessSP process_sp(GetSP());
1175
Greg Clayton48381312010-10-30 04:51:46 +00001176 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001177 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001178 static_cast<void*>(process_sp.get()), addr,
1179 static_cast<const void*>(src),
1180 static_cast<uint64_t>(src_len),
1181 static_cast<void*>(sb_error.get()));
Greg Clayton48381312010-10-30 04:51:46 +00001182
Greg Claytonacdbe812012-01-30 09:04:36 +00001183 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001184 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001185 Process::StopLocker stop_locker;
1186 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1187 {
1188 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1189 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1190 }
1191 else
1192 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001193 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001194 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running",
1195 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001196 sb_error.SetErrorString("process is running");
1197 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001198 }
1199
Greg Clayton48381312010-10-30 04:51:46 +00001200 if (log)
1201 {
1202 SBStream sstr;
1203 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001204 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001205 static_cast<void*>(process_sp.get()), addr,
1206 static_cast<const void*>(src),
1207 static_cast<uint64_t>(src_len),
1208 static_cast<void*>(sb_error.get()), sstr.GetData(),
1209 static_cast<uint64_t>(bytes_written));
Greg Clayton48381312010-10-30 04:51:46 +00001210 }
1211
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001212 return bytes_written;
1213}
1214
Caroline Ticedde9cff2010-09-20 05:20:02 +00001215bool
1216SBProcess::GetDescription (SBStream &description)
1217{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001218 Stream &strm = description.ref();
1219
Greg Claytonacdbe812012-01-30 09:04:36 +00001220 ProcessSP process_sp(GetSP());
1221 if (process_sp)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001222 {
1223 char path[PATH_MAX];
1224 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Claytonacdbe812012-01-30 09:04:36 +00001225 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton1d273162010-10-06 03:09:58 +00001226 const char *exe_name = NULL;
1227 if (exe_module)
1228 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1229
Daniel Malead01b2952012-11-29 21:49:15 +00001230 strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
Greg Claytonacdbe812012-01-30 09:04:36 +00001231 process_sp->GetID(),
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001232 lldb_private::StateAsCString (GetState()),
1233 GetNumThreads(),
1234 exe_name ? ", executable = " : "",
1235 exe_name ? exe_name : "");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001236 }
1237 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001238 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001239
1240 return true;
1241}
Greg Clayton8f343b02010-11-04 01:54:29 +00001242
1243uint32_t
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001244SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1245{
Greg Clayton5160ce52013-03-27 23:08:40 +00001246 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001247
1248 uint32_t num = 0;
1249 ProcessSP process_sp(GetSP());
1250 if (process_sp)
1251 {
1252 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1253 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001254 if (log)
1255 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001256 static_cast<void*>(process_sp.get()), num);
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001257 }
1258 else
1259 {
1260 sb_error.SetErrorString ("SBProcess is invalid");
1261 }
1262 return num;
1263}
1264
1265uint32_t
Greg Clayton8f343b02010-11-04 01:54:29 +00001266SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1267{
Greg Claytonacdbe812012-01-30 09:04:36 +00001268 ProcessSP process_sp(GetSP());
1269 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001270 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001271 Process::StopLocker stop_locker;
1272 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1273 {
1274 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1275 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1276 }
1277 else
1278 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001279 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001280 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001281 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running",
1282 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001283 sb_error.SetErrorString("process is running");
1284 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001285 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001286 return LLDB_INVALID_IMAGE_TOKEN;
1287}
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001288
Greg Clayton8f343b02010-11-04 01:54:29 +00001289lldb::SBError
1290SBProcess::UnloadImage (uint32_t image_token)
1291{
1292 lldb::SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +00001293 ProcessSP process_sp(GetSP());
1294 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001295 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001296 Process::StopLocker stop_locker;
1297 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1298 {
1299 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1300 sb_error.SetError (process_sp->UnloadImage (image_token));
1301 }
1302 else
1303 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001304 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001305 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001306 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running",
1307 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001308 sb_error.SetErrorString("process is running");
1309 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001310 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001311 else
1312 sb_error.SetErrorString("invalid process");
1313 return sb_error;
1314}
Jason Molenda8c713372013-11-05 11:00:35 +00001315
Jason Molendaa3329782014-03-29 18:54:20 +00001316lldb::SBError
1317SBProcess::SendEventData (const char *event_data)
1318{
1319 lldb::SBError sb_error;
1320 ProcessSP process_sp(GetSP());
1321 if (process_sp)
1322 {
1323 Process::StopLocker stop_locker;
1324 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1325 {
1326 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1327 sb_error.SetError (process_sp->SendEventData (event_data));
1328 }
1329 else
1330 {
1331 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1332 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001333 log->Printf ("SBProcess(%p)::SendEventData() => error: process is running",
1334 static_cast<void*>(process_sp.get()));
Jason Molendaa3329782014-03-29 18:54:20 +00001335 sb_error.SetErrorString("process is running");
1336 }
1337 }
1338 else
1339 sb_error.SetErrorString("invalid process");
1340 return sb_error;
1341}
1342
Jason Molenda8c713372013-11-05 11:00:35 +00001343uint32_t
Jason Molenda95d005c2013-11-06 03:07:33 +00001344SBProcess::GetNumExtendedBacktraceTypes ()
Jason Molenda8c713372013-11-05 11:00:35 +00001345{
1346 ProcessSP process_sp(GetSP());
1347 if (process_sp && process_sp->GetSystemRuntime())
1348 {
1349 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda95d005c2013-11-06 03:07:33 +00001350 return runtime->GetExtendedBacktraceTypes().size();
Jason Molenda8c713372013-11-05 11:00:35 +00001351 }
1352 return 0;
1353}
1354
1355const char *
Jason Molenda95d005c2013-11-06 03:07:33 +00001356SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx)
Jason Molenda8c713372013-11-05 11:00:35 +00001357{
1358 ProcessSP process_sp(GetSP());
1359 if (process_sp && process_sp->GetSystemRuntime())
1360 {
1361 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda008c45f2013-11-12 23:33:32 +00001362 const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes();
Jason Molenda8c713372013-11-05 11:00:35 +00001363 if (idx < names.size())
1364 {
1365 return names[idx].AsCString();
1366 }
1367 else
1368 {
1369 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1370 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001371 log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds",
1372 static_cast<void*>(process_sp.get()));
Jason Molenda8c713372013-11-05 11:00:35 +00001373 }
1374 }
1375 return NULL;
1376}
Kuba Breckaa51ea382014-09-06 01:33:13 +00001377
1378SBThreadCollection
1379SBProcess::GetHistoryThreads (addr_t addr)
1380{
1381 ProcessSP process_sp(GetSP());
1382 SBThreadCollection threads;
1383 if (process_sp)
1384 {
1385 threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1386 }
1387 return threads;
1388}
Kuba Brecka63927542014-10-11 01:59:32 +00001389
1390bool
1391SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type)
1392{
1393 ProcessSP process_sp(GetSP());
1394 if (! process_sp)
1395 return false;
1396
1397 InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type);
1398
1399 if (! runtime_sp.get())
1400 return false;
1401
1402 return runtime_sp->IsActive();
1403}