blob: afb4b6f17b3762a7f65cbcf20c23b840b6a2467a [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
Eli Friedman4c5de692010-06-09 07:44:37 +000010#include "lldb/API/SBProcess.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000011
Virgile Bellobdae3782013-08-28 12:14:27 +000012// C Includes
13#include <inttypes.h>
14
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015#include "lldb/lldb-defines.h"
16#include "lldb/lldb-types.h"
17
Jim Ingham40af72e2010-06-15 19:49:27 +000018#include "lldb/Interpreter/Args.h"
Greg Clayton5d5028b2010-10-06 03:53:16 +000019#include "lldb/Core/Debugger.h"
Caroline Ticeceb6b132010-10-26 03:11:13 +000020#include "lldb/Core/Log.h"
Greg Clayton1f746072012-08-29 21:13:06 +000021#include "lldb/Core/Module.h"
Adrian McCarthyf7d18932015-11-20 23:09:11 +000022#include "lldb/Core/PluginManager.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000023#include "lldb/Core/State.h"
24#include "lldb/Core/Stream.h"
25#include "lldb/Core/StreamFile.h"
26#include "lldb/Target/Process.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000027#include "lldb/Target/RegisterContext.h"
Jason Molenda8c713372013-11-05 11:00:35 +000028#include "lldb/Target/SystemRuntime.h"
Greg Clayton66111032010-06-23 01:19:29 +000029#include "lldb/Target/Target.h"
30#include "lldb/Target/Thread.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031
32// Project includes
33
Eli Friedman4c5de692010-06-09 07:44:37 +000034#include "lldb/API/SBBroadcaster.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000035#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton0e615682012-02-24 05:03:03 +000036#include "lldb/API/SBDebugger.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000037#include "lldb/API/SBEvent.h"
Greg Clayton0e615682012-02-24 05:03:03 +000038#include "lldb/API/SBFileSpec.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000039#include "lldb/API/SBThread.h"
Kuba Breckaa51ea382014-09-06 01:33:13 +000040#include "lldb/API/SBThreadCollection.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;
Chaoren Lind3173f32015-05-29 19:52:29 +0000171 ProcessLaunchInfo launch_info(FileSpec{stdin_path, false},
172 FileSpec{stdout_path, false},
173 FileSpec{stderr_path, false},
174 FileSpec{working_directory, false},
175 launch_flags);
Greg Claytonc9858e42012-04-06 02:17:47 +0000176 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)
Bruce Mitcheneradb99822015-09-22 05:07:56 +0000413 log->Printf ("SBProcess(%p)::GetAsyncProfileData (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
Ilia K38810f42015-05-20 10:15:47 +0000605SBEvent
606SBProcess::GetStopEventForStopID(uint32_t stop_id)
607{
608 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
609
610 SBEvent sb_event;
611 EventSP event_sp;
612 ProcessSP process_sp(GetSP());
613 if (process_sp)
614 {
615 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
616 event_sp = process_sp->GetStopEventForStopID(stop_id);
617 sb_event.reset(event_sp);
618 }
619
620 if (log)
621 log->Printf ("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 ") => SBEvent(%p)",
622 static_cast<void*>(process_sp.get()),
623 stop_id,
624 static_cast<void*>(event_sp.get()));
625
626 return sb_event;
627}
628
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000629StateType
630SBProcess::GetState ()
631{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000632
Caroline Ticeceb6b132010-10-26 03:11:13 +0000633 StateType ret_val = eStateInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000634 ProcessSP process_sp(GetSP());
635 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000636 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000637 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
638 ret_val = process_sp->GetState();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000639 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000640
Greg Clayton5160ce52013-03-27 23:08:40 +0000641 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000642 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000643 log->Printf ("SBProcess(%p)::GetState () => %s",
644 static_cast<void*>(process_sp.get()),
Caroline Tice750cd172010-10-26 23:49:36 +0000645 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000646
647 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000648}
649
650
651int
652SBProcess::GetExitStatus ()
653{
Greg Clayton48381312010-10-30 04:51:46 +0000654 int exit_status = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000655 ProcessSP process_sp(GetSP());
656 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000657 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000658 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
659 exit_status = process_sp->GetExitStatus ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000660 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000661 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000662 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000663 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
664 static_cast<void*>(process_sp.get()), exit_status,
665 exit_status);
Greg Clayton48381312010-10-30 04:51:46 +0000666
667 return exit_status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000668}
669
670const char *
671SBProcess::GetExitDescription ()
672{
Greg Clayton48381312010-10-30 04:51:46 +0000673 const char *exit_desc = NULL;
Greg Claytonacdbe812012-01-30 09:04:36 +0000674 ProcessSP process_sp(GetSP());
675 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000676 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000677 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
678 exit_desc = process_sp->GetExitDescription ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000679 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000680 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000681 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000682 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
683 static_cast<void*>(process_sp.get()), exit_desc);
Greg Clayton48381312010-10-30 04:51:46 +0000684 return exit_desc;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000685}
686
687lldb::pid_t
688SBProcess::GetProcessID ()
689{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000690 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Claytonacdbe812012-01-30 09:04:36 +0000691 ProcessSP process_sp(GetSP());
692 if (process_sp)
693 ret_val = process_sp->GetID();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000694
Greg Clayton5160ce52013-03-27 23:08:40 +0000695 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000696 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000697 log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64,
698 static_cast<void*>(process_sp.get()), ret_val);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000699
700 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000701}
702
Greg Clayton949e8222013-01-16 17:29:04 +0000703uint32_t
704SBProcess::GetUniqueID()
705{
706 uint32_t ret_val = 0;
707 ProcessSP process_sp(GetSP());
708 if (process_sp)
709 ret_val = process_sp->GetUniqueID();
Greg Clayton5160ce52013-03-27 23:08:40 +0000710 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton949e8222013-01-16 17:29:04 +0000711 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000712 log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32,
713 static_cast<void*>(process_sp.get()), ret_val);
Greg Clayton949e8222013-01-16 17:29:04 +0000714 return ret_val;
715}
716
Johnny Chencf386e22011-03-01 22:56:31 +0000717ByteOrder
718SBProcess::GetByteOrder () const
719{
720 ByteOrder byteOrder = eByteOrderInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000721 ProcessSP process_sp(GetSP());
722 if (process_sp)
723 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000724
Greg Clayton5160ce52013-03-27 23:08:40 +0000725 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chencf386e22011-03-01 22:56:31 +0000726 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000727 log->Printf ("SBProcess(%p)::GetByteOrder () => %d",
728 static_cast<void*>(process_sp.get()), byteOrder);
Johnny Chencf386e22011-03-01 22:56:31 +0000729
730 return byteOrder;
731}
732
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000733uint32_t
734SBProcess::GetAddressByteSize () const
735{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000736 uint32_t size = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000737 ProcessSP process_sp(GetSP());
738 if (process_sp)
739 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000740
Greg Clayton5160ce52013-03-27 23:08:40 +0000741 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000742 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000743 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d",
744 static_cast<void*>(process_sp.get()), size);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000745
746 return size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000747}
748
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000749SBError
750SBProcess::Continue ()
751{
Greg Clayton5160ce52013-03-27 23:08:40 +0000752 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000753
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000754 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000755 ProcessSP process_sp(GetSP());
756
757 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000758 log->Printf ("SBProcess(%p)::Continue ()...",
759 static_cast<void*>(process_sp.get()));
Greg Claytonacdbe812012-01-30 09:04:36 +0000760
761 if (process_sp)
Greg Clayton5d5028b2010-10-06 03:53:16 +0000762 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000763 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000764
Greg Claytondc6224e2014-10-21 01:00:42 +0000765 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution ())
766 sb_error.ref() = process_sp->Resume ();
767 else
768 sb_error.ref() = process_sp->ResumeSynchronous (NULL);
Greg Clayton5d5028b2010-10-06 03:53:16 +0000769 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000770 else
771 sb_error.SetErrorString ("SBProcess is invalid");
772
Caroline Ticeceb6b132010-10-26 03:11:13 +0000773 if (log)
774 {
775 SBStream sstr;
776 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000777 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s",
778 static_cast<void*>(process_sp.get()),
779 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000780 }
781
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000782 return sb_error;
783}
784
785
786SBError
787SBProcess::Destroy ()
788{
789 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000790 ProcessSP process_sp(GetSP());
791 if (process_sp)
Greg Clayton6779606a2011-01-22 23:43:18 +0000792 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000793 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Jason Molendaede31932015-04-17 05:01:58 +0000794 sb_error.SetError(process_sp->Destroy(false));
Greg Clayton6779606a2011-01-22 23:43:18 +0000795 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000796 else
797 sb_error.SetErrorString ("SBProcess is invalid");
798
Greg Clayton5160ce52013-03-27 23:08:40 +0000799 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000800 if (log)
801 {
802 SBStream sstr;
803 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000804 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
805 static_cast<void*>(process_sp.get()),
806 static_cast<void*>(sb_error.get()), sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000807 }
808
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000809 return sb_error;
810}
811
812
813SBError
814SBProcess::Stop ()
815{
816 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000817 ProcessSP process_sp(GetSP());
818 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000819 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000820 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
821 sb_error.SetError (process_sp->Halt());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000822 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000823 else
824 sb_error.SetErrorString ("SBProcess is invalid");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000825
Greg Clayton5160ce52013-03-27 23:08:40 +0000826 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000827 if (log)
828 {
829 SBStream sstr;
830 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000831 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
832 static_cast<void*>(process_sp.get()),
833 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000834 }
835
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000836 return sb_error;
837}
838
839SBError
840SBProcess::Kill ()
841{
842 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000843 ProcessSP process_sp(GetSP());
844 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000845 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000846 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Jason Molendaede31932015-04-17 05:01:58 +0000847 sb_error.SetError (process_sp->Destroy(true));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000848 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000849 else
850 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000851
Greg Clayton5160ce52013-03-27 23:08:40 +0000852 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000853 if (log)
854 {
855 SBStream sstr;
856 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000857 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
858 static_cast<void*>(process_sp.get()),
859 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000860 }
861
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000862 return sb_error;
863}
864
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000865SBError
866SBProcess::Detach ()
867{
Jim Inghamacff8952013-05-02 00:27:30 +0000868 // FIXME: This should come from a process default.
869 bool keep_stopped = false;
870 return Detach (keep_stopped);
871}
872
873SBError
874SBProcess::Detach (bool keep_stopped)
875{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000876 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());
Jim Inghamacff8952013-05-02 00:27:30 +0000881 sb_error.SetError (process_sp->Detach(keep_stopped));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000882 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000883 else
884 sb_error.SetErrorString ("SBProcess is invalid");
885
886 return sb_error;
887}
888
889SBError
Greg Clayton48381312010-10-30 04:51:46 +0000890SBProcess::Signal (int signo)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000891{
892 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000893 ProcessSP process_sp(GetSP());
894 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000895 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000896 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
897 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000898 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000899 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000900 sb_error.SetErrorString ("SBProcess is invalid");
Greg Clayton5160ce52013-03-27 23:08:40 +0000901 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000902 if (log)
903 {
904 SBStream sstr;
905 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000906 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
907 static_cast<void*>(process_sp.get()), signo,
908 static_cast<void*>(sb_error.get()), sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000909 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000910 return sb_error;
911}
912
Todd Fiala802dc4022014-06-23 19:30:49 +0000913SBUnixSignals
914SBProcess::GetUnixSignals()
915{
Chaoren Lin98d0a4b2015-07-14 01:09:28 +0000916 if (auto process_sp = GetSP())
917 return SBUnixSignals{process_sp};
Todd Fiala802dc4022014-06-23 19:30:49 +0000918
Chaoren Lin98d0a4b2015-07-14 01:09:28 +0000919 return {};
Todd Fiala802dc4022014-06-23 19:30:49 +0000920}
921
Jim Inghamcfc09352012-07-27 23:57:19 +0000922void
923SBProcess::SendAsyncInterrupt ()
924{
925 ProcessSP process_sp(GetSP());
926 if (process_sp)
927 {
928 process_sp->SendAsyncInterrupt ();
929 }
930}
931
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000932SBThread
Greg Clayton48381312010-10-30 04:51:46 +0000933SBProcess::GetThreadByID (tid_t tid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000934{
Greg Clayton48381312010-10-30 04:51:46 +0000935 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000936 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000937 ProcessSP process_sp(GetSP());
938 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000939 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000940 Process::StopLocker stop_locker;
941 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Hafiz Abid Qadeer5bf72c42015-02-11 16:37:17 +0000942 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000943 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000944 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000945 }
Greg Clayton48381312010-10-30 04:51:46 +0000946
Greg Clayton5160ce52013-03-27 23:08:40 +0000947 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000948 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000949 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000950 static_cast<void*>(process_sp.get()), tid,
951 static_cast<void*>(thread_sp.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000952
953 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000954}
955
Jim Ingham18b46892012-07-13 20:18:18 +0000956SBThread
957SBProcess::GetThreadByIndexID (uint32_t index_id)
958{
959 SBThread sb_thread;
960 ThreadSP thread_sp;
961 ProcessSP process_sp(GetSP());
962 if (process_sp)
963 {
Jim Ingham18b46892012-07-13 20:18:18 +0000964 Process::StopLocker stop_locker;
965 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Hafiz Abid Qadeer5bf72c42015-02-11 16:37:17 +0000966 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Jim Ingham18b46892012-07-13 20:18:18 +0000967 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
968 sb_thread.SetThread (thread_sp);
969 }
970
Greg Clayton5160ce52013-03-27 23:08:40 +0000971 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000972 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000973 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
974 static_cast<void*>(process_sp.get()), index_id,
975 static_cast<void*>(thread_sp.get()));
Jim Ingham18b46892012-07-13 20:18:18 +0000976
977 return sb_thread;
978}
979
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000980StateType
981SBProcess::GetStateFromEvent (const SBEvent &event)
982{
Greg Clayton5160ce52013-03-27 23:08:40 +0000983 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000984
Caroline Ticeceb6b132010-10-26 03:11:13 +0000985 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000986
Caroline Ticeceb6b132010-10-26 03:11:13 +0000987 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000988 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
989 static_cast<void*>(event.get()),
Caroline Tice750cd172010-10-26 23:49:36 +0000990 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000991
992 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000993}
994
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000995bool
996SBProcess::GetRestartedFromEvent (const SBEvent &event)
997{
Greg Clayton66111032010-06-23 01:19:29 +0000998 return Process::ProcessEventData::GetRestartedFromEvent (event.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000999}
1000
Jim Ingham0161b492013-02-09 01:29:05 +00001001size_t
1002SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
1003{
1004 return Process::ProcessEventData::GetNumRestartedReasons(event.get());
1005}
1006
1007const char *
1008SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
1009{
1010 return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
1011}
1012
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001013SBProcess
1014SBProcess::GetProcessFromEvent (const SBEvent &event)
1015{
Greg Clayton66111032010-06-23 01:19:29 +00001016 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001017 return process;
1018}
1019
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001020bool
Ilia K06d28552015-05-15 09:29:09 +00001021SBProcess::GetInterruptedFromEvent (const SBEvent &event)
1022{
1023 return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
1024}
1025
1026bool
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001027SBProcess::EventIsProcessEvent (const SBEvent &event)
1028{
Ilia Kf9e5dc12015-03-21 11:11:07 +00001029 return event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass();
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001030}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001031
1032SBBroadcaster
1033SBProcess::GetBroadcaster () const
1034{
Greg Clayton5160ce52013-03-27 23:08:40 +00001035 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001036
Greg Claytonacdbe812012-01-30 09:04:36 +00001037 ProcessSP process_sp(GetSP());
1038
1039 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001040
1041 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001042 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
1043 static_cast<void*>(process_sp.get()),
1044 static_cast<void*>(broadcaster.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001045
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001046 return broadcaster;
1047}
1048
Jim Ingham4bddaeb2012-02-16 06:50:00 +00001049const char *
1050SBProcess::GetBroadcasterClass ()
1051{
1052 return Process::GetStaticBroadcasterClass().AsCString();
1053}
1054
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001055size_t
1056SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
1057{
Greg Clayton5160ce52013-03-27 23:08:40 +00001058 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001059
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001060 size_t bytes_read = 0;
1061
Greg Claytonacdbe812012-01-30 09:04:36 +00001062 ProcessSP process_sp(GetSP());
1063
Greg Clayton48381312010-10-30 04:51:46 +00001064 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001065 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001066 static_cast<void*>(process_sp.get()), addr,
1067 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1068 static_cast<void*>(sb_error.get()));
1069
Greg Claytonacdbe812012-01-30 09:04:36 +00001070 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001071 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001072 Process::StopLocker stop_locker;
1073 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1074 {
1075 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1076 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
1077 }
1078 else
1079 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001080 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001081 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running",
1082 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001083 sb_error.SetErrorString("process is running");
1084 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001085 }
1086 else
1087 {
1088 sb_error.SetErrorString ("SBProcess is invalid");
1089 }
1090
Caroline Ticeceb6b132010-10-26 03:11:13 +00001091 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +00001092 {
1093 SBStream sstr;
1094 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001095 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001096 static_cast<void*>(process_sp.get()), addr,
1097 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1098 static_cast<void*>(sb_error.get()), sstr.GetData(),
1099 static_cast<uint64_t>(bytes_read));
Greg Clayton93aa84e2010-10-29 04:59:35 +00001100 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001101
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001102 return bytes_read;
1103}
1104
1105size_t
Greg Claytone91b7952011-12-15 03:14:23 +00001106SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1107{
1108 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001109 ProcessSP process_sp(GetSP());
1110 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001111 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001112 Process::StopLocker stop_locker;
1113 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1114 {
1115 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1116 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
1117 }
1118 else
1119 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001120 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001121 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001122 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running",
1123 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001124 sb_error.SetErrorString("process is running");
1125 }
Greg Claytone91b7952011-12-15 03:14:23 +00001126 }
1127 else
1128 {
1129 sb_error.SetErrorString ("SBProcess is invalid");
1130 }
1131 return bytes_read;
1132}
1133
1134uint64_t
1135SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1136{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001137 uint64_t value = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001138 ProcessSP process_sp(GetSP());
1139 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001140 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001141 Process::StopLocker stop_locker;
1142 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1143 {
1144 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1145 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
1146 }
1147 else
1148 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001149 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001150 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001151 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running",
1152 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001153 sb_error.SetErrorString("process is running");
1154 }
Greg Claytone91b7952011-12-15 03:14:23 +00001155 }
1156 else
1157 {
1158 sb_error.SetErrorString ("SBProcess is invalid");
1159 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001160 return value;
Greg Claytone91b7952011-12-15 03:14:23 +00001161}
1162
1163lldb::addr_t
1164SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1165{
1166 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Claytonacdbe812012-01-30 09:04:36 +00001167 ProcessSP process_sp(GetSP());
1168 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001169 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001170 Process::StopLocker stop_locker;
1171 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1172 {
1173 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1174 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1175 }
1176 else
1177 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001178 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001179 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001180 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running",
1181 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001182 sb_error.SetErrorString("process is running");
1183 }
Greg Claytone91b7952011-12-15 03:14:23 +00001184 }
1185 else
1186 {
1187 sb_error.SetErrorString ("SBProcess is invalid");
1188 }
1189 return ptr;
1190}
1191
1192size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001193SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1194{
1195 size_t bytes_written = 0;
1196
Greg Clayton5160ce52013-03-27 23:08:40 +00001197 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonacdbe812012-01-30 09:04:36 +00001198
1199 ProcessSP process_sp(GetSP());
1200
Greg Clayton48381312010-10-30 04:51:46 +00001201 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001202 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001203 static_cast<void*>(process_sp.get()), addr,
1204 static_cast<const void*>(src),
1205 static_cast<uint64_t>(src_len),
1206 static_cast<void*>(sb_error.get()));
Greg Clayton48381312010-10-30 04:51:46 +00001207
Greg Claytonacdbe812012-01-30 09:04:36 +00001208 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001209 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001210 Process::StopLocker stop_locker;
1211 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1212 {
1213 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1214 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1215 }
1216 else
1217 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001218 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001219 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running",
1220 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001221 sb_error.SetErrorString("process is running");
1222 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001223 }
1224
Greg Clayton48381312010-10-30 04:51:46 +00001225 if (log)
1226 {
1227 SBStream sstr;
1228 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001229 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001230 static_cast<void*>(process_sp.get()), addr,
1231 static_cast<const void*>(src),
1232 static_cast<uint64_t>(src_len),
1233 static_cast<void*>(sb_error.get()), sstr.GetData(),
1234 static_cast<uint64_t>(bytes_written));
Greg Clayton48381312010-10-30 04:51:46 +00001235 }
1236
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001237 return bytes_written;
1238}
1239
Caroline Ticedde9cff2010-09-20 05:20:02 +00001240bool
1241SBProcess::GetDescription (SBStream &description)
1242{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001243 Stream &strm = description.ref();
1244
Greg Claytonacdbe812012-01-30 09:04:36 +00001245 ProcessSP process_sp(GetSP());
1246 if (process_sp)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001247 {
1248 char path[PATH_MAX];
1249 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Claytonacdbe812012-01-30 09:04:36 +00001250 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton1d273162010-10-06 03:09:58 +00001251 const char *exe_name = NULL;
1252 if (exe_module)
1253 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1254
Daniel Malead01b2952012-11-29 21:49:15 +00001255 strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
Greg Claytonacdbe812012-01-30 09:04:36 +00001256 process_sp->GetID(),
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001257 lldb_private::StateAsCString (GetState()),
1258 GetNumThreads(),
1259 exe_name ? ", executable = " : "",
1260 exe_name ? exe_name : "");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001261 }
1262 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001263 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001264
1265 return true;
1266}
Greg Clayton8f343b02010-11-04 01:54:29 +00001267
1268uint32_t
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001269SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1270{
Greg Clayton5160ce52013-03-27 23:08:40 +00001271 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001272
1273 uint32_t num = 0;
1274 ProcessSP process_sp(GetSP());
1275 if (process_sp)
1276 {
1277 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1278 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001279 if (log)
1280 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001281 static_cast<void*>(process_sp.get()), num);
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001282 }
1283 else
1284 {
1285 sb_error.SetErrorString ("SBProcess is invalid");
1286 }
1287 return num;
1288}
1289
1290uint32_t
Greg Clayton8f343b02010-11-04 01:54:29 +00001291SBProcess::LoadImage (lldb::SBFileSpec &sb_image_spec, lldb::SBError &sb_error)
1292{
Greg Claytonacdbe812012-01-30 09:04:36 +00001293 ProcessSP process_sp(GetSP());
1294 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001295 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001296 Process::StopLocker stop_locker;
1297 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1298 {
1299 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1300 return process_sp->LoadImage (*sb_image_spec, sb_error.ref());
1301 }
1302 else
1303 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001304 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001305 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001306 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running",
1307 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001308 sb_error.SetErrorString("process is running");
1309 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001310 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001311 return LLDB_INVALID_IMAGE_TOKEN;
1312}
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001313
Greg Clayton8f343b02010-11-04 01:54:29 +00001314lldb::SBError
1315SBProcess::UnloadImage (uint32_t image_token)
1316{
1317 lldb::SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +00001318 ProcessSP process_sp(GetSP());
1319 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001320 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001321 Process::StopLocker stop_locker;
1322 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1323 {
1324 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1325 sb_error.SetError (process_sp->UnloadImage (image_token));
1326 }
1327 else
1328 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001329 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001330 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001331 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running",
1332 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001333 sb_error.SetErrorString("process is running");
1334 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001335 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001336 else
1337 sb_error.SetErrorString("invalid process");
1338 return sb_error;
1339}
Jason Molenda8c713372013-11-05 11:00:35 +00001340
Jason Molendaa3329782014-03-29 18:54:20 +00001341lldb::SBError
1342SBProcess::SendEventData (const char *event_data)
1343{
1344 lldb::SBError sb_error;
1345 ProcessSP process_sp(GetSP());
1346 if (process_sp)
1347 {
1348 Process::StopLocker stop_locker;
1349 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1350 {
1351 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1352 sb_error.SetError (process_sp->SendEventData (event_data));
1353 }
1354 else
1355 {
1356 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1357 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001358 log->Printf ("SBProcess(%p)::SendEventData() => error: process is running",
1359 static_cast<void*>(process_sp.get()));
Jason Molendaa3329782014-03-29 18:54:20 +00001360 sb_error.SetErrorString("process is running");
1361 }
1362 }
1363 else
1364 sb_error.SetErrorString("invalid process");
1365 return sb_error;
1366}
1367
Jason Molenda8c713372013-11-05 11:00:35 +00001368uint32_t
Jason Molenda95d005c2013-11-06 03:07:33 +00001369SBProcess::GetNumExtendedBacktraceTypes ()
Jason Molenda8c713372013-11-05 11:00:35 +00001370{
1371 ProcessSP process_sp(GetSP());
1372 if (process_sp && process_sp->GetSystemRuntime())
1373 {
1374 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda95d005c2013-11-06 03:07:33 +00001375 return runtime->GetExtendedBacktraceTypes().size();
Jason Molenda8c713372013-11-05 11:00:35 +00001376 }
1377 return 0;
1378}
1379
1380const char *
Jason Molenda95d005c2013-11-06 03:07:33 +00001381SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx)
Jason Molenda8c713372013-11-05 11:00:35 +00001382{
1383 ProcessSP process_sp(GetSP());
1384 if (process_sp && process_sp->GetSystemRuntime())
1385 {
1386 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda008c45f2013-11-12 23:33:32 +00001387 const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes();
Jason Molenda8c713372013-11-05 11:00:35 +00001388 if (idx < names.size())
1389 {
1390 return names[idx].AsCString();
1391 }
1392 else
1393 {
1394 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1395 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001396 log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds",
1397 static_cast<void*>(process_sp.get()));
Jason Molenda8c713372013-11-05 11:00:35 +00001398 }
1399 }
1400 return NULL;
1401}
Kuba Breckaa51ea382014-09-06 01:33:13 +00001402
1403SBThreadCollection
1404SBProcess::GetHistoryThreads (addr_t addr)
1405{
1406 ProcessSP process_sp(GetSP());
1407 SBThreadCollection threads;
1408 if (process_sp)
1409 {
1410 threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1411 }
1412 return threads;
1413}
Kuba Brecka63927542014-10-11 01:59:32 +00001414
1415bool
1416SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type)
1417{
1418 ProcessSP process_sp(GetSP());
1419 if (! process_sp)
1420 return false;
1421
1422 InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type);
1423
1424 if (! runtime_sp.get())
1425 return false;
1426
1427 return runtime_sp->IsActive();
1428}
Adrian McCarthyf7d18932015-11-20 23:09:11 +00001429
1430lldb::SBError
1431SBProcess::SaveCore(const char *file_name)
1432{
1433 lldb::SBError error;
1434 ProcessSP process_sp(GetSP());
1435 if (!process_sp)
1436 {
1437 error.SetErrorString("SBProcess is invalid");
1438 return error;
1439 }
1440
1441 Mutex::Locker api_locker(process_sp->GetTarget().GetAPIMutex());
1442
1443 if (process_sp->GetState() != eStateStopped)
1444 {
1445 error.SetErrorString("the process is not stopped");
1446 return error;
1447 }
1448
1449 FileSpec core_file(file_name, false);
1450 error.ref() = PluginManager::SaveCore(process_sp, core_file);
1451 return error;
1452}