blob: c84da7f8ed9bae7e28aa1ee5e8c522dbcf7a4626 [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());
Jason Molendaede31932015-04-17 05:01:58 +0000771 sb_error.SetError(process_sp->Destroy(false));
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());
Jason Molendaede31932015-04-17 05:01:58 +0000824 sb_error.SetError (process_sp->Destroy(true));
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
Ilia K06d28552015-05-15 09:29:09 +00001002SBProcess::GetInterruptedFromEvent (const SBEvent &event)
1003{
1004 return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
1005}
1006
1007bool
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001008SBProcess::EventIsProcessEvent (const SBEvent &event)
1009{
Ilia Kf9e5dc12015-03-21 11:11:07 +00001010 return event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass();
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001011}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001012
1013SBBroadcaster
1014SBProcess::GetBroadcaster () const
1015{
Greg Clayton5160ce52013-03-27 23:08:40 +00001016 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001017
Greg Claytonacdbe812012-01-30 09:04:36 +00001018 ProcessSP process_sp(GetSP());
1019
1020 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001021
1022 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001023 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
1024 static_cast<void*>(process_sp.get()),
1025 static_cast<void*>(broadcaster.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001026
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001027 return broadcaster;
1028}
1029
Jim Ingham4bddaeb2012-02-16 06:50:00 +00001030const char *
1031SBProcess::GetBroadcasterClass ()
1032{
1033 return Process::GetStaticBroadcasterClass().AsCString();
1034}
1035
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001036size_t
1037SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
1038{
Greg Clayton5160ce52013-03-27 23:08:40 +00001039 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001040
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001041 size_t bytes_read = 0;
1042
Greg Claytonacdbe812012-01-30 09:04:36 +00001043 ProcessSP process_sp(GetSP());
1044
Greg Clayton48381312010-10-30 04:51:46 +00001045 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001046 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001047 static_cast<void*>(process_sp.get()), addr,
1048 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1049 static_cast<void*>(sb_error.get()));
1050
Greg Claytonacdbe812012-01-30 09:04:36 +00001051 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001052 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001053 Process::StopLocker stop_locker;
1054 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1055 {
1056 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1057 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
1058 }
1059 else
1060 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001061 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001062 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running",
1063 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001064 sb_error.SetErrorString("process is running");
1065 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001066 }
1067 else
1068 {
1069 sb_error.SetErrorString ("SBProcess is invalid");
1070 }
1071
Caroline Ticeceb6b132010-10-26 03:11:13 +00001072 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +00001073 {
1074 SBStream sstr;
1075 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001076 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001077 static_cast<void*>(process_sp.get()), addr,
1078 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1079 static_cast<void*>(sb_error.get()), sstr.GetData(),
1080 static_cast<uint64_t>(bytes_read));
Greg Clayton93aa84e2010-10-29 04:59:35 +00001081 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001082
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001083 return bytes_read;
1084}
1085
1086size_t
Greg Claytone91b7952011-12-15 03:14:23 +00001087SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1088{
1089 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001090 ProcessSP process_sp(GetSP());
1091 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001092 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001093 Process::StopLocker stop_locker;
1094 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1095 {
1096 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1097 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
1098 }
1099 else
1100 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001101 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001102 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001103 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running",
1104 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001105 sb_error.SetErrorString("process is running");
1106 }
Greg Claytone91b7952011-12-15 03:14:23 +00001107 }
1108 else
1109 {
1110 sb_error.SetErrorString ("SBProcess is invalid");
1111 }
1112 return bytes_read;
1113}
1114
1115uint64_t
1116SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1117{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001118 uint64_t value = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001119 ProcessSP process_sp(GetSP());
1120 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001121 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001122 Process::StopLocker stop_locker;
1123 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1124 {
1125 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1126 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
1127 }
1128 else
1129 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001130 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001131 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001132 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running",
1133 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001134 sb_error.SetErrorString("process is running");
1135 }
Greg Claytone91b7952011-12-15 03:14:23 +00001136 }
1137 else
1138 {
1139 sb_error.SetErrorString ("SBProcess is invalid");
1140 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001141 return value;
Greg Claytone91b7952011-12-15 03:14:23 +00001142}
1143
1144lldb::addr_t
1145SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1146{
1147 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Claytonacdbe812012-01-30 09:04:36 +00001148 ProcessSP process_sp(GetSP());
1149 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001150 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001151 Process::StopLocker stop_locker;
1152 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1153 {
1154 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1155 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1156 }
1157 else
1158 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001159 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001160 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001161 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running",
1162 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001163 sb_error.SetErrorString("process is running");
1164 }
Greg Claytone91b7952011-12-15 03:14:23 +00001165 }
1166 else
1167 {
1168 sb_error.SetErrorString ("SBProcess is invalid");
1169 }
1170 return ptr;
1171}
1172
1173size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001174SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1175{
1176 size_t bytes_written = 0;
1177
Greg Clayton5160ce52013-03-27 23:08:40 +00001178 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonacdbe812012-01-30 09:04:36 +00001179
1180 ProcessSP process_sp(GetSP());
1181
Greg Clayton48381312010-10-30 04:51:46 +00001182 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001183 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001184 static_cast<void*>(process_sp.get()), addr,
1185 static_cast<const void*>(src),
1186 static_cast<uint64_t>(src_len),
1187 static_cast<void*>(sb_error.get()));
Greg Clayton48381312010-10-30 04:51:46 +00001188
Greg Claytonacdbe812012-01-30 09:04:36 +00001189 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001190 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001191 Process::StopLocker stop_locker;
1192 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1193 {
1194 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1195 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1196 }
1197 else
1198 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001199 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001200 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running",
1201 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001202 sb_error.SetErrorString("process is running");
1203 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001204 }
1205
Greg Clayton48381312010-10-30 04:51:46 +00001206 if (log)
1207 {
1208 SBStream sstr;
1209 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001210 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001211 static_cast<void*>(process_sp.get()), addr,
1212 static_cast<const void*>(src),
1213 static_cast<uint64_t>(src_len),
1214 static_cast<void*>(sb_error.get()), sstr.GetData(),
1215 static_cast<uint64_t>(bytes_written));
Greg Clayton48381312010-10-30 04:51:46 +00001216 }
1217
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001218 return bytes_written;
1219}
1220
Caroline Ticedde9cff2010-09-20 05:20:02 +00001221bool
1222SBProcess::GetDescription (SBStream &description)
1223{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001224 Stream &strm = description.ref();
1225
Greg Claytonacdbe812012-01-30 09:04:36 +00001226 ProcessSP process_sp(GetSP());
1227 if (process_sp)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001228 {
1229 char path[PATH_MAX];
1230 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Claytonacdbe812012-01-30 09:04:36 +00001231 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton1d273162010-10-06 03:09:58 +00001232 const char *exe_name = NULL;
1233 if (exe_module)
1234 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1235
Daniel Malead01b2952012-11-29 21:49:15 +00001236 strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
Greg Claytonacdbe812012-01-30 09:04:36 +00001237 process_sp->GetID(),
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001238 lldb_private::StateAsCString (GetState()),
1239 GetNumThreads(),
1240 exe_name ? ", executable = " : "",
1241 exe_name ? exe_name : "");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001242 }
1243 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001244 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001245
1246 return true;
1247}
Greg Clayton8f343b02010-11-04 01:54:29 +00001248
1249uint32_t
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001250SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1251{
Greg Clayton5160ce52013-03-27 23:08:40 +00001252 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001253
1254 uint32_t num = 0;
1255 ProcessSP process_sp(GetSP());
1256 if (process_sp)
1257 {
1258 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1259 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001260 if (log)
1261 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001262 static_cast<void*>(process_sp.get()), num);
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001263 }
1264 else
1265 {
1266 sb_error.SetErrorString ("SBProcess is invalid");
1267 }
1268 return num;
1269}
1270
1271uint32_t
Greg Clayton8f343b02010-11-04 01:54:29 +00001272SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1273{
Greg Claytonacdbe812012-01-30 09:04:36 +00001274 ProcessSP process_sp(GetSP());
1275 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001276 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001277 Process::StopLocker stop_locker;
1278 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1279 {
1280 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1281 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1282 }
1283 else
1284 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001285 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001286 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001287 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running",
1288 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001289 sb_error.SetErrorString("process is running");
1290 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001291 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001292 return LLDB_INVALID_IMAGE_TOKEN;
1293}
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001294
Greg Clayton8f343b02010-11-04 01:54:29 +00001295lldb::SBError
1296SBProcess::UnloadImage (uint32_t image_token)
1297{
1298 lldb::SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +00001299 ProcessSP process_sp(GetSP());
1300 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001301 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001302 Process::StopLocker stop_locker;
1303 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1304 {
1305 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1306 sb_error.SetError (process_sp->UnloadImage (image_token));
1307 }
1308 else
1309 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001310 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001311 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001312 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running",
1313 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001314 sb_error.SetErrorString("process is running");
1315 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001316 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001317 else
1318 sb_error.SetErrorString("invalid process");
1319 return sb_error;
1320}
Jason Molenda8c713372013-11-05 11:00:35 +00001321
Jason Molendaa3329782014-03-29 18:54:20 +00001322lldb::SBError
1323SBProcess::SendEventData (const char *event_data)
1324{
1325 lldb::SBError sb_error;
1326 ProcessSP process_sp(GetSP());
1327 if (process_sp)
1328 {
1329 Process::StopLocker stop_locker;
1330 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1331 {
1332 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1333 sb_error.SetError (process_sp->SendEventData (event_data));
1334 }
1335 else
1336 {
1337 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1338 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001339 log->Printf ("SBProcess(%p)::SendEventData() => error: process is running",
1340 static_cast<void*>(process_sp.get()));
Jason Molendaa3329782014-03-29 18:54:20 +00001341 sb_error.SetErrorString("process is running");
1342 }
1343 }
1344 else
1345 sb_error.SetErrorString("invalid process");
1346 return sb_error;
1347}
1348
Jason Molenda8c713372013-11-05 11:00:35 +00001349uint32_t
Jason Molenda95d005c2013-11-06 03:07:33 +00001350SBProcess::GetNumExtendedBacktraceTypes ()
Jason Molenda8c713372013-11-05 11:00:35 +00001351{
1352 ProcessSP process_sp(GetSP());
1353 if (process_sp && process_sp->GetSystemRuntime())
1354 {
1355 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda95d005c2013-11-06 03:07:33 +00001356 return runtime->GetExtendedBacktraceTypes().size();
Jason Molenda8c713372013-11-05 11:00:35 +00001357 }
1358 return 0;
1359}
1360
1361const char *
Jason Molenda95d005c2013-11-06 03:07:33 +00001362SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx)
Jason Molenda8c713372013-11-05 11:00:35 +00001363{
1364 ProcessSP process_sp(GetSP());
1365 if (process_sp && process_sp->GetSystemRuntime())
1366 {
1367 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda008c45f2013-11-12 23:33:32 +00001368 const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes();
Jason Molenda8c713372013-11-05 11:00:35 +00001369 if (idx < names.size())
1370 {
1371 return names[idx].AsCString();
1372 }
1373 else
1374 {
1375 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1376 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001377 log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds",
1378 static_cast<void*>(process_sp.get()));
Jason Molenda8c713372013-11-05 11:00:35 +00001379 }
1380 }
1381 return NULL;
1382}
Kuba Breckaa51ea382014-09-06 01:33:13 +00001383
1384SBThreadCollection
1385SBProcess::GetHistoryThreads (addr_t addr)
1386{
1387 ProcessSP process_sp(GetSP());
1388 SBThreadCollection threads;
1389 if (process_sp)
1390 {
1391 threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1392 }
1393 return threads;
1394}
Kuba Brecka63927542014-10-11 01:59:32 +00001395
1396bool
1397SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type)
1398{
1399 ProcessSP process_sp(GetSP());
1400 if (! process_sp)
1401 return false;
1402
1403 InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type);
1404
1405 if (! runtime_sp.get())
1406 return false;
1407
1408 return runtime_sp->IsActive();
1409}