blob: eea5fdca2b38b453ad43707ee19e61e87b1d7d92 [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{
Pavel Labathea2cc5e2016-01-05 17:55:35 +0000998 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
999
1000 bool ret_val = Process::ProcessEventData::GetRestartedFromEvent (event.get());
1001
1002 if (log)
Hans Wennborg400e1802016-01-13 22:40:26 +00001003 log->Printf ("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__,
1004 static_cast<void*>(event.get()), ret_val);
Pavel Labathea2cc5e2016-01-05 17:55:35 +00001005
1006 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001007}
1008
Jim Ingham0161b492013-02-09 01:29:05 +00001009size_t
1010SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
1011{
1012 return Process::ProcessEventData::GetNumRestartedReasons(event.get());
1013}
1014
1015const char *
1016SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
1017{
1018 return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
1019}
1020
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001021SBProcess
1022SBProcess::GetProcessFromEvent (const SBEvent &event)
1023{
Greg Clayton66111032010-06-23 01:19:29 +00001024 SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001025 return process;
1026}
1027
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001028bool
Ilia K06d28552015-05-15 09:29:09 +00001029SBProcess::GetInterruptedFromEvent (const SBEvent &event)
1030{
1031 return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
1032}
1033
1034bool
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001035SBProcess::EventIsProcessEvent (const SBEvent &event)
1036{
Ilia Kf9e5dc12015-03-21 11:11:07 +00001037 return event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass();
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001038}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001039
1040SBBroadcaster
1041SBProcess::GetBroadcaster () const
1042{
Greg Clayton5160ce52013-03-27 23:08:40 +00001043 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001044
Greg Claytonacdbe812012-01-30 09:04:36 +00001045 ProcessSP process_sp(GetSP());
1046
1047 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001048
1049 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001050 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
1051 static_cast<void*>(process_sp.get()),
1052 static_cast<void*>(broadcaster.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001053
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001054 return broadcaster;
1055}
1056
Jim Ingham4bddaeb2012-02-16 06:50:00 +00001057const char *
1058SBProcess::GetBroadcasterClass ()
1059{
1060 return Process::GetStaticBroadcasterClass().AsCString();
1061}
1062
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001063size_t
1064SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
1065{
Greg Clayton5160ce52013-03-27 23:08:40 +00001066 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001067
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001068 size_t bytes_read = 0;
1069
Greg Claytonacdbe812012-01-30 09:04:36 +00001070 ProcessSP process_sp(GetSP());
1071
Greg Clayton48381312010-10-30 04:51:46 +00001072 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001073 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001074 static_cast<void*>(process_sp.get()), addr,
1075 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1076 static_cast<void*>(sb_error.get()));
1077
Greg Claytonacdbe812012-01-30 09:04:36 +00001078 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001079 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001080 Process::StopLocker stop_locker;
1081 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1082 {
1083 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1084 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
1085 }
1086 else
1087 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001088 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001089 log->Printf ("SBProcess(%p)::ReadMemory() => error: process is running",
1090 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001091 sb_error.SetErrorString("process is running");
1092 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001093 }
1094 else
1095 {
1096 sb_error.SetErrorString ("SBProcess is invalid");
1097 }
1098
Caroline Ticeceb6b132010-10-26 03:11:13 +00001099 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +00001100 {
1101 SBStream sstr;
1102 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001103 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001104 static_cast<void*>(process_sp.get()), addr,
1105 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1106 static_cast<void*>(sb_error.get()), sstr.GetData(),
1107 static_cast<uint64_t>(bytes_read));
Greg Clayton93aa84e2010-10-29 04:59:35 +00001108 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001109
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001110 return bytes_read;
1111}
1112
1113size_t
Greg Claytone91b7952011-12-15 03:14:23 +00001114SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1115{
1116 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001117 ProcessSP process_sp(GetSP());
1118 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001119 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001120 Process::StopLocker stop_locker;
1121 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1122 {
1123 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1124 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
1125 }
1126 else
1127 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001128 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001129 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001130 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running",
1131 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001132 sb_error.SetErrorString("process is running");
1133 }
Greg Claytone91b7952011-12-15 03:14:23 +00001134 }
1135 else
1136 {
1137 sb_error.SetErrorString ("SBProcess is invalid");
1138 }
1139 return bytes_read;
1140}
1141
1142uint64_t
1143SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1144{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001145 uint64_t value = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001146 ProcessSP process_sp(GetSP());
1147 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001148 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001149 Process::StopLocker stop_locker;
1150 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1151 {
1152 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1153 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
1154 }
1155 else
1156 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001157 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001158 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001159 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running",
1160 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001161 sb_error.SetErrorString("process is running");
1162 }
Greg Claytone91b7952011-12-15 03:14:23 +00001163 }
1164 else
1165 {
1166 sb_error.SetErrorString ("SBProcess is invalid");
1167 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001168 return value;
Greg Claytone91b7952011-12-15 03:14:23 +00001169}
1170
1171lldb::addr_t
1172SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1173{
1174 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Claytonacdbe812012-01-30 09:04:36 +00001175 ProcessSP process_sp(GetSP());
1176 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001177 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001178 Process::StopLocker stop_locker;
1179 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1180 {
1181 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1182 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1183 }
1184 else
1185 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001186 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001187 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001188 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running",
1189 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001190 sb_error.SetErrorString("process is running");
1191 }
Greg Claytone91b7952011-12-15 03:14:23 +00001192 }
1193 else
1194 {
1195 sb_error.SetErrorString ("SBProcess is invalid");
1196 }
1197 return ptr;
1198}
1199
1200size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001201SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1202{
1203 size_t bytes_written = 0;
1204
Greg Clayton5160ce52013-03-27 23:08:40 +00001205 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonacdbe812012-01-30 09:04:36 +00001206
1207 ProcessSP process_sp(GetSP());
1208
Greg Clayton48381312010-10-30 04:51:46 +00001209 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001210 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001211 static_cast<void*>(process_sp.get()), addr,
1212 static_cast<const void*>(src),
1213 static_cast<uint64_t>(src_len),
1214 static_cast<void*>(sb_error.get()));
Greg Clayton48381312010-10-30 04:51:46 +00001215
Greg Claytonacdbe812012-01-30 09:04:36 +00001216 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001217 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001218 Process::StopLocker stop_locker;
1219 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1220 {
1221 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1222 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1223 }
1224 else
1225 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001226 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001227 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running",
1228 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001229 sb_error.SetErrorString("process is running");
1230 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001231 }
1232
Greg Clayton48381312010-10-30 04:51:46 +00001233 if (log)
1234 {
1235 SBStream sstr;
1236 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001237 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001238 static_cast<void*>(process_sp.get()), addr,
1239 static_cast<const void*>(src),
1240 static_cast<uint64_t>(src_len),
1241 static_cast<void*>(sb_error.get()), sstr.GetData(),
1242 static_cast<uint64_t>(bytes_written));
Greg Clayton48381312010-10-30 04:51:46 +00001243 }
1244
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001245 return bytes_written;
1246}
1247
Caroline Ticedde9cff2010-09-20 05:20:02 +00001248bool
1249SBProcess::GetDescription (SBStream &description)
1250{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001251 Stream &strm = description.ref();
1252
Greg Claytonacdbe812012-01-30 09:04:36 +00001253 ProcessSP process_sp(GetSP());
1254 if (process_sp)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001255 {
1256 char path[PATH_MAX];
1257 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Claytonacdbe812012-01-30 09:04:36 +00001258 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton1d273162010-10-06 03:09:58 +00001259 const char *exe_name = NULL;
1260 if (exe_module)
1261 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1262
Daniel Malead01b2952012-11-29 21:49:15 +00001263 strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
Greg Claytonacdbe812012-01-30 09:04:36 +00001264 process_sp->GetID(),
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001265 lldb_private::StateAsCString (GetState()),
1266 GetNumThreads(),
1267 exe_name ? ", executable = " : "",
1268 exe_name ? exe_name : "");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001269 }
1270 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001271 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001272
1273 return true;
1274}
Greg Clayton8f343b02010-11-04 01:54:29 +00001275
1276uint32_t
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001277SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1278{
Greg Clayton5160ce52013-03-27 23:08:40 +00001279 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001280
1281 uint32_t num = 0;
1282 ProcessSP process_sp(GetSP());
1283 if (process_sp)
1284 {
1285 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1286 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001287 if (log)
1288 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001289 static_cast<void*>(process_sp.get()), num);
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001290 }
1291 else
1292 {
1293 sb_error.SetErrorString ("SBProcess is invalid");
1294 }
1295 return num;
1296}
1297
1298uint32_t
Tamas Berghammer4fbd67a2015-12-08 13:43:59 +00001299SBProcess::LoadImage (lldb::SBFileSpec &sb_remote_image_spec, lldb::SBError &sb_error)
1300{
1301 return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error);
1302}
1303
1304uint32_t
1305SBProcess::LoadImage (const lldb::SBFileSpec &sb_local_image_spec,
1306 const lldb::SBFileSpec &sb_remote_image_spec,
1307 lldb::SBError &sb_error)
Greg Clayton8f343b02010-11-04 01:54:29 +00001308{
Greg Claytonacdbe812012-01-30 09:04:36 +00001309 ProcessSP process_sp(GetSP());
1310 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001311 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001312 Process::StopLocker stop_locker;
1313 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1314 {
1315 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Tamas Berghammer3cb132a2015-12-02 11:58:51 +00001316 PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
Tamas Berghammer4fbd67a2015-12-08 13:43:59 +00001317 return platform_sp->LoadImage (process_sp.get(),
1318 *sb_local_image_spec,
1319 *sb_remote_image_spec,
1320 sb_error.ref());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001321 }
1322 else
1323 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001324 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001325 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001326 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running",
1327 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001328 sb_error.SetErrorString("process is running");
1329 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001330 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001331 return LLDB_INVALID_IMAGE_TOKEN;
1332}
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001333
Greg Clayton8f343b02010-11-04 01:54:29 +00001334lldb::SBError
1335SBProcess::UnloadImage (uint32_t image_token)
1336{
1337 lldb::SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +00001338 ProcessSP process_sp(GetSP());
1339 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001340 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001341 Process::StopLocker stop_locker;
1342 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1343 {
1344 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Tamas Berghammer3cb132a2015-12-02 11:58:51 +00001345 PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1346 sb_error.SetError (platform_sp->UnloadImage (process_sp.get(), image_token));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001347 }
1348 else
1349 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001350 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001351 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001352 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running",
1353 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001354 sb_error.SetErrorString("process is running");
1355 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001356 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001357 else
1358 sb_error.SetErrorString("invalid process");
1359 return sb_error;
1360}
Jason Molenda8c713372013-11-05 11:00:35 +00001361
Jason Molendaa3329782014-03-29 18:54:20 +00001362lldb::SBError
1363SBProcess::SendEventData (const char *event_data)
1364{
1365 lldb::SBError sb_error;
1366 ProcessSP process_sp(GetSP());
1367 if (process_sp)
1368 {
1369 Process::StopLocker stop_locker;
1370 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1371 {
1372 Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
1373 sb_error.SetError (process_sp->SendEventData (event_data));
1374 }
1375 else
1376 {
1377 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1378 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001379 log->Printf ("SBProcess(%p)::SendEventData() => error: process is running",
1380 static_cast<void*>(process_sp.get()));
Jason Molendaa3329782014-03-29 18:54:20 +00001381 sb_error.SetErrorString("process is running");
1382 }
1383 }
1384 else
1385 sb_error.SetErrorString("invalid process");
1386 return sb_error;
1387}
1388
Jason Molenda8c713372013-11-05 11:00:35 +00001389uint32_t
Jason Molenda95d005c2013-11-06 03:07:33 +00001390SBProcess::GetNumExtendedBacktraceTypes ()
Jason Molenda8c713372013-11-05 11:00:35 +00001391{
1392 ProcessSP process_sp(GetSP());
1393 if (process_sp && process_sp->GetSystemRuntime())
1394 {
1395 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda95d005c2013-11-06 03:07:33 +00001396 return runtime->GetExtendedBacktraceTypes().size();
Jason Molenda8c713372013-11-05 11:00:35 +00001397 }
1398 return 0;
1399}
1400
1401const char *
Jason Molenda95d005c2013-11-06 03:07:33 +00001402SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx)
Jason Molenda8c713372013-11-05 11:00:35 +00001403{
1404 ProcessSP process_sp(GetSP());
1405 if (process_sp && process_sp->GetSystemRuntime())
1406 {
1407 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda008c45f2013-11-12 23:33:32 +00001408 const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes();
Jason Molenda8c713372013-11-05 11:00:35 +00001409 if (idx < names.size())
1410 {
1411 return names[idx].AsCString();
1412 }
1413 else
1414 {
1415 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1416 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001417 log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds",
1418 static_cast<void*>(process_sp.get()));
Jason Molenda8c713372013-11-05 11:00:35 +00001419 }
1420 }
1421 return NULL;
1422}
Kuba Breckaa51ea382014-09-06 01:33:13 +00001423
1424SBThreadCollection
1425SBProcess::GetHistoryThreads (addr_t addr)
1426{
1427 ProcessSP process_sp(GetSP());
1428 SBThreadCollection threads;
1429 if (process_sp)
1430 {
1431 threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1432 }
1433 return threads;
1434}
Kuba Brecka63927542014-10-11 01:59:32 +00001435
1436bool
1437SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type)
1438{
1439 ProcessSP process_sp(GetSP());
1440 if (! process_sp)
1441 return false;
1442
1443 InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type);
1444
1445 if (! runtime_sp.get())
1446 return false;
1447
1448 return runtime_sp->IsActive();
1449}
Adrian McCarthyf7d18932015-11-20 23:09:11 +00001450
1451lldb::SBError
1452SBProcess::SaveCore(const char *file_name)
1453{
1454 lldb::SBError error;
1455 ProcessSP process_sp(GetSP());
1456 if (!process_sp)
1457 {
1458 error.SetErrorString("SBProcess is invalid");
1459 return error;
1460 }
1461
1462 Mutex::Locker api_locker(process_sp->GetTarget().GetAPIMutex());
1463
1464 if (process_sp->GetState() != eStateStopped)
1465 {
1466 error.SetErrorString("the process is not stopped");
1467 return error;
1468 }
1469
1470 FileSpec core_file(file_name, false);
1471 error.ref() = PluginManager::SaveCore(process_sp, core_file);
1472 return error;
1473}