blob: 41efd86177d688e869ba04a1a442d4deef2118b8 [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"
Caroline Ticedde9cff2010-09-20 05:20:02 +000041#include "lldb/API/SBStream.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000042#include "lldb/API/SBStringList.h"
Todd Fiala802dc4022014-06-23 19:30:49 +000043#include "lldb/API/SBUnixSignals.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044
45using namespace lldb;
46using namespace lldb_private;
47
48
Chris Lattner30fdc8d2010-06-08 16:52:24 +000049SBProcess::SBProcess () :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000050 m_opaque_wp()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000051{
52}
53
54
55//----------------------------------------------------------------------
56// SBProcess constructor
57//----------------------------------------------------------------------
58
59SBProcess::SBProcess (const SBProcess& rhs) :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000060 m_opaque_wp (rhs.m_opaque_wp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000061{
62}
63
64
65SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000066 m_opaque_wp (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000067{
68}
69
Greg Claytonefabb122010-11-05 23:17:00 +000070const SBProcess&
71SBProcess::operator = (const SBProcess& rhs)
72{
73 if (this != &rhs)
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000074 m_opaque_wp = rhs.m_opaque_wp;
Greg Claytonefabb122010-11-05 23:17:00 +000075 return *this;
76}
77
Chris Lattner30fdc8d2010-06-08 16:52:24 +000078//----------------------------------------------------------------------
79// Destructor
80//----------------------------------------------------------------------
81SBProcess::~SBProcess()
82{
83}
84
Jim Ingham4bddaeb2012-02-16 06:50:00 +000085const char *
86SBProcess::GetBroadcasterClassName ()
87{
88 return Process::GetStaticBroadcasterClass().AsCString();
89}
90
Jim Inghamd7b30ef2012-10-26 19:18:04 +000091const char *
92SBProcess::GetPluginName ()
93{
94 ProcessSP process_sp(GetSP());
95 if (process_sp)
96 {
Greg Clayton57abc5d2013-05-10 21:47:16 +000097 return process_sp->GetPluginName().GetCString();
Jim Inghamd7b30ef2012-10-26 19:18:04 +000098 }
99 return "<Unknown>";
100}
101
102const char *
103SBProcess::GetShortPluginName ()
104{
105 ProcessSP process_sp(GetSP());
106 if (process_sp)
107 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000108 return process_sp->GetPluginName().GetCString();
Jim Inghamd7b30ef2012-10-26 19:18:04 +0000109 }
110 return "<Unknown>";
111}
112
113
Greg Claytonb9556ac2012-01-30 07:41:31 +0000114lldb::ProcessSP
115SBProcess::GetSP() const
116{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000117 return m_opaque_wp.lock();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000118}
119
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000120void
Greg Claytonb9556ac2012-01-30 07:41:31 +0000121SBProcess::SetSP (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000122{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000123 m_opaque_wp = process_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000124}
125
126void
127SBProcess::Clear ()
128{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000129 m_opaque_wp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000130}
131
132
133bool
134SBProcess::IsValid() const
135{
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000136 ProcessSP process_sp(m_opaque_wp.lock());
137 return ((bool) process_sp && process_sp->IsValid());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000138}
139
James McIlree9631aae2011-03-04 00:31:13 +0000140bool
141SBProcess::RemoteLaunch (char const **argv,
142 char const **envp,
143 const char *stdin_path,
144 const char *stdout_path,
145 const char *stderr_path,
146 const char *working_directory,
147 uint32_t launch_flags,
148 bool stop_at_entry,
149 lldb::SBError& error)
150{
Greg Clayton5160ce52013-03-27 23:08:40 +0000151 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000152 if (log)
James McIlree9631aae2011-03-04 00:31:13 +0000153 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 +0000154 static_cast<void*>(m_opaque_wp.lock().get()),
155 static_cast<void*>(argv), static_cast<void*>(envp),
156 stdin_path ? stdin_path : "NULL",
157 stdout_path ? stdout_path : "NULL",
158 stderr_path ? stderr_path : "NULL",
James McIlree9631aae2011-03-04 00:31:13 +0000159 working_directory ? working_directory : "NULL",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000160 launch_flags, stop_at_entry,
161 static_cast<void*>(error.get()));
162
Greg Claytonacdbe812012-01-30 09:04:36 +0000163 ProcessSP process_sp(GetSP());
164 if (process_sp)
James McIlree9631aae2011-03-04 00:31:13 +0000165 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000166 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
167 if (process_sp->GetState() == eStateConnected)
James McIlree9631aae2011-03-04 00:31:13 +0000168 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000169 if (stop_at_entry)
170 launch_flags |= eLaunchFlagStopAtEntry;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000171 ProcessLaunchInfo launch_info (stdin_path,
Greg Claytonc9858e42012-04-06 02:17:47 +0000172 stdout_path,
173 stderr_path,
174 working_directory,
175 launch_flags);
176 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
177 if (exe_module)
Greg Clayton14715c62013-06-29 00:10:32 +0000178 launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
Greg Claytonc9858e42012-04-06 02:17:47 +0000179 if (argv)
180 launch_info.GetArguments().AppendArguments (argv);
181 if (envp)
182 launch_info.GetEnvironmentEntries ().SetArguments (envp);
183 error.SetError (process_sp->Launch (launch_info));
James McIlree9631aae2011-03-04 00:31:13 +0000184 }
185 else
186 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000187 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
James McIlree9631aae2011-03-04 00:31:13 +0000188 }
189 }
190 else
191 {
192 error.SetErrorString ("unable to attach pid");
193 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000194
James McIlree9631aae2011-03-04 00:31:13 +0000195 if (log) {
196 SBStream sstr;
197 error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000198 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s",
199 static_cast<void*>(process_sp.get()),
200 static_cast<void*>(error.get()), sstr.GetData());
James McIlree9631aae2011-03-04 00:31:13 +0000201 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000202
James McIlree9631aae2011-03-04 00:31:13 +0000203 return error.Success();
204}
205
206bool
207SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
208{
Greg Claytonacdbe812012-01-30 09:04:36 +0000209 ProcessSP process_sp(GetSP());
210 if (process_sp)
James McIlree9631aae2011-03-04 00:31:13 +0000211 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000212 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
213 if (process_sp->GetState() == eStateConnected)
James McIlree9631aae2011-03-04 00:31:13 +0000214 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000215 ProcessAttachInfo attach_info;
216 attach_info.SetProcessID (pid);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000217 error.SetError (process_sp->Attach (attach_info));
James McIlree9631aae2011-03-04 00:31:13 +0000218 }
219 else
220 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000221 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
James McIlree9631aae2011-03-04 00:31:13 +0000222 }
223 }
224 else
225 {
226 error.SetErrorString ("unable to attach pid");
227 }
228
Greg Clayton5160ce52013-03-27 23:08:40 +0000229 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
James McIlree9631aae2011-03-04 00:31:13 +0000230 if (log) {
231 SBStream sstr;
232 error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000233 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s",
234 static_cast<void*>(process_sp.get()), pid,
235 static_cast<void*>(error.get()), sstr.GetData());
James McIlree9631aae2011-03-04 00:31:13 +0000236 }
237
238 return error.Success();
239}
240
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000241
242uint32_t
243SBProcess::GetNumThreads ()
244{
Greg Clayton5160ce52013-03-27 23:08:40 +0000245 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000246
Caroline Ticeceb6b132010-10-26 03:11:13 +0000247 uint32_t num_threads = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000248 ProcessSP process_sp(GetSP());
249 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000250 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000251 Process::StopLocker stop_locker;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000252
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000253 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Claytonacdbe812012-01-30 09:04:36 +0000254 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000255 num_threads = process_sp->GetThreadList().GetSize(can_update);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000256 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000257
258 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000259 log->Printf ("SBProcess(%p)::GetNumThreads () => %d",
260 static_cast<void*>(process_sp.get()), num_threads);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000261
262 return num_threads;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000263}
264
265SBThread
Jim Ingham2976d002010-08-26 21:32:51 +0000266SBProcess::GetSelectedThread () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000267{
Greg Clayton5160ce52013-03-27 23:08:40 +0000268 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000269
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000270 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000271 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000272 ProcessSP process_sp(GetSP());
273 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000274 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000275 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
276 thread_sp = process_sp->GetThreadList().GetSelectedThread();
Greg Clayton17a6ad02012-01-30 02:53:15 +0000277 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000278 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000279
280 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000281 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)",
282 static_cast<void*>(process_sp.get()),
283 static_cast<void*>(thread_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000284
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000285 return sb_thread;
286}
287
Greg Claytona4d87472013-01-18 23:41:08 +0000288SBThread
289SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context)
290{
Greg Clayton5160ce52013-03-27 23:08:40 +0000291 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000292
Greg Claytona4d87472013-01-18 23:41:08 +0000293 SBThread sb_thread;
294 ThreadSP thread_sp;
295 ProcessSP process_sp(GetSP());
296 if (process_sp)
297 {
298 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
299 thread_sp = process_sp->CreateOSPluginThread(tid, context);
300 sb_thread.SetThread (thread_sp);
301 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000302
Greg Claytona4d87472013-01-18 23:41:08 +0000303 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000304 log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)",
305 static_cast<void*>(process_sp.get()), tid, context,
306 static_cast<void*>(thread_sp.get()));
307
Greg Claytona4d87472013-01-18 23:41:08 +0000308 return sb_thread;
309}
310
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000311SBTarget
312SBProcess::GetTarget() const
313{
Greg Clayton5160ce52013-03-27 23:08:40 +0000314 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000315
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000316 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000317 TargetSP target_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000318 ProcessSP process_sp(GetSP());
319 if (process_sp)
Greg Claytonb9556ac2012-01-30 07:41:31 +0000320 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000321 target_sp = process_sp->GetTarget().shared_from_this();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000322 sb_target.SetSP (target_sp);
323 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000324
Caroline Ticeceb6b132010-10-26 03:11:13 +0000325 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000326 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)",
327 static_cast<void*>(process_sp.get()),
328 static_cast<void*>(target_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000329
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000330 return sb_target;
331}
332
333
334size_t
335SBProcess::PutSTDIN (const char *src, size_t src_len)
336{
Greg Clayton5160ce52013-03-27 23:08:40 +0000337 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000338
Caroline Ticeceb6b132010-10-26 03:11:13 +0000339 size_t ret_val = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000340 ProcessSP process_sp(GetSP());
341 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000342 {
343 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000344 ret_val = process_sp->PutSTDIN (src, src_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000345 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000346
Caroline Ticeceb6b132010-10-26 03:11:13 +0000347 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000348 log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 ") => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000349 static_cast<void*>(process_sp.get()), src,
350 static_cast<uint64_t>(src_len),
351 static_cast<uint64_t>(ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000352
353 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000354}
355
356size_t
357SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
358{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000359 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000360 ProcessSP process_sp(GetSP());
361 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000362 {
363 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000364 bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000365 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000366
Greg Clayton5160ce52013-03-27 23:08:40 +0000367 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000368 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000369 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000370 static_cast<void*>(process_sp.get()),
371 static_cast<int>(bytes_read), dst,
372 static_cast<uint64_t>(dst_len),
373 static_cast<uint64_t>(bytes_read));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000374
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000375 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000376}
377
378size_t
379SBProcess::GetSTDERR (char *dst, size_t dst_len) const
380{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000381 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000382 ProcessSP process_sp(GetSP());
383 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000384 {
385 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000386 bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000387 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000388
Greg Clayton5160ce52013-03-27 23:08:40 +0000389 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000390 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000391 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000392 static_cast<void*>(process_sp.get()),
393 static_cast<int>(bytes_read), dst,
394 static_cast<uint64_t>(dst_len),
395 static_cast<uint64_t>(bytes_read));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000396
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000397 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000398}
399
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000400size_t
401SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const
402{
403 size_t bytes_read = 0;
404 ProcessSP process_sp(GetSP());
405 if (process_sp)
406 {
407 Error error;
408 bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error);
409 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000410
Greg Clayton5160ce52013-03-27 23:08:40 +0000411 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000412 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000413 log->Printf ("SBProcess(%p)::GetProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000414 static_cast<void*>(process_sp.get()),
415 static_cast<int>(bytes_read), dst,
416 static_cast<uint64_t>(dst_len),
417 static_cast<uint64_t>(bytes_read));
418
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000419 return bytes_read;
420}
421
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000422void
Jim Ingham2976d002010-08-26 21:32:51 +0000423SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000424{
425 if (out == NULL)
426 return;
427
Greg Claytonacdbe812012-01-30 09:04:36 +0000428 ProcessSP process_sp(GetSP());
429 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000430 {
431 const StateType event_state = SBProcess::GetStateFromEvent (event);
432 char message[1024];
433 int message_len = ::snprintf (message,
434 sizeof (message),
Daniel Malead01b2952012-11-29 21:49:15 +0000435 "Process %" PRIu64 " %s\n",
Greg Claytonacdbe812012-01-30 09:04:36 +0000436 process_sp->GetID(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000437 SBDebugger::StateAsCString (event_state));
438
439 if (message_len > 0)
440 ::fwrite (message, 1, message_len, out);
441 }
442}
443
444void
Jim Ingham2976d002010-08-26 21:32:51 +0000445SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000446{
Greg Claytonacdbe812012-01-30 09:04:36 +0000447 ProcessSP process_sp(GetSP());
448 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000449 {
450 const StateType event_state = SBProcess::GetStateFromEvent (event);
451 char message[1024];
452 ::snprintf (message,
453 sizeof (message),
Daniel Malead01b2952012-11-29 21:49:15 +0000454 "Process %" PRIu64 " %s\n",
Greg Claytonacdbe812012-01-30 09:04:36 +0000455 process_sp->GetID(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000456 SBDebugger::StateAsCString (event_state));
457
458 result.AppendMessage (message);
459 }
460}
461
462bool
Jim Ingham2976d002010-08-26 21:32:51 +0000463SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000464{
Greg Claytonacdbe812012-01-30 09:04:36 +0000465 ProcessSP process_sp(GetSP());
466 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000467 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000468 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
469 return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000470 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000471 return false;
472}
473
474bool
Greg Claytonea561dc2012-10-12 23:32:11 +0000475SBProcess::SetSelectedThreadByID (lldb::tid_t tid)
476{
Greg Clayton5160ce52013-03-27 23:08:40 +0000477 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000478
Caroline Ticeceb6b132010-10-26 03:11:13 +0000479 bool ret_val = false;
Greg Claytonacdbe812012-01-30 09:04:36 +0000480 ProcessSP process_sp(GetSP());
481 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000482 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000483 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
484 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000485 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000486
487 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000488 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000489 static_cast<void*>(process_sp.get()), tid,
490 (ret_val ? "true" : "false"));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000491
492 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000493}
494
Jim Ingham18b46892012-07-13 20:18:18 +0000495bool
496SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
497{
Greg Clayton5160ce52013-03-27 23:08:40 +0000498 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000499
500 bool ret_val = false;
501 ProcessSP process_sp(GetSP());
502 if (process_sp)
503 {
504 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
505 ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
506 }
507
508 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000509 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
510 static_cast<void*>(process_sp.get()), index_id,
511 (ret_val ? "true" : "false"));
Jim Ingham18b46892012-07-13 20:18:18 +0000512
513 return ret_val;
514}
515
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000516SBThread
517SBProcess::GetThreadAtIndex (size_t index)
518{
Greg Clayton5160ce52013-03-27 23:08:40 +0000519 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000520
Greg Clayton17a6ad02012-01-30 02:53:15 +0000521 SBThread sb_thread;
522 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000523 ProcessSP process_sp(GetSP());
524 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000525 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000526 Process::StopLocker stop_locker;
527 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Greg Claytonacdbe812012-01-30 09:04:36 +0000528 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000529 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000530 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000531 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000532
533 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000534 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000535 static_cast<void*>(process_sp.get()),
536 static_cast<uint32_t>(index),
537 static_cast<void*>(thread_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000538
Greg Clayton17a6ad02012-01-30 02:53:15 +0000539 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000540}
541
Jim Inghambf2956a22013-01-08 23:22:42 +0000542uint32_t
Jason Molenda5e8dce42013-12-13 00:29:16 +0000543SBProcess::GetNumQueues ()
544{
545 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
546
547 uint32_t num_queues = 0;
548 ProcessSP process_sp(GetSP());
549 if (process_sp)
550 {
551 Process::StopLocker stop_locker;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000552
Jason Molenda5e8dce42013-12-13 00:29:16 +0000553 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
554 num_queues = process_sp->GetQueueList().GetSize();
555 }
556
557 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000558 log->Printf ("SBProcess(%p)::GetNumQueues () => %d",
559 static_cast<void*>(process_sp.get()), num_queues);
Jason Molenda5e8dce42013-12-13 00:29:16 +0000560
561 return num_queues;
562}
563
564SBQueue
565SBProcess::GetQueueAtIndex (size_t index)
566{
567 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
568
569 SBQueue sb_queue;
570 QueueSP queue_sp;
571 ProcessSP process_sp(GetSP());
572 if (process_sp)
573 {
574 Process::StopLocker stop_locker;
575 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
576 queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
577 sb_queue.SetQueue (queue_sp);
578 }
579
580 if (log)
Jason Molenda5e8dce42013-12-13 00:29:16 +0000581 log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000582 static_cast<void*>(process_sp.get()),
583 static_cast<uint32_t>(index),
584 static_cast<void*>(queue_sp.get()));
Jason Molenda5e8dce42013-12-13 00:29:16 +0000585
586 return sb_queue;
587}
588
589
590uint32_t
Jim Inghambf2956a22013-01-08 23:22:42 +0000591SBProcess::GetStopID(bool include_expression_stops)
592{
593 ProcessSP process_sp(GetSP());
594 if (process_sp)
595 {
596 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
597 if (include_expression_stops)
598 return process_sp->GetStopID();
599 else
600 return process_sp->GetLastNaturalStopID();
601 }
602 return 0;
603}
604
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000605StateType
606SBProcess::GetState ()
607{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000608
Caroline Ticeceb6b132010-10-26 03:11:13 +0000609 StateType ret_val = eStateInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000610 ProcessSP process_sp(GetSP());
611 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000612 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000613 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
614 ret_val = process_sp->GetState();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000615 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000616
Greg Clayton5160ce52013-03-27 23:08:40 +0000617 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000618 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000619 log->Printf ("SBProcess(%p)::GetState () => %s",
620 static_cast<void*>(process_sp.get()),
Caroline Tice750cd172010-10-26 23:49:36 +0000621 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000622
623 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000624}
625
626
627int
628SBProcess::GetExitStatus ()
629{
Greg Clayton48381312010-10-30 04:51:46 +0000630 int exit_status = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000631 ProcessSP process_sp(GetSP());
632 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000633 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000634 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
635 exit_status = process_sp->GetExitStatus ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000636 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000637 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000638 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000639 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
640 static_cast<void*>(process_sp.get()), exit_status,
641 exit_status);
Greg Clayton48381312010-10-30 04:51:46 +0000642
643 return exit_status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000644}
645
646const char *
647SBProcess::GetExitDescription ()
648{
Greg Clayton48381312010-10-30 04:51:46 +0000649 const char *exit_desc = NULL;
Greg Claytonacdbe812012-01-30 09:04:36 +0000650 ProcessSP process_sp(GetSP());
651 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000652 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000653 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
654 exit_desc = process_sp->GetExitDescription ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000655 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000656 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000657 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000658 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
659 static_cast<void*>(process_sp.get()), exit_desc);
Greg Clayton48381312010-10-30 04:51:46 +0000660 return exit_desc;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000661}
662
663lldb::pid_t
664SBProcess::GetProcessID ()
665{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000666 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Claytonacdbe812012-01-30 09:04:36 +0000667 ProcessSP process_sp(GetSP());
668 if (process_sp)
669 ret_val = process_sp->GetID();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000670
Greg Clayton5160ce52013-03-27 23:08:40 +0000671 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000672 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000673 log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64,
674 static_cast<void*>(process_sp.get()), ret_val);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000675
676 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000677}
678
Greg Clayton949e8222013-01-16 17:29:04 +0000679uint32_t
680SBProcess::GetUniqueID()
681{
682 uint32_t ret_val = 0;
683 ProcessSP process_sp(GetSP());
684 if (process_sp)
685 ret_val = process_sp->GetUniqueID();
Greg Clayton5160ce52013-03-27 23:08:40 +0000686 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton949e8222013-01-16 17:29:04 +0000687 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000688 log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32,
689 static_cast<void*>(process_sp.get()), ret_val);
Greg Clayton949e8222013-01-16 17:29:04 +0000690 return ret_val;
691}
692
Johnny Chencf386e22011-03-01 22:56:31 +0000693ByteOrder
694SBProcess::GetByteOrder () const
695{
696 ByteOrder byteOrder = eByteOrderInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000697 ProcessSP process_sp(GetSP());
698 if (process_sp)
699 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000700
Greg Clayton5160ce52013-03-27 23:08:40 +0000701 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chencf386e22011-03-01 22:56:31 +0000702 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000703 log->Printf ("SBProcess(%p)::GetByteOrder () => %d",
704 static_cast<void*>(process_sp.get()), byteOrder);
Johnny Chencf386e22011-03-01 22:56:31 +0000705
706 return byteOrder;
707}
708
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000709uint32_t
710SBProcess::GetAddressByteSize () const
711{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000712 uint32_t size = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000713 ProcessSP process_sp(GetSP());
714 if (process_sp)
715 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000716
Greg Clayton5160ce52013-03-27 23:08:40 +0000717 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000718 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000719 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d",
720 static_cast<void*>(process_sp.get()), size);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000721
722 return size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000723}
724
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000725SBError
726SBProcess::Continue ()
727{
Greg Clayton5160ce52013-03-27 23:08:40 +0000728 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000729
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000730 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000731 ProcessSP process_sp(GetSP());
732
733 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000734 log->Printf ("SBProcess(%p)::Continue ()...",
735 static_cast<void*>(process_sp.get()));
Greg Claytonacdbe812012-01-30 09:04:36 +0000736
737 if (process_sp)
Greg Clayton5d5028b2010-10-06 03:53:16 +0000738 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000739 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000740
Greg Claytonacdbe812012-01-30 09:04:36 +0000741 Error error (process_sp->Resume());
Greg Clayton5d5028b2010-10-06 03:53:16 +0000742 if (error.Success())
743 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000744 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution () == false)
Greg Clayton48381312010-10-30 04:51:46 +0000745 {
746 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000747 log->Printf ("SBProcess(%p)::Continue () waiting for process to stop...",
748 static_cast<void*>(process_sp.get()));
Greg Claytonacdbe812012-01-30 09:04:36 +0000749 process_sp->WaitForProcessToStop (NULL);
Greg Clayton48381312010-10-30 04:51:46 +0000750 }
Greg Clayton5d5028b2010-10-06 03:53:16 +0000751 }
752 sb_error.SetError(error);
753 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000754 else
755 sb_error.SetErrorString ("SBProcess is invalid");
756
Caroline Ticeceb6b132010-10-26 03:11:13 +0000757 if (log)
758 {
759 SBStream sstr;
760 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000761 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s",
762 static_cast<void*>(process_sp.get()),
763 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000764 }
765
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000766 return sb_error;
767}
768
769
770SBError
771SBProcess::Destroy ()
772{
773 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000774 ProcessSP process_sp(GetSP());
775 if (process_sp)
Greg Clayton6779606a2011-01-22 23:43:18 +0000776 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000777 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
778 sb_error.SetError(process_sp->Destroy());
Greg Clayton6779606a2011-01-22 23:43:18 +0000779 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000780 else
781 sb_error.SetErrorString ("SBProcess is invalid");
782
Greg Clayton5160ce52013-03-27 23:08:40 +0000783 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000784 if (log)
785 {
786 SBStream sstr;
787 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000788 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
789 static_cast<void*>(process_sp.get()),
790 static_cast<void*>(sb_error.get()), sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000791 }
792
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000793 return sb_error;
794}
795
796
797SBError
798SBProcess::Stop ()
799{
800 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000801 ProcessSP process_sp(GetSP());
802 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000803 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000804 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
805 sb_error.SetError (process_sp->Halt());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000806 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000807 else
808 sb_error.SetErrorString ("SBProcess is invalid");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000809
Greg Clayton5160ce52013-03-27 23:08:40 +0000810 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000811 if (log)
812 {
813 SBStream sstr;
814 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000815 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
816 static_cast<void*>(process_sp.get()),
817 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000818 }
819
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000820 return sb_error;
821}
822
823SBError
824SBProcess::Kill ()
825{
826 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000827 ProcessSP process_sp(GetSP());
828 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000829 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000830 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
831 sb_error.SetError (process_sp->Destroy());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000832 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000833 else
834 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000835
Greg Clayton5160ce52013-03-27 23:08:40 +0000836 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000837 if (log)
838 {
839 SBStream sstr;
840 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000841 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
842 static_cast<void*>(process_sp.get()),
843 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000844 }
845
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000846 return sb_error;
847}
848
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000849SBError
850SBProcess::Detach ()
851{
Jim Inghamacff8952013-05-02 00:27:30 +0000852 // FIXME: This should come from a process default.
853 bool keep_stopped = false;
854 return Detach (keep_stopped);
855}
856
857SBError
858SBProcess::Detach (bool keep_stopped)
859{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000860 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000861 ProcessSP process_sp(GetSP());
862 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000863 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000864 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Jim Inghamacff8952013-05-02 00:27:30 +0000865 sb_error.SetError (process_sp->Detach(keep_stopped));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000866 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000867 else
868 sb_error.SetErrorString ("SBProcess is invalid");
869
870 return sb_error;
871}
872
873SBError
Greg Clayton48381312010-10-30 04:51:46 +0000874SBProcess::Signal (int signo)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000875{
876 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000877 ProcessSP process_sp(GetSP());
878 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000879 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000880 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
881 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000882 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000883 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000884 sb_error.SetErrorString ("SBProcess is invalid");
Greg Clayton5160ce52013-03-27 23:08:40 +0000885 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000886 if (log)
887 {
888 SBStream sstr;
889 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000890 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
891 static_cast<void*>(process_sp.get()), signo,
892 static_cast<void*>(sb_error.get()), sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000893 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000894 return sb_error;
895}
896
Todd Fiala802dc4022014-06-23 19:30:49 +0000897SBUnixSignals
898SBProcess::GetUnixSignals()
899{
900 SBUnixSignals sb_unix_signals;
901 ProcessSP process_sp(GetSP());
902 if (process_sp)
903 {
904 sb_unix_signals.SetSP(process_sp);
905 }
906
907 return sb_unix_signals;
908}
909
Jim Inghamcfc09352012-07-27 23:57:19 +0000910void
911SBProcess::SendAsyncInterrupt ()
912{
913 ProcessSP process_sp(GetSP());
914 if (process_sp)
915 {
916 process_sp->SendAsyncInterrupt ();
917 }
918}
919
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000920SBThread
Greg Clayton48381312010-10-30 04:51:46 +0000921SBProcess::GetThreadByID (tid_t tid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000922{
Greg Clayton48381312010-10-30 04:51:46 +0000923 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000924 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000925 ProcessSP process_sp(GetSP());
926 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000927 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000928 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000929 Process::StopLocker stop_locker;
930 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
931 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000932 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000933 }
Greg Clayton48381312010-10-30 04:51:46 +0000934
Greg Clayton5160ce52013-03-27 23:08:40 +0000935 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000936 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000937 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000938 static_cast<void*>(process_sp.get()), tid,
939 static_cast<void*>(thread_sp.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000940
941 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000942}
943
Jim Ingham18b46892012-07-13 20:18:18 +0000944SBThread
945SBProcess::GetThreadByIndexID (uint32_t index_id)
946{
947 SBThread sb_thread;
948 ThreadSP thread_sp;
949 ProcessSP process_sp(GetSP());
950 if (process_sp)
951 {
952 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
953 Process::StopLocker stop_locker;
954 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
955 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
956 sb_thread.SetThread (thread_sp);
957 }
958
Greg Clayton5160ce52013-03-27 23:08:40 +0000959 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000960 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000961 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
962 static_cast<void*>(process_sp.get()), index_id,
963 static_cast<void*>(thread_sp.get()));
Jim Ingham18b46892012-07-13 20:18:18 +0000964
965 return sb_thread;
966}
967
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000968StateType
969SBProcess::GetStateFromEvent (const SBEvent &event)
970{
Greg Clayton5160ce52013-03-27 23:08:40 +0000971 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000972
Caroline Ticeceb6b132010-10-26 03:11:13 +0000973 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000974
Caroline Ticeceb6b132010-10-26 03:11:13 +0000975 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000976 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
977 static_cast<void*>(event.get()),
Caroline Tice750cd172010-10-26 23:49:36 +0000978 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000979
980 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000981}
982
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000983bool
984SBProcess::GetRestartedFromEvent (const SBEvent &event)
985{
Greg Clayton66111032010-06-23 01:19:29 +0000986 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000987}
988
Jim Ingham0161b492013-02-09 01:29:05 +0000989size_t
990SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
991{
992 return Process::ProcessEventData::GetNumRestartedReasons(event.get());
993}
994
995const char *
996SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
997{
998 return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
999}
1000
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001001SBProcess
1002SBProcess::GetProcessFromEvent (const SBEvent &event)
1003{
Greg Clayton66111032010-06-23 01:19:29 +00001004 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001005 return process;
1006}
1007
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001008bool
1009SBProcess::EventIsProcessEvent (const SBEvent &event)
1010{
Jim Ingham4bddaeb2012-02-16 06:50:00 +00001011 return strcmp (event.GetBroadcasterClass(), SBProcess::GetBroadcasterClass()) == 0;
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001012}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001013
1014SBBroadcaster
1015SBProcess::GetBroadcaster () const
1016{
Greg Clayton5160ce52013-03-27 23:08:40 +00001017 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001018
Greg Claytonacdbe812012-01-30 09:04:36 +00001019 ProcessSP process_sp(GetSP());
1020
1021 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001022
1023 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001024 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
1025 static_cast<void*>(process_sp.get()),
1026 static_cast<void*>(broadcaster.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001027
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001028 return broadcaster;
1029}
1030
Jim Ingham4bddaeb2012-02-16 06:50:00 +00001031const char *
1032SBProcess::GetBroadcasterClass ()
1033{
1034 return Process::GetStaticBroadcasterClass().AsCString();
1035}
1036
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001037size_t
1038SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
1039{
Greg Clayton5160ce52013-03-27 23:08:40 +00001040 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001041
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001042 size_t bytes_read = 0;
1043
Greg Claytonacdbe812012-01-30 09:04:36 +00001044 ProcessSP process_sp(GetSP());
1045
Greg Clayton48381312010-10-30 04:51:46 +00001046 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001047 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001048 static_cast<void*>(process_sp.get()), addr,
1049 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1050 static_cast<void*>(sb_error.get()));
1051
Greg Claytonacdbe812012-01-30 09:04:36 +00001052 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001053 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001054 Process::StopLocker stop_locker;
1055 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1056 {
1057 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1058 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
1059 }
1060 else
1061 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001062 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001063 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running",
1064 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001065 sb_error.SetErrorString("process is running");
1066 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001067 }
1068 else
1069 {
1070 sb_error.SetErrorString ("SBProcess is invalid");
1071 }
1072
Caroline Ticeceb6b132010-10-26 03:11:13 +00001073 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +00001074 {
1075 SBStream sstr;
1076 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001077 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001078 static_cast<void*>(process_sp.get()), addr,
1079 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1080 static_cast<void*>(sb_error.get()), sstr.GetData(),
1081 static_cast<uint64_t>(bytes_read));
Greg Clayton93aa84e2010-10-29 04:59:35 +00001082 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001083
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001084 return bytes_read;
1085}
1086
1087size_t
Greg Claytone91b7952011-12-15 03:14:23 +00001088SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1089{
1090 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001091 ProcessSP process_sp(GetSP());
1092 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001093 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001094 Process::StopLocker stop_locker;
1095 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1096 {
1097 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1098 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
1099 }
1100 else
1101 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001102 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001103 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001104 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running",
1105 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001106 sb_error.SetErrorString("process is running");
1107 }
Greg Claytone91b7952011-12-15 03:14:23 +00001108 }
1109 else
1110 {
1111 sb_error.SetErrorString ("SBProcess is invalid");
1112 }
1113 return bytes_read;
1114}
1115
1116uint64_t
1117SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1118{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001119 uint64_t value = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001120 ProcessSP process_sp(GetSP());
1121 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001122 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001123 Process::StopLocker stop_locker;
1124 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1125 {
1126 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1127 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
1128 }
1129 else
1130 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001131 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001132 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001133 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running",
1134 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001135 sb_error.SetErrorString("process is running");
1136 }
Greg Claytone91b7952011-12-15 03:14:23 +00001137 }
1138 else
1139 {
1140 sb_error.SetErrorString ("SBProcess is invalid");
1141 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001142 return value;
Greg Claytone91b7952011-12-15 03:14:23 +00001143}
1144
1145lldb::addr_t
1146SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1147{
1148 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Claytonacdbe812012-01-30 09:04:36 +00001149 ProcessSP process_sp(GetSP());
1150 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001151 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001152 Process::StopLocker stop_locker;
1153 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1154 {
1155 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1156 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1157 }
1158 else
1159 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001160 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001161 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001162 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running",
1163 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001164 sb_error.SetErrorString("process is running");
1165 }
Greg Claytone91b7952011-12-15 03:14:23 +00001166 }
1167 else
1168 {
1169 sb_error.SetErrorString ("SBProcess is invalid");
1170 }
1171 return ptr;
1172}
1173
1174size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001175SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1176{
1177 size_t bytes_written = 0;
1178
Greg Clayton5160ce52013-03-27 23:08:40 +00001179 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonacdbe812012-01-30 09:04:36 +00001180
1181 ProcessSP process_sp(GetSP());
1182
Greg Clayton48381312010-10-30 04:51:46 +00001183 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001184 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001185 static_cast<void*>(process_sp.get()), addr,
1186 static_cast<const void*>(src),
1187 static_cast<uint64_t>(src_len),
1188 static_cast<void*>(sb_error.get()));
Greg Clayton48381312010-10-30 04:51:46 +00001189
Greg Claytonacdbe812012-01-30 09:04:36 +00001190 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001191 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001192 Process::StopLocker stop_locker;
1193 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1194 {
1195 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1196 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1197 }
1198 else
1199 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001200 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001201 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running",
1202 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001203 sb_error.SetErrorString("process is running");
1204 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001205 }
1206
Greg Clayton48381312010-10-30 04:51:46 +00001207 if (log)
1208 {
1209 SBStream sstr;
1210 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001211 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001212 static_cast<void*>(process_sp.get()), addr,
1213 static_cast<const void*>(src),
1214 static_cast<uint64_t>(src_len),
1215 static_cast<void*>(sb_error.get()), sstr.GetData(),
1216 static_cast<uint64_t>(bytes_written));
Greg Clayton48381312010-10-30 04:51:46 +00001217 }
1218
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001219 return bytes_written;
1220}
1221
Caroline Ticedde9cff2010-09-20 05:20:02 +00001222bool
1223SBProcess::GetDescription (SBStream &description)
1224{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001225 Stream &strm = description.ref();
1226
Greg Claytonacdbe812012-01-30 09:04:36 +00001227 ProcessSP process_sp(GetSP());
1228 if (process_sp)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001229 {
1230 char path[PATH_MAX];
1231 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Claytonacdbe812012-01-30 09:04:36 +00001232 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton1d273162010-10-06 03:09:58 +00001233 const char *exe_name = NULL;
1234 if (exe_module)
1235 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1236
Daniel Malead01b2952012-11-29 21:49:15 +00001237 strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
Greg Claytonacdbe812012-01-30 09:04:36 +00001238 process_sp->GetID(),
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001239 lldb_private::StateAsCString (GetState()),
1240 GetNumThreads(),
1241 exe_name ? ", executable = " : "",
1242 exe_name ? exe_name : "");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001243 }
1244 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001245 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001246
1247 return true;
1248}
Greg Clayton8f343b02010-11-04 01:54:29 +00001249
1250uint32_t
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001251SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1252{
Greg Clayton5160ce52013-03-27 23:08:40 +00001253 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001254
1255 uint32_t num = 0;
1256 ProcessSP process_sp(GetSP());
1257 if (process_sp)
1258 {
1259 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1260 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001261 if (log)
1262 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001263 static_cast<void*>(process_sp.get()), num);
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001264 }
1265 else
1266 {
1267 sb_error.SetErrorString ("SBProcess is invalid");
1268 }
1269 return num;
1270}
1271
1272uint32_t
Greg Clayton8f343b02010-11-04 01:54:29 +00001273SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1274{
Greg Claytonacdbe812012-01-30 09:04:36 +00001275 ProcessSP process_sp(GetSP());
1276 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001277 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001278 Process::StopLocker stop_locker;
1279 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1280 {
1281 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1282 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1283 }
1284 else
1285 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001286 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001287 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001288 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running",
1289 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001290 sb_error.SetErrorString("process is running");
1291 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001292 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001293 return LLDB_INVALID_IMAGE_TOKEN;
1294}
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001295
Greg Clayton8f343b02010-11-04 01:54:29 +00001296lldb::SBError
1297SBProcess::UnloadImage (uint32_t image_token)
1298{
1299 lldb::SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +00001300 ProcessSP process_sp(GetSP());
1301 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001302 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001303 Process::StopLocker stop_locker;
1304 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1305 {
1306 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1307 sb_error.SetError (process_sp->UnloadImage (image_token));
1308 }
1309 else
1310 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001311 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001312 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001313 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running",
1314 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001315 sb_error.SetErrorString("process is running");
1316 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001317 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001318 else
1319 sb_error.SetErrorString("invalid process");
1320 return sb_error;
1321}
Jason Molenda8c713372013-11-05 11:00:35 +00001322
Jason Molendaa3329782014-03-29 18:54:20 +00001323lldb::SBError
1324SBProcess::SendEventData (const char *event_data)
1325{
1326 lldb::SBError sb_error;
1327 ProcessSP process_sp(GetSP());
1328 if (process_sp)
1329 {
1330 Process::StopLocker stop_locker;
1331 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1332 {
1333 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1334 sb_error.SetError (process_sp->SendEventData (event_data));
1335 }
1336 else
1337 {
1338 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1339 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001340 log->Printf ("SBProcess(%p)::SendEventData() => error: process is running",
1341 static_cast<void*>(process_sp.get()));
Jason Molendaa3329782014-03-29 18:54:20 +00001342 sb_error.SetErrorString("process is running");
1343 }
1344 }
1345 else
1346 sb_error.SetErrorString("invalid process");
1347 return sb_error;
1348}
1349
Jason Molenda8c713372013-11-05 11:00:35 +00001350uint32_t
Jason Molenda95d005c2013-11-06 03:07:33 +00001351SBProcess::GetNumExtendedBacktraceTypes ()
Jason Molenda8c713372013-11-05 11:00:35 +00001352{
1353 ProcessSP process_sp(GetSP());
1354 if (process_sp && process_sp->GetSystemRuntime())
1355 {
1356 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda95d005c2013-11-06 03:07:33 +00001357 return runtime->GetExtendedBacktraceTypes().size();
Jason Molenda8c713372013-11-05 11:00:35 +00001358 }
1359 return 0;
1360}
1361
1362const char *
Jason Molenda95d005c2013-11-06 03:07:33 +00001363SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx)
Jason Molenda8c713372013-11-05 11:00:35 +00001364{
1365 ProcessSP process_sp(GetSP());
1366 if (process_sp && process_sp->GetSystemRuntime())
1367 {
1368 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda008c45f2013-11-12 23:33:32 +00001369 const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes();
Jason Molenda8c713372013-11-05 11:00:35 +00001370 if (idx < names.size())
1371 {
1372 return names[idx].AsCString();
1373 }
1374 else
1375 {
1376 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1377 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001378 log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds",
1379 static_cast<void*>(process_sp.get()));
Jason Molenda8c713372013-11-05 11:00:35 +00001380 }
1381 }
1382 return NULL;
1383}