blob: d260065195c399b088e7d1f873b3f391274dbf2d [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- Process.cpp ---------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Daniel Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Chris Lattner30fdc8d2010-06-08 16:52:24 +000012#include "lldb/Target/Process.h"
13
14#include "lldb/lldb-private-log.h"
15
16#include "lldb/Breakpoint/StoppointCallbackContext.h"
17#include "lldb/Breakpoint/BreakpointLocation.h"
18#include "lldb/Core/Event.h"
Caroline Ticeef5c6d02010-11-16 05:07:41 +000019#include "lldb/Core/ConnectionFileDescriptor.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000020#include "lldb/Core/Debugger.h"
Caroline Ticeef5c6d02010-11-16 05:07:41 +000021#include "lldb/Core/InputReader.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022#include "lldb/Core/Log.h"
Greg Clayton1f746072012-08-29 21:13:06 +000023#include "lldb/Core/Module.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024#include "lldb/Core/PluginManager.h"
25#include "lldb/Core/State.h"
Greg Claytoneb0103f2011-04-07 22:46:35 +000026#include "lldb/Expression/ClangUserExpression.h"
Caroline Tice3df9a8d2010-09-04 00:03:46 +000027#include "lldb/Interpreter/CommandInterpreter.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028#include "lldb/Host/Host.h"
29#include "lldb/Target/ABI.h"
Greg Clayton8f343b02010-11-04 01:54:29 +000030#include "lldb/Target/DynamicLoader.h"
Greg Clayton56d9a1b2011-08-22 02:49:39 +000031#include "lldb/Target/OperatingSystem.h"
Jim Ingham22777012010-09-23 02:01:19 +000032#include "lldb/Target/LanguageRuntime.h"
33#include "lldb/Target/CPPLanguageRuntime.h"
34#include "lldb/Target/ObjCLanguageRuntime.h"
Greg Claytone996fd32011-03-08 22:40:15 +000035#include "lldb/Target/Platform.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000036#include "lldb/Target/RegisterContext.h"
Greg Claytonf4b47e12010-08-04 01:40:35 +000037#include "lldb/Target/StopInfo.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000038#include "lldb/Target/Target.h"
39#include "lldb/Target/TargetList.h"
40#include "lldb/Target/Thread.h"
41#include "lldb/Target/ThreadPlan.h"
Jim Ingham076b3042012-04-10 01:21:57 +000042#include "lldb/Target/ThreadPlanBase.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000043
44using namespace lldb;
45using namespace lldb_private;
46
Greg Clayton67cc0632012-08-22 17:17:09 +000047
48// Comment out line below to disable memory caching, overriding the process setting
49// target.process.disable-memory-cache
50#define ENABLE_MEMORY_CACHING
51
52#ifdef ENABLE_MEMORY_CACHING
53#define DISABLE_MEM_CACHE_DEFAULT false
54#else
55#define DISABLE_MEM_CACHE_DEFAULT true
56#endif
57
58class ProcessOptionValueProperties : public OptionValueProperties
59{
60public:
61 ProcessOptionValueProperties (const ConstString &name) :
62 OptionValueProperties (name)
63 {
64 }
65
66 // This constructor is used when creating ProcessOptionValueProperties when it
67 // is part of a new lldb_private::Process instance. It will copy all current
68 // global property values as needed
69 ProcessOptionValueProperties (ProcessProperties *global_properties) :
70 OptionValueProperties(*global_properties->GetValueProperties())
71 {
72 }
73
74 virtual const Property *
75 GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const
76 {
77 // When gettings the value for a key from the process options, we will always
78 // try and grab the setting from the current process if there is one. Else we just
79 // use the one from this instance.
80 if (exe_ctx)
81 {
82 Process *process = exe_ctx->GetProcessPtr();
83 if (process)
84 {
85 ProcessOptionValueProperties *instance_properties = static_cast<ProcessOptionValueProperties *>(process->GetValueProperties().get());
86 if (this != instance_properties)
87 return instance_properties->ProtectedGetPropertyAtIndex (idx);
88 }
89 }
90 return ProtectedGetPropertyAtIndex (idx);
91 }
92};
93
94static PropertyDefinition
95g_properties[] =
96{
97 { "disable-memory-cache" , OptionValue::eTypeBoolean, false, DISABLE_MEM_CACHE_DEFAULT, NULL, NULL, "Disable reading and caching of memory in fixed-size units." },
Jim Ingham8c3f2762012-11-29 00:41:12 +000098 { "extra-startup-command", OptionValue::eTypeArray , false, OptionValue::eTypeString, NULL, NULL, "A list containing extra commands understood by the particular process plugin used. "
99 "For instance, to turn on debugserver logging set this to \"QSetLogging:bitmask=LOG_DEFAULT;\"" },
Jim Inghamafc1b122013-01-31 19:48:57 +0000100 { "ignore-breakpoints-in-expressions", OptionValue::eTypeBoolean, true, true, NULL, NULL, "If true, breakpoints will be ignored during expression evaluation." },
101 { "unwind-on-error-in-expressions", OptionValue::eTypeBoolean, true, true, NULL, NULL, "If true, errors in expression evaluation will unwind the stack back to the state before the call." },
Greg Claytone1e835c2012-11-29 18:48:47 +0000102 { "python-os-plugin-path", OptionValue::eTypeFileSpec, false, true, NULL, NULL, "A path to a python OS plug-in module file that contains a OperatingSystemPlugIn class." },
Jim Ingham29950772013-01-26 02:19:28 +0000103 { "stop-on-sharedlibrary-events" , OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true, stop when a shared library is loaded or unloaded." },
Jim Inghamacff8952013-05-02 00:27:30 +0000104 { "detach-keeps-stopped" , OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true, detach will attempt to keep the process stopped." },
Greg Clayton67cc0632012-08-22 17:17:09 +0000105 { NULL , OptionValue::eTypeInvalid, false, 0, NULL, NULL, NULL }
106};
107
108enum {
109 ePropertyDisableMemCache,
Greg Claytonc9d645d2012-10-18 22:40:37 +0000110 ePropertyExtraStartCommand,
Jim Ingham184e9812013-01-15 02:47:48 +0000111 ePropertyIgnoreBreakpointsInExpressions,
112 ePropertyUnwindOnErrorInExpressions,
Jim Ingham29950772013-01-26 02:19:28 +0000113 ePropertyPythonOSPluginPath,
Jim Inghamacff8952013-05-02 00:27:30 +0000114 ePropertyStopOnSharedLibraryEvents,
115 ePropertyDetachKeepsStopped
Greg Clayton67cc0632012-08-22 17:17:09 +0000116};
117
118ProcessProperties::ProcessProperties (bool is_global) :
119 Properties ()
120{
121 if (is_global)
122 {
123 m_collection_sp.reset (new ProcessOptionValueProperties(ConstString("process")));
124 m_collection_sp->Initialize(g_properties);
125 m_collection_sp->AppendProperty(ConstString("thread"),
Jim Ingham29950772013-01-26 02:19:28 +0000126 ConstString("Settings specific to threads."),
Greg Clayton67cc0632012-08-22 17:17:09 +0000127 true,
128 Thread::GetGlobalProperties()->GetValueProperties());
129 }
130 else
131 m_collection_sp.reset (new ProcessOptionValueProperties(Process::GetGlobalProperties().get()));
132}
133
134ProcessProperties::~ProcessProperties()
135{
136}
137
138bool
139ProcessProperties::GetDisableMemoryCache() const
140{
141 const uint32_t idx = ePropertyDisableMemCache;
142 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
143}
144
145Args
146ProcessProperties::GetExtraStartupCommands () const
147{
148 Args args;
149 const uint32_t idx = ePropertyExtraStartCommand;
150 m_collection_sp->GetPropertyAtIndexAsArgs(NULL, idx, args);
151 return args;
152}
153
154void
155ProcessProperties::SetExtraStartupCommands (const Args &args)
156{
157 const uint32_t idx = ePropertyExtraStartCommand;
158 m_collection_sp->SetPropertyAtIndexFromArgs(NULL, idx, args);
159}
160
Greg Claytonc9d645d2012-10-18 22:40:37 +0000161FileSpec
162ProcessProperties::GetPythonOSPluginPath () const
163{
164 const uint32_t idx = ePropertyPythonOSPluginPath;
165 return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx);
166}
167
168void
169ProcessProperties::SetPythonOSPluginPath (const FileSpec &file)
170{
171 const uint32_t idx = ePropertyPythonOSPluginPath;
172 m_collection_sp->SetPropertyAtIndexAsFileSpec(NULL, idx, file);
173}
174
Jim Ingham184e9812013-01-15 02:47:48 +0000175
176bool
177ProcessProperties::GetIgnoreBreakpointsInExpressions () const
178{
179 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
180 return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0);
181}
182
183void
184ProcessProperties::SetIgnoreBreakpointsInExpressions (bool ignore)
185{
186 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
187 m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, ignore);
188}
189
190bool
191ProcessProperties::GetUnwindOnErrorInExpressions () const
192{
193 const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
194 return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0);
195}
196
197void
198ProcessProperties::SetUnwindOnErrorInExpressions (bool ignore)
199{
200 const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
201 m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, ignore);
202}
203
Jim Ingham29950772013-01-26 02:19:28 +0000204bool
205ProcessProperties::GetStopOnSharedLibraryEvents () const
206{
207 const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
208 return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0);
209}
210
211void
212ProcessProperties::SetStopOnSharedLibraryEvents (bool stop)
213{
214 const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
215 m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, stop);
216}
217
Jim Inghamacff8952013-05-02 00:27:30 +0000218bool
219ProcessProperties::GetDetachKeepsStopped () const
220{
221 const uint32_t idx = ePropertyDetachKeepsStopped;
222 return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0);
223}
224
225void
226ProcessProperties::SetDetachKeepsStopped (bool stop)
227{
228 const uint32_t idx = ePropertyDetachKeepsStopped;
229 m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, stop);
230}
231
Greg Clayton32e0a752011-03-30 18:16:51 +0000232void
Greg Clayton8b82f082011-04-12 05:54:46 +0000233ProcessInstanceInfo::Dump (Stream &s, Platform *platform) const
Greg Clayton32e0a752011-03-30 18:16:51 +0000234{
235 const char *cstr;
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000236 if (m_pid != LLDB_INVALID_PROCESS_ID)
Daniel Malead01b2952012-11-29 21:49:15 +0000237 s.Printf (" pid = %" PRIu64 "\n", m_pid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000238
239 if (m_parent_pid != LLDB_INVALID_PROCESS_ID)
Daniel Malead01b2952012-11-29 21:49:15 +0000240 s.Printf (" parent = %" PRIu64 "\n", m_parent_pid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000241
242 if (m_executable)
243 {
244 s.Printf (" name = %s\n", m_executable.GetFilename().GetCString());
245 s.PutCString (" file = ");
246 m_executable.Dump(&s);
247 s.EOL();
248 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000249 const uint32_t argc = m_arguments.GetArgumentCount();
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000250 if (argc > 0)
251 {
252 for (uint32_t i=0; i<argc; i++)
253 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000254 const char *arg = m_arguments.GetArgumentAtIndex(i);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000255 if (i < 10)
Greg Clayton8b82f082011-04-12 05:54:46 +0000256 s.Printf (" arg[%u] = %s\n", i, arg);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000257 else
Greg Clayton8b82f082011-04-12 05:54:46 +0000258 s.Printf ("arg[%u] = %s\n", i, arg);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000259 }
260 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000261
262 const uint32_t envc = m_environment.GetArgumentCount();
263 if (envc > 0)
264 {
265 for (uint32_t i=0; i<envc; i++)
266 {
267 const char *env = m_environment.GetArgumentAtIndex(i);
268 if (i < 10)
269 s.Printf (" env[%u] = %s\n", i, env);
270 else
271 s.Printf ("env[%u] = %s\n", i, env);
272 }
273 }
274
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000275 if (m_arch.IsValid())
276 s.Printf (" arch = %s\n", m_arch.GetTriple().str().c_str());
277
Greg Clayton8b82f082011-04-12 05:54:46 +0000278 if (m_uid != UINT32_MAX)
Greg Clayton32e0a752011-03-30 18:16:51 +0000279 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000280 cstr = platform->GetUserName (m_uid);
281 s.Printf (" uid = %-5u (%s)\n", m_uid, cstr ? cstr : "");
Greg Clayton32e0a752011-03-30 18:16:51 +0000282 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000283 if (m_gid != UINT32_MAX)
Greg Clayton32e0a752011-03-30 18:16:51 +0000284 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000285 cstr = platform->GetGroupName (m_gid);
286 s.Printf (" gid = %-5u (%s)\n", m_gid, cstr ? cstr : "");
Greg Clayton32e0a752011-03-30 18:16:51 +0000287 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000288 if (m_euid != UINT32_MAX)
Greg Clayton32e0a752011-03-30 18:16:51 +0000289 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000290 cstr = platform->GetUserName (m_euid);
291 s.Printf (" euid = %-5u (%s)\n", m_euid, cstr ? cstr : "");
Greg Clayton32e0a752011-03-30 18:16:51 +0000292 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000293 if (m_egid != UINT32_MAX)
Greg Clayton32e0a752011-03-30 18:16:51 +0000294 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000295 cstr = platform->GetGroupName (m_egid);
296 s.Printf (" egid = %-5u (%s)\n", m_egid, cstr ? cstr : "");
Greg Clayton32e0a752011-03-30 18:16:51 +0000297 }
298}
299
300void
Greg Clayton8b82f082011-04-12 05:54:46 +0000301ProcessInstanceInfo::DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose)
Greg Clayton32e0a752011-03-30 18:16:51 +0000302{
Greg Clayton8b82f082011-04-12 05:54:46 +0000303 const char *label;
304 if (show_args || verbose)
305 label = "ARGUMENTS";
306 else
307 label = "NAME";
308
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000309 if (verbose)
310 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000311 s.Printf ("PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE %s\n", label);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000312 s.PutCString ("====== ====== ========== ========== ========== ========== ======================== ============================\n");
313 }
314 else
315 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000316 s.Printf ("PID PARENT USER ARCH %s\n", label);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000317 s.PutCString ("====== ====== ========== ======= ============================\n");
318 }
Greg Clayton32e0a752011-03-30 18:16:51 +0000319}
320
321void
Greg Clayton8b82f082011-04-12 05:54:46 +0000322ProcessInstanceInfo::DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const
Greg Clayton32e0a752011-03-30 18:16:51 +0000323{
324 if (m_pid != LLDB_INVALID_PROCESS_ID)
325 {
326 const char *cstr;
Daniel Malead01b2952012-11-29 21:49:15 +0000327 s.Printf ("%-6" PRIu64 " %-6" PRIu64 " ", m_pid, m_parent_pid);
Greg Clayton32e0a752011-03-30 18:16:51 +0000328
Greg Clayton32e0a752011-03-30 18:16:51 +0000329
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000330 if (verbose)
331 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000332 cstr = platform->GetUserName (m_uid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000333 if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
334 s.Printf ("%-10s ", cstr);
335 else
Greg Clayton8b82f082011-04-12 05:54:46 +0000336 s.Printf ("%-10u ", m_uid);
Greg Clayton32e0a752011-03-30 18:16:51 +0000337
Greg Clayton8b82f082011-04-12 05:54:46 +0000338 cstr = platform->GetGroupName (m_gid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000339 if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
340 s.Printf ("%-10s ", cstr);
341 else
Greg Clayton8b82f082011-04-12 05:54:46 +0000342 s.Printf ("%-10u ", m_gid);
Greg Clayton32e0a752011-03-30 18:16:51 +0000343
Greg Clayton8b82f082011-04-12 05:54:46 +0000344 cstr = platform->GetUserName (m_euid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000345 if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
346 s.Printf ("%-10s ", cstr);
347 else
Greg Clayton8b82f082011-04-12 05:54:46 +0000348 s.Printf ("%-10u ", m_euid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000349
Greg Clayton8b82f082011-04-12 05:54:46 +0000350 cstr = platform->GetGroupName (m_egid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000351 if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
352 s.Printf ("%-10s ", cstr);
353 else
Greg Clayton8b82f082011-04-12 05:54:46 +0000354 s.Printf ("%-10u ", m_egid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000355 s.Printf ("%-24s ", m_arch.IsValid() ? m_arch.GetTriple().str().c_str() : "");
356 }
357 else
358 {
Jason Molendafd54b362011-09-20 21:44:10 +0000359 s.Printf ("%-10s %-7d %s ",
Greg Clayton8b82f082011-04-12 05:54:46 +0000360 platform->GetUserName (m_euid),
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000361 (int)m_arch.GetTriple().getArchName().size(),
362 m_arch.GetTriple().getArchName().data());
363 }
364
Greg Clayton8b82f082011-04-12 05:54:46 +0000365 if (verbose || show_args)
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000366 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000367 const uint32_t argc = m_arguments.GetArgumentCount();
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000368 if (argc > 0)
369 {
370 for (uint32_t i=0; i<argc; i++)
371 {
372 if (i > 0)
373 s.PutChar (' ');
Greg Clayton8b82f082011-04-12 05:54:46 +0000374 s.PutCString (m_arguments.GetArgumentAtIndex(i));
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000375 }
376 }
377 }
378 else
379 {
380 s.PutCString (GetName());
381 }
382
383 s.EOL();
Greg Clayton32e0a752011-03-30 18:16:51 +0000384 }
385}
386
Greg Clayton8b82f082011-04-12 05:54:46 +0000387
388void
Greg Clayton45392552012-10-17 22:57:12 +0000389ProcessInfo::SetArguments (char const **argv, bool first_arg_is_executable)
Greg Clayton982c9762011-11-03 21:22:33 +0000390{
391 m_arguments.SetArguments (argv);
392
393 // Is the first argument the executable?
394 if (first_arg_is_executable)
395 {
396 const char *first_arg = m_arguments.GetArgumentAtIndex (0);
397 if (first_arg)
398 {
399 // Yes the first argument is an executable, set it as the executable
400 // in the launch options. Don't resolve the file path as the path
401 // could be a remote platform path
402 const bool resolve = false;
403 m_executable.SetFile(first_arg, resolve);
Greg Clayton982c9762011-11-03 21:22:33 +0000404 }
405 }
406}
407void
Greg Clayton45392552012-10-17 22:57:12 +0000408ProcessInfo::SetArguments (const Args& args, bool first_arg_is_executable)
Greg Clayton8b82f082011-04-12 05:54:46 +0000409{
410 // Copy all arguments
411 m_arguments = args;
412
413 // Is the first argument the executable?
414 if (first_arg_is_executable)
415 {
Greg Clayton982c9762011-11-03 21:22:33 +0000416 const char *first_arg = m_arguments.GetArgumentAtIndex (0);
Greg Clayton8b82f082011-04-12 05:54:46 +0000417 if (first_arg)
418 {
419 // Yes the first argument is an executable, set it as the executable
420 // in the launch options. Don't resolve the file path as the path
421 // could be a remote platform path
422 const bool resolve = false;
423 m_executable.SetFile(first_arg, resolve);
Greg Clayton8b82f082011-04-12 05:54:46 +0000424 }
425 }
426}
427
Greg Clayton1d885962011-11-08 02:43:13 +0000428void
Greg Claytonee95ed52011-11-17 22:14:31 +0000429ProcessLaunchInfo::FinalizeFileActions (Target *target, bool default_to_use_pty)
Greg Clayton1d885962011-11-08 02:43:13 +0000430{
431 // If notthing was specified, then check the process for any default
432 // settings that were set with "settings set"
433 if (m_file_actions.empty())
434 {
Greg Clayton1d885962011-11-08 02:43:13 +0000435 if (m_flags.Test(eLaunchFlagDisableSTDIO))
436 {
Greg Clayton9845a8d2012-03-06 04:01:04 +0000437 AppendSuppressFileAction (STDIN_FILENO , true, false);
438 AppendSuppressFileAction (STDOUT_FILENO, false, true);
439 AppendSuppressFileAction (STDERR_FILENO, false, true);
Greg Clayton1d885962011-11-08 02:43:13 +0000440 }
441 else
442 {
443 // Check for any values that might have gotten set with any of:
444 // (lldb) settings set target.input-path
445 // (lldb) settings set target.output-path
446 // (lldb) settings set target.error-path
Greg Clayton67cc0632012-08-22 17:17:09 +0000447 FileSpec in_path;
448 FileSpec out_path;
449 FileSpec err_path;
Greg Clayton1d885962011-11-08 02:43:13 +0000450 if (target)
451 {
Greg Clayton9845a8d2012-03-06 04:01:04 +0000452 in_path = target->GetStandardInputPath();
453 out_path = target->GetStandardOutputPath();
454 err_path = target->GetStandardErrorPath();
Greg Claytonee95ed52011-11-17 22:14:31 +0000455 }
456
Greg Clayton67cc0632012-08-22 17:17:09 +0000457 if (in_path || out_path || err_path)
458 {
459 char path[PATH_MAX];
460 if (in_path && in_path.GetPath(path, sizeof(path)))
461 AppendOpenFileAction(STDIN_FILENO, path, true, false);
462
463 if (out_path && out_path.GetPath(path, sizeof(path)))
464 AppendOpenFileAction(STDOUT_FILENO, path, false, true);
465
466 if (err_path && err_path.GetPath(path, sizeof(path)))
467 AppendOpenFileAction(STDERR_FILENO, path, false, true);
468 }
469 else if (default_to_use_pty)
Greg Claytonee95ed52011-11-17 22:14:31 +0000470 {
471 if (m_pty.OpenFirstAvailableMaster (O_RDWR|O_NOCTTY, NULL, 0))
Greg Clayton1d885962011-11-08 02:43:13 +0000472 {
Greg Clayton67cc0632012-08-22 17:17:09 +0000473 const char *slave_path = m_pty.GetSlaveName (NULL, 0);
474 AppendOpenFileAction(STDIN_FILENO, slave_path, true, false);
475 AppendOpenFileAction(STDOUT_FILENO, slave_path, false, true);
476 AppendOpenFileAction(STDERR_FILENO, slave_path, false, true);
Greg Clayton1d885962011-11-08 02:43:13 +0000477 }
478 }
Greg Clayton1d885962011-11-08 02:43:13 +0000479 }
480 }
481}
482
Greg Clayton144f3a92011-11-15 03:53:30 +0000483
484bool
Greg Claytond1cf11a2012-04-14 01:42:46 +0000485ProcessLaunchInfo::ConvertArgumentsForLaunchingInShell (Error &error,
486 bool localhost,
487 bool will_debug,
488 bool first_arg_is_full_shell_command)
Greg Clayton144f3a92011-11-15 03:53:30 +0000489{
490 error.Clear();
491
492 if (GetFlags().Test (eLaunchFlagLaunchInShell))
493 {
494 const char *shell_executable = GetShell();
495 if (shell_executable)
496 {
497 char shell_resolved_path[PATH_MAX];
498
499 if (localhost)
500 {
501 FileSpec shell_filespec (shell_executable, true);
502
503 if (!shell_filespec.Exists())
504 {
505 // Resolve the path in case we just got "bash", "sh" or "tcsh"
506 if (!shell_filespec.ResolveExecutableLocation ())
507 {
508 error.SetErrorStringWithFormat("invalid shell path '%s'", shell_executable);
509 return false;
510 }
511 }
512 shell_filespec.GetPath (shell_resolved_path, sizeof(shell_resolved_path));
513 shell_executable = shell_resolved_path;
514 }
515
Greg Clayton45392552012-10-17 22:57:12 +0000516 const char **argv = GetArguments().GetConstArgumentVector ();
517 if (argv == NULL || argv[0] == NULL)
518 return false;
Greg Clayton144f3a92011-11-15 03:53:30 +0000519 Args shell_arguments;
520 std::string safe_arg;
521 shell_arguments.AppendArgument (shell_executable);
Greg Clayton144f3a92011-11-15 03:53:30 +0000522 shell_arguments.AppendArgument ("-c");
Greg Claytond1cf11a2012-04-14 01:42:46 +0000523 StreamString shell_command;
524 if (will_debug)
Greg Clayton144f3a92011-11-15 03:53:30 +0000525 {
Greg Clayton45392552012-10-17 22:57:12 +0000526 // Add a modified PATH environment variable in case argv[0]
527 // is a relative path
528 const char *argv0 = argv[0];
529 if (argv0 && (argv0[0] != '/' && argv0[0] != '~'))
530 {
531 // We have a relative path to our executable which may not work if
532 // we just try to run "a.out" (without it being converted to "./a.out")
533 const char *working_dir = GetWorkingDirectory();
Greg Clayton8938f8d2013-02-14 03:54:39 +0000534 // Be sure to put quotes around PATH's value in case any paths have spaces...
535 std::string new_path("PATH=\"");
Greg Clayton45392552012-10-17 22:57:12 +0000536 const size_t empty_path_len = new_path.size();
537
538 if (working_dir && working_dir[0])
539 {
540 new_path += working_dir;
541 }
542 else
543 {
544 char current_working_dir[PATH_MAX];
545 const char *cwd = getcwd(current_working_dir, sizeof(current_working_dir));
546 if (cwd && cwd[0])
547 new_path += cwd;
548 }
549 const char *curr_path = getenv("PATH");
550 if (curr_path)
551 {
552 if (new_path.size() > empty_path_len)
553 new_path += ':';
554 new_path += curr_path;
555 }
Greg Clayton8938f8d2013-02-14 03:54:39 +0000556 new_path += "\" ";
Greg Clayton45392552012-10-17 22:57:12 +0000557 shell_command.PutCString(new_path.c_str());
558 }
559
Greg Claytond1cf11a2012-04-14 01:42:46 +0000560 shell_command.PutCString ("exec");
Greg Clayton45392552012-10-17 22:57:12 +0000561
Greg Clayton45392552012-10-17 22:57:12 +0000562 // Only Apple supports /usr/bin/arch being able to specify the architecture
Greg Claytond1cf11a2012-04-14 01:42:46 +0000563 if (GetArchitecture().IsValid())
564 {
565 shell_command.Printf(" /usr/bin/arch -arch %s", GetArchitecture().GetArchitectureName());
Greg Clayton45392552012-10-17 22:57:12 +0000566 // Set the resume count to 2:
Greg Claytond1cf11a2012-04-14 01:42:46 +0000567 // 1 - stop in shell
568 // 2 - stop in /usr/bin/arch
569 // 3 - then we will stop in our program
570 SetResumeCount(2);
571 }
572 else
573 {
Greg Clayton45392552012-10-17 22:57:12 +0000574 // Set the resume count to 1:
Greg Claytond1cf11a2012-04-14 01:42:46 +0000575 // 1 - stop in shell
576 // 2 - then we will stop in our program
577 SetResumeCount(1);
578 }
Greg Clayton144f3a92011-11-15 03:53:30 +0000579 }
Greg Clayton45392552012-10-17 22:57:12 +0000580
581 if (first_arg_is_full_shell_command)
Greg Clayton144f3a92011-11-15 03:53:30 +0000582 {
Greg Clayton45392552012-10-17 22:57:12 +0000583 // There should only be one argument that is the shell command itself to be used as is
584 if (argv[0] && !argv[1])
585 shell_command.Printf("%s", argv[0]);
Greg Claytond1cf11a2012-04-14 01:42:46 +0000586 else
Greg Clayton45392552012-10-17 22:57:12 +0000587 return false;
Greg Clayton144f3a92011-11-15 03:53:30 +0000588 }
Greg Claytond1cf11a2012-04-14 01:42:46 +0000589 else
590 {
Greg Clayton45392552012-10-17 22:57:12 +0000591 for (size_t i=0; argv[i] != NULL; ++i)
592 {
593 const char *arg = Args::GetShellSafeArgument (argv[i], safe_arg);
594 shell_command.Printf(" %s", arg);
595 }
Greg Claytond1cf11a2012-04-14 01:42:46 +0000596 }
Greg Clayton45392552012-10-17 22:57:12 +0000597 shell_arguments.AppendArgument (shell_command.GetString().c_str());
Greg Clayton144f3a92011-11-15 03:53:30 +0000598 m_executable.SetFile(shell_executable, false);
599 m_arguments = shell_arguments;
600 return true;
601 }
602 else
603 {
604 error.SetErrorString ("invalid shell path");
605 }
606 }
607 else
608 {
609 error.SetErrorString ("not launching in shell");
610 }
611 return false;
612}
613
614
Greg Clayton32e0a752011-03-30 18:16:51 +0000615bool
Greg Clayton8b82f082011-04-12 05:54:46 +0000616ProcessLaunchInfo::FileAction::Open (int fd, const char *path, bool read, bool write)
617{
618 if ((read || write) && fd >= 0 && path && path[0])
619 {
620 m_action = eFileActionOpen;
621 m_fd = fd;
622 if (read && write)
Greg Clayton144f3a92011-11-15 03:53:30 +0000623 m_arg = O_NOCTTY | O_CREAT | O_RDWR;
Greg Clayton8b82f082011-04-12 05:54:46 +0000624 else if (read)
Greg Clayton144f3a92011-11-15 03:53:30 +0000625 m_arg = O_NOCTTY | O_RDONLY;
Greg Clayton8b82f082011-04-12 05:54:46 +0000626 else
Greg Clayton144f3a92011-11-15 03:53:30 +0000627 m_arg = O_NOCTTY | O_CREAT | O_WRONLY;
Greg Clayton8b82f082011-04-12 05:54:46 +0000628 m_path.assign (path);
629 return true;
630 }
631 else
632 {
633 Clear();
634 }
635 return false;
636}
637
638bool
639ProcessLaunchInfo::FileAction::Close (int fd)
640{
641 Clear();
642 if (fd >= 0)
643 {
644 m_action = eFileActionClose;
645 m_fd = fd;
646 }
647 return m_fd >= 0;
648}
649
650
651bool
652ProcessLaunchInfo::FileAction::Duplicate (int fd, int dup_fd)
653{
654 Clear();
655 if (fd >= 0 && dup_fd >= 0)
656 {
657 m_action = eFileActionDuplicate;
658 m_fd = fd;
659 m_arg = dup_fd;
660 }
661 return m_fd >= 0;
662}
663
664
665
666bool
667ProcessLaunchInfo::FileAction::AddPosixSpawnFileAction (posix_spawn_file_actions_t *file_actions,
668 const FileAction *info,
669 Log *log,
670 Error& error)
671{
672 if (info == NULL)
673 return false;
674
675 switch (info->m_action)
676 {
677 case eFileActionNone:
678 error.Clear();
679 break;
680
681 case eFileActionClose:
682 if (info->m_fd == -1)
683 error.SetErrorString ("invalid fd for posix_spawn_file_actions_addclose(...)");
684 else
685 {
686 error.SetError (::posix_spawn_file_actions_addclose (file_actions, info->m_fd),
687 eErrorTypePOSIX);
688 if (log && (error.Fail() || log))
689 error.PutToLog(log, "posix_spawn_file_actions_addclose (action=%p, fd=%i)",
690 file_actions, info->m_fd);
691 }
692 break;
693
694 case eFileActionDuplicate:
695 if (info->m_fd == -1)
696 error.SetErrorString ("invalid fd for posix_spawn_file_actions_adddup2(...)");
697 else if (info->m_arg == -1)
698 error.SetErrorString ("invalid duplicate fd for posix_spawn_file_actions_adddup2(...)");
699 else
700 {
701 error.SetError (::posix_spawn_file_actions_adddup2 (file_actions, info->m_fd, info->m_arg),
702 eErrorTypePOSIX);
703 if (log && (error.Fail() || log))
704 error.PutToLog(log, "posix_spawn_file_actions_adddup2 (action=%p, fd=%i, dup_fd=%i)",
705 file_actions, info->m_fd, info->m_arg);
706 }
707 break;
708
709 case eFileActionOpen:
710 if (info->m_fd == -1)
711 error.SetErrorString ("invalid fd in posix_spawn_file_actions_addopen(...)");
712 else
713 {
714 int oflag = info->m_arg;
Greg Clayton144f3a92011-11-15 03:53:30 +0000715
Greg Clayton8b82f082011-04-12 05:54:46 +0000716 mode_t mode = 0;
717
Greg Clayton144f3a92011-11-15 03:53:30 +0000718 if (oflag & O_CREAT)
719 mode = 0640;
720
Greg Clayton8b82f082011-04-12 05:54:46 +0000721 error.SetError (::posix_spawn_file_actions_addopen (file_actions,
722 info->m_fd,
723 info->m_path.c_str(),
724 oflag,
725 mode),
726 eErrorTypePOSIX);
727 if (error.Fail() || log)
728 error.PutToLog(log,
729 "posix_spawn_file_actions_addopen (action=%p, fd=%i, path='%s', oflag=%i, mode=%i)",
730 file_actions, info->m_fd, info->m_path.c_str(), oflag, mode);
731 }
732 break;
Greg Clayton8b82f082011-04-12 05:54:46 +0000733 }
734 return error.Success();
735}
736
737Error
Greg Claytonf6b8b582011-04-13 00:18:08 +0000738ProcessLaunchCommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
Greg Clayton8b82f082011-04-12 05:54:46 +0000739{
740 Error error;
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000741 const int short_option = m_getopt_table[option_idx].val;
Greg Clayton8b82f082011-04-12 05:54:46 +0000742
743 switch (short_option)
744 {
745 case 's': // Stop at program entry point
746 launch_info.GetFlags().Set (eLaunchFlagStopAtEntry);
747 break;
748
Greg Clayton8b82f082011-04-12 05:54:46 +0000749 case 'i': // STDIN for read only
750 {
751 ProcessLaunchInfo::FileAction action;
Greg Clayton9845a8d2012-03-06 04:01:04 +0000752 if (action.Open (STDIN_FILENO, option_arg, true, false))
Greg Clayton8b82f082011-04-12 05:54:46 +0000753 launch_info.AppendFileAction (action);
754 }
755 break;
756
757 case 'o': // Open STDOUT for write only
758 {
759 ProcessLaunchInfo::FileAction action;
Greg Clayton9845a8d2012-03-06 04:01:04 +0000760 if (action.Open (STDOUT_FILENO, option_arg, false, true))
761 launch_info.AppendFileAction (action);
762 }
763 break;
764
765 case 'e': // STDERR for write only
766 {
767 ProcessLaunchInfo::FileAction action;
768 if (action.Open (STDERR_FILENO, option_arg, false, true))
Greg Clayton8b82f082011-04-12 05:54:46 +0000769 launch_info.AppendFileAction (action);
770 }
771 break;
772
Greg Clayton9845a8d2012-03-06 04:01:04 +0000773
Greg Clayton8b82f082011-04-12 05:54:46 +0000774 case 'p': // Process plug-in name
775 launch_info.SetProcessPluginName (option_arg);
776 break;
777
778 case 'n': // Disable STDIO
779 {
780 ProcessLaunchInfo::FileAction action;
Greg Clayton9845a8d2012-03-06 04:01:04 +0000781 if (action.Open (STDIN_FILENO, "/dev/null", true, false))
Greg Clayton8b82f082011-04-12 05:54:46 +0000782 launch_info.AppendFileAction (action);
Greg Clayton9845a8d2012-03-06 04:01:04 +0000783 if (action.Open (STDOUT_FILENO, "/dev/null", false, true))
Greg Clayton8b82f082011-04-12 05:54:46 +0000784 launch_info.AppendFileAction (action);
Greg Clayton9845a8d2012-03-06 04:01:04 +0000785 if (action.Open (STDERR_FILENO, "/dev/null", false, true))
Greg Clayton8b82f082011-04-12 05:54:46 +0000786 launch_info.AppendFileAction (action);
787 }
788 break;
789
790 case 'w':
791 launch_info.SetWorkingDirectory (option_arg);
792 break;
793
794 case 't': // Open process in new terminal window
795 launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY);
796 break;
797
798 case 'a':
Greg Clayton70512312012-05-08 01:45:38 +0000799 if (!launch_info.GetArchitecture().SetTriple (option_arg, m_interpreter.GetPlatform(true).get()))
800 launch_info.GetArchitecture().SetTriple (option_arg);
Greg Clayton8b82f082011-04-12 05:54:46 +0000801 break;
802
803 case 'A':
804 launch_info.GetFlags().Set (eLaunchFlagDisableASLR);
805 break;
806
Greg Clayton982c9762011-11-03 21:22:33 +0000807 case 'c':
Greg Clayton144f3a92011-11-15 03:53:30 +0000808 if (option_arg && option_arg[0])
809 launch_info.SetShell (option_arg);
810 else
811 launch_info.SetShell ("/bin/bash");
Greg Clayton982c9762011-11-03 21:22:33 +0000812 break;
813
Greg Clayton8b82f082011-04-12 05:54:46 +0000814 case 'v':
815 launch_info.GetEnvironmentEntries().AppendArgument(option_arg);
816 break;
817
818 default:
Greg Clayton86edbf42011-10-26 00:56:27 +0000819 error.SetErrorStringWithFormat("unrecognized short option character '%c'", short_option);
Greg Clayton8b82f082011-04-12 05:54:46 +0000820 break;
821
822 }
823 return error;
824}
825
826OptionDefinition
827ProcessLaunchCommandOptions::g_option_table[] =
828{
829{ LLDB_OPT_SET_ALL, false, "stop-at-entry", 's', no_argument, NULL, 0, eArgTypeNone, "Stop at the entry point of the program when launching a process."},
830{ LLDB_OPT_SET_ALL, false, "disable-aslr", 'A', no_argument, NULL, 0, eArgTypeNone, "Disable address space layout randomization when launching a process."},
831{ LLDB_OPT_SET_ALL, false, "plugin", 'p', required_argument, NULL, 0, eArgTypePlugin, "Name of the process plugin you want to use."},
Sean Callanan31542552012-10-24 01:12:14 +0000832{ LLDB_OPT_SET_ALL, false, "working-dir", 'w', required_argument, NULL, 0, eArgTypeDirectoryName, "Set the current working directory to <path> when running the inferior."},
Greg Clayton8b82f082011-04-12 05:54:46 +0000833{ LLDB_OPT_SET_ALL, false, "arch", 'a', required_argument, NULL, 0, eArgTypeArchitecture, "Set the architecture for the process to launch when ambiguous."},
834{ LLDB_OPT_SET_ALL, false, "environment", 'v', required_argument, NULL, 0, eArgTypeNone, "Specify an environment variable name/value stirng (--environement NAME=VALUE). Can be specified multiple times for subsequent environment entries."},
Sean Callanan31542552012-10-24 01:12:14 +0000835{ LLDB_OPT_SET_ALL, false, "shell", 'c', optional_argument, NULL, 0, eArgTypeFilename, "Run the process in a shell (not supported on all platforms)."},
Greg Clayton8b82f082011-04-12 05:54:46 +0000836
Sean Callanan31542552012-10-24 01:12:14 +0000837{ LLDB_OPT_SET_1 , false, "stdin", 'i', required_argument, NULL, 0, eArgTypeFilename, "Redirect stdin for the process to <filename>."},
838{ LLDB_OPT_SET_1 , false, "stdout", 'o', required_argument, NULL, 0, eArgTypeFilename, "Redirect stdout for the process to <filename>."},
839{ LLDB_OPT_SET_1 , false, "stderr", 'e', required_argument, NULL, 0, eArgTypeFilename, "Redirect stderr for the process to <filename>."},
Greg Clayton8b82f082011-04-12 05:54:46 +0000840
841{ LLDB_OPT_SET_2 , false, "tty", 't', no_argument, NULL, 0, eArgTypeNone, "Start the process in a terminal (not supported on all platforms)."},
842
843{ LLDB_OPT_SET_3 , false, "no-stdio", 'n', no_argument, NULL, 0, eArgTypeNone, "Do not set up for terminal I/O to go to running process."},
844
845{ 0 , false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
846};
847
848
849
850bool
851ProcessInstanceInfoMatch::NameMatches (const char *process_name) const
Greg Clayton32e0a752011-03-30 18:16:51 +0000852{
853 if (m_name_match_type == eNameMatchIgnore || process_name == NULL)
854 return true;
855 const char *match_name = m_match_info.GetName();
856 if (!match_name)
857 return true;
858
859 return lldb_private::NameMatches (process_name, m_name_match_type, match_name);
860}
861
862bool
Greg Clayton8b82f082011-04-12 05:54:46 +0000863ProcessInstanceInfoMatch::Matches (const ProcessInstanceInfo &proc_info) const
Greg Clayton32e0a752011-03-30 18:16:51 +0000864{
865 if (!NameMatches (proc_info.GetName()))
866 return false;
867
868 if (m_match_info.ProcessIDIsValid() &&
869 m_match_info.GetProcessID() != proc_info.GetProcessID())
870 return false;
871
872 if (m_match_info.ParentProcessIDIsValid() &&
873 m_match_info.GetParentProcessID() != proc_info.GetParentProcessID())
874 return false;
875
Greg Clayton8b82f082011-04-12 05:54:46 +0000876 if (m_match_info.UserIDIsValid () &&
877 m_match_info.GetUserID() != proc_info.GetUserID())
Greg Clayton32e0a752011-03-30 18:16:51 +0000878 return false;
879
Greg Clayton8b82f082011-04-12 05:54:46 +0000880 if (m_match_info.GroupIDIsValid () &&
881 m_match_info.GetGroupID() != proc_info.GetGroupID())
Greg Clayton32e0a752011-03-30 18:16:51 +0000882 return false;
883
884 if (m_match_info.EffectiveUserIDIsValid () &&
885 m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID())
886 return false;
887
888 if (m_match_info.EffectiveGroupIDIsValid () &&
889 m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID())
890 return false;
891
892 if (m_match_info.GetArchitecture().IsValid() &&
Sean Callananbf4b7be2012-12-13 22:07:14 +0000893 !m_match_info.GetArchitecture().IsCompatibleMatch(proc_info.GetArchitecture()))
Greg Clayton32e0a752011-03-30 18:16:51 +0000894 return false;
895 return true;
896}
897
898bool
Greg Clayton8b82f082011-04-12 05:54:46 +0000899ProcessInstanceInfoMatch::MatchAllProcesses () const
Greg Clayton32e0a752011-03-30 18:16:51 +0000900{
901 if (m_name_match_type != eNameMatchIgnore)
902 return false;
903
904 if (m_match_info.ProcessIDIsValid())
905 return false;
906
907 if (m_match_info.ParentProcessIDIsValid())
908 return false;
909
Greg Clayton8b82f082011-04-12 05:54:46 +0000910 if (m_match_info.UserIDIsValid ())
Greg Clayton32e0a752011-03-30 18:16:51 +0000911 return false;
912
Greg Clayton8b82f082011-04-12 05:54:46 +0000913 if (m_match_info.GroupIDIsValid ())
Greg Clayton32e0a752011-03-30 18:16:51 +0000914 return false;
915
916 if (m_match_info.EffectiveUserIDIsValid ())
917 return false;
918
919 if (m_match_info.EffectiveGroupIDIsValid ())
920 return false;
921
922 if (m_match_info.GetArchitecture().IsValid())
923 return false;
924
925 if (m_match_all_users)
926 return false;
927
928 return true;
929
930}
931
932void
Greg Clayton8b82f082011-04-12 05:54:46 +0000933ProcessInstanceInfoMatch::Clear()
Greg Clayton32e0a752011-03-30 18:16:51 +0000934{
935 m_match_info.Clear();
936 m_name_match_type = eNameMatchIgnore;
937 m_match_all_users = false;
938}
Greg Clayton58be07b2011-01-07 06:08:19 +0000939
Greg Claytonc3776bf2012-02-09 06:16:32 +0000940ProcessSP
941Process::FindPlugin (Target &target, const char *plugin_name, Listener &listener, const FileSpec *crash_file_path)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000942{
Greg Clayton949e8222013-01-16 17:29:04 +0000943 static uint32_t g_process_unique_id = 0;
944
Greg Claytonc3776bf2012-02-09 06:16:32 +0000945 ProcessSP process_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000946 ProcessCreateInstance create_callback = NULL;
947 if (plugin_name)
948 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000949 ConstString const_plugin_name(plugin_name);
950 create_callback = PluginManager::GetProcessCreateCallbackForPluginName (const_plugin_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000951 if (create_callback)
952 {
Greg Claytonc3776bf2012-02-09 06:16:32 +0000953 process_sp = create_callback(target, listener, crash_file_path);
954 if (process_sp)
955 {
Greg Clayton949e8222013-01-16 17:29:04 +0000956 if (process_sp->CanDebug(target, true))
957 {
958 process_sp->m_process_unique_id = ++g_process_unique_id;
959 }
960 else
Greg Claytonc3776bf2012-02-09 06:16:32 +0000961 process_sp.reset();
962 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000963 }
964 }
965 else
966 {
Greg Claytonc982c762010-07-09 20:39:50 +0000967 for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000968 {
Greg Claytonc3776bf2012-02-09 06:16:32 +0000969 process_sp = create_callback(target, listener, crash_file_path);
970 if (process_sp)
971 {
Greg Clayton949e8222013-01-16 17:29:04 +0000972 if (process_sp->CanDebug(target, false))
973 {
974 process_sp->m_process_unique_id = ++g_process_unique_id;
Greg Claytonc3776bf2012-02-09 06:16:32 +0000975 break;
Greg Clayton949e8222013-01-16 17:29:04 +0000976 }
977 else
978 process_sp.reset();
Greg Claytonc3776bf2012-02-09 06:16:32 +0000979 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000980 }
981 }
Greg Claytonc3776bf2012-02-09 06:16:32 +0000982 return process_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000983}
984
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000985ConstString &
986Process::GetStaticBroadcasterClass ()
987{
988 static ConstString class_name ("lldb.process");
989 return class_name;
990}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000991
992//----------------------------------------------------------------------
993// Process constructor
994//----------------------------------------------------------------------
995Process::Process(Target &target, Listener &listener) :
Greg Clayton67cc0632012-08-22 17:17:09 +0000996 ProcessProperties (false),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000997 UserID (LLDB_INVALID_PROCESS_ID),
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000998 Broadcaster (&(target.GetDebugger()), "lldb.process"),
Sean Callananbb777042013-05-16 17:30:37 +0000999 m_reservation_cache (*this),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001000 m_target (target),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001001 m_public_state (eStateUnloaded),
1002 m_private_state (eStateUnloaded),
Jim Ingham4bddaeb2012-02-16 06:50:00 +00001003 m_private_state_broadcaster (NULL, "lldb.process.internal_state_broadcaster"),
1004 m_private_state_control_broadcaster (NULL, "lldb.process.internal_state_control_broadcaster"),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001005 m_private_state_listener ("lldb.process.internal_state_listener"),
1006 m_private_state_control_wait(),
1007 m_private_state_thread (LLDB_INVALID_HOST_THREAD),
Jim Ingham4b536182011-08-09 02:12:22 +00001008 m_mod_id (),
Greg Clayton949e8222013-01-16 17:29:04 +00001009 m_process_unique_id(0),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001010 m_thread_index_id (0),
Han Ming Ongc2c423e2013-01-08 22:10:01 +00001011 m_thread_id_to_index_id_map (),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001012 m_exit_status (-1),
1013 m_exit_string (),
Andrew Kaylorba4e61d2013-05-07 18:35:34 +00001014 m_thread_mutex (Mutex::eMutexTypeRecursive),
1015 m_thread_list_real (this),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001016 m_thread_list (this),
1017 m_notifications (),
Greg Clayton3af9ea52010-11-18 05:57:03 +00001018 m_image_tokens (),
1019 m_listener (listener),
1020 m_breakpoint_site_list (),
Greg Clayton3af9ea52010-11-18 05:57:03 +00001021 m_dynamic_checkers_ap (),
Caroline Ticeef5c6d02010-11-16 05:07:41 +00001022 m_unix_signals (),
Greg Clayton3af9ea52010-11-18 05:57:03 +00001023 m_abi_sp (),
Caroline Ticeef5c6d02010-11-16 05:07:41 +00001024 m_process_input_reader (),
Greg Clayton3e06bd92011-01-09 21:07:35 +00001025 m_stdio_communication ("process.stdio"),
Greg Clayton3af9ea52010-11-18 05:57:03 +00001026 m_stdio_communication_mutex (Mutex::eMutexTypeRecursive),
Greg Clayton58be07b2011-01-07 06:08:19 +00001027 m_stdout_data (),
Greg Clayton93e86192011-11-13 04:45:22 +00001028 m_stderr_data (),
Han Ming Ongab3b8b22012-11-17 00:21:04 +00001029 m_profile_data_comm_mutex (Mutex::eMutexTypeRecursive),
1030 m_profile_data (),
Greg Claytond495c532011-05-17 03:37:42 +00001031 m_memory_cache (*this),
1032 m_allocated_memory_cache (*this),
Greg Claytone24c4ac2011-11-17 04:46:02 +00001033 m_should_detach (false),
Sean Callanan90539452011-09-20 23:01:51 +00001034 m_next_event_action_ap(),
Greg Clayton96249852013-04-18 16:57:27 +00001035 m_public_run_lock (),
Greg Clayton96249852013-04-18 16:57:27 +00001036 m_private_run_lock (),
Jim Inghamaacc3182012-06-06 00:29:30 +00001037 m_currently_handling_event(false),
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001038 m_finalize_called(false),
Greg Claytonf9b57b92013-05-10 23:48:10 +00001039 m_clear_thread_plans_on_stop (false),
Jim Ingham0161b492013-02-09 01:29:05 +00001040 m_last_broadcast_state (eStateInvalid),
Jason Molenda69b6b632013-03-05 03:33:59 +00001041 m_destroy_in_process (false),
1042 m_can_jit(eCanJITDontKnow)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001043{
Jim Ingham4bddaeb2012-02-16 06:50:00 +00001044 CheckInWithManager ();
Caroline Tice1559a462010-09-27 00:30:10 +00001045
Greg Clayton5160ce52013-03-27 23:08:40 +00001046 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001047 if (log)
1048 log->Printf ("%p Process::Process()", this);
1049
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001050 SetEventName (eBroadcastBitStateChanged, "state-changed");
1051 SetEventName (eBroadcastBitInterrupt, "interrupt");
1052 SetEventName (eBroadcastBitSTDOUT, "stdout-available");
1053 SetEventName (eBroadcastBitSTDERR, "stderr-available");
Han Ming Ongab3b8b22012-11-17 00:21:04 +00001054 SetEventName (eBroadcastBitProfileData, "profile-data-available");
Greg Claytoncfd1ace2010-10-31 03:01:06 +00001055
Greg Clayton35a4cc52012-10-29 20:52:08 +00001056 m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlStop , "control-stop" );
1057 m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlPause , "control-pause" );
1058 m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlResume, "control-resume");
1059
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001060 listener.StartListeningForEvents (this,
1061 eBroadcastBitStateChanged |
1062 eBroadcastBitInterrupt |
1063 eBroadcastBitSTDOUT |
Han Ming Ongab3b8b22012-11-17 00:21:04 +00001064 eBroadcastBitSTDERR |
1065 eBroadcastBitProfileData);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001066
1067 m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster,
Jim Inghamcfc09352012-07-27 23:57:19 +00001068 eBroadcastBitStateChanged |
1069 eBroadcastBitInterrupt);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001070
1071 m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster,
1072 eBroadcastInternalStateControlStop |
1073 eBroadcastInternalStateControlPause |
1074 eBroadcastInternalStateControlResume);
1075}
1076
1077//----------------------------------------------------------------------
1078// Destructor
1079//----------------------------------------------------------------------
1080Process::~Process()
1081{
Greg Clayton5160ce52013-03-27 23:08:40 +00001082 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001083 if (log)
1084 log->Printf ("%p Process::~Process()", this);
1085 StopPrivateStateThread();
1086}
1087
Greg Clayton67cc0632012-08-22 17:17:09 +00001088const ProcessPropertiesSP &
1089Process::GetGlobalProperties()
1090{
1091 static ProcessPropertiesSP g_settings_sp;
1092 if (!g_settings_sp)
1093 g_settings_sp.reset (new ProcessProperties (true));
1094 return g_settings_sp;
1095}
1096
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001097void
1098Process::Finalize()
1099{
Greg Claytone24c4ac2011-11-17 04:46:02 +00001100 switch (GetPrivateState())
1101 {
1102 case eStateConnected:
1103 case eStateAttaching:
1104 case eStateLaunching:
1105 case eStateStopped:
1106 case eStateRunning:
1107 case eStateStepping:
1108 case eStateCrashed:
1109 case eStateSuspended:
1110 if (GetShouldDetach())
Jim Inghamacff8952013-05-02 00:27:30 +00001111 {
1112 // FIXME: This will have to be a process setting:
1113 bool keep_stopped = false;
1114 Detach(keep_stopped);
1115 }
Greg Claytone24c4ac2011-11-17 04:46:02 +00001116 else
1117 Destroy();
1118 break;
1119
1120 case eStateInvalid:
1121 case eStateUnloaded:
1122 case eStateDetached:
1123 case eStateExited:
1124 break;
1125 }
1126
Greg Clayton1ed54f52011-10-01 00:45:15 +00001127 // Clear our broadcaster before we proceed with destroying
1128 Broadcaster::Clear();
1129
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001130 // Do any cleanup needed prior to being destructed... Subclasses
1131 // that override this method should call this superclass method as well.
Jim Inghamd0a3e122011-02-16 17:54:55 +00001132
1133 // We need to destroy the loader before the derived Process class gets destroyed
1134 // since it is very likely that undoing the loader will require access to the real process.
Greg Clayton894f82f2012-01-20 23:08:34 +00001135 m_dynamic_checkers_ap.reset();
1136 m_abi_sp.reset();
Greg Clayton56d9a1b2011-08-22 02:49:39 +00001137 m_os_ap.reset();
Greg Clayton894f82f2012-01-20 23:08:34 +00001138 m_dyld_ap.reset();
Andrew Kaylorba4e61d2013-05-07 18:35:34 +00001139 m_thread_list_real.Destroy();
Greg Claytone1cd1be2012-01-29 20:56:30 +00001140 m_thread_list.Destroy();
Greg Clayton894f82f2012-01-20 23:08:34 +00001141 std::vector<Notifications> empty_notifications;
1142 m_notifications.swap(empty_notifications);
1143 m_image_tokens.clear();
1144 m_memory_cache.Clear();
1145 m_allocated_memory_cache.Clear();
1146 m_language_runtimes.clear();
1147 m_next_event_action_ap.reset();
Greg Clayton35a4cc52012-10-29 20:52:08 +00001148//#ifdef LLDB_CONFIGURATION_DEBUG
1149// StreamFile s(stdout, false);
1150// EventSP event_sp;
1151// while (m_private_state_listener.GetNextEvent(event_sp))
1152// {
1153// event_sp->Dump (&s);
1154// s.EOL();
1155// }
1156//#endif
1157 // We have to be very careful here as the m_private_state_listener might
1158 // contain events that have ProcessSP values in them which can keep this
1159 // process around forever. These events need to be cleared out.
1160 m_private_state_listener.Clear();
Greg Claytonaa49c832013-05-03 22:25:56 +00001161 m_public_run_lock.WriteTryLock(); // This will do nothing if already locked
Greg Clayton96249852013-04-18 16:57:27 +00001162 m_public_run_lock.WriteUnlock();
Greg Claytonaa49c832013-05-03 22:25:56 +00001163 m_private_run_lock.WriteTryLock(); // This will do nothing if already locked
Greg Clayton96249852013-04-18 16:57:27 +00001164 m_private_run_lock.WriteUnlock();
Jim Ingham4fc6cb92012-08-22 21:34:33 +00001165 m_finalize_called = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001166}
1167
1168void
1169Process::RegisterNotificationCallbacks (const Notifications& callbacks)
1170{
1171 m_notifications.push_back(callbacks);
1172 if (callbacks.initialize != NULL)
1173 callbacks.initialize (callbacks.baton, this);
1174}
1175
1176bool
1177Process::UnregisterNotificationCallbacks(const Notifications& callbacks)
1178{
1179 std::vector<Notifications>::iterator pos, end = m_notifications.end();
1180 for (pos = m_notifications.begin(); pos != end; ++pos)
1181 {
1182 if (pos->baton == callbacks.baton &&
1183 pos->initialize == callbacks.initialize &&
1184 pos->process_state_changed == callbacks.process_state_changed)
1185 {
1186 m_notifications.erase(pos);
1187 return true;
1188 }
1189 }
1190 return false;
1191}
1192
1193void
1194Process::SynchronouslyNotifyStateChanged (StateType state)
1195{
1196 std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end();
1197 for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos)
1198 {
1199 if (notification_pos->process_state_changed)
1200 notification_pos->process_state_changed (notification_pos->baton, this, state);
1201 }
1202}
1203
1204// FIXME: We need to do some work on events before the general Listener sees them.
1205// For instance if we are continuing from a breakpoint, we need to ensure that we do
1206// the little "insert real insn, step & stop" trick. But we can't do that when the
1207// event is delivered by the broadcaster - since that is done on the thread that is
1208// waiting for new events, so if we needed more than one event for our handling, we would
1209// stall. So instead we do it when we fetch the event off of the queue.
1210//
1211
1212StateType
1213Process::GetNextEvent (EventSP &event_sp)
1214{
1215 StateType state = eStateInvalid;
1216
1217 if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp)
1218 state = Process::ProcessEventData::GetStateFromEvent (event_sp.get());
1219
1220 return state;
1221}
1222
1223
1224StateType
Greg Clayton85fb1b92012-09-11 02:33:37 +00001225Process::WaitForProcessToStop (const TimeValue *timeout, lldb::EventSP *event_sp_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001226{
Jim Ingham4b536182011-08-09 02:12:22 +00001227 // We can't just wait for a "stopped" event, because the stopped event may have restarted the target.
1228 // We have to actually check each event, and in the case of a stopped event check the restarted flag
1229 // on the event.
Greg Clayton85fb1b92012-09-11 02:33:37 +00001230 if (event_sp_ptr)
1231 event_sp_ptr->reset();
Jim Ingham4b536182011-08-09 02:12:22 +00001232 StateType state = GetState();
1233 // If we are exited or detached, we won't ever get back to any
1234 // other valid state...
1235 if (state == eStateDetached || state == eStateExited)
1236 return state;
1237
1238 while (state != eStateInvalid)
1239 {
Greg Clayton85fb1b92012-09-11 02:33:37 +00001240 EventSP event_sp;
Jim Ingham4b536182011-08-09 02:12:22 +00001241 state = WaitForStateChangedEvents (timeout, event_sp);
Greg Clayton85fb1b92012-09-11 02:33:37 +00001242 if (event_sp_ptr && event_sp)
1243 *event_sp_ptr = event_sp;
1244
Jim Ingham4b536182011-08-09 02:12:22 +00001245 switch (state)
1246 {
1247 case eStateCrashed:
1248 case eStateDetached:
1249 case eStateExited:
1250 case eStateUnloaded:
1251 return state;
1252 case eStateStopped:
1253 if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
1254 continue;
1255 else
1256 return state;
1257 default:
1258 continue;
1259 }
1260 }
1261 return state;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001262}
1263
1264
1265StateType
1266Process::WaitForState
1267(
1268 const TimeValue *timeout,
1269 const StateType *match_states, const uint32_t num_match_states
1270)
1271{
1272 EventSP event_sp;
1273 uint32_t i;
Greg Clayton05faeb72010-10-07 04:19:01 +00001274 StateType state = GetState();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001275 while (state != eStateInvalid)
1276 {
Greg Clayton05faeb72010-10-07 04:19:01 +00001277 // If we are exited or detached, we won't ever get back to any
1278 // other valid state...
1279 if (state == eStateDetached || state == eStateExited)
1280 return state;
1281
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001282 state = WaitForStateChangedEvents (timeout, event_sp);
1283
1284 for (i=0; i<num_match_states; ++i)
1285 {
1286 if (match_states[i] == state)
1287 return state;
1288 }
1289 }
1290 return state;
1291}
1292
Jim Ingham30f9b212010-10-11 23:53:14 +00001293bool
1294Process::HijackProcessEvents (Listener *listener)
1295{
1296 if (listener != NULL)
1297 {
Jim Inghamcfc09352012-07-27 23:57:19 +00001298 return HijackBroadcaster(listener, eBroadcastBitStateChanged | eBroadcastBitInterrupt);
Jim Ingham30f9b212010-10-11 23:53:14 +00001299 }
1300 else
1301 return false;
1302}
1303
1304void
1305Process::RestoreProcessEvents ()
1306{
1307 RestoreBroadcaster();
1308}
1309
Jim Ingham0f16e732011-02-08 05:20:59 +00001310bool
1311Process::HijackPrivateProcessEvents (Listener *listener)
1312{
1313 if (listener != NULL)
1314 {
Jim Inghamcfc09352012-07-27 23:57:19 +00001315 return m_private_state_broadcaster.HijackBroadcaster(listener, eBroadcastBitStateChanged | eBroadcastBitInterrupt);
Jim Ingham0f16e732011-02-08 05:20:59 +00001316 }
1317 else
1318 return false;
1319}
1320
1321void
1322Process::RestorePrivateProcessEvents ()
1323{
1324 m_private_state_broadcaster.RestoreBroadcaster();
1325}
1326
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001327StateType
1328Process::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp)
1329{
Greg Clayton5160ce52013-03-27 23:08:40 +00001330 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001331
1332 if (log)
1333 log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
1334
1335 StateType state = eStateInvalid;
Greg Clayton3fcbed62010-10-19 03:25:40 +00001336 if (m_listener.WaitForEventForBroadcasterWithType (timeout,
1337 this,
Jim Inghamcfc09352012-07-27 23:57:19 +00001338 eBroadcastBitStateChanged | eBroadcastBitInterrupt,
Greg Clayton3fcbed62010-10-19 03:25:40 +00001339 event_sp))
Jim Inghamcfc09352012-07-27 23:57:19 +00001340 {
1341 if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged)
1342 state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
1343 else if (log)
1344 log->Printf ("Process::%s got no event or was interrupted.", __FUNCTION__);
1345 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001346
1347 if (log)
1348 log->Printf ("Process::%s (timeout = %p, event_sp) => %s",
1349 __FUNCTION__,
1350 timeout,
1351 StateAsCString(state));
1352 return state;
1353}
1354
1355Event *
1356Process::PeekAtStateChangedEvents ()
1357{
Greg Clayton5160ce52013-03-27 23:08:40 +00001358 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001359
1360 if (log)
1361 log->Printf ("Process::%s...", __FUNCTION__);
1362
1363 Event *event_ptr;
Greg Clayton3fcbed62010-10-19 03:25:40 +00001364 event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this,
1365 eBroadcastBitStateChanged);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001366 if (log)
1367 {
1368 if (event_ptr)
1369 {
1370 log->Printf ("Process::%s (event_ptr) => %s",
1371 __FUNCTION__,
1372 StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr)));
1373 }
1374 else
1375 {
1376 log->Printf ("Process::%s no events found",
1377 __FUNCTION__);
1378 }
1379 }
1380 return event_ptr;
1381}
1382
1383StateType
1384Process::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp)
1385{
Greg Clayton5160ce52013-03-27 23:08:40 +00001386 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001387
1388 if (log)
1389 log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
1390
1391 StateType state = eStateInvalid;
Greg Clayton6779606a2011-01-22 23:43:18 +00001392 if (m_private_state_listener.WaitForEventForBroadcasterWithType (timeout,
1393 &m_private_state_broadcaster,
Jim Inghamcfc09352012-07-27 23:57:19 +00001394 eBroadcastBitStateChanged | eBroadcastBitInterrupt,
Greg Clayton6779606a2011-01-22 23:43:18 +00001395 event_sp))
Jim Inghamcfc09352012-07-27 23:57:19 +00001396 if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged)
1397 state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001398
1399 // This is a bit of a hack, but when we wait here we could very well return
1400 // to the command-line, and that could disable the log, which would render the
1401 // log we got above invalid.
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001402 if (log)
Greg Clayton6779606a2011-01-22 23:43:18 +00001403 {
1404 if (state == eStateInvalid)
1405 log->Printf ("Process::%s (timeout = %p, event_sp) => TIMEOUT", __FUNCTION__, timeout);
1406 else
1407 log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state));
1408 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001409 return state;
1410}
1411
1412bool
1413Process::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only)
1414{
Greg Clayton5160ce52013-03-27 23:08:40 +00001415 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001416
1417 if (log)
1418 log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout);
1419
1420 if (control_only)
1421 return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp);
1422 else
1423 return m_private_state_listener.WaitForEvent(timeout, event_sp);
1424}
1425
1426bool
1427Process::IsRunning () const
1428{
1429 return StateIsRunningState (m_public_state.GetValue());
1430}
1431
1432int
1433Process::GetExitStatus ()
1434{
1435 if (m_public_state.GetValue() == eStateExited)
1436 return m_exit_status;
1437 return -1;
1438}
1439
Greg Clayton85851dd2010-12-04 00:10:17 +00001440
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001441const char *
1442Process::GetExitDescription ()
1443{
1444 if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty())
1445 return m_exit_string.c_str();
1446 return NULL;
1447}
1448
Greg Clayton6779606a2011-01-22 23:43:18 +00001449bool
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001450Process::SetExitStatus (int status, const char *cstr)
1451{
Greg Clayton5160ce52013-03-27 23:08:40 +00001452 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
Greg Clayton414f5d32011-01-25 02:58:48 +00001453 if (log)
1454 log->Printf("Process::SetExitStatus (status=%i (0x%8.8x), description=%s%s%s)",
1455 status, status,
1456 cstr ? "\"" : "",
1457 cstr ? cstr : "NULL",
1458 cstr ? "\"" : "");
1459
Greg Clayton6779606a2011-01-22 23:43:18 +00001460 // We were already in the exited state
1461 if (m_private_state.GetValue() == eStateExited)
Greg Clayton414f5d32011-01-25 02:58:48 +00001462 {
Greg Clayton385d6032011-01-26 23:47:29 +00001463 if (log)
1464 log->Printf("Process::SetExitStatus () ignoring exit status because state was already set to eStateExited");
Greg Clayton6779606a2011-01-22 23:43:18 +00001465 return false;
Greg Clayton414f5d32011-01-25 02:58:48 +00001466 }
Greg Clayton6779606a2011-01-22 23:43:18 +00001467
1468 m_exit_status = status;
1469 if (cstr)
1470 m_exit_string = cstr;
1471 else
1472 m_exit_string.clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001473
Greg Clayton6779606a2011-01-22 23:43:18 +00001474 DidExit ();
Greg Clayton10177aa2010-12-08 05:08:21 +00001475
Greg Clayton6779606a2011-01-22 23:43:18 +00001476 SetPrivateState (eStateExited);
1477 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001478}
1479
1480// This static callback can be used to watch for local child processes on
1481// the current host. The the child process exits, the process will be
1482// found in the global target list (we want to be completely sure that the
1483// lldb_private::Process doesn't go away before we can deliver the signal.
1484bool
Greg Claytone4e45922011-11-16 05:37:56 +00001485Process::SetProcessExitStatus (void *callback_baton,
1486 lldb::pid_t pid,
1487 bool exited,
1488 int signo, // Zero for no signal
1489 int exit_status // Exit value of process if signal is zero
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001490)
1491{
Greg Clayton5160ce52013-03-27 23:08:40 +00001492 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS));
Greg Claytone4e45922011-11-16 05:37:56 +00001493 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001494 log->Printf ("Process::SetProcessExitStatus (baton=%p, pid=%" PRIu64 ", exited=%i, signal=%i, exit_status=%i)\n",
Greg Claytone4e45922011-11-16 05:37:56 +00001495 callback_baton,
1496 pid,
1497 exited,
1498 signo,
1499 exit_status);
1500
1501 if (exited)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001502 {
Greg Clayton66111032010-06-23 01:19:29 +00001503 TargetSP target_sp(Debugger::FindTargetWithProcessID (pid));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001504 if (target_sp)
1505 {
1506 ProcessSP process_sp (target_sp->GetProcessSP());
1507 if (process_sp)
1508 {
1509 const char *signal_cstr = NULL;
1510 if (signo)
1511 signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo);
1512
1513 process_sp->SetExitStatus (exit_status, signal_cstr);
1514 }
1515 }
1516 return true;
1517 }
1518 return false;
1519}
1520
1521
Greg Clayton56d9a1b2011-08-22 02:49:39 +00001522void
1523Process::UpdateThreadListIfNeeded ()
1524{
1525 const uint32_t stop_id = GetStopID();
1526 if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID())
1527 {
Greg Clayton2637f822011-11-17 01:23:07 +00001528 const StateType state = GetPrivateState();
1529 if (StateIsStoppedState (state, true))
1530 {
1531 Mutex::Locker locker (m_thread_list.GetMutex ());
Greg Claytone24c4ac2011-11-17 04:46:02 +00001532 // m_thread_list does have its own mutex, but we need to
1533 // hold onto the mutex between the call to UpdateThreadList(...)
1534 // and the os->UpdateThreadList(...) so it doesn't change on us
Andrew Kaylorba4e61d2013-05-07 18:35:34 +00001535 ThreadList &old_thread_list = m_thread_list;
1536 ThreadList real_thread_list(this);
Greg Clayton2637f822011-11-17 01:23:07 +00001537 ThreadList new_thread_list(this);
1538 // Always update the thread list with the protocol specific
Greg Clayton9fc13552012-04-10 00:18:59 +00001539 // thread list, but only update if "true" is returned
Andrew Kaylorba4e61d2013-05-07 18:35:34 +00001540 if (UpdateThreadList (m_thread_list_real, real_thread_list))
Greg Clayton9fc13552012-04-10 00:18:59 +00001541 {
Jim Ingham09437922013-03-01 20:04:25 +00001542 // Don't call into the OperatingSystem to update the thread list if we are shutting down, since
1543 // that may call back into the SBAPI's, requiring the API lock which is already held by whoever is
1544 // shutting us down, causing a deadlock.
1545 if (!m_destroy_in_process)
1546 {
1547 OperatingSystem *os = GetOperatingSystem ();
1548 if (os)
Greg Claytonb3ae8762013-04-12 20:07:46 +00001549 {
1550 // Clear any old backing threads where memory threads might have been
1551 // backed by actual threads from the lldb_private::Process subclass
Andrew Kaylorba4e61d2013-05-07 18:35:34 +00001552 size_t num_old_threads = old_thread_list.GetSize(false);
Greg Claytonb3ae8762013-04-12 20:07:46 +00001553 for (size_t i=0; i<num_old_threads; ++i)
Andrew Kaylorba4e61d2013-05-07 18:35:34 +00001554 old_thread_list.GetThreadAtIndex(i, false)->ClearBackingThread();
Greg Claytonb3ae8762013-04-12 20:07:46 +00001555
1556 // Now let the OperatingSystem plug-in update the thread list
Andrew Kaylorba4e61d2013-05-07 18:35:34 +00001557 os->UpdateThreadList (old_thread_list, // Old list full of threads created by OS plug-in
1558 real_thread_list, // The actual thread list full of threads created by each lldb_private::Process subclass
1559 new_thread_list); // The new thread list that we will show to the user that gets filled in
Greg Claytonb3ae8762013-04-12 20:07:46 +00001560 }
Andrew Kaylorba4e61d2013-05-07 18:35:34 +00001561 else
1562 {
1563 // No OS plug-in, the new thread list is the same as the real thread list
1564 new_thread_list = real_thread_list;
1565 }
Jim Ingham09437922013-03-01 20:04:25 +00001566 }
Andrew Kaylorba4e61d2013-05-07 18:35:34 +00001567 m_thread_list.Update (new_thread_list);
1568 m_thread_list.SetStopID (stop_id);
Greg Clayton9fc13552012-04-10 00:18:59 +00001569 }
Greg Clayton2637f822011-11-17 01:23:07 +00001570 }
Greg Clayton56d9a1b2011-08-22 02:49:39 +00001571 }
1572}
1573
Greg Claytona4d87472013-01-18 23:41:08 +00001574ThreadSP
1575Process::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context)
1576{
1577 OperatingSystem *os = GetOperatingSystem ();
1578 if (os)
1579 return os->CreateThread(tid, context);
1580 return ThreadSP();
1581}
1582
1583
1584
Han Ming Ongc2c423e2013-01-08 22:10:01 +00001585// This is obsoleted. Staged removal for Xcode.
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001586uint32_t
1587Process::GetNextThreadIndexID ()
1588{
1589 return ++m_thread_index_id;
1590}
1591
Han Ming Ongc2c423e2013-01-08 22:10:01 +00001592uint32_t
1593Process::GetNextThreadIndexID (uint64_t thread_id)
1594{
1595 return AssignIndexIDToThread(thread_id);
1596}
1597
1598bool
1599Process::HasAssignedIndexIDToThread(uint64_t thread_id)
1600{
1601 std::map<uint64_t, uint32_t>::iterator iterator = m_thread_id_to_index_id_map.find(thread_id);
1602 if (iterator == m_thread_id_to_index_id_map.end())
1603 {
1604 return false;
1605 }
1606 else
1607 {
1608 return true;
1609 }
1610}
1611
1612uint32_t
1613Process::AssignIndexIDToThread(uint64_t thread_id)
1614{
1615 uint32_t result = 0;
1616 std::map<uint64_t, uint32_t>::iterator iterator = m_thread_id_to_index_id_map.find(thread_id);
1617 if (iterator == m_thread_id_to_index_id_map.end())
1618 {
1619 result = ++m_thread_index_id;
1620 m_thread_id_to_index_id_map[thread_id] = result;
1621 }
1622 else
1623 {
1624 result = iterator->second;
1625 }
1626
1627 return result;
1628}
1629
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001630StateType
1631Process::GetState()
1632{
1633 // If any other threads access this we will need a mutex for it
1634 return m_public_state.GetValue ();
1635}
1636
1637void
Jim Ingham221d51c2013-05-08 00:35:16 +00001638Process::SetPublicState (StateType new_state, bool restarted)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001639{
Greg Clayton5160ce52013-03-27 23:08:40 +00001640 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001641 if (log)
Jim Ingham221d51c2013-05-08 00:35:16 +00001642 log->Printf("Process::SetPublicState (state = %s, restarted = %i)", StateAsCString(new_state), restarted);
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001643 const StateType old_state = m_public_state.GetValue();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001644 m_public_state.SetValue (new_state);
Jim Ingham3b8285d2012-04-19 01:40:33 +00001645
1646 // On the transition from Run to Stopped, we unlock the writer end of the
1647 // run lock. The lock gets locked in Resume, which is the public API
1648 // to tell the program to run.
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001649 if (!IsHijackedForEvent(eBroadcastBitStateChanged))
1650 {
Sean Callanan8b0737f2012-06-02 01:16:20 +00001651 if (new_state == eStateDetached)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001652 {
Sean Callanan8b0737f2012-06-02 01:16:20 +00001653 if (log)
1654 log->Printf("Process::SetPublicState (%s) -- unlocking run lock for detach", StateAsCString(new_state));
Greg Clayton96249852013-04-18 16:57:27 +00001655 m_public_run_lock.WriteUnlock();
Sean Callanan8b0737f2012-06-02 01:16:20 +00001656 }
1657 else
1658 {
1659 const bool old_state_is_stopped = StateIsStoppedState(old_state, false);
1660 const bool new_state_is_stopped = StateIsStoppedState(new_state, false);
Jim Ingham221d51c2013-05-08 00:35:16 +00001661 if ((old_state_is_stopped != new_state_is_stopped))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001662 {
Jim Ingham221d51c2013-05-08 00:35:16 +00001663 if (new_state_is_stopped && !restarted)
Sean Callanan8b0737f2012-06-02 01:16:20 +00001664 {
1665 if (log)
1666 log->Printf("Process::SetPublicState (%s) -- unlocking run lock", StateAsCString(new_state));
Greg Clayton96249852013-04-18 16:57:27 +00001667 m_public_run_lock.WriteUnlock();
Sean Callanan8b0737f2012-06-02 01:16:20 +00001668 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001669 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001670 }
1671 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001672}
1673
Jim Ingham3b8285d2012-04-19 01:40:33 +00001674Error
1675Process::Resume ()
1676{
Greg Clayton5160ce52013-03-27 23:08:40 +00001677 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
Jim Ingham3b8285d2012-04-19 01:40:33 +00001678 if (log)
1679 log->Printf("Process::Resume -- locking run lock");
Greg Clayton96249852013-04-18 16:57:27 +00001680 if (!m_public_run_lock.WriteTryLock())
Jim Ingham3b8285d2012-04-19 01:40:33 +00001681 {
1682 Error error("Resume request failed - process still running.");
1683 if (log)
1684 log->Printf ("Process::Resume: -- WriteTryLock failed, not resuming.");
1685 return error;
1686 }
1687 return PrivateResume();
1688}
1689
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001690StateType
1691Process::GetPrivateState ()
1692{
1693 return m_private_state.GetValue();
1694}
1695
1696void
1697Process::SetPrivateState (StateType new_state)
1698{
Greg Clayton5160ce52013-03-27 23:08:40 +00001699 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001700 bool state_changed = false;
1701
1702 if (log)
1703 log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state));
1704
Andrew Kaylor29d65742013-05-10 17:19:04 +00001705 Mutex::Locker thread_locker(m_thread_list.GetMutex());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001706 Mutex::Locker locker(m_private_state.GetMutex());
1707
1708 const StateType old_state = m_private_state.GetValueNoLock ();
1709 state_changed = old_state != new_state;
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001710 // This code is left commented out in case we ever need to control
1711 // the private process state with another run lock. Right now it doesn't
1712 // seem like we need to do this, but if we ever do, we can uncomment and
1713 // use this code.
Greg Claytonaa49c832013-05-03 22:25:56 +00001714 const bool old_state_is_stopped = StateIsStoppedState(old_state, false);
1715 const bool new_state_is_stopped = StateIsStoppedState(new_state, false);
1716 if (old_state_is_stopped != new_state_is_stopped)
1717 {
1718 if (new_state_is_stopped)
1719 m_private_run_lock.WriteUnlock();
1720 else
1721 m_private_run_lock.WriteLock();
1722 }
Greg Claytonaa49c832013-05-03 22:25:56 +00001723
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001724 if (state_changed)
1725 {
1726 m_private_state.SetValueNoLock (new_state);
Greg Clayton2637f822011-11-17 01:23:07 +00001727 if (StateIsStoppedState(new_state, false))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001728 {
Andrew Kaylor29d65742013-05-10 17:19:04 +00001729 // Note, this currently assumes that all threads in the list
1730 // stop when the process stops. In the future we will want to
1731 // support a debugging model where some threads continue to run
1732 // while others are stopped. When that happens we will either need
1733 // a way for the thread list to identify which threads are stopping
1734 // or create a special thread list containing only threads which
1735 // actually stopped.
1736 //
1737 // The process plugin is responsible for managing the actual
1738 // behavior of the threads and should have stopped any threads
1739 // that are going to stop before we get here.
1740 m_thread_list.DidStop();
1741
Jim Ingham4b536182011-08-09 02:12:22 +00001742 m_mod_id.BumpStopID();
Greg Clayton58be07b2011-01-07 06:08:19 +00001743 m_memory_cache.Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001744 if (log)
Jim Ingham4b536182011-08-09 02:12:22 +00001745 log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_mod_id.GetStopID());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001746 }
1747 // Use our target to get a shared pointer to ourselves...
Greg Clayton35a4cc52012-10-29 20:52:08 +00001748 if (m_finalize_called && PrivateStateThreadIsValid() == false)
1749 BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (shared_from_this(), new_state));
1750 else
1751 m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (shared_from_this(), new_state));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001752 }
1753 else
1754 {
1755 if (log)
Jason Molendafd54b362011-09-20 21:44:10 +00001756 log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001757 }
1758}
1759
Jim Ingham0faa43f2011-11-08 03:00:11 +00001760void
1761Process::SetRunningUserExpression (bool on)
1762{
1763 m_mod_id.SetRunningUserExpression (on);
1764}
1765
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001766addr_t
1767Process::GetImageInfoAddress()
1768{
1769 return LLDB_INVALID_ADDRESS;
1770}
1771
Greg Clayton8f343b02010-11-04 01:54:29 +00001772//----------------------------------------------------------------------
1773// LoadImage
1774//
1775// This function provides a default implementation that works for most
1776// unix variants. Any Process subclasses that need to do shared library
1777// loading differently should override LoadImage and UnloadImage and
1778// do what is needed.
1779//----------------------------------------------------------------------
1780uint32_t
1781Process::LoadImage (const FileSpec &image_spec, Error &error)
1782{
Greg Claytonac7a3db2012-04-18 00:05:19 +00001783 char path[PATH_MAX];
1784 image_spec.GetPath(path, sizeof(path));
1785
Greg Clayton8f343b02010-11-04 01:54:29 +00001786 DynamicLoader *loader = GetDynamicLoader();
1787 if (loader)
1788 {
1789 error = loader->CanLoadImage();
1790 if (error.Fail())
1791 return LLDB_INVALID_IMAGE_TOKEN;
1792 }
1793
1794 if (error.Success())
1795 {
1796 ThreadSP thread_sp(GetThreadList ().GetSelectedThread());
Greg Clayton8f343b02010-11-04 01:54:29 +00001797
1798 if (thread_sp)
1799 {
1800 StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0));
1801
1802 if (frame_sp)
1803 {
1804 ExecutionContext exe_ctx;
1805 frame_sp->CalculateExecutionContext (exe_ctx);
Jim Ingham184e9812013-01-15 02:47:48 +00001806 const bool unwind_on_error = true;
1807 const bool ignore_breakpoints = true;
Greg Clayton8f343b02010-11-04 01:54:29 +00001808 StreamString expr;
Greg Clayton8f343b02010-11-04 01:54:29 +00001809 expr.Printf("dlopen (\"%s\", 2)", path);
1810 const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n";
Jim Inghamf48169b2010-11-30 02:22:11 +00001811 lldb::ValueObjectSP result_valobj_sp;
Greg Clayton26ab83d2012-10-31 20:49:04 +00001812 ClangUserExpression::Evaluate (exe_ctx,
1813 eExecutionPolicyAlways,
1814 lldb::eLanguageTypeUnknown,
1815 ClangUserExpression::eResultTypeAny,
1816 unwind_on_error,
Jim Ingham184e9812013-01-15 02:47:48 +00001817 ignore_breakpoints,
Greg Clayton26ab83d2012-10-31 20:49:04 +00001818 expr.GetData(),
1819 prefix,
1820 result_valobj_sp,
1821 true,
1822 ClangUserExpression::kDefaultTimeout);
Johnny Chene92aa432011-09-09 00:01:43 +00001823 error = result_valobj_sp->GetError();
1824 if (error.Success())
Greg Clayton8f343b02010-11-04 01:54:29 +00001825 {
1826 Scalar scalar;
Jim Ingham6035b672011-03-31 00:19:25 +00001827 if (result_valobj_sp->ResolveValue (scalar))
Greg Clayton8f343b02010-11-04 01:54:29 +00001828 {
1829 addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1830 if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS)
1831 {
1832 uint32_t image_token = m_image_tokens.size();
1833 m_image_tokens.push_back (image_ptr);
1834 return image_token;
1835 }
1836 }
1837 }
1838 }
1839 }
1840 }
Greg Claytonac7a3db2012-04-18 00:05:19 +00001841 if (!error.AsCString())
1842 error.SetErrorStringWithFormat("unable to load '%s'", path);
Greg Clayton8f343b02010-11-04 01:54:29 +00001843 return LLDB_INVALID_IMAGE_TOKEN;
1844}
1845
1846//----------------------------------------------------------------------
1847// UnloadImage
1848//
1849// This function provides a default implementation that works for most
1850// unix variants. Any Process subclasses that need to do shared library
1851// loading differently should override LoadImage and UnloadImage and
1852// do what is needed.
1853//----------------------------------------------------------------------
1854Error
1855Process::UnloadImage (uint32_t image_token)
1856{
1857 Error error;
1858 if (image_token < m_image_tokens.size())
1859 {
1860 const addr_t image_addr = m_image_tokens[image_token];
1861 if (image_addr == LLDB_INVALID_ADDRESS)
1862 {
1863 error.SetErrorString("image already unloaded");
1864 }
1865 else
1866 {
1867 DynamicLoader *loader = GetDynamicLoader();
1868 if (loader)
1869 error = loader->CanLoadImage();
1870
1871 if (error.Success())
1872 {
1873 ThreadSP thread_sp(GetThreadList ().GetSelectedThread());
Greg Clayton8f343b02010-11-04 01:54:29 +00001874
1875 if (thread_sp)
1876 {
1877 StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0));
1878
1879 if (frame_sp)
1880 {
1881 ExecutionContext exe_ctx;
1882 frame_sp->CalculateExecutionContext (exe_ctx);
Jim Ingham184e9812013-01-15 02:47:48 +00001883 const bool unwind_on_error = true;
1884 const bool ignore_breakpoints = true;
Greg Clayton8f343b02010-11-04 01:54:29 +00001885 StreamString expr;
Daniel Malead01b2952012-11-29 21:49:15 +00001886 expr.Printf("dlclose ((void *)0x%" PRIx64 ")", image_addr);
Greg Clayton8f343b02010-11-04 01:54:29 +00001887 const char *prefix = "extern \"C\" int dlclose(void* handle);\n";
Jim Inghamf48169b2010-11-30 02:22:11 +00001888 lldb::ValueObjectSP result_valobj_sp;
Greg Clayton26ab83d2012-10-31 20:49:04 +00001889 ClangUserExpression::Evaluate (exe_ctx,
1890 eExecutionPolicyAlways,
1891 lldb::eLanguageTypeUnknown,
1892 ClangUserExpression::eResultTypeAny,
1893 unwind_on_error,
Jim Ingham184e9812013-01-15 02:47:48 +00001894 ignore_breakpoints,
Greg Clayton26ab83d2012-10-31 20:49:04 +00001895 expr.GetData(),
1896 prefix,
1897 result_valobj_sp,
1898 true,
1899 ClangUserExpression::kDefaultTimeout);
Greg Clayton8f343b02010-11-04 01:54:29 +00001900 if (result_valobj_sp->GetError().Success())
1901 {
1902 Scalar scalar;
Jim Ingham6035b672011-03-31 00:19:25 +00001903 if (result_valobj_sp->ResolveValue (scalar))
Greg Clayton8f343b02010-11-04 01:54:29 +00001904 {
1905 if (scalar.UInt(1))
1906 {
1907 error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData());
1908 }
1909 else
1910 {
1911 m_image_tokens[image_token] = LLDB_INVALID_ADDRESS;
1912 }
1913 }
1914 }
1915 else
1916 {
1917 error = result_valobj_sp->GetError();
1918 }
1919 }
1920 }
1921 }
1922 }
1923 }
1924 else
1925 {
1926 error.SetErrorString("invalid image token");
1927 }
1928 return error;
1929}
1930
Greg Clayton31f1d2f2011-05-11 18:39:18 +00001931const lldb::ABISP &
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001932Process::GetABI()
1933{
Greg Clayton31f1d2f2011-05-11 18:39:18 +00001934 if (!m_abi_sp)
1935 m_abi_sp = ABI::FindPlugin(m_target.GetArchitecture());
1936 return m_abi_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001937}
1938
Jim Ingham22777012010-09-23 02:01:19 +00001939LanguageRuntime *
Jim Inghamab175242012-03-10 00:22:19 +00001940Process::GetLanguageRuntime(lldb::LanguageType language, bool retry_if_null)
Jim Ingham22777012010-09-23 02:01:19 +00001941{
1942 LanguageRuntimeCollection::iterator pos;
1943 pos = m_language_runtimes.find (language);
Jim Inghamab175242012-03-10 00:22:19 +00001944 if (pos == m_language_runtimes.end() || (retry_if_null && !(*pos).second))
Jim Ingham22777012010-09-23 02:01:19 +00001945 {
Jim Inghamab175242012-03-10 00:22:19 +00001946 lldb::LanguageRuntimeSP runtime_sp(LanguageRuntime::FindPlugin(this, language));
Jim Ingham22777012010-09-23 02:01:19 +00001947
Jim Inghamab175242012-03-10 00:22:19 +00001948 m_language_runtimes[language] = runtime_sp;
1949 return runtime_sp.get();
Jim Ingham22777012010-09-23 02:01:19 +00001950 }
1951 else
1952 return (*pos).second.get();
1953}
1954
1955CPPLanguageRuntime *
Jim Inghamab175242012-03-10 00:22:19 +00001956Process::GetCPPLanguageRuntime (bool retry_if_null)
Jim Ingham22777012010-09-23 02:01:19 +00001957{
Jim Inghamab175242012-03-10 00:22:19 +00001958 LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus, retry_if_null);
Jim Ingham22777012010-09-23 02:01:19 +00001959 if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus)
1960 return static_cast<CPPLanguageRuntime *> (runtime);
1961 return NULL;
1962}
1963
1964ObjCLanguageRuntime *
Jim Inghamab175242012-03-10 00:22:19 +00001965Process::GetObjCLanguageRuntime (bool retry_if_null)
Jim Ingham22777012010-09-23 02:01:19 +00001966{
Jim Inghamab175242012-03-10 00:22:19 +00001967 LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC, retry_if_null);
Jim Ingham22777012010-09-23 02:01:19 +00001968 if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC)
1969 return static_cast<ObjCLanguageRuntime *> (runtime);
1970 return NULL;
1971}
1972
Enrico Granatafd4c84e2012-05-21 16:51:35 +00001973bool
1974Process::IsPossibleDynamicValue (ValueObject& in_value)
1975{
1976 if (in_value.IsDynamic())
1977 return false;
1978 LanguageType known_type = in_value.GetObjectRuntimeLanguage();
1979
1980 if (known_type != eLanguageTypeUnknown && known_type != eLanguageTypeC)
1981 {
1982 LanguageRuntime *runtime = GetLanguageRuntime (known_type);
1983 return runtime ? runtime->CouldHaveDynamicValue(in_value) : false;
1984 }
1985
1986 LanguageRuntime *cpp_runtime = GetLanguageRuntime (eLanguageTypeC_plus_plus);
1987 if (cpp_runtime && cpp_runtime->CouldHaveDynamicValue(in_value))
1988 return true;
1989
1990 LanguageRuntime *objc_runtime = GetLanguageRuntime (eLanguageTypeObjC);
1991 return objc_runtime ? objc_runtime->CouldHaveDynamicValue(in_value) : false;
1992}
1993
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001994BreakpointSiteList &
1995Process::GetBreakpointSiteList()
1996{
1997 return m_breakpoint_site_list;
1998}
1999
2000const BreakpointSiteList &
2001Process::GetBreakpointSiteList() const
2002{
2003 return m_breakpoint_site_list;
2004}
2005
2006
2007void
2008Process::DisableAllBreakpointSites ()
2009{
2010 m_breakpoint_site_list.SetEnabledForAll (false);
Jim Ingham43c555d2012-07-04 00:35:43 +00002011 size_t num_sites = m_breakpoint_site_list.GetSize();
2012 for (size_t i = 0; i < num_sites; i++)
2013 {
Jim Ingham299c0c12013-02-15 02:06:30 +00002014 DisableBreakpointSite (m_breakpoint_site_list.GetByIndex(i).get());
Jim Ingham43c555d2012-07-04 00:35:43 +00002015 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002016}
2017
2018Error
2019Process::ClearBreakpointSiteByID (lldb::user_id_t break_id)
2020{
2021 Error error (DisableBreakpointSiteByID (break_id));
2022
2023 if (error.Success())
2024 m_breakpoint_site_list.Remove(break_id);
2025
2026 return error;
2027}
2028
2029Error
2030Process::DisableBreakpointSiteByID (lldb::user_id_t break_id)
2031{
2032 Error error;
2033 BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
2034 if (bp_site_sp)
2035 {
2036 if (bp_site_sp->IsEnabled())
Jim Ingham299c0c12013-02-15 02:06:30 +00002037 error = DisableBreakpointSite (bp_site_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002038 }
2039 else
2040 {
Daniel Malead01b2952012-11-29 21:49:15 +00002041 error.SetErrorStringWithFormat("invalid breakpoint site ID: %" PRIu64, break_id);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002042 }
2043
2044 return error;
2045}
2046
2047Error
2048Process::EnableBreakpointSiteByID (lldb::user_id_t break_id)
2049{
2050 Error error;
2051 BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
2052 if (bp_site_sp)
2053 {
2054 if (!bp_site_sp->IsEnabled())
Jim Ingham299c0c12013-02-15 02:06:30 +00002055 error = EnableBreakpointSite (bp_site_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002056 }
2057 else
2058 {
Daniel Malead01b2952012-11-29 21:49:15 +00002059 error.SetErrorStringWithFormat("invalid breakpoint site ID: %" PRIu64, break_id);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002060 }
2061 return error;
2062}
2063
Stephen Wilson50bd94f2010-07-17 00:56:13 +00002064lldb::break_id_t
Greg Claytone1cd1be2012-01-29 20:56:30 +00002065Process::CreateBreakpointSite (const BreakpointLocationSP &owner, bool use_hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002066{
Greg Clayton92bb12c2011-05-19 18:17:41 +00002067 const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002068 if (load_addr != LLDB_INVALID_ADDRESS)
2069 {
2070 BreakpointSiteSP bp_site_sp;
2071
2072 // Look up this breakpoint site. If it exists, then add this new owner, otherwise
2073 // create a new breakpoint site and add it.
2074
2075 bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr);
2076
2077 if (bp_site_sp)
2078 {
2079 bp_site_sp->AddOwner (owner);
2080 owner->SetBreakpointSite (bp_site_sp);
2081 return bp_site_sp->GetID();
2082 }
2083 else
2084 {
Greg Claytonc7bece562013-01-25 18:06:21 +00002085 bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, use_hardware));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002086 if (bp_site_sp)
2087 {
Jim Ingham299c0c12013-02-15 02:06:30 +00002088 if (EnableBreakpointSite (bp_site_sp.get()).Success())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002089 {
2090 owner->SetBreakpointSite (bp_site_sp);
2091 return m_breakpoint_site_list.Add (bp_site_sp);
2092 }
2093 }
2094 }
2095 }
2096 // We failed to enable the breakpoint
2097 return LLDB_INVALID_BREAK_ID;
2098
2099}
2100
2101void
2102Process::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp)
2103{
2104 uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id);
2105 if (num_owners == 0)
2106 {
Jim Inghamf1ff3bb2013-04-06 00:16:39 +00002107 // Don't try to disable the site if we don't have a live process anymore.
2108 if (IsAlive())
2109 DisableBreakpointSite (bp_site_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002110 m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress());
2111 }
2112}
2113
2114
2115size_t
2116Process::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const
2117{
2118 size_t bytes_removed = 0;
2119 addr_t intersect_addr;
2120 size_t intersect_size;
2121 size_t opcode_offset;
2122 size_t idx;
Greg Clayton4d122c42011-09-17 08:33:22 +00002123 BreakpointSiteSP bp_sp;
Jim Ingham20c77192011-06-29 19:42:28 +00002124 BreakpointSiteList bp_sites_in_range;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002125
Jim Ingham20c77192011-06-29 19:42:28 +00002126 if (m_breakpoint_site_list.FindInRange (bp_addr, bp_addr + size, bp_sites_in_range))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002127 {
Greg Clayton4d122c42011-09-17 08:33:22 +00002128 for (idx = 0; (bp_sp = bp_sites_in_range.GetByIndex(idx)); ++idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002129 {
Greg Clayton4d122c42011-09-17 08:33:22 +00002130 if (bp_sp->GetType() == BreakpointSite::eSoftware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002131 {
Greg Clayton4d122c42011-09-17 08:33:22 +00002132 if (bp_sp->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset))
Jim Ingham20c77192011-06-29 19:42:28 +00002133 {
2134 assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size);
2135 assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size);
Greg Clayton4d122c42011-09-17 08:33:22 +00002136 assert(opcode_offset + intersect_size <= bp_sp->GetByteSize());
Jim Ingham20c77192011-06-29 19:42:28 +00002137 size_t buf_offset = intersect_addr - bp_addr;
Greg Clayton4d122c42011-09-17 08:33:22 +00002138 ::memcpy(buf + buf_offset, bp_sp->GetSavedOpcodeBytes() + opcode_offset, intersect_size);
Jim Ingham20c77192011-06-29 19:42:28 +00002139 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002140 }
2141 }
2142 }
2143 return bytes_removed;
2144}
2145
2146
Greg Claytonded470d2011-03-19 01:12:21 +00002147
2148size_t
2149Process::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site)
2150{
2151 PlatformSP platform_sp (m_target.GetPlatform());
2152 if (platform_sp)
2153 return platform_sp->GetSoftwareBreakpointTrapOpcode (m_target, bp_site);
2154 return 0;
2155}
2156
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002157Error
2158Process::EnableSoftwareBreakpoint (BreakpointSite *bp_site)
2159{
2160 Error error;
2161 assert (bp_site != NULL);
Greg Clayton5160ce52013-03-27 23:08:40 +00002162 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002163 const addr_t bp_addr = bp_site->GetLoadAddress();
2164 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002165 log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64, bp_site->GetID(), (uint64_t)bp_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002166 if (bp_site->IsEnabled())
2167 {
2168 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002169 log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- already enabled", bp_site->GetID(), (uint64_t)bp_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002170 return error;
2171 }
2172
2173 if (bp_addr == LLDB_INVALID_ADDRESS)
2174 {
2175 error.SetErrorString("BreakpointSite contains an invalid load address.");
2176 return error;
2177 }
2178 // Ask the lldb::Process subclass to fill in the correct software breakpoint
2179 // trap for the breakpoint site
2180 const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site);
2181
2182 if (bp_opcode_size == 0)
2183 {
Daniel Malead01b2952012-11-29 21:49:15 +00002184 error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%" PRIx64, bp_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002185 }
2186 else
2187 {
2188 const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes();
2189
2190 if (bp_opcode_bytes == NULL)
2191 {
2192 error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode.");
2193 return error;
2194 }
2195
2196 // Save the original opcode by reading it
2197 if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size)
2198 {
2199 // Write a software breakpoint in place of the original opcode
2200 if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
2201 {
2202 uint8_t verify_bp_opcode_bytes[64];
2203 if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
2204 {
2205 if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0)
2206 {
2207 bp_site->SetEnabled(true);
2208 bp_site->SetType (BreakpointSite::eSoftware);
2209 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002210 log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- SUCCESS",
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002211 bp_site->GetID(),
2212 (uint64_t)bp_addr);
2213 }
2214 else
Greg Clayton86edbf42011-10-26 00:56:27 +00002215 error.SetErrorString("failed to verify the breakpoint trap in memory.");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002216 }
2217 else
2218 error.SetErrorString("Unable to read memory to verify breakpoint trap.");
2219 }
2220 else
2221 error.SetErrorString("Unable to write breakpoint trap to memory.");
2222 }
2223 else
2224 error.SetErrorString("Unable to read memory at breakpoint address.");
2225 }
Stephen Wilson78a4feb2011-01-12 04:20:03 +00002226 if (log && error.Fail())
Daniel Malead01b2952012-11-29 21:49:15 +00002227 log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- FAILED: %s",
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002228 bp_site->GetID(),
2229 (uint64_t)bp_addr,
2230 error.AsCString());
2231 return error;
2232}
2233
2234Error
2235Process::DisableSoftwareBreakpoint (BreakpointSite *bp_site)
2236{
2237 Error error;
2238 assert (bp_site != NULL);
Greg Clayton5160ce52013-03-27 23:08:40 +00002239 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002240 addr_t bp_addr = bp_site->GetLoadAddress();
2241 lldb::user_id_t breakID = bp_site->GetID();
2242 if (log)
Jim Ingham299c0c12013-02-15 02:06:30 +00002243 log->Printf ("Process::DisableSoftwareBreakpoint (breakID = %" PRIu64 ") addr = 0x%" PRIx64, breakID, (uint64_t)bp_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002244
2245 if (bp_site->IsHardware())
2246 {
2247 error.SetErrorString("Breakpoint site is a hardware breakpoint.");
2248 }
2249 else if (bp_site->IsEnabled())
2250 {
2251 const size_t break_op_size = bp_site->GetByteSize();
2252 const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes();
2253 if (break_op_size > 0)
2254 {
2255 // Clear a software breakoint instruction
Greg Claytonc982c762010-07-09 20:39:50 +00002256 uint8_t curr_break_op[8];
Stephen Wilson4ab47682010-07-20 18:41:11 +00002257 assert (break_op_size <= sizeof(curr_break_op));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002258 bool break_op_found = false;
2259
2260 // Read the breakpoint opcode
2261 if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size)
2262 {
2263 bool verify = false;
2264 // Make sure we have the a breakpoint opcode exists at this address
2265 if (::memcmp (curr_break_op, break_op, break_op_size) == 0)
2266 {
2267 break_op_found = true;
2268 // We found a valid breakpoint opcode at this address, now restore
2269 // the saved opcode.
2270 if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size)
2271 {
2272 verify = true;
2273 }
2274 else
2275 error.SetErrorString("Memory write failed when restoring original opcode.");
2276 }
2277 else
2278 {
2279 error.SetErrorString("Original breakpoint trap is no longer in memory.");
2280 // Set verify to true and so we can check if the original opcode has already been restored
2281 verify = true;
2282 }
2283
2284 if (verify)
2285 {
Greg Claytonc982c762010-07-09 20:39:50 +00002286 uint8_t verify_opcode[8];
Stephen Wilson4ab47682010-07-20 18:41:11 +00002287 assert (break_op_size < sizeof(verify_opcode));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002288 // Verify that our original opcode made it back to the inferior
2289 if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size)
2290 {
2291 // compare the memory we just read with the original opcode
2292 if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0)
2293 {
2294 // SUCCESS
2295 bp_site->SetEnabled(false);
2296 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002297 log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002298 return error;
2299 }
2300 else
2301 {
2302 if (break_op_found)
2303 error.SetErrorString("Failed to restore original opcode.");
2304 }
2305 }
2306 else
2307 error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored.");
2308 }
2309 }
2310 else
2311 error.SetErrorString("Unable to read memory that should contain the breakpoint trap.");
2312 }
2313 }
2314 else
2315 {
2316 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002317 log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- already disabled", bp_site->GetID(), (uint64_t)bp_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002318 return error;
2319 }
2320
2321 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002322 log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- FAILED: %s",
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002323 bp_site->GetID(),
2324 (uint64_t)bp_addr,
2325 error.AsCString());
2326 return error;
2327
2328}
2329
Greg Clayton58be07b2011-01-07 06:08:19 +00002330// Uncomment to verify memory caching works after making changes to caching code
2331//#define VERIFY_MEMORY_READS
2332
Sean Callanan64c0cf22012-06-07 22:26:42 +00002333size_t
2334Process::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
2335{
2336 if (!GetDisableMemoryCache())
2337 {
Greg Clayton58be07b2011-01-07 06:08:19 +00002338#if defined (VERIFY_MEMORY_READS)
Sean Callanan64c0cf22012-06-07 22:26:42 +00002339 // Memory caching is enabled, with debug verification
2340
2341 if (buf && size)
2342 {
2343 // Uncomment the line below to make sure memory caching is working.
2344 // I ran this through the test suite and got no assertions, so I am
2345 // pretty confident this is working well. If any changes are made to
2346 // memory caching, uncomment the line below and test your changes!
2347
2348 // Verify all memory reads by using the cache first, then redundantly
2349 // reading the same memory from the inferior and comparing to make sure
2350 // everything is exactly the same.
2351 std::string verify_buf (size, '\0');
2352 assert (verify_buf.size() == size);
2353 const size_t cache_bytes_read = m_memory_cache.Read (this, addr, buf, size, error);
2354 Error verify_error;
2355 const size_t verify_bytes_read = ReadMemoryFromInferior (addr, const_cast<char *>(verify_buf.data()), verify_buf.size(), verify_error);
2356 assert (cache_bytes_read == verify_bytes_read);
2357 assert (memcmp(buf, verify_buf.data(), verify_buf.size()) == 0);
2358 assert (verify_error.Success() == error.Success());
2359 return cache_bytes_read;
2360 }
2361 return 0;
2362#else // !defined(VERIFY_MEMORY_READS)
2363 // Memory caching is enabled, without debug verification
2364
2365 return m_memory_cache.Read (addr, buf, size, error);
2366#endif // defined (VERIFY_MEMORY_READS)
Greg Clayton58be07b2011-01-07 06:08:19 +00002367 }
Sean Callanan64c0cf22012-06-07 22:26:42 +00002368 else
2369 {
2370 // Memory caching is disabled
2371
2372 return ReadMemoryFromInferior (addr, buf, size, error);
2373 }
Greg Clayton58be07b2011-01-07 06:08:19 +00002374}
Greg Clayton58be07b2011-01-07 06:08:19 +00002375
Greg Clayton4c82d422012-05-18 23:20:01 +00002376size_t
2377Process::ReadCStringFromMemory (addr_t addr, std::string &out_str, Error &error)
2378{
Greg Claytonde87c0f2012-05-19 00:18:00 +00002379 char buf[256];
Greg Clayton4c82d422012-05-18 23:20:01 +00002380 out_str.clear();
2381 addr_t curr_addr = addr;
2382 while (1)
2383 {
2384 size_t length = ReadCStringFromMemory (curr_addr, buf, sizeof(buf), error);
2385 if (length == 0)
2386 break;
2387 out_str.append(buf, length);
2388 // If we got "length - 1" bytes, we didn't get the whole C string, we
2389 // need to read some more characters
2390 if (length == sizeof(buf) - 1)
2391 curr_addr += length;
2392 else
2393 break;
2394 }
2395 return out_str.size();
2396}
2397
Greg Clayton58be07b2011-01-07 06:08:19 +00002398
2399size_t
Ashok Thirumurthi6ac9d132013-04-19 15:58:38 +00002400Process::ReadStringFromMemory (addr_t addr, char *dst, size_t max_bytes, Error &error,
2401 size_t type_width)
2402{
2403 size_t total_bytes_read = 0;
2404 if (dst && max_bytes && type_width && max_bytes >= type_width)
2405 {
2406 // Ensure a null terminator independent of the number of bytes that is read.
2407 memset (dst, 0, max_bytes);
2408 size_t bytes_left = max_bytes - type_width;
2409
2410 const char terminator[4] = {'\0', '\0', '\0', '\0'};
2411 assert(sizeof(terminator) >= type_width &&
2412 "Attempting to validate a string with more than 4 bytes per character!");
2413
2414 addr_t curr_addr = addr;
2415 const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize();
2416 char *curr_dst = dst;
2417
2418 error.Clear();
2419 while (bytes_left > 0 && error.Success())
2420 {
2421 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
2422 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
2423 size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error);
2424
2425 if (bytes_read == 0)
2426 break;
2427
2428 // Search for a null terminator of correct size and alignment in bytes_read
2429 size_t aligned_start = total_bytes_read - total_bytes_read % type_width;
2430 for (size_t i = aligned_start; i + type_width <= total_bytes_read + bytes_read; i += type_width)
2431 if (::strncmp(&dst[i], terminator, type_width) == 0)
2432 {
2433 error.Clear();
2434 return i;
2435 }
2436
2437 total_bytes_read += bytes_read;
2438 curr_dst += bytes_read;
2439 curr_addr += bytes_read;
2440 bytes_left -= bytes_read;
2441 }
2442 }
2443 else
2444 {
2445 if (max_bytes)
2446 error.SetErrorString("invalid arguments");
2447 }
2448 return total_bytes_read;
2449}
2450
2451// Deprecated in favor of ReadStringFromMemory which has wchar support and correct code to find
2452// null terminators.
2453size_t
Greg Claytone91b7952011-12-15 03:14:23 +00002454Process::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len, Error &result_error)
Greg Clayton8b82f082011-04-12 05:54:46 +00002455{
2456 size_t total_cstr_len = 0;
2457 if (dst && dst_max_len)
2458 {
Greg Claytone91b7952011-12-15 03:14:23 +00002459 result_error.Clear();
Greg Clayton8b82f082011-04-12 05:54:46 +00002460 // NULL out everything just to be safe
2461 memset (dst, 0, dst_max_len);
2462 Error error;
2463 addr_t curr_addr = addr;
2464 const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize();
2465 size_t bytes_left = dst_max_len - 1;
2466 char *curr_dst = dst;
2467
2468 while (bytes_left > 0)
2469 {
2470 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
2471 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
2472 size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error);
2473
2474 if (bytes_read == 0)
2475 {
Greg Claytone91b7952011-12-15 03:14:23 +00002476 result_error = error;
Greg Clayton8b82f082011-04-12 05:54:46 +00002477 dst[total_cstr_len] = '\0';
2478 break;
2479 }
2480 const size_t len = strlen(curr_dst);
2481
2482 total_cstr_len += len;
2483
2484 if (len < bytes_to_read)
2485 break;
2486
2487 curr_dst += bytes_read;
2488 curr_addr += bytes_read;
2489 bytes_left -= bytes_read;
2490 }
2491 }
Greg Claytone91b7952011-12-15 03:14:23 +00002492 else
2493 {
2494 if (dst == NULL)
2495 result_error.SetErrorString("invalid arguments");
2496 else
2497 result_error.Clear();
2498 }
Greg Clayton8b82f082011-04-12 05:54:46 +00002499 return total_cstr_len;
2500}
2501
2502size_t
Greg Clayton58be07b2011-01-07 06:08:19 +00002503Process::ReadMemoryFromInferior (addr_t addr, void *buf, size_t size, Error &error)
2504{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002505 if (buf == NULL || size == 0)
2506 return 0;
2507
2508 size_t bytes_read = 0;
2509 uint8_t *bytes = (uint8_t *)buf;
2510
2511 while (bytes_read < size)
2512 {
2513 const size_t curr_size = size - bytes_read;
2514 const size_t curr_bytes_read = DoReadMemory (addr + bytes_read,
2515 bytes + bytes_read,
2516 curr_size,
2517 error);
2518 bytes_read += curr_bytes_read;
2519 if (curr_bytes_read == curr_size || curr_bytes_read == 0)
2520 break;
2521 }
2522
2523 // Replace any software breakpoint opcodes that fall into this range back
2524 // into "buf" before we return
2525 if (bytes_read > 0)
2526 RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf);
2527 return bytes_read;
2528}
2529
Greg Clayton58a4c462010-12-16 20:01:20 +00002530uint64_t
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002531Process::ReadUnsignedIntegerFromMemory (lldb::addr_t vm_addr, size_t integer_byte_size, uint64_t fail_value, Error &error)
Greg Clayton58a4c462010-12-16 20:01:20 +00002532{
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002533 Scalar scalar;
2534 if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar, error))
2535 return scalar.ULongLong(fail_value);
2536 return fail_value;
2537}
2538
2539addr_t
2540Process::ReadPointerFromMemory (lldb::addr_t vm_addr, Error &error)
2541{
2542 Scalar scalar;
2543 if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar, error))
2544 return scalar.ULongLong(LLDB_INVALID_ADDRESS);
2545 return LLDB_INVALID_ADDRESS;
2546}
2547
2548
2549bool
2550Process::WritePointerToMemory (lldb::addr_t vm_addr,
2551 lldb::addr_t ptr_value,
2552 Error &error)
2553{
2554 Scalar scalar;
2555 const uint32_t addr_byte_size = GetAddressByteSize();
2556 if (addr_byte_size <= 4)
2557 scalar = (uint32_t)ptr_value;
Greg Clayton58a4c462010-12-16 20:01:20 +00002558 else
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002559 scalar = ptr_value;
2560 return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) == addr_byte_size;
Greg Clayton58a4c462010-12-16 20:01:20 +00002561}
2562
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002563size_t
2564Process::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error)
2565{
2566 size_t bytes_written = 0;
2567 const uint8_t *bytes = (const uint8_t *)buf;
2568
2569 while (bytes_written < size)
2570 {
2571 const size_t curr_size = size - bytes_written;
2572 const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written,
2573 bytes + bytes_written,
2574 curr_size,
2575 error);
2576 bytes_written += curr_bytes_written;
2577 if (curr_bytes_written == curr_size || curr_bytes_written == 0)
2578 break;
2579 }
2580 return bytes_written;
2581}
2582
2583size_t
2584Process::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error)
2585{
Greg Clayton58be07b2011-01-07 06:08:19 +00002586#if defined (ENABLE_MEMORY_CACHING)
2587 m_memory_cache.Flush (addr, size);
2588#endif
2589
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002590 if (buf == NULL || size == 0)
2591 return 0;
Jim Ingham78a685a2011-04-16 00:01:13 +00002592
Jim Ingham4b536182011-08-09 02:12:22 +00002593 m_mod_id.BumpMemoryID();
Jim Ingham78a685a2011-04-16 00:01:13 +00002594
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002595 // We need to write any data that would go where any current software traps
2596 // (enabled software breakpoints) any software traps (breakpoints) that we
2597 // may have placed in our tasks memory.
2598
2599 BreakpointSiteList::collection::const_iterator iter = m_breakpoint_site_list.GetMap()->lower_bound (addr);
2600 BreakpointSiteList::collection::const_iterator end = m_breakpoint_site_list.GetMap()->end();
2601
2602 if (iter == end || iter->second->GetLoadAddress() > addr + size)
Greg Claytonb4aaf2e2011-05-16 02:35:02 +00002603 return WriteMemoryPrivate (addr, buf, size, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002604
2605 BreakpointSiteList::collection::const_iterator pos;
2606 size_t bytes_written = 0;
Greg Claytonc982c762010-07-09 20:39:50 +00002607 addr_t intersect_addr = 0;
2608 size_t intersect_size = 0;
2609 size_t opcode_offset = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002610 const uint8_t *ubuf = (const uint8_t *)buf;
2611
2612 for (pos = iter; pos != end; ++pos)
2613 {
2614 BreakpointSiteSP bp;
2615 bp = pos->second;
2616
2617 assert(bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset));
2618 assert(addr <= intersect_addr && intersect_addr < addr + size);
2619 assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size);
2620 assert(opcode_offset + intersect_size <= bp->GetByteSize());
2621
2622 // Check for bytes before this breakpoint
2623 const addr_t curr_addr = addr + bytes_written;
2624 if (intersect_addr > curr_addr)
2625 {
2626 // There are some bytes before this breakpoint that we need to
2627 // just write to memory
2628 size_t curr_size = intersect_addr - curr_addr;
2629 size_t curr_bytes_written = WriteMemoryPrivate (curr_addr,
2630 ubuf + bytes_written,
2631 curr_size,
2632 error);
2633 bytes_written += curr_bytes_written;
2634 if (curr_bytes_written != curr_size)
2635 {
2636 // We weren't able to write all of the requested bytes, we
2637 // are done looping and will return the number of bytes that
2638 // we have written so far.
2639 break;
2640 }
2641 }
2642
2643 // Now write any bytes that would cover up any software breakpoints
2644 // directly into the breakpoint opcode buffer
2645 ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size);
2646 bytes_written += intersect_size;
2647 }
2648
2649 // Write any remaining bytes after the last breakpoint if we have any left
2650 if (bytes_written < size)
2651 bytes_written += WriteMemoryPrivate (addr + bytes_written,
2652 ubuf + bytes_written,
2653 size - bytes_written,
2654 error);
Jim Ingham78a685a2011-04-16 00:01:13 +00002655
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002656 return bytes_written;
2657}
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002658
2659size_t
Greg Claytonc7bece562013-01-25 18:06:21 +00002660Process::WriteScalarToMemory (addr_t addr, const Scalar &scalar, size_t byte_size, Error &error)
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002661{
2662 if (byte_size == UINT32_MAX)
2663 byte_size = scalar.GetByteSize();
2664 if (byte_size > 0)
2665 {
2666 uint8_t buf[32];
2667 const size_t mem_size = scalar.GetAsMemoryData (buf, byte_size, GetByteOrder(), error);
2668 if (mem_size > 0)
2669 return WriteMemory(addr, buf, mem_size, error);
2670 else
2671 error.SetErrorString ("failed to get scalar as memory data");
2672 }
2673 else
2674 {
2675 error.SetErrorString ("invalid scalar value");
2676 }
2677 return 0;
2678}
2679
2680size_t
2681Process::ReadScalarIntegerFromMemory (addr_t addr,
2682 uint32_t byte_size,
2683 bool is_signed,
2684 Scalar &scalar,
2685 Error &error)
2686{
Greg Clayton7060f892013-05-01 23:41:30 +00002687 uint64_t uval = 0;
2688 if (byte_size == 0)
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002689 {
Greg Clayton7060f892013-05-01 23:41:30 +00002690 error.SetErrorString ("byte size is zero");
2691 }
2692 else if (byte_size & (byte_size - 1))
2693 {
2694 error.SetErrorStringWithFormat ("byte size %u is not a power of 2", byte_size);
2695 }
2696 else if (byte_size <= sizeof(uval))
2697 {
2698 const size_t bytes_read = ReadMemory (addr, &uval, byte_size, error);
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002699 if (bytes_read == byte_size)
2700 {
2701 DataExtractor data (&uval, sizeof(uval), GetByteOrder(), GetAddressByteSize());
Greg Claytonc7bece562013-01-25 18:06:21 +00002702 lldb::offset_t offset = 0;
Greg Clayton7060f892013-05-01 23:41:30 +00002703 if (byte_size <= 4)
2704 scalar = data.GetMaxU32 (&offset, byte_size);
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002705 else
Greg Clayton7060f892013-05-01 23:41:30 +00002706 scalar = data.GetMaxU64 (&offset, byte_size);
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002707 if (is_signed)
2708 scalar.SignExtend(byte_size * 8);
2709 return bytes_read;
2710 }
2711 }
2712 else
2713 {
2714 error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
2715 }
2716 return 0;
2717}
2718
Greg Claytond495c532011-05-17 03:37:42 +00002719#define USE_ALLOCATE_MEMORY_CACHE 1
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002720addr_t
2721Process::AllocateMemory(size_t size, uint32_t permissions, Error &error)
2722{
Jim Inghamf72ce3a2011-06-20 17:32:44 +00002723 if (GetPrivateState() != eStateStopped)
2724 return LLDB_INVALID_ADDRESS;
2725
Greg Claytond495c532011-05-17 03:37:42 +00002726#if defined (USE_ALLOCATE_MEMORY_CACHE)
2727 return m_allocated_memory_cache.AllocateMemory(size, permissions, error);
2728#else
Greg Claytonb2daec92011-01-23 19:58:49 +00002729 addr_t allocated_addr = DoAllocateMemory (size, permissions, error);
Greg Clayton5160ce52013-03-27 23:08:40 +00002730 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Greg Claytonb2daec92011-01-23 19:58:49 +00002731 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002732 log->Printf("Process::AllocateMemory(size=%4zu, permissions=%s) => 0x%16.16" PRIx64 " (m_stop_id = %u m_memory_id = %u)",
Greg Claytonb2daec92011-01-23 19:58:49 +00002733 size,
Greg Claytond495c532011-05-17 03:37:42 +00002734 GetPermissionsAsCString (permissions),
Greg Claytonb2daec92011-01-23 19:58:49 +00002735 (uint64_t)allocated_addr,
Jim Ingham4b536182011-08-09 02:12:22 +00002736 m_mod_id.GetStopID(),
2737 m_mod_id.GetMemoryID());
Greg Claytonb2daec92011-01-23 19:58:49 +00002738 return allocated_addr;
Greg Claytond495c532011-05-17 03:37:42 +00002739#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002740}
2741
Sean Callanan90539452011-09-20 23:01:51 +00002742bool
2743Process::CanJIT ()
2744{
Sean Callanana7b443a2012-02-14 22:50:38 +00002745 if (m_can_jit == eCanJITDontKnow)
2746 {
2747 Error err;
2748
2749 uint64_t allocated_memory = AllocateMemory(8,
2750 ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable,
2751 err);
2752
2753 if (err.Success())
2754 m_can_jit = eCanJITYes;
2755 else
2756 m_can_jit = eCanJITNo;
2757
2758 DeallocateMemory (allocated_memory);
2759 }
2760
Sean Callanan90539452011-09-20 23:01:51 +00002761 return m_can_jit == eCanJITYes;
2762}
2763
2764void
2765Process::SetCanJIT (bool can_jit)
2766{
2767 m_can_jit = (can_jit ? eCanJITYes : eCanJITNo);
2768}
2769
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002770Error
2771Process::DeallocateMemory (addr_t ptr)
2772{
Greg Claytond495c532011-05-17 03:37:42 +00002773 Error error;
2774#if defined (USE_ALLOCATE_MEMORY_CACHE)
2775 if (!m_allocated_memory_cache.DeallocateMemory(ptr))
2776 {
Daniel Malead01b2952012-11-29 21:49:15 +00002777 error.SetErrorStringWithFormat ("deallocation of memory at 0x%" PRIx64 " failed.", (uint64_t)ptr);
Greg Claytond495c532011-05-17 03:37:42 +00002778 }
2779#else
2780 error = DoDeallocateMemory (ptr);
Greg Claytonb2daec92011-01-23 19:58:49 +00002781
Greg Clayton5160ce52013-03-27 23:08:40 +00002782 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Greg Claytonb2daec92011-01-23 19:58:49 +00002783 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002784 log->Printf("Process::DeallocateMemory(addr=0x%16.16" PRIx64 ") => err = %s (m_stop_id = %u, m_memory_id = %u)",
Greg Claytonb2daec92011-01-23 19:58:49 +00002785 ptr,
2786 error.AsCString("SUCCESS"),
Jim Ingham4b536182011-08-09 02:12:22 +00002787 m_mod_id.GetStopID(),
2788 m_mod_id.GetMemoryID());
Greg Claytond495c532011-05-17 03:37:42 +00002789#endif
Greg Claytonb2daec92011-01-23 19:58:49 +00002790 return error;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002791}
2792
Han Ming Ongc811d382012-11-17 00:33:14 +00002793
Greg Claytonc9660542012-02-05 02:38:54 +00002794ModuleSP
Greg Claytonc859e2d2012-02-13 23:10:39 +00002795Process::ReadModuleFromMemory (const FileSpec& file_spec,
Greg Clayton39f7ee82013-02-01 21:38:35 +00002796 lldb::addr_t header_addr)
Greg Claytonc9660542012-02-05 02:38:54 +00002797{
Greg Claytonc7f09cc2012-02-24 21:55:59 +00002798 ModuleSP module_sp (new Module (file_spec, ArchSpec()));
Greg Claytonc9660542012-02-05 02:38:54 +00002799 if (module_sp)
2800 {
Greg Claytonc7f09cc2012-02-24 21:55:59 +00002801 Error error;
2802 ObjectFile *objfile = module_sp->GetMemoryObjectFile (shared_from_this(), header_addr, error);
2803 if (objfile)
Greg Claytonc7f09cc2012-02-24 21:55:59 +00002804 return module_sp;
Greg Claytonc9660542012-02-05 02:38:54 +00002805 }
Greg Claytonc7f09cc2012-02-24 21:55:59 +00002806 return ModuleSP();
Greg Claytonc9660542012-02-05 02:38:54 +00002807}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002808
2809Error
Jim Ingham1b5792e2012-12-18 02:03:49 +00002810Process::EnableWatchpoint (Watchpoint *watchpoint, bool notify)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002811{
2812 Error error;
2813 error.SetErrorString("watchpoints are not supported");
2814 return error;
2815}
2816
2817Error
Jim Ingham1b5792e2012-12-18 02:03:49 +00002818Process::DisableWatchpoint (Watchpoint *watchpoint, bool notify)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002819{
2820 Error error;
2821 error.SetErrorString("watchpoints are not supported");
2822 return error;
2823}
2824
2825StateType
2826Process::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp)
2827{
2828 StateType state;
2829 // Now wait for the process to launch and return control to us, and then
2830 // call DidLaunch:
2831 while (1)
2832 {
Greg Clayton6779606a2011-01-22 23:43:18 +00002833 event_sp.reset();
2834 state = WaitForStateChangedEventsPrivate (timeout, event_sp);
2835
Greg Clayton2637f822011-11-17 01:23:07 +00002836 if (StateIsStoppedState(state, false))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002837 break;
Greg Clayton6779606a2011-01-22 23:43:18 +00002838
2839 // If state is invalid, then we timed out
2840 if (state == eStateInvalid)
2841 break;
2842
2843 if (event_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002844 HandlePrivateEvent (event_sp);
2845 }
2846 return state;
2847}
2848
2849Error
Greg Clayton982c9762011-11-03 21:22:33 +00002850Process::Launch (const ProcessLaunchInfo &launch_info)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002851{
2852 Error error;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002853 m_abi_sp.reset();
Greg Clayton93d3c8332011-02-16 04:46:07 +00002854 m_dyld_ap.reset();
Greg Clayton56d9a1b2011-08-22 02:49:39 +00002855 m_os_ap.reset();
Caroline Ticeef5c6d02010-11-16 05:07:41 +00002856 m_process_input_reader.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002857
Greg Claytonaa149cb2011-08-11 02:48:45 +00002858 Module *exe_module = m_target.GetExecutableModulePointer();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002859 if (exe_module)
2860 {
Greg Clayton2289fa42011-04-30 01:09:13 +00002861 char local_exec_file_path[PATH_MAX];
2862 char platform_exec_file_path[PATH_MAX];
2863 exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path));
2864 exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002865 if (exe_module->GetFileSpec().Exists())
2866 {
Greg Clayton71337622011-02-24 22:24:29 +00002867 if (PrivateStateThreadIsValid ())
2868 PausePrivateStateThread ();
2869
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002870 error = WillLaunch (exe_module);
2871 if (error.Success())
2872 {
Jim Ingham221d51c2013-05-08 00:35:16 +00002873 const bool restarted = false;
2874 SetPublicState (eStateLaunching, restarted);
Greg Claytone24c4ac2011-11-17 04:46:02 +00002875 m_should_detach = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002876
Greg Clayton96249852013-04-18 16:57:27 +00002877 if (m_public_run_lock.WriteTryLock())
Greg Clayton69fd4be2012-09-04 20:29:05 +00002878 {
2879 // Now launch using these arguments.
2880 error = DoLaunch (exe_module, launch_info);
2881 }
2882 else
2883 {
2884 // This shouldn't happen
2885 error.SetErrorString("failed to acquire process run lock");
2886 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002887
2888 if (error.Fail())
2889 {
2890 if (GetID() != LLDB_INVALID_PROCESS_ID)
2891 {
2892 SetID (LLDB_INVALID_PROCESS_ID);
2893 const char *error_string = error.AsCString();
2894 if (error_string == NULL)
2895 error_string = "launch failed";
2896 SetExitStatus (-1, error_string);
2897 }
2898 }
2899 else
2900 {
2901 EventSP event_sp;
Greg Clayton1a38ea72011-06-22 01:42:17 +00002902 TimeValue timeout_time;
2903 timeout_time = TimeValue::Now();
2904 timeout_time.OffsetWithSeconds(10);
2905 StateType state = WaitForProcessStopPrivate(&timeout_time, event_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002906
Greg Clayton1a38ea72011-06-22 01:42:17 +00002907 if (state == eStateInvalid || event_sp.get() == NULL)
2908 {
2909 // We were able to launch the process, but we failed to
2910 // catch the initial stop.
2911 SetExitStatus (0, "failed to catch stop after launch");
2912 Destroy();
2913 }
2914 else if (state == eStateStopped || state == eStateCrashed)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002915 {
Greg Clayton93d3c8332011-02-16 04:46:07 +00002916
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002917 DidLaunch ();
2918
Greg Claytonc859e2d2012-02-13 23:10:39 +00002919 DynamicLoader *dyld = GetDynamicLoader ();
2920 if (dyld)
2921 dyld->DidLaunch();
Greg Clayton93d3c8332011-02-16 04:46:07 +00002922
Greg Clayton56d9a1b2011-08-22 02:49:39 +00002923 m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002924 // This delays passing the stopped event to listeners till DidLaunch gets
2925 // a chance to complete...
2926 HandlePrivateEvent (event_sp);
Greg Clayton71337622011-02-24 22:24:29 +00002927
2928 if (PrivateStateThreadIsValid ())
2929 ResumePrivateStateThread ();
2930 else
2931 StartPrivateStateThread ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002932 }
2933 else if (state == eStateExited)
2934 {
2935 // We exited while trying to launch somehow. Don't call DidLaunch as that's
2936 // not likely to work, and return an invalid pid.
2937 HandlePrivateEvent (event_sp);
2938 }
2939 }
2940 }
2941 }
2942 else
2943 {
Greg Clayton86edbf42011-10-26 00:56:27 +00002944 error.SetErrorStringWithFormat("file doesn't exist: '%s'", local_exec_file_path);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002945 }
2946 }
2947 return error;
2948}
2949
Greg Claytonc3776bf2012-02-09 06:16:32 +00002950
2951Error
2952Process::LoadCore ()
2953{
2954 Error error = DoLoadCore();
2955 if (error.Success())
2956 {
2957 if (PrivateStateThreadIsValid ())
2958 ResumePrivateStateThread ();
2959 else
2960 StartPrivateStateThread ();
2961
Greg Claytonc859e2d2012-02-13 23:10:39 +00002962 DynamicLoader *dyld = GetDynamicLoader ();
2963 if (dyld)
2964 dyld->DidAttach();
2965
2966 m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
Greg Claytonc3776bf2012-02-09 06:16:32 +00002967 // We successfully loaded a core file, now pretend we stopped so we can
2968 // show all of the threads in the core file and explore the crashed
2969 // state.
2970 SetPrivateState (eStateStopped);
2971
2972 }
2973 return error;
2974}
2975
Greg Claytonc859e2d2012-02-13 23:10:39 +00002976DynamicLoader *
2977Process::GetDynamicLoader ()
2978{
2979 if (m_dyld_ap.get() == NULL)
2980 m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL));
2981 return m_dyld_ap.get();
2982}
Greg Claytonc3776bf2012-02-09 06:16:32 +00002983
2984
Jim Inghambb3a2832011-01-29 01:49:25 +00002985Process::NextEventAction::EventActionResult
2986Process::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002987{
Jim Inghambb3a2832011-01-29 01:49:25 +00002988 StateType state = ProcessEventData::GetStateFromEvent (event_sp.get());
2989 switch (state)
Greg Clayton19388cf2010-10-18 01:45:30 +00002990 {
Greg Clayton513c26c2011-01-29 07:10:55 +00002991 case eStateRunning:
Greg Clayton71337622011-02-24 22:24:29 +00002992 case eStateConnected:
Greg Clayton513c26c2011-01-29 07:10:55 +00002993 return eEventActionRetry;
2994
2995 case eStateStopped:
2996 case eStateCrashed:
Greg Claytonc9ed4782011-11-12 02:10:56 +00002997 {
2998 // During attach, prior to sending the eStateStopped event,
Jim Inghamb1e2e842012-04-12 18:49:31 +00002999 // lldb_private::Process subclasses must set the new process ID.
Greg Claytonc9ed4782011-11-12 02:10:56 +00003000 assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID);
Jim Ingham221d51c2013-05-08 00:35:16 +00003001 // We don't want these events to be reported, so go set the ShouldReportStop here:
3002 m_process->GetThreadList().SetShouldReportStop (eVoteNo);
3003
Greg Claytonc9ed4782011-11-12 02:10:56 +00003004 if (m_exec_count > 0)
3005 {
3006 --m_exec_count;
Jim Ingham221d51c2013-05-08 00:35:16 +00003007 RequestResume();
Greg Claytonc9ed4782011-11-12 02:10:56 +00003008 return eEventActionRetry;
3009 }
3010 else
3011 {
3012 m_process->CompleteAttach ();
3013 return eEventActionSuccess;
3014 }
3015 }
Greg Clayton513c26c2011-01-29 07:10:55 +00003016 break;
Greg Claytonc9ed4782011-11-12 02:10:56 +00003017
Greg Clayton513c26c2011-01-29 07:10:55 +00003018 default:
3019 case eStateExited:
3020 case eStateInvalid:
Greg Clayton513c26c2011-01-29 07:10:55 +00003021 break;
Jim Inghambb3a2832011-01-29 01:49:25 +00003022 }
Greg Claytonc9ed4782011-11-12 02:10:56 +00003023
3024 m_exit_string.assign ("No valid Process");
3025 return eEventActionExit;
Jim Inghambb3a2832011-01-29 01:49:25 +00003026}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003027
Jim Inghambb3a2832011-01-29 01:49:25 +00003028Process::NextEventAction::EventActionResult
3029Process::AttachCompletionHandler::HandleBeingInterrupted()
3030{
3031 return eEventActionSuccess;
3032}
3033
3034const char *
3035Process::AttachCompletionHandler::GetExitString ()
3036{
3037 return m_exit_string.c_str();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003038}
3039
3040Error
Greg Clayton144f3a92011-11-15 03:53:30 +00003041Process::Attach (ProcessAttachInfo &attach_info)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003042{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003043 m_abi_sp.reset();
Caroline Ticeef5c6d02010-11-16 05:07:41 +00003044 m_process_input_reader.reset();
Greg Clayton93d3c8332011-02-16 04:46:07 +00003045 m_dyld_ap.reset();
Greg Clayton56d9a1b2011-08-22 02:49:39 +00003046 m_os_ap.reset();
Jim Ingham5aee1622010-08-09 23:31:02 +00003047
Greg Clayton144f3a92011-11-15 03:53:30 +00003048 lldb::pid_t attach_pid = attach_info.GetProcessID();
Greg Claytone996fd32011-03-08 22:40:15 +00003049 Error error;
Greg Clayton144f3a92011-11-15 03:53:30 +00003050 if (attach_pid == LLDB_INVALID_PROCESS_ID)
Jim Ingham5aee1622010-08-09 23:31:02 +00003051 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003052 char process_name[PATH_MAX];
Jim Ingham4299fdb2011-09-15 01:10:17 +00003053
Greg Clayton144f3a92011-11-15 03:53:30 +00003054 if (attach_info.GetExecutableFile().GetPath (process_name, sizeof(process_name)))
Jim Ingham2ecb7422010-08-17 21:54:19 +00003055 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003056 const bool wait_for_launch = attach_info.GetWaitForLaunch();
3057
3058 if (wait_for_launch)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003059 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003060 error = WillAttachToProcessWithName(process_name, wait_for_launch);
3061 if (error.Success())
3062 {
Greg Clayton96249852013-04-18 16:57:27 +00003063 if (m_public_run_lock.WriteTryLock())
Greg Clayton926cce72012-10-12 16:10:12 +00003064 {
3065 m_should_detach = true;
Jim Ingham221d51c2013-05-08 00:35:16 +00003066 const bool restarted = false;
3067 SetPublicState (eStateAttaching, restarted);
Greg Clayton926cce72012-10-12 16:10:12 +00003068 // Now attach using these arguments.
3069 error = DoAttachToProcessWithName (process_name, wait_for_launch, attach_info);
3070 }
3071 else
3072 {
3073 // This shouldn't happen
3074 error.SetErrorString("failed to acquire process run lock");
3075 }
Greg Claytone24c4ac2011-11-17 04:46:02 +00003076
Greg Clayton144f3a92011-11-15 03:53:30 +00003077 if (error.Fail())
3078 {
3079 if (GetID() != LLDB_INVALID_PROCESS_ID)
3080 {
3081 SetID (LLDB_INVALID_PROCESS_ID);
3082 if (error.AsCString() == NULL)
3083 error.SetErrorString("attach failed");
3084
3085 SetExitStatus(-1, error.AsCString());
3086 }
3087 }
3088 else
3089 {
3090 SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount()));
3091 StartPrivateStateThread();
3092 }
3093 return error;
3094 }
Greg Claytone996fd32011-03-08 22:40:15 +00003095 }
Greg Clayton144f3a92011-11-15 03:53:30 +00003096 else
Greg Claytone996fd32011-03-08 22:40:15 +00003097 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003098 ProcessInstanceInfoList process_infos;
3099 PlatformSP platform_sp (m_target.GetPlatform ());
3100
3101 if (platform_sp)
3102 {
3103 ProcessInstanceInfoMatch match_info;
3104 match_info.GetProcessInfo() = attach_info;
3105 match_info.SetNameMatchType (eNameMatchEquals);
3106 platform_sp->FindProcesses (match_info, process_infos);
3107 const uint32_t num_matches = process_infos.GetSize();
3108 if (num_matches == 1)
3109 {
3110 attach_pid = process_infos.GetProcessIDAtIndex(0);
3111 // Fall through and attach using the above process ID
3112 }
3113 else
3114 {
3115 match_info.GetProcessInfo().GetExecutableFile().GetPath (process_name, sizeof(process_name));
3116 if (num_matches > 1)
3117 error.SetErrorStringWithFormat ("more than one process named %s", process_name);
3118 else
3119 error.SetErrorStringWithFormat ("could not find a process named %s", process_name);
3120 }
3121 }
3122 else
3123 {
3124 error.SetErrorString ("invalid platform, can't find processes by name");
3125 return error;
3126 }
Greg Claytone996fd32011-03-08 22:40:15 +00003127 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003128 }
3129 else
Greg Clayton144f3a92011-11-15 03:53:30 +00003130 {
3131 error.SetErrorString ("invalid process name");
Greg Claytone996fd32011-03-08 22:40:15 +00003132 }
3133 }
Greg Clayton144f3a92011-11-15 03:53:30 +00003134
3135 if (attach_pid != LLDB_INVALID_PROCESS_ID)
Greg Claytone996fd32011-03-08 22:40:15 +00003136 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003137 error = WillAttachToProcessWithID(attach_pid);
Greg Claytone996fd32011-03-08 22:40:15 +00003138 if (error.Success())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003139 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003140
Greg Clayton96249852013-04-18 16:57:27 +00003141 if (m_public_run_lock.WriteTryLock())
Greg Clayton926cce72012-10-12 16:10:12 +00003142 {
3143 // Now attach using these arguments.
3144 m_should_detach = true;
Jim Ingham221d51c2013-05-08 00:35:16 +00003145 const bool restarted = false;
3146 SetPublicState (eStateAttaching, restarted);
Greg Clayton926cce72012-10-12 16:10:12 +00003147 error = DoAttachToProcessWithID (attach_pid, attach_info);
3148 }
3149 else
3150 {
3151 // This shouldn't happen
3152 error.SetErrorString("failed to acquire process run lock");
3153 }
3154
Greg Clayton144f3a92011-11-15 03:53:30 +00003155 if (error.Success())
3156 {
3157
3158 SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount()));
3159 StartPrivateStateThread();
3160 }
3161 else
Greg Claytone996fd32011-03-08 22:40:15 +00003162 {
3163 if (GetID() != LLDB_INVALID_PROCESS_ID)
3164 {
3165 SetID (LLDB_INVALID_PROCESS_ID);
3166 const char *error_string = error.AsCString();
3167 if (error_string == NULL)
3168 error_string = "attach failed";
3169
3170 SetExitStatus(-1, error_string);
3171 }
3172 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003173 }
3174 }
3175 return error;
3176}
3177
Greg Clayton93d3c8332011-02-16 04:46:07 +00003178void
3179Process::CompleteAttach ()
3180{
3181 // Let the process subclass figure out at much as it can about the process
3182 // before we go looking for a dynamic loader plug-in.
3183 DidAttach();
3184
Jim Ingham4299fdb2011-09-15 01:10:17 +00003185 // We just attached. If we have a platform, ask it for the process architecture, and if it isn't
3186 // the same as the one we've already set, switch architectures.
3187 PlatformSP platform_sp (m_target.GetPlatform ());
3188 assert (platform_sp.get());
3189 if (platform_sp)
3190 {
Greg Clayton70512312012-05-08 01:45:38 +00003191 const ArchSpec &target_arch = m_target.GetArchitecture();
Greg Clayton1e0c8842013-01-11 20:49:54 +00003192 if (target_arch.IsValid() && !platform_sp->IsCompatibleArchitecture (target_arch, false, NULL))
Greg Clayton70512312012-05-08 01:45:38 +00003193 {
3194 ArchSpec platform_arch;
3195 platform_sp = platform_sp->GetPlatformForArchitecture (target_arch, &platform_arch);
3196 if (platform_sp)
3197 {
3198 m_target.SetPlatform (platform_sp);
3199 m_target.SetArchitecture(platform_arch);
3200 }
3201 }
3202 else
3203 {
3204 ProcessInstanceInfo process_info;
3205 platform_sp->GetProcessInfo (GetID(), process_info);
3206 const ArchSpec &process_arch = process_info.GetArchitecture();
Sean Callananbf4b7be2012-12-13 22:07:14 +00003207 if (process_arch.IsValid() && !m_target.GetArchitecture().IsExactMatch(process_arch))
Greg Clayton70512312012-05-08 01:45:38 +00003208 m_target.SetArchitecture (process_arch);
3209 }
Jim Ingham4299fdb2011-09-15 01:10:17 +00003210 }
3211
3212 // We have completed the attach, now it is time to find the dynamic loader
Greg Clayton93d3c8332011-02-16 04:46:07 +00003213 // plug-in
Greg Claytonc859e2d2012-02-13 23:10:39 +00003214 DynamicLoader *dyld = GetDynamicLoader ();
3215 if (dyld)
3216 dyld->DidAttach();
Greg Clayton93d3c8332011-02-16 04:46:07 +00003217
Greg Clayton56d9a1b2011-08-22 02:49:39 +00003218 m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL));
Greg Clayton93d3c8332011-02-16 04:46:07 +00003219 // Figure out which one is the executable, and set that in our target:
Enrico Granata17598482012-11-08 02:22:02 +00003220 const ModuleList &target_modules = m_target.GetImages();
Jim Ingham3ee12ef2012-05-30 02:19:25 +00003221 Mutex::Locker modules_locker(target_modules.GetMutex());
3222 size_t num_modules = target_modules.GetSize();
3223 ModuleSP new_executable_module_sp;
Greg Clayton93d3c8332011-02-16 04:46:07 +00003224
Greg Clayton93d3c8332011-02-16 04:46:07 +00003225 for (int i = 0; i < num_modules; i++)
3226 {
Jim Ingham3ee12ef2012-05-30 02:19:25 +00003227 ModuleSP module_sp (target_modules.GetModuleAtIndexUnlocked (i));
Greg Clayton8b82f082011-04-12 05:54:46 +00003228 if (module_sp && module_sp->IsExecutable())
Greg Clayton93d3c8332011-02-16 04:46:07 +00003229 {
Greg Claytonaa149cb2011-08-11 02:48:45 +00003230 if (m_target.GetExecutableModulePointer() != module_sp.get())
Jim Ingham3ee12ef2012-05-30 02:19:25 +00003231 new_executable_module_sp = module_sp;
Greg Clayton93d3c8332011-02-16 04:46:07 +00003232 break;
3233 }
3234 }
Jim Ingham3ee12ef2012-05-30 02:19:25 +00003235 if (new_executable_module_sp)
3236 m_target.SetExecutableModule (new_executable_module_sp, false);
Greg Clayton93d3c8332011-02-16 04:46:07 +00003237}
3238
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003239Error
Jason Molenda4bd4e7e2012-09-29 04:02:01 +00003240Process::ConnectRemote (Stream *strm, const char *remote_url)
Greg Claytonb766a732011-02-04 01:58:07 +00003241{
Greg Claytonb766a732011-02-04 01:58:07 +00003242 m_abi_sp.reset();
3243 m_process_input_reader.reset();
3244
3245 // Find the process and its architecture. Make sure it matches the architecture
3246 // of the current Target, and if not adjust it.
3247
Jason Molenda4bd4e7e2012-09-29 04:02:01 +00003248 Error error (DoConnectRemote (strm, remote_url));
Greg Claytonb766a732011-02-04 01:58:07 +00003249 if (error.Success())
3250 {
Greg Clayton71337622011-02-24 22:24:29 +00003251 if (GetID() != LLDB_INVALID_PROCESS_ID)
3252 {
Greg Clayton32e0a752011-03-30 18:16:51 +00003253 EventSP event_sp;
3254 StateType state = WaitForProcessStopPrivate(NULL, event_sp);
3255
3256 if (state == eStateStopped || state == eStateCrashed)
3257 {
3258 // If we attached and actually have a process on the other end, then
3259 // this ended up being the equivalent of an attach.
3260 CompleteAttach ();
3261
3262 // This delays passing the stopped event to listeners till
3263 // CompleteAttach gets a chance to complete...
3264 HandlePrivateEvent (event_sp);
3265
3266 }
Greg Clayton71337622011-02-24 22:24:29 +00003267 }
Greg Clayton32e0a752011-03-30 18:16:51 +00003268
3269 if (PrivateStateThreadIsValid ())
3270 ResumePrivateStateThread ();
3271 else
3272 StartPrivateStateThread ();
Greg Claytonb766a732011-02-04 01:58:07 +00003273 }
3274 return error;
3275}
3276
3277
3278Error
Jim Ingham3b8285d2012-04-19 01:40:33 +00003279Process::PrivateResume ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003280{
Greg Clayton5160ce52013-03-27 23:08:40 +00003281 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS|LIBLLDB_LOG_STEP));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003282 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00003283 log->Printf("Process::PrivateResume() m_stop_id = %u, public state: %s private state: %s",
Jim Ingham4b536182011-08-09 02:12:22 +00003284 m_mod_id.GetStopID(),
Jim Ingham444586b2011-01-24 06:34:17 +00003285 StateAsCString(m_public_state.GetValue()),
3286 StateAsCString(m_private_state.GetValue()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003287
3288 Error error (WillResume());
3289 // Tell the process it is about to resume before the thread list
3290 if (error.Success())
3291 {
Johnny Chenc4221e42010-12-02 20:53:05 +00003292 // Now let the thread list know we are about to resume so it
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003293 // can let all of our threads know that they are about to be
3294 // resumed. Threads will each be called with
3295 // Thread::WillResume(StateType) where StateType contains the state
3296 // that they are supposed to have when the process is resumed
3297 // (suspended/running/stepping). Threads should also check
3298 // their resume signal in lldb::Thread::GetResumeSignal()
Jim Ingham221d51c2013-05-08 00:35:16 +00003299 // to see if they are supposed to start back up with a signal.
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003300 if (m_thread_list.WillResume())
3301 {
Jim Ingham372787f2012-04-07 00:00:41 +00003302 // Last thing, do the PreResumeActions.
3303 if (!RunPreResumeActions())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003304 {
Jim Ingham0161b492013-02-09 01:29:05 +00003305 error.SetErrorStringWithFormat ("Process::PrivateResume PreResumeActions failed, not resuming.");
Jim Ingham372787f2012-04-07 00:00:41 +00003306 }
3307 else
3308 {
3309 m_mod_id.BumpResumeID();
3310 error = DoResume();
3311 if (error.Success())
3312 {
3313 DidResume();
3314 m_thread_list.DidResume();
3315 if (log)
3316 log->Printf ("Process thinks the process has resumed.");
3317 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003318 }
3319 }
3320 else
3321 {
Jim Ingham513c6bb2012-09-01 01:02:41 +00003322 // Somebody wanted to run without running. So generate a continue & a stopped event,
3323 // and let the world handle them.
3324 if (log)
3325 log->Printf ("Process::PrivateResume() asked to simulate a start & stop.");
3326
3327 SetPrivateState(eStateRunning);
3328 SetPrivateState(eStateStopped);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003329 }
3330 }
Jim Ingham444586b2011-01-24 06:34:17 +00003331 else if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00003332 log->Printf ("Process::PrivateResume() got an error \"%s\".", error.AsCString("<unknown error>"));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003333 return error;
3334}
3335
3336Error
Greg Claytonf9b57b92013-05-10 23:48:10 +00003337Process::Halt (bool clear_thread_plans)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003338{
Greg Claytonf9b57b92013-05-10 23:48:10 +00003339 // Don't clear the m_clear_thread_plans_on_stop, only set it to true if
3340 // in case it was already set and some thread plan logic calls halt on its
3341 // own.
3342 m_clear_thread_plans_on_stop |= clear_thread_plans;
3343
Jim Inghamaacc3182012-06-06 00:29:30 +00003344 // First make sure we aren't in the middle of handling an event, or we might restart. This is pretty weak, since
3345 // we could just straightaway get another event. It just narrows the window...
3346 m_currently_handling_event.WaitForValueEqualTo(false);
3347
3348
Jim Inghambb3a2832011-01-29 01:49:25 +00003349 // Pause our private state thread so we can ensure no one else eats
3350 // the stop event out from under us.
Jim Ingham0f16e732011-02-08 05:20:59 +00003351 Listener halt_listener ("lldb.process.halt_listener");
3352 HijackPrivateProcessEvents(&halt_listener);
Greg Clayton3af9ea52010-11-18 05:57:03 +00003353
Jim Inghambb3a2832011-01-29 01:49:25 +00003354 EventSP event_sp;
Greg Clayton513c26c2011-01-29 07:10:55 +00003355 Error error (WillHalt());
Jim Inghambb3a2832011-01-29 01:49:25 +00003356
Greg Clayton513c26c2011-01-29 07:10:55 +00003357 if (error.Success())
Jim Inghambb3a2832011-01-29 01:49:25 +00003358 {
Jim Inghambb3a2832011-01-29 01:49:25 +00003359
Greg Clayton513c26c2011-01-29 07:10:55 +00003360 bool caused_stop = false;
3361
3362 // Ask the process subclass to actually halt our process
3363 error = DoHalt(caused_stop);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003364 if (error.Success())
Jim Ingham0d8bcc72010-11-17 02:32:00 +00003365 {
Greg Clayton513c26c2011-01-29 07:10:55 +00003366 if (m_public_state.GetValue() == eStateAttaching)
3367 {
3368 SetExitStatus(SIGKILL, "Cancelled async attach.");
3369 Destroy ();
3370 }
3371 else
Jim Ingham0d8bcc72010-11-17 02:32:00 +00003372 {
Jim Inghambb3a2832011-01-29 01:49:25 +00003373 // If "caused_stop" is true, then DoHalt stopped the process. If
3374 // "caused_stop" is false, the process was already stopped.
3375 // If the DoHalt caused the process to stop, then we want to catch
3376 // this event and set the interrupted bool to true before we pass
3377 // this along so clients know that the process was interrupted by
3378 // a halt command.
3379 if (caused_stop)
Greg Clayton3af9ea52010-11-18 05:57:03 +00003380 {
Jim Ingham0f16e732011-02-08 05:20:59 +00003381 // Wait for 1 second for the process to stop.
Jim Inghambb3a2832011-01-29 01:49:25 +00003382 TimeValue timeout_time;
3383 timeout_time = TimeValue::Now();
3384 timeout_time.OffsetWithSeconds(1);
Jim Ingham0f16e732011-02-08 05:20:59 +00003385 bool got_event = halt_listener.WaitForEvent (&timeout_time, event_sp);
3386 StateType state = ProcessEventData::GetStateFromEvent(event_sp.get());
Jim Inghambb3a2832011-01-29 01:49:25 +00003387
Jim Ingham0f16e732011-02-08 05:20:59 +00003388 if (!got_event || state == eStateInvalid)
Greg Clayton3af9ea52010-11-18 05:57:03 +00003389 {
Jim Inghambb3a2832011-01-29 01:49:25 +00003390 // We timeout out and didn't get a stop event...
Jim Ingham0f16e732011-02-08 05:20:59 +00003391 error.SetErrorStringWithFormat ("Halt timed out. State = %s", StateAsCString(GetState()));
Greg Clayton3af9ea52010-11-18 05:57:03 +00003392 }
3393 else
3394 {
Greg Clayton2637f822011-11-17 01:23:07 +00003395 if (StateIsStoppedState (state, false))
Jim Inghambb3a2832011-01-29 01:49:25 +00003396 {
3397 // We caused the process to interrupt itself, so mark this
3398 // as such in the stop event so clients can tell an interrupted
3399 // process from a natural stop
3400 ProcessEventData::SetInterruptedInEvent (event_sp.get(), true);
3401 }
3402 else
3403 {
Greg Clayton5160ce52013-03-27 23:08:40 +00003404 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Jim Inghambb3a2832011-01-29 01:49:25 +00003405 if (log)
3406 log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state));
3407 error.SetErrorString ("Did not get stopped event after halt.");
3408 }
Greg Clayton3af9ea52010-11-18 05:57:03 +00003409 }
3410 }
Jim Inghambb3a2832011-01-29 01:49:25 +00003411 DidHalt();
Jim Ingham0d8bcc72010-11-17 02:32:00 +00003412 }
3413 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003414 }
Jim Inghambb3a2832011-01-29 01:49:25 +00003415 // Resume our private state thread before we post the event (if any)
Jim Ingham0f16e732011-02-08 05:20:59 +00003416 RestorePrivateProcessEvents();
Jim Inghambb3a2832011-01-29 01:49:25 +00003417
3418 // Post any event we might have consumed. If all goes well, we will have
3419 // stopped the process, intercepted the event and set the interrupted
3420 // bool in the event. Post it to the private event queue and that will end up
3421 // correctly setting the state.
3422 if (event_sp)
3423 m_private_state_broadcaster.BroadcastEvent(event_sp);
3424
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003425 return error;
3426}
3427
3428Error
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003429Process::HaltForDestroyOrDetach(lldb::EventSP &exit_event_sp)
3430{
3431 Error error;
3432 if (m_public_state.GetValue() == eStateRunning)
3433 {
3434 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3435 if (log)
3436 log->Printf("Process::Destroy() About to halt.");
3437 error = Halt();
3438 if (error.Success())
3439 {
3440 // Consume the halt event.
3441 TimeValue timeout (TimeValue::Now());
3442 timeout.OffsetWithSeconds(1);
3443 StateType state = WaitForProcessToStop (&timeout, &exit_event_sp);
3444
3445 // If the process exited while we were waiting for it to stop, put the exited event into
3446 // the shared pointer passed in and return. Our caller doesn't need to do anything else, since
3447 // they don't have a process anymore...
3448
3449 if (state == eStateExited || m_private_state.GetValue() == eStateExited)
3450 {
3451 if (log)
3452 log->Printf("Process::HaltForDestroyOrDetach() Process exited while waiting to Halt.");
3453 return error;
3454 }
3455 else
3456 exit_event_sp.reset(); // It is ok to consume any non-exit stop events
3457
3458 if (state != eStateStopped)
3459 {
3460 if (log)
3461 log->Printf("Process::HaltForDestroyOrDetach() Halt failed to stop, state is: %s", StateAsCString(state));
3462 // If we really couldn't stop the process then we should just error out here, but if the
3463 // lower levels just bobbled sending the event and we really are stopped, then continue on.
3464 StateType private_state = m_private_state.GetValue();
3465 if (private_state != eStateStopped)
3466 {
3467 return error;
3468 }
3469 }
3470 }
3471 else
3472 {
3473 if (log)
3474 log->Printf("Process::HaltForDestroyOrDetach() Halt got error: %s", error.AsCString());
3475 }
3476 }
3477 return error;
3478}
3479
3480Error
Jim Inghamacff8952013-05-02 00:27:30 +00003481Process::Detach (bool keep_stopped)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003482{
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003483 EventSP exit_event_sp;
3484 Error error;
3485 m_destroy_in_process = true;
3486
3487 error = WillDetach();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003488
3489 if (error.Success())
3490 {
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003491 if (DetachRequiresHalt())
3492 {
3493 error = HaltForDestroyOrDetach (exit_event_sp);
3494 if (!error.Success())
3495 {
3496 m_destroy_in_process = false;
3497 return error;
3498 }
3499 else if (exit_event_sp)
3500 {
3501 // We shouldn't need to do anything else here. There's no process left to detach from...
3502 StopPrivateStateThread();
3503 m_destroy_in_process = false;
3504 return error;
3505 }
3506 }
3507
Jim Inghamacff8952013-05-02 00:27:30 +00003508 error = DoDetach(keep_stopped);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003509 if (error.Success())
3510 {
3511 DidDetach();
3512 StopPrivateStateThread();
3513 }
Jim Inghamacff8952013-05-02 00:27:30 +00003514 else
3515 {
3516 return error;
3517 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003518 }
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003519 m_destroy_in_process = false;
3520
3521 // If we exited when we were waiting for a process to stop, then
3522 // forward the event here so we don't lose the event
3523 if (exit_event_sp)
3524 {
3525 // Directly broadcast our exited event because we shut down our
3526 // private state thread above
3527 BroadcastEvent(exit_event_sp);
3528 }
3529
3530 // If we have been interrupted (to kill us) in the middle of running, we may not end up propagating
3531 // the last events through the event system, in which case we might strand the write lock. Unlock
3532 // it here so when we do to tear down the process we don't get an error destroying the lock.
3533
Greg Clayton96249852013-04-18 16:57:27 +00003534 m_public_run_lock.WriteUnlock();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003535 return error;
3536}
3537
3538Error
3539Process::Destroy ()
3540{
Jim Ingham09437922013-03-01 20:04:25 +00003541
3542 // Tell ourselves we are in the process of destroying the process, so that we don't do any unnecessary work
3543 // that might hinder the destruction. Remember to set this back to false when we are done. That way if the attempt
3544 // failed and the process stays around for some reason it won't be in a confused state.
3545
3546 m_destroy_in_process = true;
3547
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003548 Error error (WillDestroy());
3549 if (error.Success())
3550 {
Greg Clayton85fb1b92012-09-11 02:33:37 +00003551 EventSP exit_event_sp;
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003552 if (DestroyRequiresHalt())
Jim Ingham04e0a222012-05-23 15:46:31 +00003553 {
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003554 error = HaltForDestroyOrDetach(exit_event_sp);
Jim Ingham04e0a222012-05-23 15:46:31 +00003555 }
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003556
Jim Inghamaacc3182012-06-06 00:29:30 +00003557 if (m_public_state.GetValue() != eStateRunning)
3558 {
3559 // Ditch all thread plans, and remove all our breakpoints: in case we have to restart the target to
3560 // kill it, we don't want it hitting a breakpoint...
3561 // Only do this if we've stopped, however, since if we didn't manage to halt it above, then
3562 // we're not going to have much luck doing this now.
3563 m_thread_list.DiscardThreadPlans();
3564 DisableAllBreakpointSites();
3565 }
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003566
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003567 error = DoDestroy();
3568 if (error.Success())
3569 {
3570 DidDestroy();
3571 StopPrivateStateThread();
3572 }
Caroline Ticeef5c6d02010-11-16 05:07:41 +00003573 m_stdio_communication.StopReadThread();
3574 m_stdio_communication.Disconnect();
3575 if (m_process_input_reader && m_process_input_reader->IsActive())
3576 m_target.GetDebugger().PopInputReader (m_process_input_reader);
3577 if (m_process_input_reader)
3578 m_process_input_reader.reset();
Greg Clayton85fb1b92012-09-11 02:33:37 +00003579
3580 // If we exited when we were waiting for a process to stop, then
3581 // forward the event here so we don't lose the event
3582 if (exit_event_sp)
3583 {
3584 // Directly broadcast our exited event because we shut down our
3585 // private state thread above
3586 BroadcastEvent(exit_event_sp);
3587 }
3588
Jim Inghamb1e2e842012-04-12 18:49:31 +00003589 // If we have been interrupted (to kill us) in the middle of running, we may not end up propagating
3590 // the last events through the event system, in which case we might strand the write lock. Unlock
3591 // it here so when we do to tear down the process we don't get an error destroying the lock.
Greg Clayton96249852013-04-18 16:57:27 +00003592 m_public_run_lock.WriteUnlock();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003593 }
Jim Ingham09437922013-03-01 20:04:25 +00003594
3595 m_destroy_in_process = false;
3596
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003597 return error;
3598}
3599
3600Error
3601Process::Signal (int signal)
3602{
3603 Error error (WillSignal());
3604 if (error.Success())
3605 {
3606 error = DoSignal(signal);
3607 if (error.Success())
3608 DidSignal();
3609 }
3610 return error;
3611}
3612
Greg Clayton514487e2011-02-15 21:59:32 +00003613lldb::ByteOrder
3614Process::GetByteOrder () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003615{
Greg Clayton514487e2011-02-15 21:59:32 +00003616 return m_target.GetArchitecture().GetByteOrder();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003617}
3618
3619uint32_t
Greg Clayton514487e2011-02-15 21:59:32 +00003620Process::GetAddressByteSize () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003621{
Greg Clayton514487e2011-02-15 21:59:32 +00003622 return m_target.GetArchitecture().GetAddressByteSize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003623}
3624
Greg Clayton514487e2011-02-15 21:59:32 +00003625
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003626bool
3627Process::ShouldBroadcastEvent (Event *event_ptr)
3628{
3629 const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr);
3630 bool return_value = true;
Greg Clayton5160ce52013-03-27 23:08:40 +00003631 Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_EVENTS | LIBLLDB_LOG_PROCESS));
Jim Ingham0161b492013-02-09 01:29:05 +00003632
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003633 switch (state)
3634 {
Greg Claytonb766a732011-02-04 01:58:07 +00003635 case eStateConnected:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003636 case eStateAttaching:
3637 case eStateLaunching:
3638 case eStateDetached:
3639 case eStateExited:
3640 case eStateUnloaded:
3641 // These events indicate changes in the state of the debugging session, always report them.
3642 return_value = true;
3643 break;
3644 case eStateInvalid:
3645 // We stopped for no apparent reason, don't report it.
3646 return_value = false;
3647 break;
3648 case eStateRunning:
3649 case eStateStepping:
3650 // If we've started the target running, we handle the cases where we
3651 // are already running and where there is a transition from stopped to
3652 // running differently.
3653 // running -> running: Automatically suppress extra running events
3654 // stopped -> running: Report except when there is one or more no votes
3655 // and no yes votes.
3656 SynchronouslyNotifyStateChanged (state);
Jim Ingham0161b492013-02-09 01:29:05 +00003657 switch (m_last_broadcast_state)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003658 {
3659 case eStateRunning:
3660 case eStateStepping:
3661 // We always suppress multiple runnings with no PUBLIC stop in between.
3662 return_value = false;
3663 break;
3664 default:
3665 // TODO: make this work correctly. For now always report
3666 // run if we aren't running so we don't miss any runnning
3667 // events. If I run the lldb/test/thread/a.out file and
3668 // break at main.cpp:58, run and hit the breakpoints on
3669 // multiple threads, then somehow during the stepping over
3670 // of all breakpoints no run gets reported.
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003671
3672 // This is a transition from stop to run.
3673 switch (m_thread_list.ShouldReportRun (event_ptr))
3674 {
3675 case eVoteYes:
3676 case eVoteNoOpinion:
3677 return_value = true;
3678 break;
3679 case eVoteNo:
3680 return_value = false;
3681 break;
3682 }
3683 break;
3684 }
3685 break;
3686 case eStateStopped:
3687 case eStateCrashed:
3688 case eStateSuspended:
3689 {
3690 // We've stopped. First see if we're going to restart the target.
3691 // If we are going to stop, then we always broadcast the event.
3692 // If we aren't going to stop, let the thread plans decide if we're going to report this event.
Jim Inghamb01e7422010-06-19 04:45:32 +00003693 // If no thread has an opinion, we don't report it.
Jim Ingham221d51c2013-05-08 00:35:16 +00003694
Jim Inghamcb4ca112012-05-16 01:32:14 +00003695 RefreshStateAfterStop ();
Jim Ingham0d8bcc72010-11-17 02:32:00 +00003696 if (ProcessEventData::GetInterruptedFromEvent (event_ptr))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003697 {
Greg Clayton3af9ea52010-11-18 05:57:03 +00003698 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00003699 log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s",
3700 event_ptr,
3701 StateAsCString(state));
3702 return_value = true;
Jim Ingham0d8bcc72010-11-17 02:32:00 +00003703 }
3704 else
3705 {
Jim Ingham221d51c2013-05-08 00:35:16 +00003706 bool was_restarted = ProcessEventData::GetRestartedFromEvent (event_ptr);
3707 bool should_resume = false;
3708
Jim Ingham0161b492013-02-09 01:29:05 +00003709 // It makes no sense to ask "ShouldStop" if we've already been restarted...
3710 // Asking the thread list is also not likely to go well, since we are running again.
3711 // So in that case just report the event.
3712
Jim Ingham0161b492013-02-09 01:29:05 +00003713 if (!was_restarted)
3714 should_resume = m_thread_list.ShouldStop (event_ptr) == false;
Jim Ingham221d51c2013-05-08 00:35:16 +00003715
3716 if (was_restarted || should_resume || m_resume_requested)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003717 {
Jim Ingham0161b492013-02-09 01:29:05 +00003718 Vote stop_vote = m_thread_list.ShouldReportStop (event_ptr);
3719 if (log)
3720 log->Printf ("Process::ShouldBroadcastEvent: should_stop: %i state: %s was_restarted: %i stop_vote: %d.",
3721 should_resume,
3722 StateAsCString(state),
3723 was_restarted,
3724 stop_vote);
3725
3726 switch (stop_vote)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003727 {
3728 case eVoteYes:
Jim Ingham0161b492013-02-09 01:29:05 +00003729 return_value = true;
3730 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003731 case eVoteNoOpinion:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003732 case eVoteNo:
3733 return_value = false;
3734 break;
3735 }
Jim Ingham0161b492013-02-09 01:29:05 +00003736
Jim Inghamcb95f342012-09-05 21:13:56 +00003737 if (!was_restarted)
Jim Ingham0161b492013-02-09 01:29:05 +00003738 {
3739 if (log)
3740 log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state));
3741 ProcessEventData::SetRestartedInEvent(event_ptr, true);
Jim Inghamcb95f342012-09-05 21:13:56 +00003742 PrivateResume ();
Jim Ingham0161b492013-02-09 01:29:05 +00003743 }
3744
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003745 }
3746 else
3747 {
3748 return_value = true;
3749 SynchronouslyNotifyStateChanged (state);
3750 }
3751 }
3752 }
Jim Ingham0161b492013-02-09 01:29:05 +00003753 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003754 }
Jim Ingham0161b492013-02-09 01:29:05 +00003755
3756 // We do some coalescing of events (for instance two consecutive running events get coalesced.)
3757 // But we only coalesce against events we actually broadcast. So we use m_last_broadcast_state
3758 // to track that. NB - you can't use "m_public_state.GetValue()" for that purpose, as was originally done,
3759 // because the PublicState reflects the last event pulled off the queue, and there may be several
3760 // events stacked up on the queue unserviced. So the PublicState may not reflect the last broadcasted event
3761 // yet. m_last_broadcast_state gets updated here.
3762
3763 if (return_value)
3764 m_last_broadcast_state = state;
3765
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003766 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00003767 log->Printf ("Process::ShouldBroadcastEvent (%p) => new state: %s, last broadcast state: %s - %s",
3768 event_ptr,
3769 StateAsCString(state),
3770 StateAsCString(m_last_broadcast_state),
3771 return_value ? "YES" : "NO");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003772 return return_value;
3773}
3774
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003775
3776bool
Jim Ingham372787f2012-04-07 00:00:41 +00003777Process::StartPrivateStateThread (bool force)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003778{
Greg Clayton5160ce52013-03-27 23:08:40 +00003779 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003780
Greg Clayton8b82f082011-04-12 05:54:46 +00003781 bool already_running = PrivateStateThreadIsValid ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003782 if (log)
Greg Clayton8b82f082011-04-12 05:54:46 +00003783 log->Printf ("Process::%s()%s ", __FUNCTION__, already_running ? " already running" : " starting private state thread");
3784
Jim Ingham372787f2012-04-07 00:00:41 +00003785 if (!force && already_running)
Greg Clayton8b82f082011-04-12 05:54:46 +00003786 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003787
3788 // Create a thread that watches our internal state and controls which
3789 // events make it to clients (into the DCProcess event queue).
Greg Clayton3e06bd92011-01-09 21:07:35 +00003790 char thread_name[1024];
Jim Ingham372787f2012-04-07 00:00:41 +00003791 if (already_running)
Daniel Malead01b2952012-11-29 21:49:15 +00003792 snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state-override(pid=%" PRIu64 ")>", GetID());
Jim Ingham372787f2012-04-07 00:00:41 +00003793 else
Daniel Malead01b2952012-11-29 21:49:15 +00003794 snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state(pid=%" PRIu64 ")>", GetID());
Jim Ingham076b3042012-04-10 01:21:57 +00003795
3796 // Create the private state thread, and start it running.
Greg Clayton3e06bd92011-01-09 21:07:35 +00003797 m_private_state_thread = Host::ThreadCreate (thread_name, Process::PrivateStateThread, this, NULL);
Jim Ingham076b3042012-04-10 01:21:57 +00003798 bool success = IS_VALID_LLDB_HOST_THREAD(m_private_state_thread);
3799 if (success)
3800 {
3801 ResumePrivateStateThread();
3802 return true;
3803 }
3804 else
3805 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003806}
3807
3808void
3809Process::PausePrivateStateThread ()
3810{
3811 ControlPrivateStateThread (eBroadcastInternalStateControlPause);
3812}
3813
3814void
3815Process::ResumePrivateStateThread ()
3816{
3817 ControlPrivateStateThread (eBroadcastInternalStateControlResume);
3818}
3819
3820void
3821Process::StopPrivateStateThread ()
3822{
Greg Clayton8b82f082011-04-12 05:54:46 +00003823 if (PrivateStateThreadIsValid ())
3824 ControlPrivateStateThread (eBroadcastInternalStateControlStop);
Jim Inghamb1e2e842012-04-12 18:49:31 +00003825 else
3826 {
Greg Clayton5160ce52013-03-27 23:08:40 +00003827 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
Jim Inghamb1e2e842012-04-12 18:49:31 +00003828 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00003829 log->Printf ("Went to stop the private state thread, but it was already invalid.");
Jim Inghamb1e2e842012-04-12 18:49:31 +00003830 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003831}
3832
3833void
3834Process::ControlPrivateStateThread (uint32_t signal)
3835{
Greg Clayton5160ce52013-03-27 23:08:40 +00003836 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003837
3838 assert (signal == eBroadcastInternalStateControlStop ||
3839 signal == eBroadcastInternalStateControlPause ||
3840 signal == eBroadcastInternalStateControlResume);
3841
3842 if (log)
Greg Clayton7ecb3a02011-01-22 17:43:17 +00003843 log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003844
Greg Clayton7ecb3a02011-01-22 17:43:17 +00003845 // Signal the private state thread. First we should copy this is case the
3846 // thread starts exiting since the private state thread will NULL this out
3847 // when it exits
3848 const lldb::thread_t private_state_thread = m_private_state_thread;
Greg Clayton2da6d492011-02-08 01:34:25 +00003849 if (IS_VALID_LLDB_HOST_THREAD(private_state_thread))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003850 {
3851 TimeValue timeout_time;
3852 bool timed_out;
3853
3854 m_private_state_control_broadcaster.BroadcastEvent (signal, NULL);
3855
3856 timeout_time = TimeValue::Now();
3857 timeout_time.OffsetWithSeconds(2);
Jim Inghamb1e2e842012-04-12 18:49:31 +00003858 if (log)
3859 log->Printf ("Sending control event of type: %d.", signal);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003860 m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out);
3861 m_private_state_control_wait.SetValue (false, eBroadcastNever);
3862
3863 if (signal == eBroadcastInternalStateControlStop)
3864 {
3865 if (timed_out)
Jim Inghamb1e2e842012-04-12 18:49:31 +00003866 {
3867 Error error;
3868 Host::ThreadCancel (private_state_thread, &error);
3869 if (log)
3870 log->Printf ("Timed out responding to the control event, cancel got error: \"%s\".", error.AsCString());
3871 }
3872 else
3873 {
3874 if (log)
3875 log->Printf ("The control event killed the private state thread without having to cancel.");
3876 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003877
3878 thread_result_t result = NULL;
Greg Clayton7ecb3a02011-01-22 17:43:17 +00003879 Host::ThreadJoin (private_state_thread, &result, NULL);
Greg Clayton49182ed2010-07-22 18:34:21 +00003880 m_private_state_thread = LLDB_INVALID_HOST_THREAD;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003881 }
3882 }
Jim Inghamb1e2e842012-04-12 18:49:31 +00003883 else
3884 {
3885 if (log)
3886 log->Printf ("Private state thread already dead, no need to signal it to stop.");
3887 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003888}
3889
3890void
Jim Inghamcfc09352012-07-27 23:57:19 +00003891Process::SendAsyncInterrupt ()
3892{
3893 if (PrivateStateThreadIsValid())
3894 m_private_state_broadcaster.BroadcastEvent (Process::eBroadcastBitInterrupt, NULL);
3895 else
3896 BroadcastEvent (Process::eBroadcastBitInterrupt, NULL);
3897}
3898
3899void
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003900Process::HandlePrivateEvent (EventSP &event_sp)
3901{
Greg Clayton5160ce52013-03-27 23:08:40 +00003902 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Jim Ingham221d51c2013-05-08 00:35:16 +00003903 m_resume_requested = false;
3904
Jim Inghamaacc3182012-06-06 00:29:30 +00003905 m_currently_handling_event.SetValue(true, eBroadcastNever);
Jim Inghambb3a2832011-01-29 01:49:25 +00003906
Greg Clayton414f5d32011-01-25 02:58:48 +00003907 const StateType new_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
Jim Inghambb3a2832011-01-29 01:49:25 +00003908
3909 // First check to see if anybody wants a shot at this event:
Jim Ingham754ab982011-01-29 04:05:41 +00003910 if (m_next_event_action_ap.get() != NULL)
Jim Inghambb3a2832011-01-29 01:49:25 +00003911 {
Jim Ingham754ab982011-01-29 04:05:41 +00003912 NextEventAction::EventActionResult action_result = m_next_event_action_ap->PerformAction(event_sp);
Jim Ingham0161b492013-02-09 01:29:05 +00003913 if (log)
3914 log->Printf ("Ran next event action, result was %d.", action_result);
3915
Jim Inghambb3a2832011-01-29 01:49:25 +00003916 switch (action_result)
3917 {
3918 case NextEventAction::eEventActionSuccess:
3919 SetNextEventAction(NULL);
3920 break;
Greg Claytonc9ed4782011-11-12 02:10:56 +00003921
Jim Inghambb3a2832011-01-29 01:49:25 +00003922 case NextEventAction::eEventActionRetry:
3923 break;
Greg Claytonc9ed4782011-11-12 02:10:56 +00003924
Jim Inghambb3a2832011-01-29 01:49:25 +00003925 case NextEventAction::eEventActionExit:
Jim Ingham2a5fdd42011-01-29 01:57:31 +00003926 // Handle Exiting Here. If we already got an exited event,
3927 // we should just propagate it. Otherwise, swallow this event,
3928 // and set our state to exit so the next event will kill us.
3929 if (new_state != eStateExited)
3930 {
3931 // FIXME: should cons up an exited event, and discard this one.
Jim Ingham754ab982011-01-29 04:05:41 +00003932 SetExitStatus(0, m_next_event_action_ap->GetExitString());
Jim Ingham221d51c2013-05-08 00:35:16 +00003933 m_currently_handling_event.SetValue(false, eBroadcastAlways);
Jim Ingham2a5fdd42011-01-29 01:57:31 +00003934 SetNextEventAction(NULL);
3935 return;
3936 }
3937 SetNextEventAction(NULL);
Jim Inghambb3a2832011-01-29 01:49:25 +00003938 break;
3939 }
3940 }
3941
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003942 // See if we should broadcast this state to external clients?
3943 const bool should_broadcast = ShouldBroadcastEvent (event_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003944
3945 if (should_broadcast)
3946 {
3947 if (log)
3948 {
Daniel Malead01b2952012-11-29 21:49:15 +00003949 log->Printf ("Process::%s (pid = %" PRIu64 ") broadcasting new state %s (old state %s) to %s",
Greg Clayton414f5d32011-01-25 02:58:48 +00003950 __FUNCTION__,
3951 GetID(),
3952 StateAsCString(new_state),
3953 StateAsCString (GetState ()),
3954 IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003955 }
Jim Ingham9575d842011-03-11 03:53:59 +00003956 Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get());
Greg Clayton414f5d32011-01-25 02:58:48 +00003957 if (StateIsRunningState (new_state))
Caroline Ticeef5c6d02010-11-16 05:07:41 +00003958 PushProcessInputReader ();
Jim Inghamb78d73f2013-05-15 01:21:48 +00003959 else if (!Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
Caroline Ticeef5c6d02010-11-16 05:07:41 +00003960 PopProcessInputReader ();
Jim Ingham9575d842011-03-11 03:53:59 +00003961
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003962 BroadcastEvent (event_sp);
3963 }
3964 else
3965 {
3966 if (log)
3967 {
Daniel Malead01b2952012-11-29 21:49:15 +00003968 log->Printf ("Process::%s (pid = %" PRIu64 ") suppressing state %s (old state %s): should_broadcast == false",
Greg Clayton414f5d32011-01-25 02:58:48 +00003969 __FUNCTION__,
3970 GetID(),
3971 StateAsCString(new_state),
Jason Molendafd54b362011-09-20 21:44:10 +00003972 StateAsCString (GetState ()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003973 }
3974 }
Jim Inghamaacc3182012-06-06 00:29:30 +00003975 m_currently_handling_event.SetValue(false, eBroadcastAlways);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003976}
3977
3978void *
3979Process::PrivateStateThread (void *arg)
3980{
3981 Process *proc = static_cast<Process*> (arg);
3982 void *result = proc->RunPrivateStateThread ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003983 return result;
3984}
3985
3986void *
3987Process::RunPrivateStateThread ()
3988{
Jim Ingham076b3042012-04-10 01:21:57 +00003989 bool control_only = true;
Jim Inghamb1e2e842012-04-12 18:49:31 +00003990 m_private_state_control_wait.SetValue (false, eBroadcastNever);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003991
Greg Clayton5160ce52013-03-27 23:08:40 +00003992 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003993 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00003994 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") thread starting...", __FUNCTION__, this, GetID());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003995
3996 bool exit_now = false;
3997 while (!exit_now)
3998 {
3999 EventSP event_sp;
4000 WaitForEventsPrivate (NULL, event_sp, control_only);
4001 if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster))
4002 {
Jim Inghamb1e2e842012-04-12 18:49:31 +00004003 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00004004 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType());
Jim Inghamb1e2e842012-04-12 18:49:31 +00004005
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004006 switch (event_sp->GetType())
4007 {
4008 case eBroadcastInternalStateControlStop:
4009 exit_now = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004010 break; // doing any internal state managment below
4011
4012 case eBroadcastInternalStateControlPause:
4013 control_only = true;
4014 break;
4015
4016 case eBroadcastInternalStateControlResume:
4017 control_only = false;
4018 break;
4019 }
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004020
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004021 m_private_state_control_wait.SetValue (true, eBroadcastAlways);
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004022 continue;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004023 }
Jim Inghamcfc09352012-07-27 23:57:19 +00004024 else if (event_sp->GetType() == eBroadcastBitInterrupt)
4025 {
4026 if (m_public_state.GetValue() == eStateAttaching)
4027 {
4028 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00004029 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") woke up with an interrupt while attaching - forwarding interrupt.", __FUNCTION__, this, GetID());
Jim Inghamcfc09352012-07-27 23:57:19 +00004030 BroadcastEvent (eBroadcastBitInterrupt, NULL);
4031 }
4032 else
4033 {
4034 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00004035 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") woke up with an interrupt - Halting.", __FUNCTION__, this, GetID());
Jim Inghamcfc09352012-07-27 23:57:19 +00004036 Halt();
4037 }
4038 continue;
4039 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004040
4041 const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4042
4043 if (internal_state != eStateInvalid)
4044 {
Greg Claytonf9b57b92013-05-10 23:48:10 +00004045 if (m_clear_thread_plans_on_stop &&
4046 StateIsStoppedState(internal_state, true))
4047 {
4048 m_clear_thread_plans_on_stop = false;
4049 m_thread_list.DiscardThreadPlans();
4050 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004051 HandlePrivateEvent (event_sp);
4052 }
4053
Greg Clayton58d1c9a2010-10-18 04:14:23 +00004054 if (internal_state == eStateInvalid ||
4055 internal_state == eStateExited ||
4056 internal_state == eStateDetached )
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004057 {
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004058 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00004059 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state));
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004060
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004061 break;
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004062 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004063 }
4064
Caroline Tice20ad3c42010-10-29 21:48:37 +00004065 // Verify log is still enabled before attempting to write to it...
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004066 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00004067 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") thread exiting...", __FUNCTION__, this, GetID());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004068
Greg Clayton96249852013-04-18 16:57:27 +00004069 m_public_run_lock.WriteUnlock();
Greg Clayton6ed95942011-01-22 07:12:45 +00004070 m_private_state_control_wait.SetValue (true, eBroadcastAlways);
4071 m_private_state_thread = LLDB_INVALID_HOST_THREAD;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004072 return NULL;
4073}
4074
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004075//------------------------------------------------------------------
4076// Process Event Data
4077//------------------------------------------------------------------
4078
4079Process::ProcessEventData::ProcessEventData () :
4080 EventData (),
4081 m_process_sp (),
4082 m_state (eStateInvalid),
Greg Claytonc982c762010-07-09 20:39:50 +00004083 m_restarted (false),
Jim Inghama8604692011-05-22 21:45:01 +00004084 m_update_state (0),
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004085 m_interrupted (false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004086{
4087}
4088
4089Process::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) :
4090 EventData (),
4091 m_process_sp (process_sp),
4092 m_state (state),
Greg Claytonc982c762010-07-09 20:39:50 +00004093 m_restarted (false),
Jim Inghama8604692011-05-22 21:45:01 +00004094 m_update_state (0),
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004095 m_interrupted (false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004096{
4097}
4098
4099Process::ProcessEventData::~ProcessEventData()
4100{
4101}
4102
4103const ConstString &
4104Process::ProcessEventData::GetFlavorString ()
4105{
4106 static ConstString g_flavor ("Process::ProcessEventData");
4107 return g_flavor;
4108}
4109
4110const ConstString &
4111Process::ProcessEventData::GetFlavor () const
4112{
4113 return ProcessEventData::GetFlavorString ();
4114}
4115
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004116void
4117Process::ProcessEventData::DoOnRemoval (Event *event_ptr)
4118{
4119 // This function gets called twice for each event, once when the event gets pulled
Jim Inghama8604692011-05-22 21:45:01 +00004120 // off of the private process event queue, and then any number of times, first when it gets pulled off of
4121 // the public event queue, then other times when we're pretending that this is where we stopped at the
4122 // end of expression evaluation. m_update_state is used to distinguish these
4123 // three cases; it is 0 when we're just pulling it off for private handling,
Jim Ingham221d51c2013-05-08 00:35:16 +00004124 // and > 1 for expression evaluation, and we don't want to do the breakpoint command handling then.
Jim Inghama8604692011-05-22 21:45:01 +00004125 if (m_update_state != 1)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004126 return;
Jim Ingham0161b492013-02-09 01:29:05 +00004127
Jim Ingham221d51c2013-05-08 00:35:16 +00004128 m_process_sp->SetPublicState (m_state, Process::ProcessEventData::GetRestartedFromEvent(event_ptr));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004129
4130 // If we're stopped and haven't restarted, then do the breakpoint commands here:
4131 if (m_state == eStateStopped && ! m_restarted)
Jim Ingham0faa43f2011-11-08 03:00:11 +00004132 {
4133 ThreadList &curr_thread_list = m_process_sp->GetThreadList();
Greg Clayton61e7a582011-12-01 23:28:38 +00004134 uint32_t num_threads = curr_thread_list.GetSize();
4135 uint32_t idx;
Greg Claytonf4b47e12010-08-04 01:40:35 +00004136
Jim Ingham4b536182011-08-09 02:12:22 +00004137 // The actions might change one of the thread's stop_info's opinions about whether we should
4138 // stop the process, so we need to query that as we go.
Jim Ingham0faa43f2011-11-08 03:00:11 +00004139
4140 // One other complication here, is that we try to catch any case where the target has run (except for expressions)
4141 // and immediately exit, but if we get that wrong (which is possible) then the thread list might have changed, and
4142 // that would cause our iteration here to crash. We could make a copy of the thread list, but we'd really like
4143 // to also know if it has changed at all, so we make up a vector of the thread ID's and check what we get back
4144 // against this list & bag out if anything differs.
Greg Clayton61e7a582011-12-01 23:28:38 +00004145 std::vector<uint32_t> thread_index_array(num_threads);
Jim Ingham0faa43f2011-11-08 03:00:11 +00004146 for (idx = 0; idx < num_threads; ++idx)
4147 thread_index_array[idx] = curr_thread_list.GetThreadAtIndex(idx)->GetIndexID();
4148
Jim Inghamc7078c22012-12-13 22:24:15 +00004149 // Use this to track whether we should continue from here. We will only continue the target running if
4150 // no thread says we should stop. Of course if some thread's PerformAction actually sets the target running,
4151 // then it doesn't matter what the other threads say...
4152
4153 bool still_should_stop = false;
Jim Ingham4b536182011-08-09 02:12:22 +00004154
Jim Ingham0ad7e052013-04-25 02:04:59 +00004155 // Sometimes - for instance if we have a bug in the stub we are talking to, we stop but no thread has a
4156 // valid stop reason. In that case we should just stop, because we have no way of telling what the right
4157 // thing to do is, and it's better to let the user decide than continue behind their backs.
4158
4159 bool does_anybody_have_an_opinion = false;
4160
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004161 for (idx = 0; idx < num_threads; ++idx)
4162 {
Jim Ingham0faa43f2011-11-08 03:00:11 +00004163 curr_thread_list = m_process_sp->GetThreadList();
4164 if (curr_thread_list.GetSize() != num_threads)
4165 {
Greg Clayton5160ce52013-03-27 23:08:40 +00004166 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
Jim Ingham87c665f2011-12-01 20:26:15 +00004167 if (log)
Greg Clayton61e7a582011-12-01 23:28:38 +00004168 log->Printf("Number of threads changed from %u to %u while processing event.", num_threads, curr_thread_list.GetSize());
Jim Ingham0faa43f2011-11-08 03:00:11 +00004169 break;
4170 }
4171
4172 lldb::ThreadSP thread_sp = curr_thread_list.GetThreadAtIndex(idx);
4173
4174 if (thread_sp->GetIndexID() != thread_index_array[idx])
4175 {
Greg Clayton5160ce52013-03-27 23:08:40 +00004176 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
Jim Ingham87c665f2011-12-01 20:26:15 +00004177 if (log)
Greg Clayton61e7a582011-12-01 23:28:38 +00004178 log->Printf("The thread at position %u changed from %u to %u while processing event.",
Jim Ingham87c665f2011-12-01 20:26:15 +00004179 idx,
4180 thread_index_array[idx],
4181 thread_sp->GetIndexID());
Jim Ingham0faa43f2011-11-08 03:00:11 +00004182 break;
4183 }
4184
Jim Inghamb15bfc72010-10-20 00:39:53 +00004185 StopInfoSP stop_info_sp = thread_sp->GetStopInfo ();
Jim Ingham5d88a062012-10-16 00:09:33 +00004186 if (stop_info_sp && stop_info_sp->IsValid())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004187 {
Jim Ingham0ad7e052013-04-25 02:04:59 +00004188 does_anybody_have_an_opinion = true;
Jim Ingham0161b492013-02-09 01:29:05 +00004189 bool this_thread_wants_to_stop;
4190 if (stop_info_sp->GetOverrideShouldStop())
Jim Ingham4b536182011-08-09 02:12:22 +00004191 {
Jim Ingham0161b492013-02-09 01:29:05 +00004192 this_thread_wants_to_stop = stop_info_sp->GetOverriddenShouldStopValue();
4193 }
4194 else
4195 {
4196 stop_info_sp->PerformAction(event_ptr);
4197 // The stop action might restart the target. If it does, then we want to mark that in the
4198 // event so that whoever is receiving it will know to wait for the running event and reflect
4199 // that state appropriately.
4200 // We also need to stop processing actions, since they aren't expecting the target to be running.
4201
4202 // FIXME: we might have run.
4203 if (stop_info_sp->HasTargetRunSinceMe())
4204 {
4205 SetRestarted (true);
4206 break;
4207 }
4208
4209 this_thread_wants_to_stop = stop_info_sp->ShouldStop(event_ptr);
Jim Ingham4b536182011-08-09 02:12:22 +00004210 }
Jim Inghamc7078c22012-12-13 22:24:15 +00004211
Jim Inghamc7078c22012-12-13 22:24:15 +00004212 if (still_should_stop == false)
4213 still_should_stop = this_thread_wants_to_stop;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004214 }
4215 }
Jim Ingham3ebcf7f2010-08-10 00:59:59 +00004216
Ashok Thirumurthicf7c55e2013-04-18 14:38:20 +00004217
Jim Inghama8ca6e22013-05-03 23:04:37 +00004218 if (!GetRestarted())
Jim Ingham9575d842011-03-11 03:53:59 +00004219 {
Jim Ingham0ad7e052013-04-25 02:04:59 +00004220 if (!still_should_stop && does_anybody_have_an_opinion)
Jim Ingham4b536182011-08-09 02:12:22 +00004221 {
4222 // We've been asked to continue, so do that here.
Jim Ingham9575d842011-03-11 03:53:59 +00004223 SetRestarted(true);
Jim Ingham3b8285d2012-04-19 01:40:33 +00004224 // Use the public resume method here, since this is just
4225 // extending a public resume.
Jim Ingham0161b492013-02-09 01:29:05 +00004226 m_process_sp->PrivateResume();
Jim Ingham4b536182011-08-09 02:12:22 +00004227 }
4228 else
4229 {
4230 // If we didn't restart, run the Stop Hooks here:
4231 // They might also restart the target, so watch for that.
4232 m_process_sp->GetTarget().RunStopHooks();
4233 if (m_process_sp->GetPrivateState() == eStateRunning)
4234 SetRestarted(true);
4235 }
Jim Ingham9575d842011-03-11 03:53:59 +00004236 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004237 }
4238}
4239
4240void
4241Process::ProcessEventData::Dump (Stream *s) const
4242{
4243 if (m_process_sp)
Daniel Malead01b2952012-11-29 21:49:15 +00004244 s->Printf(" process = %p (pid = %" PRIu64 "), ", m_process_sp.get(), m_process_sp->GetID());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004245
Greg Clayton8b82f082011-04-12 05:54:46 +00004246 s->Printf("state = %s", StateAsCString(GetState()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004247}
4248
4249const Process::ProcessEventData *
4250Process::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr)
4251{
4252 if (event_ptr)
4253 {
4254 const EventData *event_data = event_ptr->GetData();
4255 if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString())
4256 return static_cast <const ProcessEventData *> (event_ptr->GetData());
4257 }
4258 return NULL;
4259}
4260
4261ProcessSP
4262Process::ProcessEventData::GetProcessFromEvent (const Event *event_ptr)
4263{
4264 ProcessSP process_sp;
4265 const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
4266 if (data)
4267 process_sp = data->GetProcessSP();
4268 return process_sp;
4269}
4270
4271StateType
4272Process::ProcessEventData::GetStateFromEvent (const Event *event_ptr)
4273{
4274 const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
4275 if (data == NULL)
4276 return eStateInvalid;
4277 else
4278 return data->GetState();
4279}
4280
4281bool
4282Process::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr)
4283{
4284 const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
4285 if (data == NULL)
4286 return false;
4287 else
4288 return data->GetRestarted();
4289}
4290
4291void
4292Process::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value)
4293{
4294 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4295 if (data != NULL)
4296 data->SetRestarted(new_value);
4297}
4298
Jim Ingham0161b492013-02-09 01:29:05 +00004299size_t
4300Process::ProcessEventData::GetNumRestartedReasons(const Event *event_ptr)
4301{
4302 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4303 if (data != NULL)
4304 return data->GetNumRestartedReasons();
4305 else
4306 return 0;
4307}
4308
4309const char *
4310Process::ProcessEventData::GetRestartedReasonAtIndex(const Event *event_ptr, size_t idx)
4311{
4312 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4313 if (data != NULL)
4314 return data->GetRestartedReasonAtIndex(idx);
4315 else
4316 return NULL;
4317}
4318
4319void
4320Process::ProcessEventData::AddRestartedReason (Event *event_ptr, const char *reason)
4321{
4322 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4323 if (data != NULL)
4324 data->AddRestartedReason(reason);
4325}
4326
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004327bool
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004328Process::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr)
4329{
4330 const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
4331 if (data == NULL)
4332 return false;
4333 else
4334 return data->GetInterrupted ();
4335}
4336
4337void
4338Process::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value)
4339{
4340 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4341 if (data != NULL)
4342 data->SetInterrupted(new_value);
4343}
4344
4345bool
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004346Process::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr)
4347{
4348 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4349 if (data)
4350 {
4351 data->SetUpdateStateOnRemoval();
4352 return true;
4353 }
4354 return false;
4355}
4356
Greg Claytond9e416c2012-02-18 05:35:26 +00004357lldb::TargetSP
4358Process::CalculateTarget ()
4359{
4360 return m_target.shared_from_this();
4361}
4362
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004363void
Greg Clayton0603aa92010-10-04 01:05:56 +00004364Process::CalculateExecutionContext (ExecutionContext &exe_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004365{
Greg Claytonc14ee322011-09-22 04:58:26 +00004366 exe_ctx.SetTargetPtr (&m_target);
4367 exe_ctx.SetProcessPtr (this);
4368 exe_ctx.SetThreadPtr(NULL);
4369 exe_ctx.SetFramePtr (NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004370}
4371
Greg Claytone996fd32011-03-08 22:40:15 +00004372//uint32_t
4373//Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids)
4374//{
4375// return 0;
4376//}
4377//
4378//ArchSpec
4379//Process::GetArchSpecForExistingProcess (lldb::pid_t pid)
4380//{
4381// return Host::GetArchSpecForExistingProcess (pid);
4382//}
4383//
4384//ArchSpec
4385//Process::GetArchSpecForExistingProcess (const char *process_name)
4386//{
4387// return Host::GetArchSpecForExistingProcess (process_name);
4388//}
4389//
Caroline Ticeef5c6d02010-11-16 05:07:41 +00004390void
4391Process::AppendSTDOUT (const char * s, size_t len)
4392{
Greg Clayton3af9ea52010-11-18 05:57:03 +00004393 Mutex::Locker locker (m_stdio_communication_mutex);
Caroline Ticeef5c6d02010-11-16 05:07:41 +00004394 m_stdout_data.append (s, len);
Greg Clayton35a4cc52012-10-29 20:52:08 +00004395 BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (shared_from_this(), GetState()));
Caroline Ticeef5c6d02010-11-16 05:07:41 +00004396}
4397
4398void
Greg Clayton93e86192011-11-13 04:45:22 +00004399Process::AppendSTDERR (const char * s, size_t len)
4400{
4401 Mutex::Locker locker (m_stdio_communication_mutex);
4402 m_stderr_data.append (s, len);
Greg Clayton35a4cc52012-10-29 20:52:08 +00004403 BroadcastEventIfUnique (eBroadcastBitSTDERR, new ProcessEventData (shared_from_this(), GetState()));
Greg Clayton93e86192011-11-13 04:45:22 +00004404}
4405
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004406void
4407Process::BroadcastAsyncProfileData(const char *s, size_t len)
4408{
4409 Mutex::Locker locker (m_profile_data_comm_mutex);
Han Ming Ong929a94f2012-11-29 22:14:45 +00004410 m_profile_data.push_back(s);
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004411 BroadcastEventIfUnique (eBroadcastBitProfileData, new ProcessEventData (shared_from_this(), GetState()));
4412}
4413
4414size_t
4415Process::GetAsyncProfileData (char *buf, size_t buf_size, Error &error)
4416{
4417 Mutex::Locker locker(m_profile_data_comm_mutex);
Han Ming Ong929a94f2012-11-29 22:14:45 +00004418 if (m_profile_data.empty())
4419 return 0;
4420
4421 size_t bytes_available = m_profile_data.front().size();
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004422 if (bytes_available > 0)
4423 {
Greg Clayton5160ce52013-03-27 23:08:40 +00004424 Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004425 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00004426 log->Printf ("Process::GetProfileData (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size);
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004427 if (bytes_available > buf_size)
4428 {
Han Ming Ong929a94f2012-11-29 22:14:45 +00004429 memcpy(buf, m_profile_data.front().data(), buf_size);
4430 m_profile_data.front().erase(0, buf_size);
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004431 bytes_available = buf_size;
4432 }
4433 else
4434 {
Han Ming Ong929a94f2012-11-29 22:14:45 +00004435 memcpy(buf, m_profile_data.front().data(), bytes_available);
4436 m_profile_data.erase(m_profile_data.begin());
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004437 }
4438 }
4439 return bytes_available;
4440}
4441
4442
Greg Clayton93e86192011-11-13 04:45:22 +00004443//------------------------------------------------------------------
4444// Process STDIO
4445//------------------------------------------------------------------
4446
4447size_t
4448Process::GetSTDOUT (char *buf, size_t buf_size, Error &error)
4449{
4450 Mutex::Locker locker(m_stdio_communication_mutex);
4451 size_t bytes_available = m_stdout_data.size();
4452 if (bytes_available > 0)
4453 {
Greg Clayton5160ce52013-03-27 23:08:40 +00004454 Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Greg Clayton93e86192011-11-13 04:45:22 +00004455 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00004456 log->Printf ("Process::GetSTDOUT (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size);
Greg Clayton93e86192011-11-13 04:45:22 +00004457 if (bytes_available > buf_size)
4458 {
4459 memcpy(buf, m_stdout_data.c_str(), buf_size);
4460 m_stdout_data.erase(0, buf_size);
4461 bytes_available = buf_size;
4462 }
4463 else
4464 {
4465 memcpy(buf, m_stdout_data.c_str(), bytes_available);
4466 m_stdout_data.clear();
4467 }
4468 }
4469 return bytes_available;
4470}
4471
4472
4473size_t
4474Process::GetSTDERR (char *buf, size_t buf_size, Error &error)
4475{
4476 Mutex::Locker locker(m_stdio_communication_mutex);
4477 size_t bytes_available = m_stderr_data.size();
4478 if (bytes_available > 0)
4479 {
Greg Clayton5160ce52013-03-27 23:08:40 +00004480 Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Greg Clayton93e86192011-11-13 04:45:22 +00004481 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00004482 log->Printf ("Process::GetSTDERR (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size);
Greg Clayton93e86192011-11-13 04:45:22 +00004483 if (bytes_available > buf_size)
4484 {
4485 memcpy(buf, m_stderr_data.c_str(), buf_size);
4486 m_stderr_data.erase(0, buf_size);
4487 bytes_available = buf_size;
4488 }
4489 else
4490 {
4491 memcpy(buf, m_stderr_data.c_str(), bytes_available);
4492 m_stderr_data.clear();
4493 }
4494 }
4495 return bytes_available;
4496}
4497
4498void
Caroline Ticeef5c6d02010-11-16 05:07:41 +00004499Process::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len)
4500{
4501 Process *process = (Process *) baton;
4502 process->AppendSTDOUT (static_cast<const char *>(src), src_len);
4503}
4504
4505size_t
4506Process::ProcessInputReaderCallback (void *baton,
4507 InputReader &reader,
4508 lldb::InputReaderAction notification,
4509 const char *bytes,
4510 size_t bytes_len)
4511{
4512 Process *process = (Process *) baton;
4513
4514 switch (notification)
4515 {
4516 case eInputReaderActivate:
4517 break;
4518
4519 case eInputReaderDeactivate:
4520 break;
4521
4522 case eInputReaderReactivate:
4523 break;
4524
Caroline Tice969ed3d2011-05-02 20:41:46 +00004525 case eInputReaderAsynchronousOutputWritten:
4526 break;
4527
Caroline Ticeef5c6d02010-11-16 05:07:41 +00004528 case eInputReaderGotToken:
4529 {
4530 Error error;
4531 process->PutSTDIN (bytes, bytes_len, error);
4532 }
4533 break;
4534
Caroline Ticeefed6132010-11-19 20:47:54 +00004535 case eInputReaderInterrupt:
4536 process->Halt ();
4537 break;
4538
4539 case eInputReaderEndOfFile:
4540 process->AppendSTDOUT ("^D", 2);
4541 break;
4542
Caroline Ticeef5c6d02010-11-16 05:07:41 +00004543 case eInputReaderDone:
4544 break;
4545
4546 }
4547
4548 return bytes_len;
4549}
4550
4551void
4552Process::ResetProcessInputReader ()
4553{
4554 m_process_input_reader.reset();
4555}
4556
4557void
Greg Claytonee95ed52011-11-17 22:14:31 +00004558Process::SetSTDIOFileDescriptor (int file_descriptor)
Caroline Ticeef5c6d02010-11-16 05:07:41 +00004559{
4560 // First set up the Read Thread for reading/handling process I/O
4561
Greg Clayton7b0992d2013-04-18 22:45:39 +00004562 std::unique_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true));
Caroline Ticeef5c6d02010-11-16 05:07:41 +00004563
4564 if (conn_ap.get())
4565 {
4566 m_stdio_communication.SetConnection (conn_ap.release());
4567 if (m_stdio_communication.IsConnected())
4568 {
4569 m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this);
4570 m_stdio_communication.StartReadThread();
4571
4572 // Now read thread is set up, set up input reader.
4573
4574 if (!m_process_input_reader.get())
4575 {
4576 m_process_input_reader.reset (new InputReader(m_target.GetDebugger()));
4577 Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback,
4578 this,
4579 eInputReaderGranularityByte,
4580 NULL,
4581 NULL,
4582 false));
4583
4584 if (err.Fail())
4585 m_process_input_reader.reset();
4586 }
4587 }
4588 }
4589}
4590
4591void
4592Process::PushProcessInputReader ()
4593{
4594 if (m_process_input_reader && !m_process_input_reader->IsActive())
4595 m_target.GetDebugger().PushInputReader (m_process_input_reader);
4596}
4597
4598void
4599Process::PopProcessInputReader ()
4600{
4601 if (m_process_input_reader && m_process_input_reader->IsActive())
4602 m_target.GetDebugger().PopInputReader (m_process_input_reader);
4603}
4604
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00004605// The process needs to know about installed plug-ins
Greg Clayton99d0faf2010-11-18 23:32:35 +00004606void
Caroline Tice20bd37f2011-03-10 22:14:10 +00004607Process::SettingsInitialize ()
Caroline Tice3df9a8d2010-09-04 00:03:46 +00004608{
Greg Clayton67cc0632012-08-22 17:17:09 +00004609// static std::vector<OptionEnumValueElement> g_plugins;
4610//
4611// int i=0;
4612// const char *name;
4613// OptionEnumValueElement option_enum;
4614// while ((name = PluginManager::GetProcessPluginNameAtIndex (i)) != NULL)
4615// {
4616// if (name)
4617// {
4618// option_enum.value = i;
4619// option_enum.string_value = name;
4620// option_enum.usage = PluginManager::GetProcessPluginDescriptionAtIndex (i);
4621// g_plugins.push_back (option_enum);
4622// }
4623// ++i;
4624// }
4625// option_enum.value = 0;
4626// option_enum.string_value = NULL;
4627// option_enum.usage = NULL;
4628// g_plugins.push_back (option_enum);
4629//
4630// for (i=0; (name = SettingsController::instance_settings_table[i].var_name); ++i)
4631// {
4632// if (::strcmp (name, "plugin") == 0)
4633// {
4634// SettingsController::instance_settings_table[i].enum_values = &g_plugins[0];
4635// break;
4636// }
4637// }
Greg Clayton67cc0632012-08-22 17:17:09 +00004638//
Greg Clayton6920b522012-08-22 18:39:03 +00004639 Thread::SettingsInitialize ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00004640}
Caroline Tice3df9a8d2010-09-04 00:03:46 +00004641
Greg Clayton99d0faf2010-11-18 23:32:35 +00004642void
Caroline Tice20bd37f2011-03-10 22:14:10 +00004643Process::SettingsTerminate ()
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00004644{
Greg Clayton6920b522012-08-22 18:39:03 +00004645 Thread::SettingsTerminate ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00004646}
Caroline Tice3df9a8d2010-09-04 00:03:46 +00004647
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00004648ExecutionResults
Jim Inghamf48169b2010-11-30 02:22:11 +00004649Process::RunThreadPlan (ExecutionContext &exe_ctx,
Jim Ingham372787f2012-04-07 00:00:41 +00004650 lldb::ThreadPlanSP &thread_plan_sp,
Jim Inghamf48169b2010-11-30 02:22:11 +00004651 bool stop_others,
Jim Ingham35e1bda2012-10-16 21:41:58 +00004652 bool run_others,
Jim Ingham184e9812013-01-15 02:47:48 +00004653 bool unwind_on_error,
4654 bool ignore_breakpoints,
Jim Ingham35e1bda2012-10-16 21:41:58 +00004655 uint32_t timeout_usec,
Jim Inghamf48169b2010-11-30 02:22:11 +00004656 Stream &errors)
4657{
4658 ExecutionResults return_value = eExecutionSetupError;
4659
Jim Ingham77787032011-01-20 02:03:18 +00004660 if (thread_plan_sp.get() == NULL)
4661 {
4662 errors.Printf("RunThreadPlan called with empty thread plan.");
Greg Claytone0d378b2011-03-24 21:19:54 +00004663 return eExecutionSetupError;
Jim Ingham77787032011-01-20 02:03:18 +00004664 }
Jim Ingham7d7931d2013-03-28 00:05:34 +00004665
4666 if (!thread_plan_sp->ValidatePlan(NULL))
4667 {
4668 errors.Printf ("RunThreadPlan called with an invalid thread plan.");
4669 return eExecutionSetupError;
4670 }
4671
Greg Claytonc14ee322011-09-22 04:58:26 +00004672 if (exe_ctx.GetProcessPtr() != this)
4673 {
4674 errors.Printf("RunThreadPlan called on wrong process.");
4675 return eExecutionSetupError;
4676 }
4677
4678 Thread *thread = exe_ctx.GetThreadPtr();
4679 if (thread == NULL)
4680 {
4681 errors.Printf("RunThreadPlan called with invalid thread.");
4682 return eExecutionSetupError;
4683 }
Jim Ingham77787032011-01-20 02:03:18 +00004684
Jim Ingham17e5c4e2011-05-17 22:24:54 +00004685 // We rely on the thread plan we are running returning "PlanCompleted" if when it successfully completes.
4686 // For that to be true the plan can't be private - since private plans suppress themselves in the
4687 // GetCompletedPlan call.
4688
4689 bool orig_plan_private = thread_plan_sp->GetPrivate();
4690 thread_plan_sp->SetPrivate(false);
4691
Jim Ingham444586b2011-01-24 06:34:17 +00004692 if (m_private_state.GetValue() != eStateStopped)
4693 {
4694 errors.Printf ("RunThreadPlan called while the private state was not stopped.");
Greg Claytone0d378b2011-03-24 21:19:54 +00004695 return eExecutionSetupError;
Jim Ingham444586b2011-01-24 06:34:17 +00004696 }
4697
Jim Ingham66243842011-08-13 00:56:10 +00004698 // Save the thread & frame from the exe_ctx for restoration after we run
Greg Claytonc14ee322011-09-22 04:58:26 +00004699 const uint32_t thread_idx_id = thread->GetIndexID();
Jim Ingham11b0e052013-02-19 23:22:45 +00004700 StackFrameSP selected_frame_sp = thread->GetSelectedFrame();
4701 if (!selected_frame_sp)
4702 {
4703 thread->SetSelectedFrame(0);
4704 selected_frame_sp = thread->GetSelectedFrame();
4705 if (!selected_frame_sp)
4706 {
4707 errors.Printf("RunThreadPlan called without a selected frame on thread %d", thread_idx_id);
4708 return eExecutionSetupError;
4709 }
4710 }
4711
4712 StackID ctx_frame_id = selected_frame_sp->GetStackID();
Jim Inghamf48169b2010-11-30 02:22:11 +00004713
4714 // N.B. Running the target may unset the currently selected thread and frame. We don't want to do that either,
4715 // so we should arrange to reset them as well.
4716
Greg Claytonc14ee322011-09-22 04:58:26 +00004717 lldb::ThreadSP selected_thread_sp = GetThreadList().GetSelectedThread();
Jim Inghamf48169b2010-11-30 02:22:11 +00004718
Jim Ingham66243842011-08-13 00:56:10 +00004719 uint32_t selected_tid;
4720 StackID selected_stack_id;
Greg Clayton762f7132011-09-18 18:59:15 +00004721 if (selected_thread_sp)
Jim Inghamf48169b2010-11-30 02:22:11 +00004722 {
4723 selected_tid = selected_thread_sp->GetIndexID();
Jim Ingham66243842011-08-13 00:56:10 +00004724 selected_stack_id = selected_thread_sp->GetSelectedFrame()->GetStackID();
Jim Inghamf48169b2010-11-30 02:22:11 +00004725 }
4726 else
4727 {
4728 selected_tid = LLDB_INVALID_THREAD_ID;
4729 }
4730
Jim Ingham372787f2012-04-07 00:00:41 +00004731 lldb::thread_t backup_private_state_thread = LLDB_INVALID_HOST_THREAD;
Jim Ingham076b3042012-04-10 01:21:57 +00004732 lldb::StateType old_state;
4733 lldb::ThreadPlanSP stopper_base_plan_sp;
Jim Ingham372787f2012-04-07 00:00:41 +00004734
Greg Clayton5160ce52013-03-27 23:08:40 +00004735 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
Jim Ingham372787f2012-04-07 00:00:41 +00004736 if (Host::GetCurrentThread() == m_private_state_thread)
4737 {
Jim Ingham076b3042012-04-10 01:21:57 +00004738 // Yikes, we are running on the private state thread! So we can't wait for public events on this thread, since
4739 // we are the thread that is generating public events.
Jim Ingham372787f2012-04-07 00:00:41 +00004740 // The simplest thing to do is to spin up a temporary thread to handle private state thread events while
Jim Ingham076b3042012-04-10 01:21:57 +00004741 // we are fielding public events here.
4742 if (log)
Jason Molendad251c9d2012-11-17 01:41:04 +00004743 log->Printf ("Running thread plan on private state thread, spinning up another state thread to handle the events.");
Jim Ingham076b3042012-04-10 01:21:57 +00004744
4745
Jim Ingham372787f2012-04-07 00:00:41 +00004746 backup_private_state_thread = m_private_state_thread;
Jim Ingham076b3042012-04-10 01:21:57 +00004747
4748 // One other bit of business: we want to run just this thread plan and anything it pushes, and then stop,
4749 // returning control here.
4750 // But in the normal course of things, the plan above us on the stack would be given a shot at the stop
4751 // event before deciding to stop, and we don't want that. So we insert a "stopper" base plan on the stack
4752 // before the plan we want to run. Since base plans always stop and return control to the user, that will
4753 // do just what we want.
4754 stopper_base_plan_sp.reset(new ThreadPlanBase (*thread));
4755 thread->QueueThreadPlan (stopper_base_plan_sp, false);
4756 // Have to make sure our public state is stopped, since otherwise the reporting logic below doesn't work correctly.
4757 old_state = m_public_state.GetValue();
4758 m_public_state.SetValueNoLock(eStateStopped);
4759
4760 // Now spin up the private state thread:
Jim Ingham372787f2012-04-07 00:00:41 +00004761 StartPrivateStateThread(true);
4762 }
4763
4764 thread->QueueThreadPlan(thread_plan_sp, false); // This used to pass "true" does that make sense?
Jim Inghamf48169b2010-11-30 02:22:11 +00004765
Jim Ingham1e7a9ee2011-01-23 21:14:08 +00004766 Listener listener("lldb.process.listener.run-thread-plan");
Jim Ingham0f16e732011-02-08 05:20:59 +00004767
Sean Callanana46ec452012-07-11 21:31:24 +00004768 lldb::EventSP event_to_broadcast_sp;
Jim Ingham0f16e732011-02-08 05:20:59 +00004769
Jim Ingham77787032011-01-20 02:03:18 +00004770 {
Sean Callanana46ec452012-07-11 21:31:24 +00004771 // This process event hijacker Hijacks the Public events and its destructor makes sure that the process events get
4772 // restored on exit to the function.
4773 //
4774 // If the event needs to propagate beyond the hijacker (e.g., the process exits during execution), then the event
4775 // is put into event_to_broadcast_sp for rebroadcasting.
Jim Inghamf48169b2010-11-30 02:22:11 +00004776
Sean Callanana46ec452012-07-11 21:31:24 +00004777 ProcessEventHijacker run_thread_plan_hijacker (*this, &listener);
Jim Ingham0f16e732011-02-08 05:20:59 +00004778
Jim Inghamf48169b2010-11-30 02:22:11 +00004779 if (log)
Jim Ingham0f16e732011-02-08 05:20:59 +00004780 {
4781 StreamString s;
Sean Callanana46ec452012-07-11 21:31:24 +00004782 thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
Daniel Malead01b2952012-11-29 21:49:15 +00004783 log->Printf ("Process::RunThreadPlan(): Resuming thread %u - 0x%4.4" PRIx64 " to run thread plan \"%s\".",
Sean Callanana46ec452012-07-11 21:31:24 +00004784 thread->GetIndexID(),
4785 thread->GetID(),
4786 s.GetData());
4787 }
4788
4789 bool got_event;
4790 lldb::EventSP event_sp;
4791 lldb::StateType stop_state = lldb::eStateInvalid;
4792
4793 TimeValue* timeout_ptr = NULL;
4794 TimeValue real_timeout;
4795
Jim Ingham0161b492013-02-09 01:29:05 +00004796 bool before_first_timeout = true; // This is set to false the first time that we have to halt the target.
Sean Callanana46ec452012-07-11 21:31:24 +00004797 bool do_resume = true;
Jim Ingham184e9812013-01-15 02:47:48 +00004798 bool handle_running_event = true;
Jim Ingham35e1bda2012-10-16 21:41:58 +00004799 const uint64_t default_one_thread_timeout_usec = 250000;
Sean Callanana46ec452012-07-11 21:31:24 +00004800
Jim Ingham0161b492013-02-09 01:29:05 +00004801 // This is just for accounting:
4802 uint32_t num_resumes = 0;
4803
4804 TimeValue one_thread_timeout = TimeValue::Now();
4805 TimeValue final_timeout = one_thread_timeout;
4806
4807 if (run_others)
4808 {
4809 // If we are running all threads then we take half the time to run all threads, bounded by
4810 // .25 sec.
4811 if (timeout_usec == 0)
4812 one_thread_timeout.OffsetWithMicroSeconds(default_one_thread_timeout_usec);
4813 else
4814 {
Greg Clayton03da4cc2013-04-19 21:31:16 +00004815 uint64_t computed_timeout = timeout_usec / 2;
Jim Ingham0161b492013-02-09 01:29:05 +00004816 if (computed_timeout > default_one_thread_timeout_usec)
4817 computed_timeout = default_one_thread_timeout_usec;
4818 one_thread_timeout.OffsetWithMicroSeconds(computed_timeout);
4819 }
4820 final_timeout.OffsetWithMicroSeconds (timeout_usec);
4821 }
4822 else
4823 {
4824 if (timeout_usec != 0)
4825 final_timeout.OffsetWithMicroSeconds(timeout_usec);
4826 }
4827
Jim Ingham8559a352012-11-26 23:52:18 +00004828 // This while loop must exit out the bottom, there's cleanup that we need to do when we are done.
4829 // So don't call return anywhere within it.
4830
Sean Callanana46ec452012-07-11 21:31:24 +00004831 while (1)
4832 {
4833 // We usually want to resume the process if we get to the top of the loop.
4834 // The only exception is if we get two running events with no intervening
4835 // stop, which can happen, we will just wait for then next stop event.
Jim Ingham0161b492013-02-09 01:29:05 +00004836 if (log)
4837 log->Printf ("Top of while loop: do_resume: %i handle_running_event: %i before_first_timeout: %i.",
4838 do_resume,
4839 handle_running_event,
4840 before_first_timeout);
Sean Callanana46ec452012-07-11 21:31:24 +00004841
Jim Ingham184e9812013-01-15 02:47:48 +00004842 if (do_resume || handle_running_event)
Sean Callanana46ec452012-07-11 21:31:24 +00004843 {
4844 // Do the initial resume and wait for the running event before going further.
4845
Jim Ingham184e9812013-01-15 02:47:48 +00004846 if (do_resume)
Sean Callanana46ec452012-07-11 21:31:24 +00004847 {
Jim Ingham0161b492013-02-09 01:29:05 +00004848 num_resumes++;
Jim Ingham184e9812013-01-15 02:47:48 +00004849 Error resume_error = PrivateResume ();
4850 if (!resume_error.Success())
4851 {
Jim Ingham0161b492013-02-09 01:29:05 +00004852 errors.Printf("Error resuming inferior the %d time: \"%s\".\n",
4853 num_resumes,
4854 resume_error.AsCString());
Jim Ingham184e9812013-01-15 02:47:48 +00004855 return_value = eExecutionSetupError;
4856 break;
4857 }
Sean Callanana46ec452012-07-11 21:31:24 +00004858 }
Sean Callanana46ec452012-07-11 21:31:24 +00004859
Jim Ingham0161b492013-02-09 01:29:05 +00004860 TimeValue resume_timeout = TimeValue::Now();
4861 resume_timeout.OffsetWithMicroSeconds(500000);
4862
4863 got_event = listener.WaitForEvent(&resume_timeout, event_sp);
Sean Callanana46ec452012-07-11 21:31:24 +00004864 if (!got_event)
4865 {
4866 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00004867 log->Printf ("Process::RunThreadPlan(): didn't get any event after resume %d, exiting.",
4868 num_resumes);
Sean Callanana46ec452012-07-11 21:31:24 +00004869
Jim Ingham0161b492013-02-09 01:29:05 +00004870 errors.Printf("Didn't get any event after resume %d, exiting.", num_resumes);
Sean Callanana46ec452012-07-11 21:31:24 +00004871 return_value = eExecutionSetupError;
4872 break;
4873 }
4874
4875 stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
Jim Ingham0161b492013-02-09 01:29:05 +00004876
Sean Callanana46ec452012-07-11 21:31:24 +00004877 if (stop_state != eStateRunning)
4878 {
Jim Ingham0161b492013-02-09 01:29:05 +00004879 bool restarted = false;
4880
4881 if (stop_state == eStateStopped)
4882 {
4883 restarted = Process::ProcessEventData::GetRestartedFromEvent(event_sp.get());
4884 if (log)
4885 log->Printf("Process::RunThreadPlan(): didn't get running event after "
4886 "resume %d, got %s instead (restarted: %i, do_resume: %i, handle_running_event: %i).",
4887 num_resumes,
4888 StateAsCString(stop_state),
4889 restarted,
4890 do_resume,
4891 handle_running_event);
4892 }
4893
4894 if (restarted)
4895 {
4896 // This is probably an overabundance of caution, I don't think I should ever get a stopped & restarted
4897 // event here. But if I do, the best thing is to Halt and then get out of here.
4898 Halt();
4899 }
4900
Jim Ingham35e1bda2012-10-16 21:41:58 +00004901 errors.Printf("Didn't get running event after initial resume, got %s instead.",
4902 StateAsCString(stop_state));
Sean Callanana46ec452012-07-11 21:31:24 +00004903 return_value = eExecutionSetupError;
4904 break;
4905 }
4906
4907 if (log)
4908 log->PutCString ("Process::RunThreadPlan(): resuming succeeded.");
4909 // We need to call the function synchronously, so spin waiting for it to return.
4910 // If we get interrupted while executing, we're going to lose our context, and
4911 // won't be able to gather the result at this point.
4912 // We set the timeout AFTER the resume, since the resume takes some time and we
4913 // don't want to charge that to the timeout.
Sean Callanana46ec452012-07-11 21:31:24 +00004914 }
Jim Ingham0f16e732011-02-08 05:20:59 +00004915 else
4916 {
Sean Callanana46ec452012-07-11 21:31:24 +00004917 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00004918 log->PutCString ("Process::RunThreadPlan(): waiting for next event.");
Jim Ingham0f16e732011-02-08 05:20:59 +00004919 }
Jim Ingham0161b492013-02-09 01:29:05 +00004920
4921 if (before_first_timeout)
4922 {
4923 if (run_others)
4924 timeout_ptr = &one_thread_timeout;
4925 else
4926 {
4927 if (timeout_usec == 0)
4928 timeout_ptr = NULL;
4929 else
4930 timeout_ptr = &final_timeout;
4931 }
4932 }
4933 else
4934 {
4935 if (timeout_usec == 0)
4936 timeout_ptr = NULL;
4937 else
4938 timeout_ptr = &final_timeout;
4939 }
4940
4941 do_resume = true;
4942 handle_running_event = true;
Jim Ingham0f16e732011-02-08 05:20:59 +00004943
Sean Callanana46ec452012-07-11 21:31:24 +00004944 // Now wait for the process to stop again:
Sean Callanana46ec452012-07-11 21:31:24 +00004945 event_sp.reset();
Jim Ingham0f16e732011-02-08 05:20:59 +00004946
Jim Ingham0f16e732011-02-08 05:20:59 +00004947 if (log)
Jim Ingham20829ac2011-08-09 22:24:33 +00004948 {
Sean Callanana46ec452012-07-11 21:31:24 +00004949 if (timeout_ptr)
4950 {
Matt Kopec676a4872013-02-21 23:55:31 +00004951 log->Printf ("Process::RunThreadPlan(): about to wait - now is %" PRIu64 " - endpoint is %" PRIu64,
Jim Ingham0161b492013-02-09 01:29:05 +00004952 TimeValue::Now().GetAsMicroSecondsSinceJan1_1970(),
4953 timeout_ptr->GetAsMicroSecondsSinceJan1_1970());
Sean Callanana46ec452012-07-11 21:31:24 +00004954 }
Jim Ingham20829ac2011-08-09 22:24:33 +00004955 else
Sean Callanana46ec452012-07-11 21:31:24 +00004956 {
4957 log->Printf ("Process::RunThreadPlan(): about to wait forever.");
4958 }
4959 }
4960
4961 got_event = listener.WaitForEvent (timeout_ptr, event_sp);
4962
4963 if (got_event)
4964 {
4965 if (event_sp.get())
4966 {
4967 bool keep_going = false;
Jim Inghamcfc09352012-07-27 23:57:19 +00004968 if (event_sp->GetType() == eBroadcastBitInterrupt)
Sean Callanana46ec452012-07-11 21:31:24 +00004969 {
Jim Inghamcfc09352012-07-27 23:57:19 +00004970 Halt();
Jim Inghamcfc09352012-07-27 23:57:19 +00004971 return_value = eExecutionInterrupted;
4972 errors.Printf ("Execution halted by user interrupt.");
4973 if (log)
4974 log->Printf ("Process::RunThreadPlan(): Got interrupted by eBroadcastBitInterrupted, exiting.");
Jim Ingham0161b492013-02-09 01:29:05 +00004975 break;
Jim Inghamcfc09352012-07-27 23:57:19 +00004976 }
4977 else
4978 {
4979 stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4980 if (log)
4981 log->Printf("Process::RunThreadPlan(): in while loop, got event: %s.", StateAsCString(stop_state));
4982
4983 switch (stop_state)
Sean Callanana46ec452012-07-11 21:31:24 +00004984 {
Jim Inghamcfc09352012-07-27 23:57:19 +00004985 case lldb::eStateStopped:
Sean Callanana46ec452012-07-11 21:31:24 +00004986 {
Jim Ingham0161b492013-02-09 01:29:05 +00004987 // We stopped, figure out what we are going to do now.
Jim Inghamcfc09352012-07-27 23:57:19 +00004988 ThreadSP thread_sp = GetThreadList().FindThreadByIndexID (thread_idx_id);
4989 if (!thread_sp)
Sean Callanana46ec452012-07-11 21:31:24 +00004990 {
Jim Inghamcfc09352012-07-27 23:57:19 +00004991 // Ooh, our thread has vanished. Unlikely that this was successful execution...
Sean Callanana46ec452012-07-11 21:31:24 +00004992 if (log)
Jim Inghamcfc09352012-07-27 23:57:19 +00004993 log->Printf ("Process::RunThreadPlan(): execution completed but our thread (index-id=%u) has vanished.", thread_idx_id);
4994 return_value = eExecutionInterrupted;
Sean Callanana46ec452012-07-11 21:31:24 +00004995 }
4996 else
4997 {
Jim Ingham0161b492013-02-09 01:29:05 +00004998 // If we were restarted, we just need to go back up to fetch another event.
4999 if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
Jim Inghamcfc09352012-07-27 23:57:19 +00005000 {
5001 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00005002 {
5003 log->Printf ("Process::RunThreadPlan(): Got a stop and restart, so we'll continue waiting.");
5004 }
5005 keep_going = true;
5006 do_resume = false;
5007 handle_running_event = true;
5008
Jim Inghamcfc09352012-07-27 23:57:19 +00005009 }
5010 else
5011 {
Jim Ingham0161b492013-02-09 01:29:05 +00005012
5013 StopInfoSP stop_info_sp (thread_sp->GetStopInfo ());
5014 StopReason stop_reason = eStopReasonInvalid;
5015 if (stop_info_sp)
5016 stop_reason = stop_info_sp->GetStopReason();
5017
5018
5019 // FIXME: We only check if the stop reason is plan complete, should we make sure that
5020 // it is OUR plan that is complete?
5021 if (stop_reason == eStopReasonPlanComplete)
Jim Ingham184e9812013-01-15 02:47:48 +00005022 {
5023 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00005024 log->PutCString ("Process::RunThreadPlan(): execution completed successfully.");
5025 // Now mark this plan as private so it doesn't get reported as the stop reason
5026 // after this point.
5027 if (thread_plan_sp)
5028 thread_plan_sp->SetPrivate (orig_plan_private);
5029 return_value = eExecutionCompleted;
Jim Ingham184e9812013-01-15 02:47:48 +00005030 }
5031 else
5032 {
Jim Ingham0161b492013-02-09 01:29:05 +00005033 // Something restarted the target, so just wait for it to stop for real.
Jim Ingham184e9812013-01-15 02:47:48 +00005034 if (stop_reason == eStopReasonBreakpoint)
Jim Ingham0161b492013-02-09 01:29:05 +00005035 {
5036 if (log)
5037 log->Printf ("Process::RunThreadPlan() stopped for breakpoint: %s.", stop_info_sp->GetDescription());
Jim Ingham184e9812013-01-15 02:47:48 +00005038 return_value = eExecutionHitBreakpoint;
Jim Ingham0161b492013-02-09 01:29:05 +00005039 }
Jim Ingham184e9812013-01-15 02:47:48 +00005040 else
Jim Ingham0161b492013-02-09 01:29:05 +00005041 {
5042 if (log)
5043 log->PutCString ("Process::RunThreadPlan(): thread plan didn't successfully complete.");
Jim Ingham184e9812013-01-15 02:47:48 +00005044 return_value = eExecutionInterrupted;
Jim Ingham0161b492013-02-09 01:29:05 +00005045 }
Jim Ingham184e9812013-01-15 02:47:48 +00005046 }
Jim Inghamcfc09352012-07-27 23:57:19 +00005047 }
Sean Callanana46ec452012-07-11 21:31:24 +00005048 }
Jim Inghamcfc09352012-07-27 23:57:19 +00005049 }
5050 break;
Sean Callanana46ec452012-07-11 21:31:24 +00005051
Jim Inghamcfc09352012-07-27 23:57:19 +00005052 case lldb::eStateRunning:
Jim Ingham0161b492013-02-09 01:29:05 +00005053 // This shouldn't really happen, but sometimes we do get two running events without an
5054 // intervening stop, and in that case we should just go back to waiting for the stop.
Jim Inghamcfc09352012-07-27 23:57:19 +00005055 do_resume = false;
5056 keep_going = true;
Jim Ingham184e9812013-01-15 02:47:48 +00005057 handle_running_event = false;
Jim Inghamcfc09352012-07-27 23:57:19 +00005058 break;
Sean Callanana46ec452012-07-11 21:31:24 +00005059
Jim Inghamcfc09352012-07-27 23:57:19 +00005060 default:
5061 if (log)
5062 log->Printf("Process::RunThreadPlan(): execution stopped with unexpected state: %s.", StateAsCString(stop_state));
5063
5064 if (stop_state == eStateExited)
5065 event_to_broadcast_sp = event_sp;
5066
Sean Callananbf154da2012-08-08 17:35:10 +00005067 errors.Printf ("Execution stopped with unexpected state.\n");
Jim Inghamcfc09352012-07-27 23:57:19 +00005068 return_value = eExecutionInterrupted;
5069 break;
5070 }
Sean Callanana46ec452012-07-11 21:31:24 +00005071 }
Jim Inghamcfc09352012-07-27 23:57:19 +00005072
Sean Callanana46ec452012-07-11 21:31:24 +00005073 if (keep_going)
5074 continue;
5075 else
5076 break;
5077 }
5078 else
5079 {
5080 if (log)
5081 log->PutCString ("Process::RunThreadPlan(): got_event was true, but the event pointer was null. How odd...");
5082 return_value = eExecutionInterrupted;
5083 break;
5084 }
5085 }
5086 else
5087 {
5088 // If we didn't get an event that means we've timed out...
5089 // We will interrupt the process here. Depending on what we were asked to do we will
5090 // either exit, or try with all threads running for the same timeout.
Sean Callanana46ec452012-07-11 21:31:24 +00005091
5092 if (log) {
Jim Ingham35e1bda2012-10-16 21:41:58 +00005093 if (run_others)
Sean Callanana46ec452012-07-11 21:31:24 +00005094 {
Jim Ingham0161b492013-02-09 01:29:05 +00005095 uint64_t remaining_time = final_timeout - TimeValue::Now();
5096 if (before_first_timeout)
5097 log->Printf ("Process::RunThreadPlan(): Running function with one thread timeout timed out, "
5098 "running till for %" PRId64 " usec with all threads enabled.",
5099 remaining_time);
Sean Callanana46ec452012-07-11 21:31:24 +00005100 else
5101 log->Printf ("Process::RunThreadPlan(): Restarting function with all threads enabled "
Jim Ingham35e1bda2012-10-16 21:41:58 +00005102 "and timeout: %d timed out, abandoning execution.",
5103 timeout_usec);
Sean Callanana46ec452012-07-11 21:31:24 +00005104 }
5105 else
5106 log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, "
Jim Ingham35e1bda2012-10-16 21:41:58 +00005107 "abandoning execution.",
5108 timeout_usec);
Sean Callanana46ec452012-07-11 21:31:24 +00005109 }
5110
Jim Ingham0161b492013-02-09 01:29:05 +00005111 // It is possible that between the time we issued the Halt, and we get around to calling Halt the target
5112 // could have stopped. That's fine, Halt will figure that out and send the appropriate Stopped event.
5113 // BUT it is also possible that we stopped & restarted (e.g. hit a signal with "stop" set to false.) In
5114 // that case, we'll get the stopped & restarted event, and we should go back to waiting for the Halt's
5115 // stopped event. That's what this while loop does.
5116
5117 bool back_to_top = true;
5118 uint32_t try_halt_again = 0;
5119 bool do_halt = true;
5120 const uint32_t num_retries = 5;
5121 while (try_halt_again < num_retries)
Sean Callanana46ec452012-07-11 21:31:24 +00005122 {
Jim Ingham0161b492013-02-09 01:29:05 +00005123 Error halt_error;
5124 if (do_halt)
5125 {
5126 if (log)
5127 log->Printf ("Process::RunThreadPlan(): Running Halt.");
5128 halt_error = Halt();
5129 }
5130 if (halt_error.Success())
5131 {
5132 if (log)
5133 log->PutCString ("Process::RunThreadPlan(): Halt succeeded.");
5134
5135 real_timeout = TimeValue::Now();
5136 real_timeout.OffsetWithMicroSeconds(500000);
5137
5138 got_event = listener.WaitForEvent(&real_timeout, event_sp);
Sean Callanana46ec452012-07-11 21:31:24 +00005139
Jim Ingham0161b492013-02-09 01:29:05 +00005140 if (got_event)
Sean Callanana46ec452012-07-11 21:31:24 +00005141 {
Jim Ingham0161b492013-02-09 01:29:05 +00005142 stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
5143 if (log)
Sean Callanana46ec452012-07-11 21:31:24 +00005144 {
Jim Ingham0161b492013-02-09 01:29:05 +00005145 log->Printf ("Process::RunThreadPlan(): Stopped with event: %s", StateAsCString(stop_state));
5146 if (stop_state == lldb::eStateStopped
5147 && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get()))
5148 log->PutCString (" Event was the Halt interruption event.");
Sean Callanana46ec452012-07-11 21:31:24 +00005149 }
5150
Jim Ingham0161b492013-02-09 01:29:05 +00005151 if (stop_state == lldb::eStateStopped)
Sean Callanana46ec452012-07-11 21:31:24 +00005152 {
Jim Ingham0161b492013-02-09 01:29:05 +00005153 // Between the time we initiated the Halt and the time we delivered it, the process could have
5154 // already finished its job. Check that here:
5155
5156 if (thread->IsThreadPlanDone (thread_plan_sp.get()))
5157 {
5158 if (log)
5159 log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done. "
5160 "Exiting wait loop.");
5161 return_value = eExecutionCompleted;
5162 back_to_top = false;
5163 break;
5164 }
5165
5166 if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
5167 {
5168 if (log)
5169 log->PutCString ("Process::RunThreadPlan(): Went to halt but got a restarted event, there must be an un-restarted stopped event so try again... "
5170 "Exiting wait loop.");
5171 try_halt_again++;
5172 do_halt = false;
5173 continue;
5174 }
Sean Callanana46ec452012-07-11 21:31:24 +00005175
Jim Ingham0161b492013-02-09 01:29:05 +00005176 if (!run_others)
5177 {
5178 if (log)
5179 log->PutCString ("Process::RunThreadPlan(): try_all_threads was false, we stopped so now we're quitting.");
5180 return_value = eExecutionInterrupted;
5181 back_to_top = false;
5182 break;
5183 }
5184
5185 if (before_first_timeout)
5186 {
5187 // Set all the other threads to run, and return to the top of the loop, which will continue;
5188 before_first_timeout = false;
5189 thread_plan_sp->SetStopOthers (false);
5190 if (log)
5191 log->PutCString ("Process::RunThreadPlan(): about to resume.");
Sean Callanana46ec452012-07-11 21:31:24 +00005192
Jim Ingham0161b492013-02-09 01:29:05 +00005193 back_to_top = true;
5194 break;
5195 }
5196 else
5197 {
5198 // Running all threads failed, so return Interrupted.
5199 if (log)
5200 log->PutCString("Process::RunThreadPlan(): running all threads timed out.");
5201 return_value = eExecutionInterrupted;
5202 back_to_top = false;
5203 break;
5204 }
Sean Callanana46ec452012-07-11 21:31:24 +00005205 }
5206 }
5207 else
Jim Ingham0161b492013-02-09 01:29:05 +00005208 { if (log)
5209 log->PutCString("Process::RunThreadPlan(): halt said it succeeded, but I got no event. "
5210 "I'm getting out of here passing Interrupted.");
Sean Callanana46ec452012-07-11 21:31:24 +00005211 return_value = eExecutionInterrupted;
Jim Ingham0161b492013-02-09 01:29:05 +00005212 back_to_top = false;
5213 break;
Sean Callanana46ec452012-07-11 21:31:24 +00005214 }
5215 }
Jim Ingham0161b492013-02-09 01:29:05 +00005216 else
5217 {
5218 try_halt_again++;
5219 continue;
5220 }
Sean Callanana46ec452012-07-11 21:31:24 +00005221 }
Jim Ingham0161b492013-02-09 01:29:05 +00005222
5223 if (!back_to_top || try_halt_again > num_retries)
5224 break;
5225 else
5226 continue;
Sean Callanana46ec452012-07-11 21:31:24 +00005227 }
Sean Callanana46ec452012-07-11 21:31:24 +00005228 } // END WAIT LOOP
5229
5230 // If we had to start up a temporary private state thread to run this thread plan, shut it down now.
5231 if (IS_VALID_LLDB_HOST_THREAD(backup_private_state_thread))
5232 {
5233 StopPrivateStateThread();
5234 Error error;
5235 m_private_state_thread = backup_private_state_thread;
Sean Callanan9a028512012-08-09 00:50:26 +00005236 if (stopper_base_plan_sp)
Sean Callanana46ec452012-07-11 21:31:24 +00005237 {
5238 thread->DiscardThreadPlansUpToPlan(stopper_base_plan_sp);
5239 }
5240 m_public_state.SetValueNoLock(old_state);
5241
5242 }
5243
Jim Ingham184e9812013-01-15 02:47:48 +00005244 // Restore the thread state if we are going to discard the plan execution. There are three cases where this
5245 // could happen:
5246 // 1) The execution successfully completed
5247 // 2) We hit a breakpoint, and ignore_breakpoints was true
5248 // 3) We got some other error, and discard_on_error was true
5249 bool should_unwind = (return_value == eExecutionInterrupted && unwind_on_error)
5250 || (return_value == eExecutionHitBreakpoint && ignore_breakpoints);
Jim Ingham8559a352012-11-26 23:52:18 +00005251
Jim Ingham184e9812013-01-15 02:47:48 +00005252 if (return_value == eExecutionCompleted
5253 || should_unwind)
Jim Ingham8559a352012-11-26 23:52:18 +00005254 {
5255 thread_plan_sp->RestoreThreadState();
5256 }
Sean Callanana46ec452012-07-11 21:31:24 +00005257
5258 // Now do some processing on the results of the run:
Jim Ingham184e9812013-01-15 02:47:48 +00005259 if (return_value == eExecutionInterrupted || return_value == eExecutionHitBreakpoint)
Sean Callanana46ec452012-07-11 21:31:24 +00005260 {
5261 if (log)
5262 {
5263 StreamString s;
5264 if (event_sp)
5265 event_sp->Dump (&s);
5266 else
5267 {
5268 log->PutCString ("Process::RunThreadPlan(): Stop event that interrupted us is NULL.");
5269 }
5270
5271 StreamString ts;
5272
5273 const char *event_explanation = NULL;
5274
5275 do
5276 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005277 if (!event_sp)
Sean Callanana46ec452012-07-11 21:31:24 +00005278 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005279 event_explanation = "<no event>";
Sean Callanana46ec452012-07-11 21:31:24 +00005280 break;
5281 }
Jim Inghamcfc09352012-07-27 23:57:19 +00005282 else if (event_sp->GetType() == eBroadcastBitInterrupt)
Sean Callanana46ec452012-07-11 21:31:24 +00005283 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005284 event_explanation = "<user interrupt>";
Sean Callanana46ec452012-07-11 21:31:24 +00005285 break;
5286 }
Jim Inghamcfc09352012-07-27 23:57:19 +00005287 else
Sean Callanana46ec452012-07-11 21:31:24 +00005288 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005289 const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get());
5290
5291 if (!event_data)
Sean Callanana46ec452012-07-11 21:31:24 +00005292 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005293 event_explanation = "<no event data>";
5294 break;
Sean Callanana46ec452012-07-11 21:31:24 +00005295 }
5296
Jim Inghamcfc09352012-07-27 23:57:19 +00005297 Process *process = event_data->GetProcessSP().get();
5298
5299 if (!process)
Sean Callanana46ec452012-07-11 21:31:24 +00005300 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005301 event_explanation = "<no process>";
5302 break;
Sean Callanana46ec452012-07-11 21:31:24 +00005303 }
Jim Inghamcfc09352012-07-27 23:57:19 +00005304
5305 ThreadList &thread_list = process->GetThreadList();
5306
5307 uint32_t num_threads = thread_list.GetSize();
5308 uint32_t thread_index;
5309
5310 ts.Printf("<%u threads> ", num_threads);
5311
5312 for (thread_index = 0;
5313 thread_index < num_threads;
5314 ++thread_index)
5315 {
5316 Thread *thread = thread_list.GetThreadAtIndex(thread_index).get();
5317
5318 if (!thread)
5319 {
5320 ts.Printf("<?> ");
5321 continue;
5322 }
5323
Daniel Malead01b2952012-11-29 21:49:15 +00005324 ts.Printf("<0x%4.4" PRIx64 " ", thread->GetID());
Jim Inghamcfc09352012-07-27 23:57:19 +00005325 RegisterContext *register_context = thread->GetRegisterContext().get();
5326
5327 if (register_context)
Daniel Malead01b2952012-11-29 21:49:15 +00005328 ts.Printf("[ip 0x%" PRIx64 "] ", register_context->GetPC());
Jim Inghamcfc09352012-07-27 23:57:19 +00005329 else
5330 ts.Printf("[ip unknown] ");
5331
5332 lldb::StopInfoSP stop_info_sp = thread->GetStopInfo();
5333 if (stop_info_sp)
5334 {
5335 const char *stop_desc = stop_info_sp->GetDescription();
5336 if (stop_desc)
5337 ts.PutCString (stop_desc);
5338 }
5339 ts.Printf(">");
5340 }
5341
5342 event_explanation = ts.GetData();
Sean Callanana46ec452012-07-11 21:31:24 +00005343 }
Sean Callanana46ec452012-07-11 21:31:24 +00005344 } while (0);
5345
Jim Inghamcfc09352012-07-27 23:57:19 +00005346 if (event_explanation)
5347 log->Printf("Process::RunThreadPlan(): execution interrupted: %s %s", s.GetData(), event_explanation);
Sean Callanana46ec452012-07-11 21:31:24 +00005348 else
Jim Inghamcfc09352012-07-27 23:57:19 +00005349 log->Printf("Process::RunThreadPlan(): execution interrupted: %s", s.GetData());
5350 }
5351
Jim Ingham184e9812013-01-15 02:47:48 +00005352 if (should_unwind && thread_plan_sp)
Jim Inghamcfc09352012-07-27 23:57:19 +00005353 {
5354 if (log)
5355 log->Printf ("Process::RunThreadPlan: ExecutionInterrupted - discarding thread plans up to %p.", thread_plan_sp.get());
5356 thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
5357 thread_plan_sp->SetPrivate (orig_plan_private);
5358 }
5359 else
5360 {
5361 if (log)
5362 log->Printf ("Process::RunThreadPlan: ExecutionInterrupted - for plan: %p not discarding.", thread_plan_sp.get());
Sean Callanana46ec452012-07-11 21:31:24 +00005363 }
5364 }
5365 else if (return_value == eExecutionSetupError)
5366 {
5367 if (log)
5368 log->PutCString("Process::RunThreadPlan(): execution set up error.");
Jim Ingham0f16e732011-02-08 05:20:59 +00005369
Jim Ingham184e9812013-01-15 02:47:48 +00005370 if (unwind_on_error && thread_plan_sp)
Jim Ingham0f16e732011-02-08 05:20:59 +00005371 {
Greg Claytonc14ee322011-09-22 04:58:26 +00005372 thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
Jim Ingham4b536182011-08-09 02:12:22 +00005373 thread_plan_sp->SetPrivate (orig_plan_private);
Jim Ingham0f16e732011-02-08 05:20:59 +00005374 }
Jim Inghamf48169b2010-11-30 02:22:11 +00005375 }
5376 else
5377 {
Sean Callanana46ec452012-07-11 21:31:24 +00005378 if (thread->IsThreadPlanDone (thread_plan_sp.get()))
Jim Inghamf48169b2010-11-30 02:22:11 +00005379 {
Jim Ingham0f16e732011-02-08 05:20:59 +00005380 if (log)
Sean Callanana46ec452012-07-11 21:31:24 +00005381 log->PutCString("Process::RunThreadPlan(): thread plan is done");
5382 return_value = eExecutionCompleted;
5383 }
5384 else if (thread->WasThreadPlanDiscarded (thread_plan_sp.get()))
5385 {
5386 if (log)
5387 log->PutCString("Process::RunThreadPlan(): thread plan was discarded");
5388 return_value = eExecutionDiscarded;
5389 }
5390 else
5391 {
5392 if (log)
5393 log->PutCString("Process::RunThreadPlan(): thread plan stopped in mid course");
Jim Ingham184e9812013-01-15 02:47:48 +00005394 if (unwind_on_error && thread_plan_sp)
Sean Callanana46ec452012-07-11 21:31:24 +00005395 {
5396 if (log)
Jim Ingham184e9812013-01-15 02:47:48 +00005397 log->PutCString("Process::RunThreadPlan(): discarding thread plan 'cause unwind_on_error is set.");
Sean Callanana46ec452012-07-11 21:31:24 +00005398 thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
5399 thread_plan_sp->SetPrivate (orig_plan_private);
5400 }
5401 }
5402 }
5403
5404 // Thread we ran the function in may have gone away because we ran the target
5405 // Check that it's still there, and if it is put it back in the context. Also restore the
5406 // frame in the context if it is still present.
5407 thread = GetThreadList().FindThreadByIndexID(thread_idx_id, true).get();
5408 if (thread)
5409 {
5410 exe_ctx.SetFrameSP (thread->GetFrameWithStackID (ctx_frame_id));
5411 }
5412
5413 // Also restore the current process'es selected frame & thread, since this function calling may
5414 // be done behind the user's back.
5415
5416 if (selected_tid != LLDB_INVALID_THREAD_ID)
5417 {
5418 if (GetThreadList().SetSelectedThreadByIndexID (selected_tid) && selected_stack_id.IsValid())
5419 {
5420 // We were able to restore the selected thread, now restore the frame:
5421 StackFrameSP old_frame_sp = GetThreadList().GetSelectedThread()->GetFrameWithStackID(selected_stack_id);
5422 if (old_frame_sp)
5423 GetThreadList().GetSelectedThread()->SetSelectedFrame(old_frame_sp.get());
Jim Inghamf48169b2010-11-30 02:22:11 +00005424 }
Jim Inghamf48169b2010-11-30 02:22:11 +00005425 }
5426 }
Jim Inghamf48169b2010-11-30 02:22:11 +00005427
Sean Callanana46ec452012-07-11 21:31:24 +00005428 // If the process exited during the run of the thread plan, notify everyone.
Jim Inghamf48169b2010-11-30 02:22:11 +00005429
Sean Callanana46ec452012-07-11 21:31:24 +00005430 if (event_to_broadcast_sp)
Jim Inghamf48169b2010-11-30 02:22:11 +00005431 {
Sean Callanana46ec452012-07-11 21:31:24 +00005432 if (log)
5433 log->PutCString("Process::RunThreadPlan(): rebroadcasting event.");
5434 BroadcastEvent(event_to_broadcast_sp);
Jim Inghamf48169b2010-11-30 02:22:11 +00005435 }
5436
5437 return return_value;
5438}
5439
5440const char *
5441Process::ExecutionResultAsCString (ExecutionResults result)
5442{
5443 const char *result_name;
5444
5445 switch (result)
5446 {
Greg Claytone0d378b2011-03-24 21:19:54 +00005447 case eExecutionCompleted:
Jim Inghamf48169b2010-11-30 02:22:11 +00005448 result_name = "eExecutionCompleted";
5449 break;
Greg Claytone0d378b2011-03-24 21:19:54 +00005450 case eExecutionDiscarded:
Jim Inghamf48169b2010-11-30 02:22:11 +00005451 result_name = "eExecutionDiscarded";
5452 break;
Greg Claytone0d378b2011-03-24 21:19:54 +00005453 case eExecutionInterrupted:
Jim Inghamf48169b2010-11-30 02:22:11 +00005454 result_name = "eExecutionInterrupted";
5455 break;
Jim Ingham184e9812013-01-15 02:47:48 +00005456 case eExecutionHitBreakpoint:
5457 result_name = "eExecutionHitBreakpoint";
5458 break;
Greg Claytone0d378b2011-03-24 21:19:54 +00005459 case eExecutionSetupError:
Jim Inghamf48169b2010-11-30 02:22:11 +00005460 result_name = "eExecutionSetupError";
5461 break;
Greg Claytone0d378b2011-03-24 21:19:54 +00005462 case eExecutionTimedOut:
Jim Inghamf48169b2010-11-30 02:22:11 +00005463 result_name = "eExecutionTimedOut";
5464 break;
5465 }
5466 return result_name;
5467}
5468
Greg Clayton7260f622011-04-18 08:33:37 +00005469void
5470Process::GetStatus (Stream &strm)
5471{
5472 const StateType state = GetState();
Greg Clayton2637f822011-11-17 01:23:07 +00005473 if (StateIsStoppedState(state, false))
Greg Clayton7260f622011-04-18 08:33:37 +00005474 {
5475 if (state == eStateExited)
5476 {
5477 int exit_status = GetExitStatus();
5478 const char *exit_description = GetExitDescription();
Daniel Malead01b2952012-11-29 21:49:15 +00005479 strm.Printf ("Process %" PRIu64 " exited with status = %i (0x%8.8x) %s\n",
Greg Clayton7260f622011-04-18 08:33:37 +00005480 GetID(),
5481 exit_status,
5482 exit_status,
5483 exit_description ? exit_description : "");
5484 }
5485 else
5486 {
5487 if (state == eStateConnected)
5488 strm.Printf ("Connected to remote target.\n");
5489 else
Daniel Malead01b2952012-11-29 21:49:15 +00005490 strm.Printf ("Process %" PRIu64 " %s\n", GetID(), StateAsCString (state));
Greg Clayton7260f622011-04-18 08:33:37 +00005491 }
5492 }
5493 else
5494 {
Daniel Malead01b2952012-11-29 21:49:15 +00005495 strm.Printf ("Process %" PRIu64 " is running.\n", GetID());
Greg Clayton7260f622011-04-18 08:33:37 +00005496 }
5497}
5498
5499size_t
5500Process::GetThreadStatus (Stream &strm,
5501 bool only_threads_with_stop_reason,
5502 uint32_t start_frame,
5503 uint32_t num_frames,
5504 uint32_t num_frames_with_source)
5505{
5506 size_t num_thread_infos_dumped = 0;
5507
Jim Ingham41f2b942012-09-10 20:50:15 +00005508 Mutex::Locker locker (GetThreadList().GetMutex());
Greg Clayton7260f622011-04-18 08:33:37 +00005509 const size_t num_threads = GetThreadList().GetSize();
5510 for (uint32_t i = 0; i < num_threads; i++)
5511 {
5512 Thread *thread = GetThreadList().GetThreadAtIndex(i).get();
5513 if (thread)
5514 {
5515 if (only_threads_with_stop_reason)
5516 {
Jim Ingham5d88a062012-10-16 00:09:33 +00005517 StopInfoSP stop_info_sp = thread->GetStopInfo();
5518 if (stop_info_sp.get() == NULL || !stop_info_sp->IsValid())
Greg Clayton7260f622011-04-18 08:33:37 +00005519 continue;
5520 }
5521 thread->GetStatus (strm,
5522 start_frame,
5523 num_frames,
5524 num_frames_with_source);
5525 ++num_thread_infos_dumped;
5526 }
5527 }
5528 return num_thread_infos_dumped;
5529}
5530
Greg Claytona9f40ad2012-02-22 04:37:26 +00005531void
5532Process::AddInvalidMemoryRegion (const LoadRange &region)
5533{
5534 m_memory_cache.AddInvalidRange(region.GetRangeBase(), region.GetByteSize());
5535}
5536
5537bool
5538Process::RemoveInvalidMemoryRange (const LoadRange &region)
5539{
5540 return m_memory_cache.RemoveInvalidRange(region.GetRangeBase(), region.GetByteSize());
5541}
5542
Jim Ingham372787f2012-04-07 00:00:41 +00005543void
5544Process::AddPreResumeAction (PreResumeActionCallback callback, void *baton)
5545{
5546 m_pre_resume_actions.push_back(PreResumeCallbackAndBaton (callback, baton));
5547}
5548
5549bool
5550Process::RunPreResumeActions ()
5551{
5552 bool result = true;
5553 while (!m_pre_resume_actions.empty())
5554 {
5555 struct PreResumeCallbackAndBaton action = m_pre_resume_actions.back();
5556 m_pre_resume_actions.pop_back();
5557 bool this_result = action.callback (action.baton);
5558 if (result == true) result = this_result;
5559 }
5560 return result;
5561}
5562
5563void
5564Process::ClearPreResumeActions ()
5565{
5566 m_pre_resume_actions.clear();
5567}
Greg Claytona9f40ad2012-02-22 04:37:26 +00005568
Greg Claytonfa559e52012-05-18 02:38:05 +00005569void
5570Process::Flush ()
5571{
5572 m_thread_list.Flush();
5573}
Greg Clayton90ba8112012-12-05 00:16:59 +00005574
5575void
5576Process::DidExec ()
5577{
5578 Target &target = GetTarget();
5579 target.CleanupProcess ();
5580 ModuleList unloaded_modules (target.GetImages());
5581 target.ModulesDidUnload (unloaded_modules);
5582 target.GetSectionLoadList().Clear();
5583 m_dynamic_checkers_ap.reset();
5584 m_abi_sp.reset();
5585 m_os_ap.reset();
5586 m_dyld_ap.reset();
5587 m_image_tokens.clear();
5588 m_allocated_memory_cache.Clear();
5589 m_language_runtimes.clear();
5590 DoDidExec();
5591 CompleteAttach ();
5592}
Sean Callananbb777042013-05-16 17:30:37 +00005593
5594Process::ReservationCache::ReservationCache (Process &process) : m_process(process)
5595{
5596 m_mod_id = process.GetModID();
5597}
5598
5599void
5600Process::ReservationCache::Reserve (lldb::addr_t addr, size_t size)
5601{
5602 CheckModID();
5603 m_reserved_cache[addr] = size;
5604}
5605
5606void
5607Process::ReservationCache::Unreserve (lldb::addr_t addr)
5608{
5609 CheckModID();
5610 ReservedMap::iterator iter = m_reserved_cache.find(addr);
5611
5612 if (iter != m_reserved_cache.end())
5613 {
5614 size_t size = iter->second;
5615 m_reserved_cache.erase(iter);
5616 m_free_cache[size].push_back(addr);
5617 }
5618}
5619
5620lldb::addr_t
5621Process::ReservationCache::Find (size_t size)
5622{
5623 CheckModID();
5624 lldb::addr_t ret = LLDB_INVALID_ADDRESS;
5625 FreeMap::iterator map_iter = m_free_cache.find(size);
5626 if (map_iter != m_free_cache.end())
5627 {
5628 if (!map_iter->second.empty())
5629 {
5630 ret = map_iter->second.back();
5631 map_iter->second.pop_back();
5632 m_reserved_cache[ret] = size;
5633 }
5634 }
5635
5636 return ret;
5637}
5638
5639void
5640Process::ReservationCache::CheckModID()
5641{
5642 if (m_mod_id != m_process.GetModID())
5643 {
5644 // wipe all our caches, they're invalid
5645 m_reserved_cache.clear();
5646 m_free_cache.clear();
5647 m_mod_id = m_process.GetModID();
5648 }
5649}