blob: 9b8ac8461ac1975059728a5225bd37517bfdae92 [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"
Howard Hellyer260368432016-06-23 08:35:37 +000026#include "lldb/Target/MemoryRegionInfo.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000027#include "lldb/Target/Process.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028#include "lldb/Target/RegisterContext.h"
Jason Molenda8c713372013-11-05 11:00:35 +000029#include "lldb/Target/SystemRuntime.h"
Greg Clayton66111032010-06-23 01:19:29 +000030#include "lldb/Target/Target.h"
31#include "lldb/Target/Thread.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032
33// Project includes
34
Eli Friedman4c5de692010-06-09 07:44:37 +000035#include "lldb/API/SBBroadcaster.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000036#include "lldb/API/SBCommandReturnObject.h"
Greg Clayton0e615682012-02-24 05:03:03 +000037#include "lldb/API/SBDebugger.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000038#include "lldb/API/SBEvent.h"
Greg Clayton0e615682012-02-24 05:03:03 +000039#include "lldb/API/SBFileSpec.h"
Howard Hellyer260368432016-06-23 08:35:37 +000040#include "lldb/API/SBMemoryRegionInfo.h"
41#include "lldb/API/SBMemoryRegionInfoList.h"
Todd Fiala75930012016-08-19 04:21:48 +000042#include "lldb/API/SBStructuredData.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000043#include "lldb/API/SBThread.h"
Kuba Breckaa51ea382014-09-06 01:33:13 +000044#include "lldb/API/SBThreadCollection.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000045#include "lldb/API/SBStream.h"
Eli Friedman4c5de692010-06-09 07:44:37 +000046#include "lldb/API/SBStringList.h"
Todd Fiala802dc4022014-06-23 19:30:49 +000047#include "lldb/API/SBUnixSignals.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000048
49using namespace lldb;
50using namespace lldb_private;
51
52
Chris Lattner30fdc8d2010-06-08 16:52:24 +000053SBProcess::SBProcess () :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000054 m_opaque_wp()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000055{
56}
57
58
59//----------------------------------------------------------------------
60// SBProcess constructor
61//----------------------------------------------------------------------
62
63SBProcess::SBProcess (const SBProcess& rhs) :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000064 m_opaque_wp (rhs.m_opaque_wp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000065{
66}
67
68
69SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000070 m_opaque_wp (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000071{
72}
73
Greg Claytonefabb122010-11-05 23:17:00 +000074const SBProcess&
75SBProcess::operator = (const SBProcess& rhs)
76{
77 if (this != &rhs)
Greg Clayton4e0fe8a2012-07-12 20:32:19 +000078 m_opaque_wp = rhs.m_opaque_wp;
Greg Claytonefabb122010-11-05 23:17:00 +000079 return *this;
80}
81
Chris Lattner30fdc8d2010-06-08 16:52:24 +000082//----------------------------------------------------------------------
83// Destructor
84//----------------------------------------------------------------------
85SBProcess::~SBProcess()
86{
87}
88
Jim Ingham4bddaeb2012-02-16 06:50:00 +000089const char *
90SBProcess::GetBroadcasterClassName ()
91{
92 return Process::GetStaticBroadcasterClass().AsCString();
93}
94
Jim Inghamd7b30ef2012-10-26 19:18:04 +000095const char *
96SBProcess::GetPluginName ()
97{
98 ProcessSP process_sp(GetSP());
99 if (process_sp)
100 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000101 return process_sp->GetPluginName().GetCString();
Jim Inghamd7b30ef2012-10-26 19:18:04 +0000102 }
103 return "<Unknown>";
104}
105
106const char *
107SBProcess::GetShortPluginName ()
108{
109 ProcessSP process_sp(GetSP());
110 if (process_sp)
111 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000112 return process_sp->GetPluginName().GetCString();
Jim Inghamd7b30ef2012-10-26 19:18:04 +0000113 }
114 return "<Unknown>";
115}
116
117
Greg Claytonb9556ac2012-01-30 07:41:31 +0000118lldb::ProcessSP
119SBProcess::GetSP() const
120{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000121 return m_opaque_wp.lock();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000122}
123
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000124void
Greg Claytonb9556ac2012-01-30 07:41:31 +0000125SBProcess::SetSP (const ProcessSP &process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000126{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000127 m_opaque_wp = process_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000128}
129
130void
131SBProcess::Clear ()
132{
Greg Clayton4e0fe8a2012-07-12 20:32:19 +0000133 m_opaque_wp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000134}
135
136
137bool
138SBProcess::IsValid() const
139{
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000140 ProcessSP process_sp(m_opaque_wp.lock());
141 return ((bool) process_sp && process_sp->IsValid());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000142}
143
James McIlree9631aae2011-03-04 00:31:13 +0000144bool
145SBProcess::RemoteLaunch (char const **argv,
146 char const **envp,
147 const char *stdin_path,
148 const char *stdout_path,
149 const char *stderr_path,
150 const char *working_directory,
151 uint32_t launch_flags,
152 bool stop_at_entry,
153 lldb::SBError& error)
154{
Greg Clayton5160ce52013-03-27 23:08:40 +0000155 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000156 if (log)
James McIlree9631aae2011-03-04 00:31:13 +0000157 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 +0000158 static_cast<void*>(m_opaque_wp.lock().get()),
159 static_cast<void*>(argv), static_cast<void*>(envp),
160 stdin_path ? stdin_path : "NULL",
161 stdout_path ? stdout_path : "NULL",
162 stderr_path ? stderr_path : "NULL",
James McIlree9631aae2011-03-04 00:31:13 +0000163 working_directory ? working_directory : "NULL",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000164 launch_flags, stop_at_entry,
165 static_cast<void*>(error.get()));
166
Greg Claytonacdbe812012-01-30 09:04:36 +0000167 ProcessSP process_sp(GetSP());
168 if (process_sp)
James McIlree9631aae2011-03-04 00:31:13 +0000169 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000170 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Claytonc9858e42012-04-06 02:17:47 +0000171 if (process_sp->GetState() == eStateConnected)
James McIlree9631aae2011-03-04 00:31:13 +0000172 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000173 if (stop_at_entry)
174 launch_flags |= eLaunchFlagStopAtEntry;
Chaoren Lind3173f32015-05-29 19:52:29 +0000175 ProcessLaunchInfo launch_info(FileSpec{stdin_path, false},
176 FileSpec{stdout_path, false},
177 FileSpec{stderr_path, false},
178 FileSpec{working_directory, false},
179 launch_flags);
Greg Claytonc9858e42012-04-06 02:17:47 +0000180 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
181 if (exe_module)
Greg Clayton14715c62013-06-29 00:10:32 +0000182 launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
Greg Claytonc9858e42012-04-06 02:17:47 +0000183 if (argv)
184 launch_info.GetArguments().AppendArguments (argv);
185 if (envp)
186 launch_info.GetEnvironmentEntries ().SetArguments (envp);
187 error.SetError (process_sp->Launch (launch_info));
James McIlree9631aae2011-03-04 00:31:13 +0000188 }
189 else
190 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000191 error.SetErrorString ("must be in eStateConnected to call RemoteLaunch");
James McIlree9631aae2011-03-04 00:31:13 +0000192 }
193 }
194 else
195 {
196 error.SetErrorString ("unable to attach pid");
197 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000198
James McIlree9631aae2011-03-04 00:31:13 +0000199 if (log) {
200 SBStream sstr;
201 error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000202 log->Printf ("SBProcess(%p)::RemoteLaunch (...) => SBError (%p): %s",
203 static_cast<void*>(process_sp.get()),
204 static_cast<void*>(error.get()), sstr.GetData());
James McIlree9631aae2011-03-04 00:31:13 +0000205 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000206
James McIlree9631aae2011-03-04 00:31:13 +0000207 return error.Success();
208}
209
210bool
211SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error)
212{
Greg Claytonacdbe812012-01-30 09:04:36 +0000213 ProcessSP process_sp(GetSP());
214 if (process_sp)
James McIlree9631aae2011-03-04 00:31:13 +0000215 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000216 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Claytonc9858e42012-04-06 02:17:47 +0000217 if (process_sp->GetState() == eStateConnected)
James McIlree9631aae2011-03-04 00:31:13 +0000218 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000219 ProcessAttachInfo attach_info;
220 attach_info.SetProcessID (pid);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000221 error.SetError (process_sp->Attach (attach_info));
James McIlree9631aae2011-03-04 00:31:13 +0000222 }
223 else
224 {
Greg Claytonc9858e42012-04-06 02:17:47 +0000225 error.SetErrorString ("must be in eStateConnected to call RemoteAttachToProcessWithID");
James McIlree9631aae2011-03-04 00:31:13 +0000226 }
227 }
228 else
229 {
230 error.SetErrorString ("unable to attach pid");
231 }
232
Greg Clayton5160ce52013-03-27 23:08:40 +0000233 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
James McIlree9631aae2011-03-04 00:31:13 +0000234 if (log) {
235 SBStream sstr;
236 error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000237 log->Printf ("SBProcess(%p)::RemoteAttachToProcessWithID (%" PRIu64 ") => SBError (%p): %s",
238 static_cast<void*>(process_sp.get()), pid,
239 static_cast<void*>(error.get()), sstr.GetData());
James McIlree9631aae2011-03-04 00:31:13 +0000240 }
241
242 return error.Success();
243}
244
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000245
246uint32_t
247SBProcess::GetNumThreads ()
248{
Greg Clayton5160ce52013-03-27 23:08:40 +0000249 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000250
Caroline Ticeceb6b132010-10-26 03:11:13 +0000251 uint32_t num_threads = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000252 ProcessSP process_sp(GetSP());
253 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000254 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000255 Process::StopLocker stop_locker;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000256
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000257 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000258 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000259 num_threads = process_sp->GetThreadList().GetSize(can_update);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000260 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000261
262 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000263 log->Printf ("SBProcess(%p)::GetNumThreads () => %d",
264 static_cast<void*>(process_sp.get()), num_threads);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000265
266 return num_threads;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000267}
268
269SBThread
Jim Ingham2976d002010-08-26 21:32:51 +0000270SBProcess::GetSelectedThread () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000271{
Greg Clayton5160ce52013-03-27 23:08:40 +0000272 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000273
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000274 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000275 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000276 ProcessSP process_sp(GetSP());
277 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000278 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000279 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000280 thread_sp = process_sp->GetThreadList().GetSelectedThread();
Greg Clayton17a6ad02012-01-30 02:53:15 +0000281 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000282 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000283
284 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000285 log->Printf ("SBProcess(%p)::GetSelectedThread () => SBThread(%p)",
286 static_cast<void*>(process_sp.get()),
287 static_cast<void*>(thread_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000288
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000289 return sb_thread;
290}
291
Greg Claytona4d87472013-01-18 23:41:08 +0000292SBThread
293SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context)
294{
Greg Clayton5160ce52013-03-27 23:08:40 +0000295 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000296
Greg Claytona4d87472013-01-18 23:41:08 +0000297 SBThread sb_thread;
298 ThreadSP thread_sp;
299 ProcessSP process_sp(GetSP());
300 if (process_sp)
301 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000302 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Claytona4d87472013-01-18 23:41:08 +0000303 thread_sp = process_sp->CreateOSPluginThread(tid, context);
304 sb_thread.SetThread (thread_sp);
305 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000306
Greg Claytona4d87472013-01-18 23:41:08 +0000307 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000308 log->Printf ("SBProcess(%p)::CreateOSPluginThread (tid=0x%" PRIx64 ", context=0x%" PRIx64 ") => SBThread(%p)",
309 static_cast<void*>(process_sp.get()), tid, context,
310 static_cast<void*>(thread_sp.get()));
311
Greg Claytona4d87472013-01-18 23:41:08 +0000312 return sb_thread;
313}
314
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000315SBTarget
316SBProcess::GetTarget() const
317{
Greg Clayton5160ce52013-03-27 23:08:40 +0000318 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000319
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000320 SBTarget sb_target;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000321 TargetSP target_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000322 ProcessSP process_sp(GetSP());
323 if (process_sp)
Greg Claytonb9556ac2012-01-30 07:41:31 +0000324 {
Greg Claytonacdbe812012-01-30 09:04:36 +0000325 target_sp = process_sp->GetTarget().shared_from_this();
Greg Claytonb9556ac2012-01-30 07:41:31 +0000326 sb_target.SetSP (target_sp);
327 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000328
Caroline Ticeceb6b132010-10-26 03:11:13 +0000329 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000330 log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)",
331 static_cast<void*>(process_sp.get()),
332 static_cast<void*>(target_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000333
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000334 return sb_target;
335}
336
337
338size_t
339SBProcess::PutSTDIN (const char *src, size_t src_len)
340{
Greg Clayton5160ce52013-03-27 23:08:40 +0000341 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000342
Caroline Ticeceb6b132010-10-26 03:11:13 +0000343 size_t ret_val = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000344 ProcessSP process_sp(GetSP());
345 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000346 {
347 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000348 ret_val = process_sp->PutSTDIN (src, src_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000349 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000350
Caroline Ticeceb6b132010-10-26 03:11:13 +0000351 if (log)
Greg Clayton6fea17e2014-03-03 19:15:20 +0000352 log->Printf("SBProcess(%p)::PutSTDIN (src=\"%s\", src_len=%" PRIu64 ") => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000353 static_cast<void*>(process_sp.get()), src,
354 static_cast<uint64_t>(src_len),
355 static_cast<uint64_t>(ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000356
357 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000358}
359
360size_t
361SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
362{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000363 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000364 ProcessSP process_sp(GetSP());
365 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000366 {
367 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000368 bytes_read = process_sp->GetSTDOUT (dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000369 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000370
Greg Clayton5160ce52013-03-27 23:08:40 +0000371 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000372 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000373 log->Printf ("SBProcess(%p)::GetSTDOUT (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000374 static_cast<void*>(process_sp.get()),
375 static_cast<int>(bytes_read), dst,
376 static_cast<uint64_t>(dst_len),
377 static_cast<uint64_t>(bytes_read));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000378
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000379 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000380}
381
382size_t
383SBProcess::GetSTDERR (char *dst, size_t dst_len) const
384{
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000385 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000386 ProcessSP process_sp(GetSP());
387 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000388 {
389 Error error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000390 bytes_read = process_sp->GetSTDERR (dst, dst_len, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000391 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000392
Greg Clayton5160ce52013-03-27 23:08:40 +0000393 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000394 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000395 log->Printf ("SBProcess(%p)::GetSTDERR (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000396 static_cast<void*>(process_sp.get()),
397 static_cast<int>(bytes_read), dst,
398 static_cast<uint64_t>(dst_len),
399 static_cast<uint64_t>(bytes_read));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000400
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000401 return bytes_read;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000402}
403
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000404size_t
405SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const
406{
407 size_t bytes_read = 0;
408 ProcessSP process_sp(GetSP());
409 if (process_sp)
410 {
411 Error error;
412 bytes_read = process_sp->GetAsyncProfileData (dst, dst_len, error);
413 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000414
Greg Clayton5160ce52013-03-27 23:08:40 +0000415 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000416 if (log)
Bruce Mitcheneradb99822015-09-22 05:07:56 +0000417 log->Printf ("SBProcess(%p)::GetAsyncProfileData (dst=\"%.*s\", dst_len=%" PRIu64 ") => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000418 static_cast<void*>(process_sp.get()),
419 static_cast<int>(bytes_read), dst,
420 static_cast<uint64_t>(dst_len),
421 static_cast<uint64_t>(bytes_read));
422
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000423 return bytes_read;
424}
425
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000426void
Jim Ingham2976d002010-08-26 21:32:51 +0000427SBProcess::ReportEventState (const SBEvent &event, FILE *out) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000428{
429 if (out == NULL)
430 return;
431
Greg Claytonacdbe812012-01-30 09:04:36 +0000432 ProcessSP process_sp(GetSP());
433 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000434 {
435 const StateType event_state = SBProcess::GetStateFromEvent (event);
436 char message[1024];
437 int message_len = ::snprintf (message,
438 sizeof (message),
Daniel Malead01b2952012-11-29 21:49:15 +0000439 "Process %" PRIu64 " %s\n",
Greg Claytonacdbe812012-01-30 09:04:36 +0000440 process_sp->GetID(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000441 SBDebugger::StateAsCString (event_state));
442
443 if (message_len > 0)
444 ::fwrite (message, 1, message_len, out);
445 }
446}
447
448void
Jim Ingham2976d002010-08-26 21:32:51 +0000449SBProcess::AppendEventStateReport (const SBEvent &event, SBCommandReturnObject &result)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000450{
Greg Claytonacdbe812012-01-30 09:04:36 +0000451 ProcessSP process_sp(GetSP());
452 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000453 {
454 const StateType event_state = SBProcess::GetStateFromEvent (event);
455 char message[1024];
456 ::snprintf (message,
457 sizeof (message),
Daniel Malead01b2952012-11-29 21:49:15 +0000458 "Process %" PRIu64 " %s\n",
Greg Claytonacdbe812012-01-30 09:04:36 +0000459 process_sp->GetID(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000460 SBDebugger::StateAsCString (event_state));
461
462 result.AppendMessage (message);
463 }
464}
465
466bool
Jim Ingham2976d002010-08-26 21:32:51 +0000467SBProcess::SetSelectedThread (const SBThread &thread)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000468{
Greg Claytonacdbe812012-01-30 09:04:36 +0000469 ProcessSP process_sp(GetSP());
470 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000471 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000472 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000473 return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000474 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000475 return false;
476}
477
478bool
Greg Claytonea561dc2012-10-12 23:32:11 +0000479SBProcess::SetSelectedThreadByID (lldb::tid_t tid)
480{
Greg Clayton5160ce52013-03-27 23:08:40 +0000481 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000482
Caroline Ticeceb6b132010-10-26 03:11:13 +0000483 bool ret_val = false;
Greg Claytonacdbe812012-01-30 09:04:36 +0000484 ProcessSP process_sp(GetSP());
485 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000486 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000487 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000488 ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000489 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000490
491 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000492 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%4.4" PRIx64 ") => %s",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000493 static_cast<void*>(process_sp.get()), tid,
494 (ret_val ? "true" : "false"));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000495
496 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000497}
498
Jim Ingham18b46892012-07-13 20:18:18 +0000499bool
500SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
501{
Greg Clayton5160ce52013-03-27 23:08:40 +0000502 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000503
504 bool ret_val = false;
505 ProcessSP process_sp(GetSP());
506 if (process_sp)
507 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000508 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Jim Ingham18b46892012-07-13 20:18:18 +0000509 ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
510 }
511
512 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000513 log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
514 static_cast<void*>(process_sp.get()), index_id,
515 (ret_val ? "true" : "false"));
Jim Ingham18b46892012-07-13 20:18:18 +0000516
517 return ret_val;
518}
519
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000520SBThread
521SBProcess::GetThreadAtIndex (size_t index)
522{
Greg Clayton5160ce52013-03-27 23:08:40 +0000523 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000524
Greg Clayton17a6ad02012-01-30 02:53:15 +0000525 SBThread sb_thread;
526 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000527 ProcessSP process_sp(GetSP());
528 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000529 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000530 Process::StopLocker stop_locker;
531 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000532 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000533 thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000534 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000535 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000536
537 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +0000538 log->Printf ("SBProcess(%p)::GetThreadAtIndex (index=%d) => SBThread(%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000539 static_cast<void*>(process_sp.get()),
540 static_cast<uint32_t>(index),
541 static_cast<void*>(thread_sp.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000542
Greg Clayton17a6ad02012-01-30 02:53:15 +0000543 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000544}
545
Jim Inghambf2956a22013-01-08 23:22:42 +0000546uint32_t
Jason Molenda5e8dce42013-12-13 00:29:16 +0000547SBProcess::GetNumQueues ()
548{
549 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
550
551 uint32_t num_queues = 0;
552 ProcessSP process_sp(GetSP());
553 if (process_sp)
554 {
555 Process::StopLocker stop_locker;
Greg Claytona61d0a52016-05-26 00:08:39 +0000556 if (stop_locker.TryLock(&process_sp->GetRunLock()))
557 {
558 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
559 num_queues = process_sp->GetQueueList().GetSize();
560 }
Jason Molenda5e8dce42013-12-13 00:29:16 +0000561 }
562
563 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000564 log->Printf ("SBProcess(%p)::GetNumQueues () => %d",
565 static_cast<void*>(process_sp.get()), num_queues);
Jason Molenda5e8dce42013-12-13 00:29:16 +0000566
567 return num_queues;
568}
569
570SBQueue
571SBProcess::GetQueueAtIndex (size_t index)
572{
573 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
574
575 SBQueue sb_queue;
576 QueueSP queue_sp;
577 ProcessSP process_sp(GetSP());
578 if (process_sp)
579 {
580 Process::StopLocker stop_locker;
Greg Claytona61d0a52016-05-26 00:08:39 +0000581 if (stop_locker.TryLock(&process_sp->GetRunLock()))
582 {
583 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
584 queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
585 sb_queue.SetQueue (queue_sp);
586 }
Jason Molenda5e8dce42013-12-13 00:29:16 +0000587 }
588
589 if (log)
Jason Molenda5e8dce42013-12-13 00:29:16 +0000590 log->Printf ("SBProcess(%p)::GetQueueAtIndex (index=%d) => SBQueue(%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000591 static_cast<void*>(process_sp.get()),
592 static_cast<uint32_t>(index),
593 static_cast<void*>(queue_sp.get()));
Jason Molenda5e8dce42013-12-13 00:29:16 +0000594
595 return sb_queue;
596}
597
598
599uint32_t
Jim Inghambf2956a22013-01-08 23:22:42 +0000600SBProcess::GetStopID(bool include_expression_stops)
601{
602 ProcessSP process_sp(GetSP());
603 if (process_sp)
604 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000605 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Jim Inghambf2956a22013-01-08 23:22:42 +0000606 if (include_expression_stops)
607 return process_sp->GetStopID();
608 else
609 return process_sp->GetLastNaturalStopID();
610 }
611 return 0;
612}
613
Ilia K38810f42015-05-20 10:15:47 +0000614SBEvent
615SBProcess::GetStopEventForStopID(uint32_t stop_id)
616{
617 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
618
619 SBEvent sb_event;
620 EventSP event_sp;
621 ProcessSP process_sp(GetSP());
622 if (process_sp)
623 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000624 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Ilia K38810f42015-05-20 10:15:47 +0000625 event_sp = process_sp->GetStopEventForStopID(stop_id);
626 sb_event.reset(event_sp);
627 }
628
629 if (log)
630 log->Printf ("SBProcess(%p)::GetStopEventForStopID (stop_id=%" PRIu32 ") => SBEvent(%p)",
631 static_cast<void*>(process_sp.get()),
632 stop_id,
633 static_cast<void*>(event_sp.get()));
634
635 return sb_event;
636}
637
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000638StateType
639SBProcess::GetState ()
640{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000641
Caroline Ticeceb6b132010-10-26 03:11:13 +0000642 StateType ret_val = eStateInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000643 ProcessSP process_sp(GetSP());
644 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000645 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000646 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000647 ret_val = process_sp->GetState();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000648 }
Caroline Ticeceb6b132010-10-26 03:11:13 +0000649
Greg Clayton5160ce52013-03-27 23:08:40 +0000650 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000651 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000652 log->Printf ("SBProcess(%p)::GetState () => %s",
653 static_cast<void*>(process_sp.get()),
Caroline Tice750cd172010-10-26 23:49:36 +0000654 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000655
656 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000657}
658
659
660int
661SBProcess::GetExitStatus ()
662{
Greg Clayton48381312010-10-30 04:51:46 +0000663 int exit_status = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000664 ProcessSP process_sp(GetSP());
665 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000666 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000667 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000668 exit_status = process_sp->GetExitStatus ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000669 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000670 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000671 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000672 log->Printf ("SBProcess(%p)::GetExitStatus () => %i (0x%8.8x)",
673 static_cast<void*>(process_sp.get()), exit_status,
674 exit_status);
Greg Clayton48381312010-10-30 04:51:46 +0000675
676 return exit_status;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000677}
678
679const char *
680SBProcess::GetExitDescription ()
681{
Greg Clayton48381312010-10-30 04:51:46 +0000682 const char *exit_desc = NULL;
Greg Claytonacdbe812012-01-30 09:04:36 +0000683 ProcessSP process_sp(GetSP());
684 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000685 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000686 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000687 exit_desc = process_sp->GetExitDescription ();
Greg Claytonaf67cec2010-12-20 20:49:23 +0000688 }
Greg Clayton5160ce52013-03-27 23:08:40 +0000689 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000690 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000691 log->Printf ("SBProcess(%p)::GetExitDescription () => %s",
692 static_cast<void*>(process_sp.get()), exit_desc);
Greg Clayton48381312010-10-30 04:51:46 +0000693 return exit_desc;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000694}
695
696lldb::pid_t
697SBProcess::GetProcessID ()
698{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000699 lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
Greg Claytonacdbe812012-01-30 09:04:36 +0000700 ProcessSP process_sp(GetSP());
701 if (process_sp)
702 ret_val = process_sp->GetID();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000703
Greg Clayton5160ce52013-03-27 23:08:40 +0000704 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000705 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000706 log->Printf ("SBProcess(%p)::GetProcessID () => %" PRIu64,
707 static_cast<void*>(process_sp.get()), ret_val);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000708
709 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000710}
711
Greg Clayton949e8222013-01-16 17:29:04 +0000712uint32_t
713SBProcess::GetUniqueID()
714{
715 uint32_t ret_val = 0;
716 ProcessSP process_sp(GetSP());
717 if (process_sp)
718 ret_val = process_sp->GetUniqueID();
Greg Clayton5160ce52013-03-27 23:08:40 +0000719 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton949e8222013-01-16 17:29:04 +0000720 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000721 log->Printf ("SBProcess(%p)::GetUniqueID () => %" PRIu32,
722 static_cast<void*>(process_sp.get()), ret_val);
Greg Clayton949e8222013-01-16 17:29:04 +0000723 return ret_val;
724}
725
Johnny Chencf386e22011-03-01 22:56:31 +0000726ByteOrder
727SBProcess::GetByteOrder () const
728{
729 ByteOrder byteOrder = eByteOrderInvalid;
Greg Claytonacdbe812012-01-30 09:04:36 +0000730 ProcessSP process_sp(GetSP());
731 if (process_sp)
732 byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000733
Greg Clayton5160ce52013-03-27 23:08:40 +0000734 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chencf386e22011-03-01 22:56:31 +0000735 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000736 log->Printf ("SBProcess(%p)::GetByteOrder () => %d",
737 static_cast<void*>(process_sp.get()), byteOrder);
Johnny Chencf386e22011-03-01 22:56:31 +0000738
739 return byteOrder;
740}
741
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000742uint32_t
743SBProcess::GetAddressByteSize () const
744{
Caroline Ticeceb6b132010-10-26 03:11:13 +0000745 uint32_t size = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +0000746 ProcessSP process_sp(GetSP());
747 if (process_sp)
748 size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
Caroline Ticeceb6b132010-10-26 03:11:13 +0000749
Greg Clayton5160ce52013-03-27 23:08:40 +0000750 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000751 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000752 log->Printf ("SBProcess(%p)::GetAddressByteSize () => %d",
753 static_cast<void*>(process_sp.get()), size);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000754
755 return size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000756}
757
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000758SBError
759SBProcess::Continue ()
760{
Greg Clayton5160ce52013-03-27 23:08:40 +0000761 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000762
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000763 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000764 ProcessSP process_sp(GetSP());
765
766 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000767 log->Printf ("SBProcess(%p)::Continue ()...",
768 static_cast<void*>(process_sp.get()));
Greg Claytonacdbe812012-01-30 09:04:36 +0000769
770 if (process_sp)
Greg Clayton5d5028b2010-10-06 03:53:16 +0000771 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000772 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000773
Greg Claytondc6224e2014-10-21 01:00:42 +0000774 if (process_sp->GetTarget().GetDebugger().GetAsyncExecution ())
775 sb_error.ref() = process_sp->Resume ();
776 else
777 sb_error.ref() = process_sp->ResumeSynchronous (NULL);
Greg Clayton5d5028b2010-10-06 03:53:16 +0000778 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000779 else
780 sb_error.SetErrorString ("SBProcess is invalid");
781
Caroline Ticeceb6b132010-10-26 03:11:13 +0000782 if (log)
783 {
784 SBStream sstr;
785 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000786 log->Printf ("SBProcess(%p)::Continue () => SBError (%p): %s",
787 static_cast<void*>(process_sp.get()),
788 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000789 }
790
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000791 return sb_error;
792}
793
794
795SBError
796SBProcess::Destroy ()
797{
798 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000799 ProcessSP process_sp(GetSP());
800 if (process_sp)
Greg Clayton6779606a2011-01-22 23:43:18 +0000801 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000802 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Jason Molendaede31932015-04-17 05:01:58 +0000803 sb_error.SetError(process_sp->Destroy(false));
Greg Clayton6779606a2011-01-22 23:43:18 +0000804 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000805 else
806 sb_error.SetErrorString ("SBProcess is invalid");
807
Greg Clayton5160ce52013-03-27 23:08:40 +0000808 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000809 if (log)
810 {
811 SBStream sstr;
812 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000813 log->Printf ("SBProcess(%p)::Destroy () => SBError (%p): %s",
814 static_cast<void*>(process_sp.get()),
815 static_cast<void*>(sb_error.get()), sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000816 }
817
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000818 return sb_error;
819}
820
821
822SBError
823SBProcess::Stop ()
824{
825 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000826 ProcessSP process_sp(GetSP());
827 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000828 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000829 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000830 sb_error.SetError (process_sp->Halt());
Greg Claytonaf67cec2010-12-20 20:49:23 +0000831 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000832 else
833 sb_error.SetErrorString ("SBProcess is invalid");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000834
Greg Clayton5160ce52013-03-27 23:08:40 +0000835 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000836 if (log)
837 {
838 SBStream sstr;
839 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000840 log->Printf ("SBProcess(%p)::Stop () => SBError (%p): %s",
841 static_cast<void*>(process_sp.get()),
842 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000843 }
844
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000845 return sb_error;
846}
847
848SBError
849SBProcess::Kill ()
850{
851 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000852 ProcessSP process_sp(GetSP());
853 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000854 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000855 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Jason Molendaede31932015-04-17 05:01:58 +0000856 sb_error.SetError (process_sp->Destroy(true));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000857 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000858 else
859 sb_error.SetErrorString ("SBProcess is invalid");
Caroline Ticeceb6b132010-10-26 03:11:13 +0000860
Greg Clayton5160ce52013-03-27 23:08:40 +0000861 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000862 if (log)
863 {
864 SBStream sstr;
865 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000866 log->Printf ("SBProcess(%p)::Kill () => SBError (%p): %s",
867 static_cast<void*>(process_sp.get()),
868 static_cast<void*>(sb_error.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000869 }
870
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000871 return sb_error;
872}
873
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000874SBError
875SBProcess::Detach ()
876{
Jim Inghamacff8952013-05-02 00:27:30 +0000877 // FIXME: This should come from a process default.
878 bool keep_stopped = false;
879 return Detach (keep_stopped);
880}
881
882SBError
883SBProcess::Detach (bool keep_stopped)
884{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000885 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000886 ProcessSP process_sp(GetSP());
887 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000888 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000889 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Jim Inghamacff8952013-05-02 00:27:30 +0000890 sb_error.SetError (process_sp->Detach(keep_stopped));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000891 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000892 else
893 sb_error.SetErrorString ("SBProcess is invalid");
894
895 return sb_error;
896}
897
898SBError
Greg Clayton48381312010-10-30 04:51:46 +0000899SBProcess::Signal (int signo)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000900{
901 SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +0000902 ProcessSP process_sp(GetSP());
903 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000904 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000905 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Claytonacdbe812012-01-30 09:04:36 +0000906 sb_error.SetError (process_sp->Signal (signo));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000907 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000908 else
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000909 sb_error.SetErrorString ("SBProcess is invalid");
Greg Clayton5160ce52013-03-27 23:08:40 +0000910 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000911 if (log)
912 {
913 SBStream sstr;
914 sb_error.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000915 log->Printf ("SBProcess(%p)::Signal (signo=%i) => SBError (%p): %s",
916 static_cast<void*>(process_sp.get()), signo,
917 static_cast<void*>(sb_error.get()), sstr.GetData());
Greg Clayton48381312010-10-30 04:51:46 +0000918 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000919 return sb_error;
920}
921
Todd Fiala802dc4022014-06-23 19:30:49 +0000922SBUnixSignals
923SBProcess::GetUnixSignals()
924{
Chaoren Lin98d0a4b2015-07-14 01:09:28 +0000925 if (auto process_sp = GetSP())
926 return SBUnixSignals{process_sp};
Todd Fiala802dc4022014-06-23 19:30:49 +0000927
Chaoren Lin98d0a4b2015-07-14 01:09:28 +0000928 return {};
Todd Fiala802dc4022014-06-23 19:30:49 +0000929}
930
Jim Inghamcfc09352012-07-27 23:57:19 +0000931void
932SBProcess::SendAsyncInterrupt ()
933{
934 ProcessSP process_sp(GetSP());
935 if (process_sp)
936 {
937 process_sp->SendAsyncInterrupt ();
938 }
939}
940
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000941SBThread
Greg Clayton48381312010-10-30 04:51:46 +0000942SBProcess::GetThreadByID (tid_t tid)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000943{
Greg Clayton48381312010-10-30 04:51:46 +0000944 SBThread sb_thread;
Greg Clayton17a6ad02012-01-30 02:53:15 +0000945 ThreadSP thread_sp;
Greg Claytonacdbe812012-01-30 09:04:36 +0000946 ProcessSP process_sp(GetSP());
947 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000948 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000949 Process::StopLocker stop_locker;
950 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000951 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +0000952 thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update);
Greg Clayton17a6ad02012-01-30 02:53:15 +0000953 sb_thread.SetThread (thread_sp);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000954 }
Greg Clayton48381312010-10-30 04:51:46 +0000955
Greg Clayton5160ce52013-03-27 23:08:40 +0000956 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +0000957 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000958 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%4.4" PRIx64 ") => SBThread (%p)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000959 static_cast<void*>(process_sp.get()), tid,
960 static_cast<void*>(thread_sp.get()));
Greg Clayton48381312010-10-30 04:51:46 +0000961
962 return sb_thread;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000963}
964
Jim Ingham18b46892012-07-13 20:18:18 +0000965SBThread
966SBProcess::GetThreadByIndexID (uint32_t index_id)
967{
968 SBThread sb_thread;
969 ThreadSP thread_sp;
970 ProcessSP process_sp(GetSP());
971 if (process_sp)
972 {
Jim Ingham18b46892012-07-13 20:18:18 +0000973 Process::StopLocker stop_locker;
974 const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +0000975 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Jim Ingham18b46892012-07-13 20:18:18 +0000976 thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
977 sb_thread.SetThread (thread_sp);
978 }
979
Greg Clayton5160ce52013-03-27 23:08:40 +0000980 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Jim Ingham18b46892012-07-13 20:18:18 +0000981 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000982 log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
983 static_cast<void*>(process_sp.get()), index_id,
984 static_cast<void*>(thread_sp.get()));
Jim Ingham18b46892012-07-13 20:18:18 +0000985
986 return sb_thread;
987}
988
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000989StateType
990SBProcess::GetStateFromEvent (const SBEvent &event)
991{
Greg Clayton5160ce52013-03-27 23:08:40 +0000992 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000993
Caroline Ticeceb6b132010-10-26 03:11:13 +0000994 StateType ret_val = Process::ProcessEventData::GetStateFromEvent (event.get());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000995
Caroline Ticeceb6b132010-10-26 03:11:13 +0000996 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000997 log->Printf ("SBProcess::GetStateFromEvent (event.sp=%p) => %s",
998 static_cast<void*>(event.get()),
Caroline Tice750cd172010-10-26 23:49:36 +0000999 lldb_private::StateAsCString (ret_val));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001000
1001 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001002}
1003
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001004bool
1005SBProcess::GetRestartedFromEvent (const SBEvent &event)
1006{
Pavel Labathea2cc5e2016-01-05 17:55:35 +00001007 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1008
1009 bool ret_val = Process::ProcessEventData::GetRestartedFromEvent (event.get());
1010
1011 if (log)
Hans Wennborg400e1802016-01-13 22:40:26 +00001012 log->Printf ("SBProcess::%s (event.sp=%p) => %d", __FUNCTION__,
1013 static_cast<void*>(event.get()), ret_val);
Pavel Labathea2cc5e2016-01-05 17:55:35 +00001014
1015 return ret_val;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001016}
1017
Jim Ingham0161b492013-02-09 01:29:05 +00001018size_t
1019SBProcess::GetNumRestartedReasonsFromEvent (const lldb::SBEvent &event)
1020{
1021 return Process::ProcessEventData::GetNumRestartedReasons(event.get());
1022}
1023
1024const char *
1025SBProcess::GetRestartedReasonAtIndexFromEvent (const lldb::SBEvent &event, size_t idx)
1026{
1027 return Process::ProcessEventData::GetRestartedReasonAtIndex(event.get(), idx);
1028}
1029
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001030SBProcess
1031SBProcess::GetProcessFromEvent (const SBEvent &event)
1032{
Todd Fiala75930012016-08-19 04:21:48 +00001033 ProcessSP process_sp =
1034 Process::ProcessEventData::GetProcessFromEvent (event.get());
1035 if (!process_sp)
1036 {
1037 // StructuredData events also know the process they come from.
1038 // Try that.
1039 process_sp = EventDataStructuredData::GetProcessFromEvent(event.get());
1040 }
1041
1042 return SBProcess(process_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001043}
1044
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001045bool
Ilia K06d28552015-05-15 09:29:09 +00001046SBProcess::GetInterruptedFromEvent (const SBEvent &event)
1047{
1048 return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
1049}
1050
Todd Fiala75930012016-08-19 04:21:48 +00001051lldb::SBStructuredData
1052SBProcess::GetStructuredDataFromEvent (const lldb::SBEvent &event)
1053{
1054 return SBStructuredData(event.GetSP());
1055}
1056
Ilia K06d28552015-05-15 09:29:09 +00001057bool
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001058SBProcess::EventIsProcessEvent (const SBEvent &event)
1059{
Todd Fiala75930012016-08-19 04:21:48 +00001060 return (event.GetBroadcasterClass() == SBProcess::GetBroadcasterClass()) &&
1061 !EventIsStructuredDataEvent (event);
1062}
1063
1064bool
1065SBProcess::EventIsStructuredDataEvent (const lldb::SBEvent &event)
1066{
1067 EventSP event_sp = event.GetSP();
1068 EventData *event_data = event_sp ? event_sp->GetData() : nullptr;
1069 return event_data &&
1070 (event_data->GetFlavor() == EventDataStructuredData::GetFlavorString());
Jim Inghame6bc6cb2012-02-08 05:23:15 +00001071}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001072
1073SBBroadcaster
1074SBProcess::GetBroadcaster () const
1075{
Greg Clayton5160ce52013-03-27 23:08:40 +00001076 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001077
Greg Claytonacdbe812012-01-30 09:04:36 +00001078 ProcessSP process_sp(GetSP());
1079
1080 SBBroadcaster broadcaster(process_sp.get(), false);
Caroline Ticeceb6b132010-10-26 03:11:13 +00001081
1082 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001083 log->Printf ("SBProcess(%p)::GetBroadcaster () => SBBroadcaster (%p)",
1084 static_cast<void*>(process_sp.get()),
1085 static_cast<void*>(broadcaster.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001086
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001087 return broadcaster;
1088}
1089
Jim Ingham4bddaeb2012-02-16 06:50:00 +00001090const char *
1091SBProcess::GetBroadcasterClass ()
1092{
1093 return Process::GetStaticBroadcasterClass().AsCString();
1094}
1095
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001096size_t
1097SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
1098{
Greg Clayton5160ce52013-03-27 23:08:40 +00001099 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +00001100
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001101 size_t bytes_read = 0;
1102
Greg Claytonacdbe812012-01-30 09:04:36 +00001103 ProcessSP process_sp(GetSP());
1104
Greg Clayton48381312010-10-30 04:51:46 +00001105 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001106 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001107 static_cast<void*>(process_sp.get()), addr,
1108 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1109 static_cast<void*>(sb_error.get()));
1110
Greg Claytonacdbe812012-01-30 09:04:36 +00001111 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001112 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001113 Process::StopLocker stop_locker;
1114 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1115 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00001116 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001117 bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref());
1118 }
1119 else
1120 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001121 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001122 log->Printf ("SBProcess(%p)::ReadMemory() => 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 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001126 }
1127 else
1128 {
1129 sb_error.SetErrorString ("SBProcess is invalid");
1130 }
1131
Caroline Ticeceb6b132010-10-26 03:11:13 +00001132 if (log)
Greg Clayton93aa84e2010-10-29 04:59:35 +00001133 {
1134 SBStream sstr;
1135 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001136 log->Printf ("SBProcess(%p)::ReadMemory (addr=0x%" PRIx64 ", dst=%p, dst_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001137 static_cast<void*>(process_sp.get()), addr,
1138 static_cast<void*>(dst), static_cast<uint64_t>(dst_len),
1139 static_cast<void*>(sb_error.get()), sstr.GetData(),
1140 static_cast<uint64_t>(bytes_read));
Greg Clayton93aa84e2010-10-29 04:59:35 +00001141 }
Caroline Ticeceb6b132010-10-26 03:11:13 +00001142
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001143 return bytes_read;
1144}
1145
1146size_t
Greg Claytone91b7952011-12-15 03:14:23 +00001147SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error)
1148{
1149 size_t bytes_read = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001150 ProcessSP process_sp(GetSP());
1151 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001152 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001153 Process::StopLocker stop_locker;
1154 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1155 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00001156 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001157 bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref());
1158 }
1159 else
1160 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001161 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001162 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001163 log->Printf ("SBProcess(%p)::ReadCStringFromMemory() => error: process is running",
1164 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001165 sb_error.SetErrorString("process is running");
1166 }
Greg Claytone91b7952011-12-15 03:14:23 +00001167 }
1168 else
1169 {
1170 sb_error.SetErrorString ("SBProcess is invalid");
1171 }
1172 return bytes_read;
1173}
1174
1175uint64_t
1176SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error)
1177{
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001178 uint64_t value = 0;
Greg Claytonacdbe812012-01-30 09:04:36 +00001179 ProcessSP process_sp(GetSP());
1180 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001181 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001182 Process::StopLocker stop_locker;
1183 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1184 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00001185 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001186 value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref());
1187 }
1188 else
1189 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001190 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001191 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001192 log->Printf ("SBProcess(%p)::ReadUnsignedFromMemory() => error: process is running",
1193 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001194 sb_error.SetErrorString("process is running");
1195 }
Greg Claytone91b7952011-12-15 03:14:23 +00001196 }
1197 else
1198 {
1199 sb_error.SetErrorString ("SBProcess is invalid");
1200 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001201 return value;
Greg Claytone91b7952011-12-15 03:14:23 +00001202}
1203
1204lldb::addr_t
1205SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error)
1206{
1207 lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
Greg Claytonacdbe812012-01-30 09:04:36 +00001208 ProcessSP process_sp(GetSP());
1209 if (process_sp)
Greg Claytone91b7952011-12-15 03:14:23 +00001210 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001211 Process::StopLocker stop_locker;
1212 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1213 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00001214 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001215 ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref());
1216 }
1217 else
1218 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001219 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001220 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001221 log->Printf ("SBProcess(%p)::ReadPointerFromMemory() => error: process is running",
1222 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001223 sb_error.SetErrorString("process is running");
1224 }
Greg Claytone91b7952011-12-15 03:14:23 +00001225 }
1226 else
1227 {
1228 sb_error.SetErrorString ("SBProcess is invalid");
1229 }
1230 return ptr;
1231}
1232
1233size_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001234SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
1235{
1236 size_t bytes_written = 0;
1237
Greg Clayton5160ce52013-03-27 23:08:40 +00001238 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonacdbe812012-01-30 09:04:36 +00001239
1240 ProcessSP process_sp(GetSP());
1241
Greg Clayton48381312010-10-30 04:51:46 +00001242 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001243 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p))...",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001244 static_cast<void*>(process_sp.get()), addr,
1245 static_cast<const void*>(src),
1246 static_cast<uint64_t>(src_len),
1247 static_cast<void*>(sb_error.get()));
Greg Clayton48381312010-10-30 04:51:46 +00001248
Greg Claytonacdbe812012-01-30 09:04:36 +00001249 if (process_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001250 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001251 Process::StopLocker stop_locker;
1252 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1253 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00001254 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001255 bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref());
1256 }
1257 else
1258 {
Greg Claytonc9858e42012-04-06 02:17:47 +00001259 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001260 log->Printf ("SBProcess(%p)::WriteMemory() => error: process is running",
1261 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001262 sb_error.SetErrorString("process is running");
1263 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001264 }
1265
Greg Clayton48381312010-10-30 04:51:46 +00001266 if (log)
1267 {
1268 SBStream sstr;
1269 sb_error.GetDescription (sstr);
Daniel Malead01b2952012-11-29 21:49:15 +00001270 log->Printf ("SBProcess(%p)::WriteMemory (addr=0x%" PRIx64 ", src=%p, src_len=%" PRIu64 ", SBError (%p): %s) => %" PRIu64,
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001271 static_cast<void*>(process_sp.get()), addr,
1272 static_cast<const void*>(src),
1273 static_cast<uint64_t>(src_len),
1274 static_cast<void*>(sb_error.get()), sstr.GetData(),
1275 static_cast<uint64_t>(bytes_written));
Greg Clayton48381312010-10-30 04:51:46 +00001276 }
1277
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001278 return bytes_written;
1279}
1280
Caroline Ticedde9cff2010-09-20 05:20:02 +00001281bool
1282SBProcess::GetDescription (SBStream &description)
1283{
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001284 Stream &strm = description.ref();
1285
Greg Claytonacdbe812012-01-30 09:04:36 +00001286 ProcessSP process_sp(GetSP());
1287 if (process_sp)
Caroline Ticedde9cff2010-09-20 05:20:02 +00001288 {
1289 char path[PATH_MAX];
1290 GetTarget().GetExecutable().GetPath (path, sizeof(path));
Greg Claytonacdbe812012-01-30 09:04:36 +00001291 Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
Greg Clayton1d273162010-10-06 03:09:58 +00001292 const char *exe_name = NULL;
1293 if (exe_module)
1294 exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1295
Daniel Malead01b2952012-11-29 21:49:15 +00001296 strm.Printf ("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
Greg Claytonacdbe812012-01-30 09:04:36 +00001297 process_sp->GetID(),
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001298 lldb_private::StateAsCString (GetState()),
1299 GetNumThreads(),
1300 exe_name ? ", executable = " : "",
1301 exe_name ? exe_name : "");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001302 }
1303 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00001304 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +00001305
1306 return true;
1307}
Greg Clayton8f343b02010-11-04 01:54:29 +00001308
1309uint32_t
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001310SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const
1311{
Greg Clayton5160ce52013-03-27 23:08:40 +00001312 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001313
1314 uint32_t num = 0;
1315 ProcessSP process_sp(GetSP());
1316 if (process_sp)
1317 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00001318 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001319 sb_error.SetError(process_sp->GetWatchpointSupportInfo (num));
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001320 if (log)
1321 log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001322 static_cast<void*>(process_sp.get()), num);
Johnny Chenf9ef60d2012-05-23 22:34:34 +00001323 }
1324 else
1325 {
1326 sb_error.SetErrorString ("SBProcess is invalid");
1327 }
1328 return num;
1329}
1330
1331uint32_t
Tamas Berghammer4fbd67a2015-12-08 13:43:59 +00001332SBProcess::LoadImage (lldb::SBFileSpec &sb_remote_image_spec, lldb::SBError &sb_error)
1333{
1334 return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error);
1335}
1336
1337uint32_t
1338SBProcess::LoadImage (const lldb::SBFileSpec &sb_local_image_spec,
1339 const lldb::SBFileSpec &sb_remote_image_spec,
1340 lldb::SBError &sb_error)
Greg Clayton8f343b02010-11-04 01:54:29 +00001341{
Greg Claytonacdbe812012-01-30 09:04:36 +00001342 ProcessSP process_sp(GetSP());
1343 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001344 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001345 Process::StopLocker stop_locker;
1346 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1347 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00001348 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Tamas Berghammer3cb132a2015-12-02 11:58:51 +00001349 PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
Tamas Berghammer4fbd67a2015-12-08 13:43:59 +00001350 return platform_sp->LoadImage (process_sp.get(),
1351 *sb_local_image_spec,
1352 *sb_remote_image_spec,
1353 sb_error.ref());
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001354 }
1355 else
1356 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001357 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001358 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001359 log->Printf ("SBProcess(%p)::LoadImage() => error: process is running",
1360 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001361 sb_error.SetErrorString("process is running");
1362 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001363 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001364 return LLDB_INVALID_IMAGE_TOKEN;
1365}
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001366
Greg Clayton8f343b02010-11-04 01:54:29 +00001367lldb::SBError
1368SBProcess::UnloadImage (uint32_t image_token)
1369{
1370 lldb::SBError sb_error;
Greg Claytonacdbe812012-01-30 09:04:36 +00001371 ProcessSP process_sp(GetSP());
1372 if (process_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +00001373 {
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001374 Process::StopLocker stop_locker;
1375 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1376 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00001377 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Tamas Berghammer3cb132a2015-12-02 11:58:51 +00001378 PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1379 sb_error.SetError (platform_sp->UnloadImage (process_sp.get(), image_token));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001380 }
1381 else
1382 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001383 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytonc9858e42012-04-06 02:17:47 +00001384 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001385 log->Printf ("SBProcess(%p)::UnloadImage() => error: process is running",
1386 static_cast<void*>(process_sp.get()));
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001387 sb_error.SetErrorString("process is running");
1388 }
Greg Claytonaf67cec2010-12-20 20:49:23 +00001389 }
Greg Clayton8f343b02010-11-04 01:54:29 +00001390 else
1391 sb_error.SetErrorString("invalid process");
1392 return sb_error;
1393}
Jason Molenda8c713372013-11-05 11:00:35 +00001394
Jason Molendaa3329782014-03-29 18:54:20 +00001395lldb::SBError
1396SBProcess::SendEventData (const char *event_data)
1397{
1398 lldb::SBError sb_error;
1399 ProcessSP process_sp(GetSP());
1400 if (process_sp)
1401 {
1402 Process::StopLocker stop_locker;
1403 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1404 {
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00001405 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Jason Molendaa3329782014-03-29 18:54:20 +00001406 sb_error.SetError (process_sp->SendEventData (event_data));
1407 }
1408 else
1409 {
1410 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1411 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001412 log->Printf ("SBProcess(%p)::SendEventData() => error: process is running",
1413 static_cast<void*>(process_sp.get()));
Jason Molendaa3329782014-03-29 18:54:20 +00001414 sb_error.SetErrorString("process is running");
1415 }
1416 }
1417 else
1418 sb_error.SetErrorString("invalid process");
1419 return sb_error;
1420}
1421
Jason Molenda8c713372013-11-05 11:00:35 +00001422uint32_t
Jason Molenda95d005c2013-11-06 03:07:33 +00001423SBProcess::GetNumExtendedBacktraceTypes ()
Jason Molenda8c713372013-11-05 11:00:35 +00001424{
1425 ProcessSP process_sp(GetSP());
1426 if (process_sp && process_sp->GetSystemRuntime())
1427 {
1428 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda95d005c2013-11-06 03:07:33 +00001429 return runtime->GetExtendedBacktraceTypes().size();
Jason Molenda8c713372013-11-05 11:00:35 +00001430 }
1431 return 0;
1432}
1433
1434const char *
Jason Molenda95d005c2013-11-06 03:07:33 +00001435SBProcess::GetExtendedBacktraceTypeAtIndex (uint32_t idx)
Jason Molenda8c713372013-11-05 11:00:35 +00001436{
1437 ProcessSP process_sp(GetSP());
1438 if (process_sp && process_sp->GetSystemRuntime())
1439 {
1440 SystemRuntime *runtime = process_sp->GetSystemRuntime();
Jason Molenda008c45f2013-11-12 23:33:32 +00001441 const std::vector<ConstString> &names = runtime->GetExtendedBacktraceTypes();
Jason Molenda8c713372013-11-05 11:00:35 +00001442 if (idx < names.size())
1443 {
1444 return names[idx].AsCString();
1445 }
1446 else
1447 {
1448 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1449 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001450 log->Printf("SBProcess(%p)::GetExtendedBacktraceTypeAtIndex() => error: requested extended backtrace name out of bounds",
1451 static_cast<void*>(process_sp.get()));
Jason Molenda8c713372013-11-05 11:00:35 +00001452 }
1453 }
1454 return NULL;
1455}
Kuba Breckaa51ea382014-09-06 01:33:13 +00001456
1457SBThreadCollection
1458SBProcess::GetHistoryThreads (addr_t addr)
1459{
1460 ProcessSP process_sp(GetSP());
1461 SBThreadCollection threads;
1462 if (process_sp)
1463 {
1464 threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1465 }
1466 return threads;
1467}
Kuba Brecka63927542014-10-11 01:59:32 +00001468
1469bool
1470SBProcess::IsInstrumentationRuntimePresent(InstrumentationRuntimeType type)
1471{
1472 ProcessSP process_sp(GetSP());
1473 if (! process_sp)
1474 return false;
1475
1476 InstrumentationRuntimeSP runtime_sp = process_sp->GetInstrumentationRuntime(type);
1477
1478 if (! runtime_sp.get())
1479 return false;
1480
1481 return runtime_sp->IsActive();
1482}
Adrian McCarthyf7d18932015-11-20 23:09:11 +00001483
1484lldb::SBError
1485SBProcess::SaveCore(const char *file_name)
1486{
1487 lldb::SBError error;
1488 ProcessSP process_sp(GetSP());
1489 if (!process_sp)
1490 {
1491 error.SetErrorString("SBProcess is invalid");
1492 return error;
1493 }
1494
Saleem Abdulrasoolbb19a132016-05-19 05:13:57 +00001495 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
Adrian McCarthyf7d18932015-11-20 23:09:11 +00001496
1497 if (process_sp->GetState() != eStateStopped)
1498 {
1499 error.SetErrorString("the process is not stopped");
1500 return error;
1501 }
1502
1503 FileSpec core_file(file_name, false);
1504 error.ref() = PluginManager::SaveCore(process_sp, core_file);
1505 return error;
1506}
Howard Hellyer260368432016-06-23 08:35:37 +00001507
1508lldb::SBError
1509SBProcess::GetMemoryRegionInfo (lldb::addr_t load_addr, SBMemoryRegionInfo &sb_region_info)
1510{
1511 lldb::SBError sb_error;
1512 ProcessSP process_sp(GetSP());
1513 MemoryRegionInfoSP region_info_sp = std::make_shared<lldb_private::MemoryRegionInfo>();
1514 if (process_sp)
1515 {
1516 Process::StopLocker stop_locker;
1517 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1518 {
1519 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
1520 sb_error.ref() = process_sp->GetMemoryRegionInfo(load_addr, *region_info_sp);
1521 if( sb_error.Success() ) {
1522 sb_region_info.ref() = *region_info_sp;
1523 }
1524 }
1525 else
1526 {
1527 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1528 if (log)
1529 log->Printf ("SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
1530 static_cast<void*>(process_sp.get()));
1531 sb_error.SetErrorString("process is running");
1532 }
1533 }
1534 else
1535 {
1536 sb_error.SetErrorString ("SBProcess is invalid");
1537 }
1538 return sb_error;
1539}
1540
1541lldb::SBMemoryRegionInfoList
1542SBProcess::GetMemoryRegions()
1543{
1544 lldb::SBError sb_error;
1545 lldb::SBMemoryRegionInfoList sb_region_list;
1546 ProcessSP process_sp(GetSP());
1547 if (process_sp)
1548 {
1549 Process::StopLocker stop_locker;
1550 if (stop_locker.TryLock(&process_sp->GetRunLock()))
1551 {
1552 std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex());
1553 std::vector<MemoryRegionInfoSP> region_list;
1554 sb_error.ref() = process_sp->GetMemoryRegions(region_list);
1555 if( sb_error.Success() ) {
1556 std::vector<MemoryRegionInfoSP>::iterator end = region_list.end();
1557 for( std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin(); it != end; it++ ) {
1558 SBMemoryRegionInfo sb_region_info(it->get());
1559 sb_region_list.Append(sb_region_info);
1560 }
1561 }
1562 }
1563 else
1564 {
1565 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1566 if (log)
1567 log->Printf ("SBProcess(%p)::GetMemoryRegionInfo() => error: process is running",
1568 static_cast<void*>(process_sp.get()));
1569 sb_error.SetErrorString("process is running");
1570 }
1571 }
1572 else
1573 {
1574 sb_error.SetErrorString ("SBProcess is invalid");
1575 }
1576 return sb_region_list;
1577}