blob: 6a9328fc9bc80e5e39c9d657edb8d14fa9206d96 [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
Eugene Zelenko8f30a652015-10-23 18:39:37 +000010// C Includes
11// C++ Includes
Greg Clayton5cc45e02016-02-26 19:41:49 +000012#include <atomic>
Greg Clayton04df8ee2016-02-26 19:38:18 +000013#include <mutex>
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +000014
Eugene Zelenko8f30a652015-10-23 18:39:37 +000015// Other libraries and framework includes
16// Project includes
Sean Callanan579e70c2016-03-19 00:03:59 +000017#include "Plugins/Process/Utility/InferiorCallPOSIX.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000018#include "lldb/Breakpoint/BreakpointLocation.h"
Sean Callanan579e70c2016-03-19 00:03:59 +000019#include "lldb/Breakpoint/StoppointCallbackContext.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000020#include "lldb/Core/Debugger.h"
Sean Callanan579e70c2016-03-19 00:03:59 +000021#include "lldb/Core/Event.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"
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +000024#include "lldb/Core/ModuleSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000025#include "lldb/Core/PluginManager.h"
26#include "lldb/Core/State.h"
Greg Clayton44d93782014-01-27 23:43:24 +000027#include "lldb/Core/StreamFile.h"
Sean Callanan579e70c2016-03-19 00:03:59 +000028#include "lldb/Expression/DiagnosticManager.h"
Zachary Turner93749ab2015-03-03 21:51:25 +000029#include "lldb/Expression/IRDynamicChecks.h"
Sean Callanan579e70c2016-03-19 00:03:59 +000030#include "lldb/Expression/UserExpression.h"
Zachary Turner93a66fc2014-10-06 21:22:36 +000031#include "lldb/Host/ConnectionFileDescriptor.h"
Zachary Turner4eff2d32015-10-14 21:37:36 +000032#include "lldb/Host/FileSystem.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033#include "lldb/Host/Host.h"
Zachary Turner39de3112014-09-09 20:54:56 +000034#include "lldb/Host/HostInfo.h"
Greg Clayton100eb932014-07-02 21:10:39 +000035#include "lldb/Host/Pipe.h"
Greg Clayton44d93782014-01-27 23:43:24 +000036#include "lldb/Host/Terminal.h"
Zachary Turner39de3112014-09-09 20:54:56 +000037#include "lldb/Host/ThreadLauncher.h"
Zachary Turner93a66fc2014-10-06 21:22:36 +000038#include "lldb/Interpreter/CommandInterpreter.h"
Zachary Turner633a29c2015-03-04 01:58:01 +000039#include "lldb/Interpreter/OptionValueProperties.h"
Jason Molenda484900b2015-08-10 07:55:25 +000040#include "lldb/Symbol/Function.h"
Zachary Turner93a66fc2014-10-06 21:22:36 +000041#include "lldb/Symbol/Symbol.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000042#include "lldb/Target/ABI.h"
Sean Callanan579e70c2016-03-19 00:03:59 +000043#include "lldb/Target/CPPLanguageRuntime.h"
Greg Clayton8f343b02010-11-04 01:54:29 +000044#include "lldb/Target/DynamicLoader.h"
Zachary Turner93749ab2015-03-03 21:51:25 +000045#include "lldb/Target/InstrumentationRuntime.h"
Andrew MacPherson17220c12014-03-05 10:12:43 +000046#include "lldb/Target/JITLoader.h"
Zachary Turner93749ab2015-03-03 21:51:25 +000047#include "lldb/Target/JITLoaderList.h"
Sean Callanan579e70c2016-03-19 00:03:59 +000048#include "lldb/Target/LanguageRuntime.h"
Kuba Breckaa51ea382014-09-06 01:33:13 +000049#include "lldb/Target/MemoryHistory.h"
Zachary Turner93749ab2015-03-03 21:51:25 +000050#include "lldb/Target/MemoryRegionInfo.h"
Jim Ingham22777012010-09-23 02:01:19 +000051#include "lldb/Target/ObjCLanguageRuntime.h"
Sean Callanan579e70c2016-03-19 00:03:59 +000052#include "lldb/Target/OperatingSystem.h"
Greg Claytone996fd32011-03-08 22:40:15 +000053#include "lldb/Target/Platform.h"
Sean Callanan579e70c2016-03-19 00:03:59 +000054#include "lldb/Target/Process.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000055#include "lldb/Target/RegisterContext.h"
Greg Claytonf4b47e12010-08-04 01:40:35 +000056#include "lldb/Target/StopInfo.h"
Jason Molendaeef51062013-11-05 03:57:19 +000057#include "lldb/Target/SystemRuntime.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000058#include "lldb/Target/Target.h"
59#include "lldb/Target/TargetList.h"
60#include "lldb/Target/Thread.h"
61#include "lldb/Target/ThreadPlan.h"
Jim Ingham076b3042012-04-10 01:21:57 +000062#include "lldb/Target/ThreadPlanBase.h"
Zachary Turner93749ab2015-03-03 21:51:25 +000063#include "lldb/Target/UnixSignals.h"
Zachary Turner50232572015-03-18 21:31:45 +000064#include "lldb/Utility/NameMatches.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000065
66using namespace lldb;
67using namespace lldb_private;
68
Greg Clayton67cc0632012-08-22 17:17:09 +000069// Comment out line below to disable memory caching, overriding the process setting
70// target.process.disable-memory-cache
71#define ENABLE_MEMORY_CACHING
72
73#ifdef ENABLE_MEMORY_CACHING
74#define DISABLE_MEM_CACHE_DEFAULT false
75#else
76#define DISABLE_MEM_CACHE_DEFAULT true
77#endif
78
79class ProcessOptionValueProperties : public OptionValueProperties
80{
81public:
82 ProcessOptionValueProperties (const ConstString &name) :
83 OptionValueProperties (name)
84 {
85 }
86
87 // This constructor is used when creating ProcessOptionValueProperties when it
88 // is part of a new lldb_private::Process instance. It will copy all current
89 // global property values as needed
90 ProcessOptionValueProperties (ProcessProperties *global_properties) :
91 OptionValueProperties(*global_properties->GetValueProperties())
92 {
93 }
94
Eugene Zelenko8f30a652015-10-23 18:39:37 +000095 const Property *
96 GetPropertyAtIndex(const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const override
Greg Clayton67cc0632012-08-22 17:17:09 +000097 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +000098 // When getting the value for a key from the process options, we will always
Greg Clayton67cc0632012-08-22 17:17:09 +000099 // try and grab the setting from the current process if there is one. Else we just
100 // use the one from this instance.
101 if (exe_ctx)
102 {
103 Process *process = exe_ctx->GetProcessPtr();
104 if (process)
105 {
106 ProcessOptionValueProperties *instance_properties = static_cast<ProcessOptionValueProperties *>(process->GetValueProperties().get());
107 if (this != instance_properties)
108 return instance_properties->ProtectedGetPropertyAtIndex (idx);
109 }
110 }
111 return ProtectedGetPropertyAtIndex (idx);
112 }
113};
114
115static PropertyDefinition
116g_properties[] =
117{
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000118 { "disable-memory-cache" , OptionValue::eTypeBoolean, false, DISABLE_MEM_CACHE_DEFAULT, nullptr, nullptr, "Disable reading and caching of memory in fixed-size units." },
119 { "extra-startup-command", OptionValue::eTypeArray , false, OptionValue::eTypeString, nullptr, nullptr, "A list containing extra commands understood by the particular process plugin used. "
Jim Ingham8c3f2762012-11-29 00:41:12 +0000120 "For instance, to turn on debugserver logging set this to \"QSetLogging:bitmask=LOG_DEFAULT;\"" },
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000121 { "ignore-breakpoints-in-expressions", OptionValue::eTypeBoolean, true, true, nullptr, nullptr, "If true, breakpoints will be ignored during expression evaluation." },
122 { "unwind-on-error-in-expressions", OptionValue::eTypeBoolean, true, true, nullptr, nullptr, "If true, errors in expression evaluation will unwind the stack back to the state before the call." },
123 { "python-os-plugin-path", OptionValue::eTypeFileSpec, false, true, nullptr, nullptr, "A path to a python OS plug-in module file that contains a OperatingSystemPlugIn class." },
124 { "stop-on-sharedlibrary-events" , OptionValue::eTypeBoolean, true, false, nullptr, nullptr, "If true, stop when a shared library is loaded or unloaded." },
125 { "detach-keeps-stopped" , OptionValue::eTypeBoolean, true, false, nullptr, nullptr, "If true, detach will attempt to keep the process stopped." },
126 { "memory-cache-line-size" , OptionValue::eTypeUInt64, false, 512, nullptr, nullptr, "The memory cache line size" },
127 { "optimization-warnings" , OptionValue::eTypeBoolean, false, true, nullptr, nullptr, "If true, warn when stopped in code that is optimized where stepping and variable availability may not behave as expected." },
128 { nullptr , OptionValue::eTypeInvalid, false, 0, nullptr, nullptr, nullptr }
Greg Clayton67cc0632012-08-22 17:17:09 +0000129};
130
131enum {
132 ePropertyDisableMemCache,
Greg Claytonc9d645d2012-10-18 22:40:37 +0000133 ePropertyExtraStartCommand,
Jim Ingham184e9812013-01-15 02:47:48 +0000134 ePropertyIgnoreBreakpointsInExpressions,
135 ePropertyUnwindOnErrorInExpressions,
Jim Ingham29950772013-01-26 02:19:28 +0000136 ePropertyPythonOSPluginPath,
Jim Inghamacff8952013-05-02 00:27:30 +0000137 ePropertyStopOnSharedLibraryEvents,
Jason Molendaf0340c92014-09-03 22:30:54 +0000138 ePropertyDetachKeepsStopped,
Jason Molendaef7d6412015-08-06 03:27:10 +0000139 ePropertyMemCacheLineSize,
140 ePropertyWarningOptimization
Greg Clayton67cc0632012-08-22 17:17:09 +0000141};
142
Greg Clayton332e8b12015-01-13 21:13:08 +0000143ProcessProperties::ProcessProperties (lldb_private::Process *process) :
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000144 Properties(),
145 m_process(process) // Can be nullptr for global ProcessProperties
Greg Clayton67cc0632012-08-22 17:17:09 +0000146{
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000147 if (process == nullptr)
Greg Clayton67cc0632012-08-22 17:17:09 +0000148 {
Greg Clayton332e8b12015-01-13 21:13:08 +0000149 // Global process properties, set them up one time
Greg Clayton67cc0632012-08-22 17:17:09 +0000150 m_collection_sp.reset (new ProcessOptionValueProperties(ConstString("process")));
151 m_collection_sp->Initialize(g_properties);
152 m_collection_sp->AppendProperty(ConstString("thread"),
Jim Ingham29950772013-01-26 02:19:28 +0000153 ConstString("Settings specific to threads."),
Greg Clayton67cc0632012-08-22 17:17:09 +0000154 true,
155 Thread::GetGlobalProperties()->GetValueProperties());
156 }
157 else
Greg Clayton332e8b12015-01-13 21:13:08 +0000158 {
Greg Clayton67cc0632012-08-22 17:17:09 +0000159 m_collection_sp.reset (new ProcessOptionValueProperties(Process::GetGlobalProperties().get()));
Greg Clayton332e8b12015-01-13 21:13:08 +0000160 m_collection_sp->SetValueChangedCallback(ePropertyPythonOSPluginPath, ProcessProperties::OptionValueChangedCallback, this);
161 }
Greg Clayton67cc0632012-08-22 17:17:09 +0000162}
163
Eugene Zelenko8f30a652015-10-23 18:39:37 +0000164ProcessProperties::~ProcessProperties() = default;
Greg Clayton67cc0632012-08-22 17:17:09 +0000165
Greg Clayton332e8b12015-01-13 21:13:08 +0000166void
167ProcessProperties::OptionValueChangedCallback (void *baton, OptionValue *option_value)
168{
169 ProcessProperties *properties = (ProcessProperties *)baton;
170 if (properties->m_process)
171 properties->m_process->LoadOperatingSystemPlugin(true);
172}
173
Greg Clayton67cc0632012-08-22 17:17:09 +0000174bool
175ProcessProperties::GetDisableMemoryCache() const
176{
177 const uint32_t idx = ePropertyDisableMemCache;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000178 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
Greg Clayton67cc0632012-08-22 17:17:09 +0000179}
180
Jason Molendaf0340c92014-09-03 22:30:54 +0000181uint64_t
182ProcessProperties::GetMemoryCacheLineSize() const
183{
184 const uint32_t idx = ePropertyMemCacheLineSize;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000185 return m_collection_sp->GetPropertyAtIndexAsUInt64(nullptr, idx, g_properties[idx].default_uint_value);
Jason Molendaf0340c92014-09-03 22:30:54 +0000186}
187
Greg Clayton67cc0632012-08-22 17:17:09 +0000188Args
189ProcessProperties::GetExtraStartupCommands () const
190{
191 Args args;
192 const uint32_t idx = ePropertyExtraStartCommand;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000193 m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args);
Greg Clayton67cc0632012-08-22 17:17:09 +0000194 return args;
195}
196
197void
198ProcessProperties::SetExtraStartupCommands (const Args &args)
199{
200 const uint32_t idx = ePropertyExtraStartCommand;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000201 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args);
Greg Clayton67cc0632012-08-22 17:17:09 +0000202}
203
Greg Claytonc9d645d2012-10-18 22:40:37 +0000204FileSpec
205ProcessProperties::GetPythonOSPluginPath () const
206{
207 const uint32_t idx = ePropertyPythonOSPluginPath;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000208 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
Greg Claytonc9d645d2012-10-18 22:40:37 +0000209}
210
211void
212ProcessProperties::SetPythonOSPluginPath (const FileSpec &file)
213{
214 const uint32_t idx = ePropertyPythonOSPluginPath;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000215 m_collection_sp->SetPropertyAtIndexAsFileSpec(nullptr, idx, file);
Greg Claytonc9d645d2012-10-18 22:40:37 +0000216}
217
Jim Ingham184e9812013-01-15 02:47:48 +0000218bool
219ProcessProperties::GetIgnoreBreakpointsInExpressions () const
220{
221 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000222 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
Jim Ingham184e9812013-01-15 02:47:48 +0000223}
224
225void
226ProcessProperties::SetIgnoreBreakpointsInExpressions (bool ignore)
227{
228 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000229 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, ignore);
Jim Ingham184e9812013-01-15 02:47:48 +0000230}
231
232bool
233ProcessProperties::GetUnwindOnErrorInExpressions () const
234{
235 const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000236 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
Jim Ingham184e9812013-01-15 02:47:48 +0000237}
238
239void
240ProcessProperties::SetUnwindOnErrorInExpressions (bool ignore)
241{
242 const uint32_t idx = ePropertyUnwindOnErrorInExpressions;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000243 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, ignore);
Jim Ingham184e9812013-01-15 02:47:48 +0000244}
245
Jim Ingham29950772013-01-26 02:19:28 +0000246bool
247ProcessProperties::GetStopOnSharedLibraryEvents () const
248{
249 const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000250 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
Jim Ingham29950772013-01-26 02:19:28 +0000251}
252
253void
254ProcessProperties::SetStopOnSharedLibraryEvents (bool stop)
255{
256 const uint32_t idx = ePropertyStopOnSharedLibraryEvents;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000257 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, stop);
Jim Ingham29950772013-01-26 02:19:28 +0000258}
259
Jim Inghamacff8952013-05-02 00:27:30 +0000260bool
261ProcessProperties::GetDetachKeepsStopped () const
262{
263 const uint32_t idx = ePropertyDetachKeepsStopped;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000264 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
Jim Inghamacff8952013-05-02 00:27:30 +0000265}
266
267void
268ProcessProperties::SetDetachKeepsStopped (bool stop)
269{
270 const uint32_t idx = ePropertyDetachKeepsStopped;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000271 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, stop);
Jim Inghamacff8952013-05-02 00:27:30 +0000272}
273
Jason Molendaef7d6412015-08-06 03:27:10 +0000274bool
275ProcessProperties::GetWarningsOptimization () const
276{
277 const uint32_t idx = ePropertyWarningOptimization;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000278 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
Jason Molendaef7d6412015-08-06 03:27:10 +0000279}
280
Greg Clayton32e0a752011-03-30 18:16:51 +0000281void
Greg Clayton8b82f082011-04-12 05:54:46 +0000282ProcessInstanceInfo::Dump (Stream &s, Platform *platform) const
Greg Clayton32e0a752011-03-30 18:16:51 +0000283{
284 const char *cstr;
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000285 if (m_pid != LLDB_INVALID_PROCESS_ID)
Daniel Malead01b2952012-11-29 21:49:15 +0000286 s.Printf (" pid = %" PRIu64 "\n", m_pid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000287
288 if (m_parent_pid != LLDB_INVALID_PROCESS_ID)
Daniel Malead01b2952012-11-29 21:49:15 +0000289 s.Printf (" parent = %" PRIu64 "\n", m_parent_pid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000290
291 if (m_executable)
292 {
293 s.Printf (" name = %s\n", m_executable.GetFilename().GetCString());
294 s.PutCString (" file = ");
295 m_executable.Dump(&s);
296 s.EOL();
297 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000298 const uint32_t argc = m_arguments.GetArgumentCount();
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000299 if (argc > 0)
300 {
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000301 for (uint32_t i = 0; i < argc; i++)
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000302 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000303 const char *arg = m_arguments.GetArgumentAtIndex(i);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000304 if (i < 10)
Greg Clayton8b82f082011-04-12 05:54:46 +0000305 s.Printf (" arg[%u] = %s\n", i, arg);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000306 else
Greg Clayton8b82f082011-04-12 05:54:46 +0000307 s.Printf ("arg[%u] = %s\n", i, arg);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000308 }
309 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000310
311 const uint32_t envc = m_environment.GetArgumentCount();
312 if (envc > 0)
313 {
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000314 for (uint32_t i = 0; i < envc; i++)
Greg Clayton8b82f082011-04-12 05:54:46 +0000315 {
316 const char *env = m_environment.GetArgumentAtIndex(i);
317 if (i < 10)
318 s.Printf (" env[%u] = %s\n", i, env);
319 else
320 s.Printf ("env[%u] = %s\n", i, env);
321 }
322 }
323
Todd Fiala7df337f2015-10-13 23:41:19 +0000324 if (m_arch.IsValid())
325 {
326 s.Printf (" arch = ");
327 m_arch.DumpTriple(s);
328 s.EOL();
329 }
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000330
Greg Clayton8b82f082011-04-12 05:54:46 +0000331 if (m_uid != UINT32_MAX)
Greg Clayton32e0a752011-03-30 18:16:51 +0000332 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000333 cstr = platform->GetUserName (m_uid);
334 s.Printf (" uid = %-5u (%s)\n", m_uid, cstr ? cstr : "");
Greg Clayton32e0a752011-03-30 18:16:51 +0000335 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000336 if (m_gid != UINT32_MAX)
Greg Clayton32e0a752011-03-30 18:16:51 +0000337 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000338 cstr = platform->GetGroupName (m_gid);
339 s.Printf (" gid = %-5u (%s)\n", m_gid, cstr ? cstr : "");
Greg Clayton32e0a752011-03-30 18:16:51 +0000340 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000341 if (m_euid != UINT32_MAX)
Greg Clayton32e0a752011-03-30 18:16:51 +0000342 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000343 cstr = platform->GetUserName (m_euid);
344 s.Printf (" euid = %-5u (%s)\n", m_euid, cstr ? cstr : "");
Greg Clayton32e0a752011-03-30 18:16:51 +0000345 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000346 if (m_egid != UINT32_MAX)
Greg Clayton32e0a752011-03-30 18:16:51 +0000347 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000348 cstr = platform->GetGroupName (m_egid);
349 s.Printf (" egid = %-5u (%s)\n", m_egid, cstr ? cstr : "");
Greg Clayton32e0a752011-03-30 18:16:51 +0000350 }
351}
352
353void
Greg Clayton8b82f082011-04-12 05:54:46 +0000354ProcessInstanceInfo::DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose)
Greg Clayton32e0a752011-03-30 18:16:51 +0000355{
Greg Clayton8b82f082011-04-12 05:54:46 +0000356 const char *label;
357 if (show_args || verbose)
358 label = "ARGUMENTS";
359 else
360 label = "NAME";
361
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000362 if (verbose)
363 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000364 s.Printf ("PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE %s\n", label);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000365 s.PutCString ("====== ====== ========== ========== ========== ========== ======================== ============================\n");
366 }
367 else
368 {
Jim Ingham368ac222014-08-15 17:05:27 +0000369 s.Printf ("PID PARENT USER TRIPLE %s\n", label);
370 s.PutCString ("====== ====== ========== ======================== ============================\n");
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000371 }
Greg Clayton32e0a752011-03-30 18:16:51 +0000372}
373
374void
Greg Clayton8b82f082011-04-12 05:54:46 +0000375ProcessInstanceInfo::DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const
Greg Clayton32e0a752011-03-30 18:16:51 +0000376{
377 if (m_pid != LLDB_INVALID_PROCESS_ID)
378 {
379 const char *cstr;
Daniel Malead01b2952012-11-29 21:49:15 +0000380 s.Printf ("%-6" PRIu64 " %-6" PRIu64 " ", m_pid, m_parent_pid);
Greg Clayton32e0a752011-03-30 18:16:51 +0000381
Todd Fiala7df337f2015-10-13 23:41:19 +0000382 StreamString arch_strm;
383 if (m_arch.IsValid())
384 m_arch.DumpTriple(arch_strm);
385
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000386 if (verbose)
387 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000388 cstr = platform->GetUserName (m_uid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000389 if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
390 s.Printf ("%-10s ", cstr);
391 else
Greg Clayton8b82f082011-04-12 05:54:46 +0000392 s.Printf ("%-10u ", m_uid);
Greg Clayton32e0a752011-03-30 18:16:51 +0000393
Greg Clayton8b82f082011-04-12 05:54:46 +0000394 cstr = platform->GetGroupName (m_gid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000395 if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
396 s.Printf ("%-10s ", cstr);
397 else
Greg Clayton8b82f082011-04-12 05:54:46 +0000398 s.Printf ("%-10u ", m_gid);
Greg Clayton32e0a752011-03-30 18:16:51 +0000399
Greg Clayton8b82f082011-04-12 05:54:46 +0000400 cstr = platform->GetUserName (m_euid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000401 if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
402 s.Printf ("%-10s ", cstr);
403 else
Greg Clayton8b82f082011-04-12 05:54:46 +0000404 s.Printf ("%-10u ", m_euid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000405
Greg Clayton8b82f082011-04-12 05:54:46 +0000406 cstr = platform->GetGroupName (m_egid);
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000407 if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed
408 s.Printf ("%-10s ", cstr);
409 else
Greg Clayton8b82f082011-04-12 05:54:46 +0000410 s.Printf ("%-10u ", m_egid);
Todd Fiala7df337f2015-10-13 23:41:19 +0000411
412 s.Printf ("%-24s ", arch_strm.GetString().c_str());
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000413 }
414 else
415 {
Jim Ingham368ac222014-08-15 17:05:27 +0000416 s.Printf ("%-10s %-24s ",
Greg Clayton8b82f082011-04-12 05:54:46 +0000417 platform->GetUserName (m_euid),
Todd Fiala7df337f2015-10-13 23:41:19 +0000418 arch_strm.GetString().c_str());
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000419 }
420
Greg Clayton8b82f082011-04-12 05:54:46 +0000421 if (verbose || show_args)
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000422 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000423 const uint32_t argc = m_arguments.GetArgumentCount();
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000424 if (argc > 0)
425 {
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000426 for (uint32_t i = 0; i < argc; i++)
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000427 {
428 if (i > 0)
429 s.PutChar (' ');
Greg Clayton8b82f082011-04-12 05:54:46 +0000430 s.PutCString (m_arguments.GetArgumentAtIndex(i));
Greg Clayton95bf0fd2011-04-01 00:29:43 +0000431 }
432 }
433 }
434 else
435 {
436 s.PutCString (GetName());
437 }
438
439 s.EOL();
Greg Clayton32e0a752011-03-30 18:16:51 +0000440 }
441}
442
Greg Clayton8b82f082011-04-12 05:54:46 +0000443Error
Greg Claytonf6b8b582011-04-13 00:18:08 +0000444ProcessLaunchCommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg)
Greg Clayton8b82f082011-04-12 05:54:46 +0000445{
446 Error error;
Greg Clayton3bcdfc02012-12-04 00:32:51 +0000447 const int short_option = m_getopt_table[option_idx].val;
Greg Clayton8b82f082011-04-12 05:54:46 +0000448
449 switch (short_option)
450 {
451 case 's': // Stop at program entry point
452 launch_info.GetFlags().Set (eLaunchFlagStopAtEntry);
453 break;
454
Greg Clayton8b82f082011-04-12 05:54:46 +0000455 case 'i': // STDIN for read only
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000456 {
457 FileAction action;
Chaoren Lind3173f32015-05-29 19:52:29 +0000458 if (action.Open(STDIN_FILENO, FileSpec{option_arg, false}, true, false))
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000459 launch_info.AppendFileAction (action);
Greg Clayton8b82f082011-04-12 05:54:46 +0000460 break;
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000461 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000462
463 case 'o': // Open STDOUT for write only
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000464 {
465 FileAction action;
Chaoren Lind3173f32015-05-29 19:52:29 +0000466 if (action.Open(STDOUT_FILENO, FileSpec{option_arg, false}, false, true))
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000467 launch_info.AppendFileAction (action);
Greg Clayton9845a8d2012-03-06 04:01:04 +0000468 break;
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000469 }
Greg Clayton9845a8d2012-03-06 04:01:04 +0000470
471 case 'e': // STDERR for write only
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000472 {
473 FileAction action;
Chaoren Lind3173f32015-05-29 19:52:29 +0000474 if (action.Open(STDERR_FILENO, FileSpec{option_arg, false}, false, true))
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000475 launch_info.AppendFileAction (action);
Greg Clayton8b82f082011-04-12 05:54:46 +0000476 break;
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000477 }
Greg Clayton9845a8d2012-03-06 04:01:04 +0000478
Greg Clayton8b82f082011-04-12 05:54:46 +0000479 case 'p': // Process plug-in name
480 launch_info.SetProcessPluginName (option_arg);
481 break;
482
483 case 'n': // Disable STDIO
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000484 {
485 FileAction action;
Zachary Turner4eff2d32015-10-14 21:37:36 +0000486 const FileSpec dev_null{FileSystem::DEV_NULL, false};
Chaoren Lind3173f32015-05-29 19:52:29 +0000487 if (action.Open(STDIN_FILENO, dev_null, true, false))
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000488 launch_info.AppendFileAction (action);
Chaoren Lind3173f32015-05-29 19:52:29 +0000489 if (action.Open(STDOUT_FILENO, dev_null, false, true))
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000490 launch_info.AppendFileAction (action);
Chaoren Lind3173f32015-05-29 19:52:29 +0000491 if (action.Open(STDERR_FILENO, dev_null, false, true))
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000492 launch_info.AppendFileAction (action);
Greg Clayton8b82f082011-04-12 05:54:46 +0000493 break;
Zachary Turnerc00cf4a2014-08-15 22:04:21 +0000494 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000495
496 case 'w':
Chaoren Lind3173f32015-05-29 19:52:29 +0000497 launch_info.SetWorkingDirectory(FileSpec{option_arg, false});
Greg Clayton8b82f082011-04-12 05:54:46 +0000498 break;
499
500 case 't': // Open process in new terminal window
501 launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY);
502 break;
503
504 case 'a':
Greg Clayton70512312012-05-08 01:45:38 +0000505 if (!launch_info.GetArchitecture().SetTriple (option_arg, m_interpreter.GetPlatform(true).get()))
506 launch_info.GetArchitecture().SetTriple (option_arg);
Greg Clayton8b82f082011-04-12 05:54:46 +0000507 break;
508
Todd Fiala51637922014-08-19 17:40:43 +0000509 case 'A': // Disable ASLR.
510 {
511 bool success;
512 const bool disable_aslr_arg = Args::StringToBoolean (option_arg, true, &success);
513 if (success)
514 disable_aslr = disable_aslr_arg ? eLazyBoolYes : eLazyBoolNo;
515 else
516 error.SetErrorStringWithFormat ("Invalid boolean value for disable-aslr option: '%s'", option_arg ? option_arg : "<null>");
Greg Clayton8b82f082011-04-12 05:54:46 +0000517 break;
Todd Fiala51637922014-08-19 17:40:43 +0000518 }
519
Enrico Granatab38ef8c2015-02-20 22:20:30 +0000520 case 'X': // shell expand args.
Enrico Granatad7a83a92015-02-10 03:06:24 +0000521 {
522 bool success;
Enrico Granatab38ef8c2015-02-20 22:20:30 +0000523 const bool expand_args = Args::StringToBoolean (option_arg, true, &success);
Enrico Granatad7a83a92015-02-10 03:06:24 +0000524 if (success)
Enrico Granatab38ef8c2015-02-20 22:20:30 +0000525 launch_info.SetShellExpandArguments(expand_args);
Enrico Granatad7a83a92015-02-10 03:06:24 +0000526 else
Enrico Granatab38ef8c2015-02-20 22:20:30 +0000527 error.SetErrorStringWithFormat ("Invalid boolean value for shell-expand-args option: '%s'", option_arg ? option_arg : "<null>");
Enrico Granatad7a83a92015-02-10 03:06:24 +0000528 break;
529 }
530
Todd Fiala51637922014-08-19 17:40:43 +0000531 case 'c':
Greg Clayton144f3a92011-11-15 03:53:30 +0000532 if (option_arg && option_arg[0])
Zachary Turner10687b02014-10-20 17:46:43 +0000533 launch_info.SetShell (FileSpec(option_arg, false));
Greg Clayton144f3a92011-11-15 03:53:30 +0000534 else
Zachary Turner10687b02014-10-20 17:46:43 +0000535 launch_info.SetShell (HostInfo::GetDefaultShell());
Greg Clayton982c9762011-11-03 21:22:33 +0000536 break;
537
Greg Clayton8b82f082011-04-12 05:54:46 +0000538 case 'v':
539 launch_info.GetEnvironmentEntries().AppendArgument(option_arg);
540 break;
541
542 default:
Greg Clayton86edbf42011-10-26 00:56:27 +0000543 error.SetErrorStringWithFormat("unrecognized short option character '%c'", short_option);
Greg Clayton8b82f082011-04-12 05:54:46 +0000544 break;
Greg Clayton8b82f082011-04-12 05:54:46 +0000545 }
546 return error;
547}
548
549OptionDefinition
550ProcessLaunchCommandOptions::g_option_table[] =
551{
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000552{ LLDB_OPT_SET_ALL, false, "stop-at-entry", 's', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Stop at the entry point of the program when launching a process." },
553{ LLDB_OPT_SET_ALL, false, "disable-aslr", 'A', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeBoolean, "Set whether to disable address space layout randomization when launching a process." },
554{ LLDB_OPT_SET_ALL, false, "plugin", 'p', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypePlugin, "Name of the process plugin you want to use." },
555{ LLDB_OPT_SET_ALL, false, "working-dir", 'w', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeDirectoryName, "Set the current working directory to <path> when running the inferior." },
556{ LLDB_OPT_SET_ALL, false, "arch", 'a', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeArchitecture, "Set the architecture for the process to launch when ambiguous." },
557{ LLDB_OPT_SET_ALL, false, "environment", 'v', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeNone, "Specify an environment variable name/value string (--environment NAME=VALUE). Can be specified multiple times for subsequent environment entries." },
558{ LLDB_OPT_SET_1|LLDB_OPT_SET_2|LLDB_OPT_SET_3, false, "shell", 'c', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeFilename, "Run the process in a shell (not supported on all platforms)." },
Greg Clayton8b82f082011-04-12 05:54:46 +0000559
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000560{ LLDB_OPT_SET_1 , false, "stdin", 'i', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeFilename, "Redirect stdin for the process to <filename>." },
561{ LLDB_OPT_SET_1 , false, "stdout", 'o', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeFilename, "Redirect stdout for the process to <filename>." },
562{ LLDB_OPT_SET_1 , false, "stderr", 'e', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeFilename, "Redirect stderr for the process to <filename>." },
Greg Clayton8b82f082011-04-12 05:54:46 +0000563
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000564{ LLDB_OPT_SET_2 , false, "tty", 't', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Start the process in a terminal (not supported on all platforms)." },
Greg Clayton8b82f082011-04-12 05:54:46 +0000565
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000566{ LLDB_OPT_SET_3 , false, "no-stdio", 'n', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Do not set up for terminal I/O to go to running process." },
567{ LLDB_OPT_SET_4, false, "shell-expand-args", 'X', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeBoolean, "Set whether to shell expand arguments to the process when launching." },
568{ 0 , false, nullptr, 0, 0, nullptr, nullptr, 0, eArgTypeNone, nullptr }
Greg Clayton8b82f082011-04-12 05:54:46 +0000569};
570
Greg Clayton8b82f082011-04-12 05:54:46 +0000571bool
572ProcessInstanceInfoMatch::NameMatches (const char *process_name) const
Greg Clayton32e0a752011-03-30 18:16:51 +0000573{
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000574 if (m_name_match_type == eNameMatchIgnore || process_name == nullptr)
Greg Clayton32e0a752011-03-30 18:16:51 +0000575 return true;
576 const char *match_name = m_match_info.GetName();
577 if (!match_name)
578 return true;
579
580 return lldb_private::NameMatches (process_name, m_name_match_type, match_name);
581}
582
583bool
Greg Clayton8b82f082011-04-12 05:54:46 +0000584ProcessInstanceInfoMatch::Matches (const ProcessInstanceInfo &proc_info) const
Greg Clayton32e0a752011-03-30 18:16:51 +0000585{
586 if (!NameMatches (proc_info.GetName()))
587 return false;
588
589 if (m_match_info.ProcessIDIsValid() &&
590 m_match_info.GetProcessID() != proc_info.GetProcessID())
591 return false;
592
593 if (m_match_info.ParentProcessIDIsValid() &&
594 m_match_info.GetParentProcessID() != proc_info.GetParentProcessID())
595 return false;
596
Greg Clayton8b82f082011-04-12 05:54:46 +0000597 if (m_match_info.UserIDIsValid () &&
598 m_match_info.GetUserID() != proc_info.GetUserID())
Greg Clayton32e0a752011-03-30 18:16:51 +0000599 return false;
600
Greg Clayton8b82f082011-04-12 05:54:46 +0000601 if (m_match_info.GroupIDIsValid () &&
602 m_match_info.GetGroupID() != proc_info.GetGroupID())
Greg Clayton32e0a752011-03-30 18:16:51 +0000603 return false;
604
605 if (m_match_info.EffectiveUserIDIsValid () &&
606 m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID())
607 return false;
608
609 if (m_match_info.EffectiveGroupIDIsValid () &&
610 m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID())
611 return false;
612
613 if (m_match_info.GetArchitecture().IsValid() &&
Sean Callananbf4b7be2012-12-13 22:07:14 +0000614 !m_match_info.GetArchitecture().IsCompatibleMatch(proc_info.GetArchitecture()))
Greg Clayton32e0a752011-03-30 18:16:51 +0000615 return false;
616 return true;
617}
618
619bool
Greg Clayton8b82f082011-04-12 05:54:46 +0000620ProcessInstanceInfoMatch::MatchAllProcesses () const
Greg Clayton32e0a752011-03-30 18:16:51 +0000621{
622 if (m_name_match_type != eNameMatchIgnore)
623 return false;
624
625 if (m_match_info.ProcessIDIsValid())
626 return false;
627
628 if (m_match_info.ParentProcessIDIsValid())
629 return false;
630
Greg Clayton8b82f082011-04-12 05:54:46 +0000631 if (m_match_info.UserIDIsValid ())
Greg Clayton32e0a752011-03-30 18:16:51 +0000632 return false;
633
Greg Clayton8b82f082011-04-12 05:54:46 +0000634 if (m_match_info.GroupIDIsValid ())
Greg Clayton32e0a752011-03-30 18:16:51 +0000635 return false;
636
637 if (m_match_info.EffectiveUserIDIsValid ())
638 return false;
639
640 if (m_match_info.EffectiveGroupIDIsValid ())
641 return false;
642
643 if (m_match_info.GetArchitecture().IsValid())
644 return false;
645
646 if (m_match_all_users)
647 return false;
648
649 return true;
Greg Clayton32e0a752011-03-30 18:16:51 +0000650}
651
652void
Greg Clayton8b82f082011-04-12 05:54:46 +0000653ProcessInstanceInfoMatch::Clear()
Greg Clayton32e0a752011-03-30 18:16:51 +0000654{
655 m_match_info.Clear();
656 m_name_match_type = eNameMatchIgnore;
657 m_match_all_users = false;
658}
Greg Clayton58be07b2011-01-07 06:08:19 +0000659
Greg Claytonc3776bf2012-02-09 06:16:32 +0000660ProcessSP
Jim Ingham583bbb12016-03-07 21:50:25 +0000661Process::FindPlugin (lldb::TargetSP target_sp, const char *plugin_name, ListenerSP listener_sp, const FileSpec *crash_file_path)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000662{
Greg Clayton949e8222013-01-16 17:29:04 +0000663 static uint32_t g_process_unique_id = 0;
664
Greg Claytonc3776bf2012-02-09 06:16:32 +0000665 ProcessSP process_sp;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000666 ProcessCreateInstance create_callback = nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000667 if (plugin_name)
668 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000669 ConstString const_plugin_name(plugin_name);
670 create_callback = PluginManager::GetProcessCreateCallbackForPluginName (const_plugin_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000671 if (create_callback)
672 {
Jim Ingham583bbb12016-03-07 21:50:25 +0000673 process_sp = create_callback(target_sp, listener_sp, crash_file_path);
Greg Claytonc3776bf2012-02-09 06:16:32 +0000674 if (process_sp)
675 {
Zachary Turner7529df92015-09-01 20:02:29 +0000676 if (process_sp->CanDebug(target_sp, true))
Greg Clayton949e8222013-01-16 17:29:04 +0000677 {
678 process_sp->m_process_unique_id = ++g_process_unique_id;
679 }
680 else
Greg Claytonc3776bf2012-02-09 06:16:32 +0000681 process_sp.reset();
682 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000683 }
684 }
685 else
686 {
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000687 for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != nullptr; ++idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000688 {
Jim Ingham583bbb12016-03-07 21:50:25 +0000689 process_sp = create_callback(target_sp, listener_sp, crash_file_path);
Greg Claytonc3776bf2012-02-09 06:16:32 +0000690 if (process_sp)
691 {
Zachary Turner7529df92015-09-01 20:02:29 +0000692 if (process_sp->CanDebug(target_sp, false))
Greg Clayton949e8222013-01-16 17:29:04 +0000693 {
694 process_sp->m_process_unique_id = ++g_process_unique_id;
Greg Claytonc3776bf2012-02-09 06:16:32 +0000695 break;
Greg Clayton949e8222013-01-16 17:29:04 +0000696 }
697 else
698 process_sp.reset();
Greg Claytonc3776bf2012-02-09 06:16:32 +0000699 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000700 }
701 }
Greg Claytonc3776bf2012-02-09 06:16:32 +0000702 return process_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000703}
704
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000705ConstString &
706Process::GetStaticBroadcasterClass ()
707{
708 static ConstString class_name ("lldb.process");
709 return class_name;
710}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000711
Jim Ingham583bbb12016-03-07 21:50:25 +0000712Process::Process(lldb::TargetSP target_sp, ListenerSP listener_sp) :
713 Process(target_sp, listener_sp, UnixSignals::Create(HostInfo::GetArchitecture()))
Todd Fiala4ceced32014-08-29 17:35:57 +0000714{
715 // This constructor just delegates to the full Process constructor,
716 // defaulting to using the Host's UnixSignals.
717}
718
Jim Ingham583bbb12016-03-07 21:50:25 +0000719Process::Process(lldb::TargetSP target_sp, ListenerSP listener_sp, const UnixSignalsSP &unix_signals_sp) :
Greg Clayton332e8b12015-01-13 21:13:08 +0000720 ProcessProperties (this),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000721 UserID (LLDB_INVALID_PROCESS_ID),
Jim Ingham583bbb12016-03-07 21:50:25 +0000722 Broadcaster ((target_sp->GetDebugger().GetBroadcasterManager()), Process::GetStaticBroadcasterClass().AsCString()),
Zachary Turner7529df92015-09-01 20:02:29 +0000723 m_target_sp (target_sp),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000724 m_public_state (eStateUnloaded),
725 m_private_state (eStateUnloaded),
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000726 m_private_state_broadcaster(nullptr, "lldb.process.internal_state_broadcaster"),
727 m_private_state_control_broadcaster(nullptr, "lldb.process.internal_state_control_broadcaster"),
Jim Ingham583bbb12016-03-07 21:50:25 +0000728 m_private_state_listener_sp (Listener::MakeListener("lldb.process.internal_state_listener")),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000729 m_private_state_control_wait(),
Jim Ingham4b536182011-08-09 02:12:22 +0000730 m_mod_id (),
Greg Clayton949e8222013-01-16 17:29:04 +0000731 m_process_unique_id(0),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000732 m_thread_index_id (0),
Han Ming Ongc2c423e2013-01-08 22:10:01 +0000733 m_thread_id_to_index_id_map (),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000734 m_exit_status (-1),
735 m_exit_string (),
Todd Fiala7b0917a2014-09-15 20:07:33 +0000736 m_exit_status_mutex(),
Andrew Kaylorba4e61d2013-05-07 18:35:34 +0000737 m_thread_mutex (Mutex::eMutexTypeRecursive),
738 m_thread_list_real (this),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000739 m_thread_list (this),
Jason Molenda864f1cc2013-11-11 05:20:44 +0000740 m_extended_thread_list (this),
Jason Molenda4ff13262013-11-20 00:31:38 +0000741 m_extended_thread_stop_id (0),
Jason Molenda5e8dce42013-12-13 00:29:16 +0000742 m_queue_list (this),
743 m_queue_list_stop_id (0),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000744 m_notifications (),
Greg Clayton3af9ea52010-11-18 05:57:03 +0000745 m_image_tokens (),
Jim Ingham583bbb12016-03-07 21:50:25 +0000746 m_listener_sp (listener_sp),
Greg Clayton3af9ea52010-11-18 05:57:03 +0000747 m_breakpoint_site_list (),
Greg Clayton3af9ea52010-11-18 05:57:03 +0000748 m_dynamic_checkers_ap (),
Todd Fiala4ceced32014-08-29 17:35:57 +0000749 m_unix_signals_sp (unix_signals_sp),
Greg Clayton3af9ea52010-11-18 05:57:03 +0000750 m_abi_sp (),
Caroline Ticeef5c6d02010-11-16 05:07:41 +0000751 m_process_input_reader (),
Greg Clayton3e06bd92011-01-09 21:07:35 +0000752 m_stdio_communication ("process.stdio"),
Greg Clayton3af9ea52010-11-18 05:57:03 +0000753 m_stdio_communication_mutex (Mutex::eMutexTypeRecursive),
Vince Harrondf3f00f2015-02-10 21:09:04 +0000754 m_stdin_forward (false),
Greg Clayton58be07b2011-01-07 06:08:19 +0000755 m_stdout_data (),
Greg Clayton93e86192011-11-13 04:45:22 +0000756 m_stderr_data (),
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000757 m_profile_data_comm_mutex (Mutex::eMutexTypeRecursive),
758 m_profile_data (),
Pavel Labath44464872015-05-27 12:40:32 +0000759 m_iohandler_sync (0),
Greg Claytond495c532011-05-17 03:37:42 +0000760 m_memory_cache (*this),
761 m_allocated_memory_cache (*this),
Greg Claytone24c4ac2011-11-17 04:46:02 +0000762 m_should_detach (false),
Sean Callanan90539452011-09-20 23:01:51 +0000763 m_next_event_action_ap(),
Greg Clayton96249852013-04-18 16:57:27 +0000764 m_public_run_lock (),
Greg Clayton96249852013-04-18 16:57:27 +0000765 m_private_run_lock (),
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000766 m_stop_info_override_callback(nullptr),
Greg Claytonc00ca312015-04-02 18:44:58 +0000767 m_finalizing (false),
768 m_finalize_called (false),
Greg Claytonf9b57b92013-05-10 23:48:10 +0000769 m_clear_thread_plans_on_stop (false),
Greg Claytonc00ca312015-04-02 18:44:58 +0000770 m_force_next_event_delivery (false),
Jim Ingham0161b492013-02-09 01:29:05 +0000771 m_last_broadcast_state (eStateInvalid),
Jason Molenda69b6b632013-03-05 03:33:59 +0000772 m_destroy_in_process (false),
Ewan Crawford90ff7912015-07-14 10:56:58 +0000773 m_can_interpret_function_calls(false),
Jason Molendaef7d6412015-08-06 03:27:10 +0000774 m_warnings_issued (),
Jason Molenda69b6b632013-03-05 03:33:59 +0000775 m_can_jit(eCanJITDontKnow)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000776{
Jim Ingham4bddaeb2012-02-16 06:50:00 +0000777 CheckInWithManager ();
Caroline Tice1559a462010-09-27 00:30:10 +0000778
Greg Clayton5160ce52013-03-27 23:08:40 +0000779 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000780 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000781 log->Printf ("%p Process::Process()", static_cast<void*>(this));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000782
Todd Fiala4ceced32014-08-29 17:35:57 +0000783 if (!m_unix_signals_sp)
Chaoren Lin98d0a4b2015-07-14 01:09:28 +0000784 m_unix_signals_sp = std::make_shared<UnixSignals>();
Todd Fiala4ceced32014-08-29 17:35:57 +0000785
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000786 SetEventName (eBroadcastBitStateChanged, "state-changed");
787 SetEventName (eBroadcastBitInterrupt, "interrupt");
788 SetEventName (eBroadcastBitSTDOUT, "stdout-available");
789 SetEventName (eBroadcastBitSTDERR, "stderr-available");
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000790 SetEventName (eBroadcastBitProfileData, "profile-data-available");
Chaoren Lin98d0a4b2015-07-14 01:09:28 +0000791
Greg Clayton35a4cc52012-10-29 20:52:08 +0000792 m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlStop , "control-stop" );
793 m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlPause , "control-pause" );
794 m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlResume, "control-resume");
795
Jim Ingham583bbb12016-03-07 21:50:25 +0000796 m_listener_sp->StartListeningForEvents (this,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000797 eBroadcastBitStateChanged |
798 eBroadcastBitInterrupt |
799 eBroadcastBitSTDOUT |
Han Ming Ongab3b8b22012-11-17 00:21:04 +0000800 eBroadcastBitSTDERR |
801 eBroadcastBitProfileData);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000802
Jim Ingham583bbb12016-03-07 21:50:25 +0000803 m_private_state_listener_sp->StartListeningForEvents(&m_private_state_broadcaster,
Jim Inghamcfc09352012-07-27 23:57:19 +0000804 eBroadcastBitStateChanged |
805 eBroadcastBitInterrupt);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000806
Jim Ingham583bbb12016-03-07 21:50:25 +0000807 m_private_state_listener_sp->StartListeningForEvents(&m_private_state_control_broadcaster,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000808 eBroadcastInternalStateControlStop |
809 eBroadcastInternalStateControlPause |
810 eBroadcastInternalStateControlResume);
Todd Fiala4ceced32014-08-29 17:35:57 +0000811 // We need something valid here, even if just the default UnixSignalsSP.
812 assert (m_unix_signals_sp && "null m_unix_signals_sp after initialization");
Pavel Labathf2991482015-10-20 10:33:17 +0000813
814 // Allow the platform to override the default cache line size
815 OptionValueSP value_sp =
816 m_collection_sp->GetPropertyAtIndex(nullptr, true, ePropertyMemCacheLineSize)->GetValue();
817 uint32_t platform_cache_line_size = target_sp->GetPlatform()->GetDefaultMemoryCacheLineSize();
818 if (! value_sp->OptionWasSet() && platform_cache_line_size != 0)
819 value_sp->SetUInt64Value(platform_cache_line_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000820}
821
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000822Process::~Process()
823{
Greg Clayton5160ce52013-03-27 23:08:40 +0000824 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000825 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000826 log->Printf ("%p Process::~Process()", static_cast<void*>(this));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000827 StopPrivateStateThread();
Zachary Turner39de3112014-09-09 20:54:56 +0000828
829 // ThreadList::Clear() will try to acquire this process's mutex, so
830 // explicitly clear the thread list here to ensure that the mutex
831 // is not destroyed before the thread list.
832 m_thread_list.Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000833}
834
Greg Clayton67cc0632012-08-22 17:17:09 +0000835const ProcessPropertiesSP &
836Process::GetGlobalProperties()
837{
Greg Claytoncc2e27f2016-02-26 23:20:08 +0000838 // NOTE: intentional leak so we don't crash if global destructor chain gets
839 // called as other threads still use the result of this function
840 static ProcessPropertiesSP *g_settings_sp_ptr = nullptr;
Greg Clayton04df8ee2016-02-26 19:38:18 +0000841 static std::once_flag g_once_flag;
842 std::call_once(g_once_flag, []() {
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000843 g_settings_sp_ptr = new ProcessPropertiesSP(new ProcessProperties(nullptr));
Greg Clayton04df8ee2016-02-26 19:38:18 +0000844 });
Greg Claytoncc2e27f2016-02-26 23:20:08 +0000845 return *g_settings_sp_ptr;
Greg Clayton67cc0632012-08-22 17:17:09 +0000846}
847
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000848void
849Process::Finalize()
850{
Greg Claytonc00ca312015-04-02 18:44:58 +0000851 m_finalizing = true;
852
Ilia Kc7efd562015-03-26 07:40:40 +0000853 // Destroy this process if needed
854 switch (GetPrivateState())
855 {
856 case eStateConnected:
857 case eStateAttaching:
858 case eStateLaunching:
859 case eStateStopped:
860 case eStateRunning:
861 case eStateStepping:
862 case eStateCrashed:
863 case eStateSuspended:
Jason Molendaede31932015-04-17 05:01:58 +0000864 Destroy(false);
Ilia Kc7efd562015-03-26 07:40:40 +0000865 break;
866
867 case eStateInvalid:
868 case eStateUnloaded:
869 case eStateDetached:
870 case eStateExited:
871 break;
872 }
Greg Claytone24c4ac2011-11-17 04:46:02 +0000873
Greg Clayton1ed54f52011-10-01 00:45:15 +0000874 // Clear our broadcaster before we proceed with destroying
875 Broadcaster::Clear();
876
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000877 // Do any cleanup needed prior to being destructed... Subclasses
878 // that override this method should call this superclass method as well.
Jim Inghamd0a3e122011-02-16 17:54:55 +0000879
880 // We need to destroy the loader before the derived Process class gets destroyed
881 // since it is very likely that undoing the loader will require access to the real process.
Greg Clayton894f82f2012-01-20 23:08:34 +0000882 m_dynamic_checkers_ap.reset();
883 m_abi_sp.reset();
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000884 m_os_ap.reset();
Jason Molendaeef51062013-11-05 03:57:19 +0000885 m_system_runtime_ap.reset();
Greg Clayton894f82f2012-01-20 23:08:34 +0000886 m_dyld_ap.reset();
Andrew MacPherson17220c12014-03-05 10:12:43 +0000887 m_jit_loaders_ap.reset();
Andrew Kaylorba4e61d2013-05-07 18:35:34 +0000888 m_thread_list_real.Destroy();
Greg Claytone1cd1be2012-01-29 20:56:30 +0000889 m_thread_list.Destroy();
Jason Molenda864f1cc2013-11-11 05:20:44 +0000890 m_extended_thread_list.Destroy();
Jason Molenda5e8dce42013-12-13 00:29:16 +0000891 m_queue_list.Clear();
892 m_queue_list_stop_id = 0;
Greg Clayton894f82f2012-01-20 23:08:34 +0000893 std::vector<Notifications> empty_notifications;
894 m_notifications.swap(empty_notifications);
895 m_image_tokens.clear();
896 m_memory_cache.Clear();
897 m_allocated_memory_cache.Clear();
898 m_language_runtimes.clear();
Kuba Breckaafdf8422014-10-10 23:43:03 +0000899 m_instrumentation_runtimes.clear();
Greg Clayton894f82f2012-01-20 23:08:34 +0000900 m_next_event_action_ap.reset();
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000901 m_stop_info_override_callback = nullptr;
Greg Clayton08765fa2015-05-28 03:24:30 +0000902 // Clear the last natural stop ID since it has a strong
903 // reference to this process
904 m_mod_id.SetStopEventForLastNaturalStopID(EventSP());
Greg Clayton35a4cc52012-10-29 20:52:08 +0000905//#ifdef LLDB_CONFIGURATION_DEBUG
906// StreamFile s(stdout, false);
907// EventSP event_sp;
Jim Ingham583bbb12016-03-07 21:50:25 +0000908// while (m_private_state_listener_sp->GetNextEvent(event_sp))
Greg Clayton35a4cc52012-10-29 20:52:08 +0000909// {
910// event_sp->Dump (&s);
911// s.EOL();
912// }
913//#endif
914 // We have to be very careful here as the m_private_state_listener might
915 // contain events that have ProcessSP values in them which can keep this
916 // process around forever. These events need to be cleared out.
Jim Ingham583bbb12016-03-07 21:50:25 +0000917 m_private_state_listener_sp->Clear();
Ed Maste64fad602013-07-29 20:58:06 +0000918 m_public_run_lock.TrySetRunning(); // This will do nothing if already locked
919 m_public_run_lock.SetStopped();
920 m_private_run_lock.TrySetRunning(); // This will do nothing if already locked
921 m_private_run_lock.SetStopped();
Jim Ingham4fc6cb92012-08-22 21:34:33 +0000922 m_finalize_called = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000923}
924
925void
926Process::RegisterNotificationCallbacks (const Notifications& callbacks)
927{
928 m_notifications.push_back(callbacks);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000929 if (callbacks.initialize != nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000930 callbacks.initialize (callbacks.baton, this);
931}
932
933bool
934Process::UnregisterNotificationCallbacks(const Notifications& callbacks)
935{
936 std::vector<Notifications>::iterator pos, end = m_notifications.end();
937 for (pos = m_notifications.begin(); pos != end; ++pos)
938 {
939 if (pos->baton == callbacks.baton &&
940 pos->initialize == callbacks.initialize &&
941 pos->process_state_changed == callbacks.process_state_changed)
942 {
943 m_notifications.erase(pos);
944 return true;
945 }
946 }
947 return false;
948}
949
950void
951Process::SynchronouslyNotifyStateChanged (StateType state)
952{
953 std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end();
954 for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos)
955 {
956 if (notification_pos->process_state_changed)
957 notification_pos->process_state_changed (notification_pos->baton, this, state);
958 }
959}
960
961// FIXME: We need to do some work on events before the general Listener sees them.
962// For instance if we are continuing from a breakpoint, we need to ensure that we do
963// the little "insert real insn, step & stop" trick. But we can't do that when the
964// event is delivered by the broadcaster - since that is done on the thread that is
965// waiting for new events, so if we needed more than one event for our handling, we would
966// stall. So instead we do it when we fetch the event off of the queue.
967//
968
969StateType
970Process::GetNextEvent (EventSP &event_sp)
971{
972 StateType state = eStateInvalid;
973
Jim Ingham583bbb12016-03-07 21:50:25 +0000974 if (m_listener_sp->GetNextEventForBroadcaster (this, event_sp) && event_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000975 state = Process::ProcessEventData::GetStateFromEvent (event_sp.get());
976
977 return state;
978}
979
Pavel Labath44464872015-05-27 12:40:32 +0000980void
981Process::SyncIOHandler (uint32_t iohandler_id, uint64_t timeout_msec)
Todd Fialaa3b89e22014-08-12 14:33:19 +0000982{
Todd Fialaa3b89e22014-08-12 14:33:19 +0000983 // don't sync (potentially context switch) in case where there is no process IO
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +0000984 if (!m_process_input_reader)
Pavel Labath44464872015-05-27 12:40:32 +0000985 return;
Todd Fialaa3b89e22014-08-12 14:33:19 +0000986
Pavel Labath44464872015-05-27 12:40:32 +0000987 TimeValue timeout = TimeValue::Now();
988 timeout.OffsetWithMicroSeconds(timeout_msec*1000);
989 uint32_t new_iohandler_id = 0;
990 m_iohandler_sync.WaitForValueNotEqualTo(iohandler_id, new_iohandler_id, &timeout);
Todd Fialaa3b89e22014-08-12 14:33:19 +0000991
Pavel Labath44464872015-05-27 12:40:32 +0000992 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
993 if (log)
994 log->Printf("Process::%s waited for m_iohandler_sync to change from %u, new value is %u", __FUNCTION__, iohandler_id, new_iohandler_id);
Todd Fialaa3b89e22014-08-12 14:33:19 +0000995}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000996
997StateType
Greg Claytondc6224e2014-10-21 01:00:42 +0000998Process::WaitForProcessToStop (const TimeValue *timeout,
999 EventSP *event_sp_ptr,
1000 bool wait_always,
Jim Ingham583bbb12016-03-07 21:50:25 +00001001 ListenerSP hijack_listener_sp,
Pavel Labath19da1f12015-12-07 12:36:52 +00001002 Stream *stream,
1003 bool use_run_lock)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001004{
Jim Ingham4b536182011-08-09 02:12:22 +00001005 // We can't just wait for a "stopped" event, because the stopped event may have restarted the target.
1006 // We have to actually check each event, and in the case of a stopped event check the restarted flag
1007 // on the event.
Greg Clayton85fb1b92012-09-11 02:33:37 +00001008 if (event_sp_ptr)
1009 event_sp_ptr->reset();
Jim Ingham4b536182011-08-09 02:12:22 +00001010 StateType state = GetState();
1011 // If we are exited or detached, we won't ever get back to any
1012 // other valid state...
1013 if (state == eStateDetached || state == eStateExited)
1014 return state;
1015
Daniel Malea9e9919f2013-10-09 16:56:28 +00001016 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1017 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001018 log->Printf ("Process::%s (timeout = %p)", __FUNCTION__,
1019 static_cast<const void*>(timeout));
Daniel Malea9e9919f2013-10-09 16:56:28 +00001020
1021 if (!wait_always &&
1022 StateIsStoppedState(state, true) &&
Jim Ingham5b4c5eb2015-04-22 17:48:24 +00001023 StateIsStoppedState(GetPrivateState(), true))
1024 {
Daniel Malea9e9919f2013-10-09 16:56:28 +00001025 if (log)
1026 log->Printf("Process::%s returning without waiting for events; process private and public states are already 'stopped'.",
1027 __FUNCTION__);
Pavel Labath78521ef2015-03-06 10:52:47 +00001028 // We need to toggle the run lock as this won't get done in
1029 // SetPublicState() if the process is hijacked.
Jim Ingham583bbb12016-03-07 21:50:25 +00001030 if (hijack_listener_sp && use_run_lock)
Pavel Labath78521ef2015-03-06 10:52:47 +00001031 m_public_run_lock.SetStopped();
Daniel Malea9e9919f2013-10-09 16:56:28 +00001032 return state;
1033 }
1034
Jim Ingham4b536182011-08-09 02:12:22 +00001035 while (state != eStateInvalid)
1036 {
Greg Clayton85fb1b92012-09-11 02:33:37 +00001037 EventSP event_sp;
Jim Ingham583bbb12016-03-07 21:50:25 +00001038 state = WaitForStateChangedEvents (timeout, event_sp, hijack_listener_sp);
Greg Clayton85fb1b92012-09-11 02:33:37 +00001039 if (event_sp_ptr && event_sp)
1040 *event_sp_ptr = event_sp;
1041
Jim Ingham583bbb12016-03-07 21:50:25 +00001042 bool pop_process_io_handler = (hijack_listener_sp.get() != nullptr);
Greg Claytondc6224e2014-10-21 01:00:42 +00001043 Process::HandleProcessStateChangedEvent (event_sp, stream, pop_process_io_handler);
1044
Jim Ingham4b536182011-08-09 02:12:22 +00001045 switch (state)
1046 {
1047 case eStateCrashed:
1048 case eStateDetached:
1049 case eStateExited:
1050 case eStateUnloaded:
Greg Clayton44d93782014-01-27 23:43:24 +00001051 // We need to toggle the run lock as this won't get done in
1052 // SetPublicState() if the process is hijacked.
Jim Ingham583bbb12016-03-07 21:50:25 +00001053 if (hijack_listener_sp && use_run_lock)
Greg Clayton44d93782014-01-27 23:43:24 +00001054 m_public_run_lock.SetStopped();
Jim Ingham4b536182011-08-09 02:12:22 +00001055 return state;
1056 case eStateStopped:
1057 if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
1058 continue;
1059 else
Greg Clayton44d93782014-01-27 23:43:24 +00001060 {
1061 // We need to toggle the run lock as this won't get done in
1062 // SetPublicState() if the process is hijacked.
Jim Ingham583bbb12016-03-07 21:50:25 +00001063 if (hijack_listener_sp && use_run_lock)
Greg Clayton44d93782014-01-27 23:43:24 +00001064 m_public_run_lock.SetStopped();
Jim Ingham4b536182011-08-09 02:12:22 +00001065 return state;
Greg Clayton44d93782014-01-27 23:43:24 +00001066 }
Jim Ingham4b536182011-08-09 02:12:22 +00001067 default:
1068 continue;
1069 }
1070 }
1071 return state;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001072}
1073
Greg Claytondc6224e2014-10-21 01:00:42 +00001074bool
1075Process::HandleProcessStateChangedEvent (const EventSP &event_sp,
1076 Stream *stream,
1077 bool &pop_process_io_handler)
1078{
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001079 const bool handle_pop = pop_process_io_handler;
Greg Claytondc6224e2014-10-21 01:00:42 +00001080
1081 pop_process_io_handler = false;
1082 ProcessSP process_sp = Process::ProcessEventData::GetProcessFromEvent(event_sp.get());
1083
1084 if (!process_sp)
1085 return false;
1086
1087 StateType event_state = Process::ProcessEventData::GetStateFromEvent (event_sp.get());
1088 if (event_state == eStateInvalid)
1089 return false;
1090
1091 switch (event_state)
1092 {
1093 case eStateInvalid:
1094 case eStateUnloaded:
Greg Claytondc6224e2014-10-21 01:00:42 +00001095 case eStateAttaching:
1096 case eStateLaunching:
1097 case eStateStepping:
1098 case eStateDetached:
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001099 if (stream)
1100 stream->Printf("Process %" PRIu64 " %s\n",
1101 process_sp->GetID(),
1102 StateAsCString (event_state));
1103 if (event_state == eStateDetached)
1104 pop_process_io_handler = true;
Greg Claytondc6224e2014-10-21 01:00:42 +00001105 break;
1106
Stephane Sezerf2ef94e2014-12-13 05:23:51 +00001107 case eStateConnected:
Greg Claytondc6224e2014-10-21 01:00:42 +00001108 case eStateRunning:
1109 // Don't be chatty when we run...
1110 break;
1111
1112 case eStateExited:
1113 if (stream)
1114 process_sp->GetStatus(*stream);
1115 pop_process_io_handler = true;
1116 break;
1117
1118 case eStateStopped:
1119 case eStateCrashed:
1120 case eStateSuspended:
1121 // Make sure the program hasn't been auto-restarted:
1122 if (Process::ProcessEventData::GetRestartedFromEvent (event_sp.get()))
1123 {
1124 if (stream)
1125 {
1126 size_t num_reasons = Process::ProcessEventData::GetNumRestartedReasons(event_sp.get());
1127 if (num_reasons > 0)
1128 {
1129 // FIXME: Do we want to report this, or would that just be annoyingly chatty?
1130 if (num_reasons == 1)
1131 {
1132 const char *reason = Process::ProcessEventData::GetRestartedReasonAtIndex (event_sp.get(), 0);
1133 stream->Printf ("Process %" PRIu64 " stopped and restarted: %s\n",
1134 process_sp->GetID(),
1135 reason ? reason : "<UNKNOWN REASON>");
1136 }
1137 else
1138 {
1139 stream->Printf ("Process %" PRIu64 " stopped and restarted, reasons:\n",
1140 process_sp->GetID());
1141
1142
1143 for (size_t i = 0; i < num_reasons; i++)
1144 {
1145 const char *reason = Process::ProcessEventData::GetRestartedReasonAtIndex (event_sp.get(), i);
1146 stream->Printf("\t%s\n", reason ? reason : "<UNKNOWN REASON>");
1147 }
1148 }
1149 }
1150 }
1151 }
1152 else
1153 {
1154 // Lock the thread list so it doesn't change on us, this is the scope for the locker:
1155 {
1156 ThreadList &thread_list = process_sp->GetThreadList();
1157 Mutex::Locker locker (thread_list.GetMutex());
1158
1159 ThreadSP curr_thread (thread_list.GetSelectedThread());
1160 ThreadSP thread;
1161 StopReason curr_thread_stop_reason = eStopReasonInvalid;
1162 if (curr_thread)
1163 curr_thread_stop_reason = curr_thread->GetStopReason();
1164 if (!curr_thread ||
1165 !curr_thread->IsValid() ||
1166 curr_thread_stop_reason == eStopReasonInvalid ||
1167 curr_thread_stop_reason == eStopReasonNone)
1168 {
1169 // Prefer a thread that has just completed its plan over another thread as current thread.
1170 ThreadSP plan_thread;
1171 ThreadSP other_thread;
Jim Inghamce400d92015-07-08 00:06:30 +00001172
Greg Claytondc6224e2014-10-21 01:00:42 +00001173 const size_t num_threads = thread_list.GetSize();
1174 size_t i;
1175 for (i = 0; i < num_threads; ++i)
1176 {
1177 thread = thread_list.GetThreadAtIndex(i);
1178 StopReason thread_stop_reason = thread->GetStopReason();
1179 switch (thread_stop_reason)
1180 {
1181 case eStopReasonInvalid:
1182 case eStopReasonNone:
1183 break;
1184
Jim Inghamce400d92015-07-08 00:06:30 +00001185 case eStopReasonSignal:
1186 {
1187 // Don't select a signal thread if we weren't going to stop at that
1188 // signal. We have to have had another reason for stopping here, and
1189 // the user doesn't want to see this thread.
1190 uint64_t signo = thread->GetStopInfo()->GetValue();
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00001191 if (process_sp->GetUnixSignals()->GetShouldStop(signo))
Jim Inghamce400d92015-07-08 00:06:30 +00001192 {
1193 if (!other_thread)
1194 other_thread = thread;
1195 }
1196 break;
1197 }
Greg Claytondc6224e2014-10-21 01:00:42 +00001198 case eStopReasonTrace:
1199 case eStopReasonBreakpoint:
1200 case eStopReasonWatchpoint:
Greg Claytondc6224e2014-10-21 01:00:42 +00001201 case eStopReasonException:
1202 case eStopReasonExec:
1203 case eStopReasonThreadExiting:
1204 case eStopReasonInstrumentation:
1205 if (!other_thread)
1206 other_thread = thread;
1207 break;
1208 case eStopReasonPlanComplete:
1209 if (!plan_thread)
1210 plan_thread = thread;
1211 break;
1212 }
1213 }
1214 if (plan_thread)
1215 thread_list.SetSelectedThreadByID (plan_thread->GetID());
1216 else if (other_thread)
1217 thread_list.SetSelectedThreadByID (other_thread->GetID());
1218 else
1219 {
1220 if (curr_thread && curr_thread->IsValid())
1221 thread = curr_thread;
1222 else
1223 thread = thread_list.GetThreadAtIndex(0);
1224
1225 if (thread)
1226 thread_list.SetSelectedThreadByID (thread->GetID());
1227 }
1228 }
1229 }
1230 // Drop the ThreadList mutex by here, since GetThreadStatus below might have to run code,
1231 // e.g. for Data formatters, and if we hold the ThreadList mutex, then the process is going to
1232 // have a hard time restarting the process.
1233 if (stream)
1234 {
1235 Debugger &debugger = process_sp->GetTarget().GetDebugger();
1236 if (debugger.GetTargetList().GetSelectedTarget().get() == &process_sp->GetTarget())
1237 {
1238 const bool only_threads_with_stop_reason = true;
1239 const uint32_t start_frame = 0;
1240 const uint32_t num_frames = 1;
1241 const uint32_t num_frames_with_source = 1;
1242 process_sp->GetStatus(*stream);
1243 process_sp->GetThreadStatus (*stream,
1244 only_threads_with_stop_reason,
1245 start_frame,
1246 num_frames,
1247 num_frames_with_source);
1248 }
1249 else
1250 {
1251 uint32_t target_idx = debugger.GetTargetList().GetIndexOfTarget(process_sp->GetTarget().shared_from_this());
1252 if (target_idx != UINT32_MAX)
1253 stream->Printf ("Target %d: (", target_idx);
1254 else
1255 stream->Printf ("Target <unknown index>: (");
1256 process_sp->GetTarget().Dump (stream, eDescriptionLevelBrief);
1257 stream->Printf (") stopped.\n");
1258 }
1259 }
1260
1261 // Pop the process IO handler
1262 pop_process_io_handler = true;
1263 }
1264 break;
1265 }
1266
1267 if (handle_pop && pop_process_io_handler)
1268 process_sp->PopProcessIOHandler();
1269
1270 return true;
1271}
1272
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001273StateType
Eugene Zelenko8f30a652015-10-23 18:39:37 +00001274Process::WaitForState(const TimeValue *timeout,
1275 const StateType *match_states,
1276 const uint32_t num_match_states)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001277{
1278 EventSP event_sp;
Greg Clayton05faeb72010-10-07 04:19:01 +00001279 StateType state = GetState();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001280 while (state != eStateInvalid)
1281 {
Greg Clayton05faeb72010-10-07 04:19:01 +00001282 // If we are exited or detached, we won't ever get back to any
1283 // other valid state...
1284 if (state == eStateDetached || state == eStateExited)
1285 return state;
1286
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001287 state = WaitForStateChangedEvents(timeout, event_sp, nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001288
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001289 for (uint32_t i = 0; i < num_match_states; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001290 {
1291 if (match_states[i] == state)
1292 return state;
1293 }
1294 }
1295 return state;
1296}
1297
Jim Ingham30f9b212010-10-11 23:53:14 +00001298bool
Jim Ingham583bbb12016-03-07 21:50:25 +00001299Process::HijackProcessEvents (ListenerSP listener_sp)
Jim Ingham30f9b212010-10-11 23:53:14 +00001300{
Jim Ingham583bbb12016-03-07 21:50:25 +00001301 if (listener_sp)
Jim Ingham30f9b212010-10-11 23:53:14 +00001302 {
Jim Ingham583bbb12016-03-07 21:50:25 +00001303 return HijackBroadcaster(listener_sp, eBroadcastBitStateChanged | eBroadcastBitInterrupt);
Jim Ingham30f9b212010-10-11 23:53:14 +00001304 }
1305 else
1306 return false;
1307}
1308
1309void
1310Process::RestoreProcessEvents ()
1311{
1312 RestoreBroadcaster();
1313}
1314
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001315StateType
Jim Ingham583bbb12016-03-07 21:50:25 +00001316Process::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp, ListenerSP hijack_listener_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001317{
Greg Clayton5160ce52013-03-27 23:08:40 +00001318 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001319
1320 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001321 log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__,
1322 static_cast<const void*>(timeout));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001323
Jim Ingham583bbb12016-03-07 21:50:25 +00001324 ListenerSP listener_sp = hijack_listener_sp;
1325 if (!listener_sp)
1326 listener_sp = m_listener_sp;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001327
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001328 StateType state = eStateInvalid;
Jim Ingham583bbb12016-03-07 21:50:25 +00001329 if (listener_sp->WaitForEventForBroadcasterWithType (timeout,
1330 this,
1331 eBroadcastBitStateChanged | eBroadcastBitInterrupt,
1332 event_sp))
Jim Inghamcfc09352012-07-27 23:57:19 +00001333 {
1334 if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged)
1335 state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
1336 else if (log)
1337 log->Printf ("Process::%s got no event or was interrupted.", __FUNCTION__);
1338 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001339
1340 if (log)
1341 log->Printf ("Process::%s (timeout = %p, event_sp) => %s",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001342 __FUNCTION__, static_cast<const void*>(timeout),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001343 StateAsCString(state));
1344 return state;
1345}
1346
1347Event *
1348Process::PeekAtStateChangedEvents ()
1349{
Greg Clayton5160ce52013-03-27 23:08:40 +00001350 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001351
1352 if (log)
1353 log->Printf ("Process::%s...", __FUNCTION__);
1354
1355 Event *event_ptr;
Jim Ingham583bbb12016-03-07 21:50:25 +00001356 event_ptr = m_listener_sp->PeekAtNextEventForBroadcasterWithType (this,
Greg Clayton3fcbed62010-10-19 03:25:40 +00001357 eBroadcastBitStateChanged);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001358 if (log)
1359 {
1360 if (event_ptr)
1361 {
1362 log->Printf ("Process::%s (event_ptr) => %s",
1363 __FUNCTION__,
1364 StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr)));
1365 }
1366 else
1367 {
1368 log->Printf ("Process::%s no events found",
1369 __FUNCTION__);
1370 }
1371 }
1372 return event_ptr;
1373}
1374
1375StateType
1376Process::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp)
1377{
Greg Clayton5160ce52013-03-27 23:08:40 +00001378 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001379
1380 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001381 log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__,
1382 static_cast<const void*>(timeout));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001383
1384 StateType state = eStateInvalid;
Jim Ingham583bbb12016-03-07 21:50:25 +00001385 if (m_private_state_listener_sp->WaitForEventForBroadcasterWithType (timeout,
Greg Clayton6779606a2011-01-22 23:43:18 +00001386 &m_private_state_broadcaster,
Jim Inghamcfc09352012-07-27 23:57:19 +00001387 eBroadcastBitStateChanged | eBroadcastBitInterrupt,
Greg Clayton6779606a2011-01-22 23:43:18 +00001388 event_sp))
Jim Inghamcfc09352012-07-27 23:57:19 +00001389 if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged)
1390 state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001391
1392 // This is a bit of a hack, but when we wait here we could very well return
1393 // to the command-line, and that could disable the log, which would render the
1394 // log we got above invalid.
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001395 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001396 log->Printf ("Process::%s (timeout = %p, event_sp) => %s",
1397 __FUNCTION__, static_cast<const void *>(timeout),
1398 state == eStateInvalid ? "TIMEOUT" : StateAsCString(state));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001399 return state;
1400}
1401
1402bool
1403Process::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only)
1404{
Greg Clayton5160ce52013-03-27 23:08:40 +00001405 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001406
1407 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001408 log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__,
1409 static_cast<const void*>(timeout));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001410
1411 if (control_only)
Jim Ingham583bbb12016-03-07 21:50:25 +00001412 return m_private_state_listener_sp->WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001413 else
Jim Ingham583bbb12016-03-07 21:50:25 +00001414 return m_private_state_listener_sp->WaitForEvent(timeout, event_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001415}
1416
1417bool
1418Process::IsRunning () const
1419{
1420 return StateIsRunningState (m_public_state.GetValue());
1421}
1422
1423int
1424Process::GetExitStatus ()
1425{
Todd Fiala7b0917a2014-09-15 20:07:33 +00001426 Mutex::Locker locker (m_exit_status_mutex);
1427
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001428 if (m_public_state.GetValue() == eStateExited)
1429 return m_exit_status;
1430 return -1;
1431}
1432
1433const char *
1434Process::GetExitDescription ()
1435{
Todd Fiala7b0917a2014-09-15 20:07:33 +00001436 Mutex::Locker locker (m_exit_status_mutex);
1437
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001438 if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty())
1439 return m_exit_string.c_str();
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001440 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001441}
1442
Greg Clayton6779606a2011-01-22 23:43:18 +00001443bool
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001444Process::SetExitStatus (int status, const char *cstr)
1445{
Greg Clayton81e2b6b2015-06-01 23:14:09 +00001446 // Use a mutex to protect setting the exit status.
1447 Mutex::Locker locker (m_exit_status_mutex);
1448
Greg Clayton5160ce52013-03-27 23:08:40 +00001449 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
Greg Clayton414f5d32011-01-25 02:58:48 +00001450 if (log)
1451 log->Printf("Process::SetExitStatus (status=%i (0x%8.8x), description=%s%s%s)",
1452 status, status,
1453 cstr ? "\"" : "",
1454 cstr ? cstr : "NULL",
1455 cstr ? "\"" : "");
1456
Greg Clayton6779606a2011-01-22 23:43:18 +00001457 // We were already in the exited state
1458 if (m_private_state.GetValue() == eStateExited)
Greg Clayton414f5d32011-01-25 02:58:48 +00001459 {
Greg Clayton385d6032011-01-26 23:47:29 +00001460 if (log)
1461 log->Printf("Process::SetExitStatus () ignoring exit status because state was already set to eStateExited");
Greg Clayton6779606a2011-01-22 23:43:18 +00001462 return false;
Greg Clayton414f5d32011-01-25 02:58:48 +00001463 }
Todd Fiala7b0917a2014-09-15 20:07:33 +00001464
Greg Clayton81e2b6b2015-06-01 23:14:09 +00001465 m_exit_status = status;
1466 if (cstr)
1467 m_exit_string = cstr;
1468 else
1469 m_exit_string.clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001470
Pavel Labatha9a43372015-09-03 09:30:17 +00001471 // When we exit, we don't need the input reader anymore
Greg Clayton5df78fa2015-05-23 03:54:53 +00001472 if (m_process_input_reader)
1473 {
1474 m_process_input_reader->SetIsDone(true);
1475 m_process_input_reader->Cancel();
1476 m_process_input_reader.reset();
1477 }
Greg Clayton10177aa2010-12-08 05:08:21 +00001478
Greg Clayton08765fa2015-05-28 03:24:30 +00001479 // Clear the last natural stop ID since it has a strong
1480 // reference to this process
1481 m_mod_id.SetStopEventForLastNaturalStopID(EventSP());
1482
Greg Clayton6779606a2011-01-22 23:43:18 +00001483 SetPrivateState (eStateExited);
Greg Clayton5df78fa2015-05-23 03:54:53 +00001484
1485 // Allow subclasses to do some cleanup
1486 DidExit ();
1487
Greg Clayton6779606a2011-01-22 23:43:18 +00001488 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001489}
1490
Jason Molendaa814f702015-11-05 23:03:44 +00001491bool
1492Process::IsAlive ()
1493{
1494 switch (m_private_state.GetValue())
1495 {
Jason Molendaa814f702015-11-05 23:03:44 +00001496 case eStateConnected:
1497 case eStateAttaching:
1498 case eStateLaunching:
1499 case eStateStopped:
1500 case eStateRunning:
1501 case eStateStepping:
1502 case eStateCrashed:
1503 case eStateSuspended:
1504 return true;
Davide Italiano13fe2a92016-01-19 22:47:51 +00001505 default:
1506 return false;
Jason Molendaa814f702015-11-05 23:03:44 +00001507 }
1508}
1509
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001510// This static callback can be used to watch for local child processes on
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001511// the current host. The child process exits, the process will be
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001512// found in the global target list (we want to be completely sure that the
1513// lldb_private::Process doesn't go away before we can deliver the signal.
1514bool
Greg Claytone4e45922011-11-16 05:37:56 +00001515Process::SetProcessExitStatus (void *callback_baton,
1516 lldb::pid_t pid,
1517 bool exited,
1518 int signo, // Zero for no signal
1519 int exit_status // Exit value of process if signal is zero
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001520)
1521{
Greg Clayton5160ce52013-03-27 23:08:40 +00001522 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS));
Greg Claytone4e45922011-11-16 05:37:56 +00001523 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001524 log->Printf ("Process::SetProcessExitStatus (baton=%p, pid=%" PRIu64 ", exited=%i, signal=%i, exit_status=%i)\n",
Greg Claytone4e45922011-11-16 05:37:56 +00001525 callback_baton,
1526 pid,
1527 exited,
1528 signo,
1529 exit_status);
1530
1531 if (exited)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001532 {
Greg Clayton66111032010-06-23 01:19:29 +00001533 TargetSP target_sp(Debugger::FindTargetWithProcessID (pid));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001534 if (target_sp)
1535 {
1536 ProcessSP process_sp (target_sp->GetProcessSP());
1537 if (process_sp)
1538 {
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001539 const char *signal_cstr = nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001540 if (signo)
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00001541 signal_cstr = process_sp->GetUnixSignals()->GetSignalAsCString(signo);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001542
1543 process_sp->SetExitStatus (exit_status, signal_cstr);
1544 }
1545 }
1546 return true;
1547 }
1548 return false;
1549}
1550
Greg Clayton56d9a1b2011-08-22 02:49:39 +00001551void
1552Process::UpdateThreadListIfNeeded ()
1553{
1554 const uint32_t stop_id = GetStopID();
1555 if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID())
1556 {
Greg Clayton2637f822011-11-17 01:23:07 +00001557 const StateType state = GetPrivateState();
1558 if (StateIsStoppedState (state, true))
1559 {
1560 Mutex::Locker locker (m_thread_list.GetMutex ());
Greg Claytone24c4ac2011-11-17 04:46:02 +00001561 // m_thread_list does have its own mutex, but we need to
1562 // hold onto the mutex between the call to UpdateThreadList(...)
1563 // and the os->UpdateThreadList(...) so it doesn't change on us
Andrew Kaylorba4e61d2013-05-07 18:35:34 +00001564 ThreadList &old_thread_list = m_thread_list;
1565 ThreadList real_thread_list(this);
Greg Clayton2637f822011-11-17 01:23:07 +00001566 ThreadList new_thread_list(this);
1567 // Always update the thread list with the protocol specific
Greg Clayton9fc13552012-04-10 00:18:59 +00001568 // thread list, but only update if "true" is returned
Andrew Kaylorba4e61d2013-05-07 18:35:34 +00001569 if (UpdateThreadList (m_thread_list_real, real_thread_list))
Greg Clayton9fc13552012-04-10 00:18:59 +00001570 {
Jim Ingham09437922013-03-01 20:04:25 +00001571 // Don't call into the OperatingSystem to update the thread list if we are shutting down, since
1572 // that may call back into the SBAPI's, requiring the API lock which is already held by whoever is
1573 // shutting us down, causing a deadlock.
Pavel Labath862432c2015-11-03 16:05:18 +00001574 OperatingSystem *os = GetOperatingSystem ();
1575 if (os && !m_destroy_in_process)
Jim Ingham09437922013-03-01 20:04:25 +00001576 {
Pavel Labath862432c2015-11-03 16:05:18 +00001577 // Clear any old backing threads where memory threads might have been
1578 // backed by actual threads from the lldb_private::Process subclass
1579 size_t num_old_threads = old_thread_list.GetSize(false);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001580 for (size_t i = 0; i < num_old_threads; ++i)
Pavel Labath862432c2015-11-03 16:05:18 +00001581 old_thread_list.GetThreadAtIndex(i, false)->ClearBackingThread();
Greg Claytonb3ae8762013-04-12 20:07:46 +00001582
Pavel Labath862432c2015-11-03 16:05:18 +00001583 // Turn off dynamic types to ensure we don't run any expressions. Objective C
1584 // can run an expression to determine if a SBValue is a dynamic type or not
1585 // and we need to avoid this. OperatingSystem plug-ins can't run expressions
1586 // that require running code...
Greg Clayton15484402015-05-15 18:40:24 +00001587
Pavel Labath862432c2015-11-03 16:05:18 +00001588 Target &target = GetTarget();
1589 const lldb::DynamicValueType saved_prefer_dynamic = target.GetPreferDynamicValue ();
1590 if (saved_prefer_dynamic != lldb::eNoDynamicValues)
1591 target.SetPreferDynamicValue(lldb::eNoDynamicValues);
Greg Clayton15484402015-05-15 18:40:24 +00001592
Pavel Labath862432c2015-11-03 16:05:18 +00001593 // Now let the OperatingSystem plug-in update the thread list
Greg Clayton15484402015-05-15 18:40:24 +00001594
Pavel Labath862432c2015-11-03 16:05:18 +00001595 os->UpdateThreadList (old_thread_list, // Old list full of threads created by OS plug-in
1596 real_thread_list, // The actual thread list full of threads created by each lldb_private::Process subclass
1597 new_thread_list); // The new thread list that we will show to the user that gets filled in
Greg Clayton15484402015-05-15 18:40:24 +00001598
Pavel Labath862432c2015-11-03 16:05:18 +00001599 if (saved_prefer_dynamic != lldb::eNoDynamicValues)
1600 target.SetPreferDynamicValue(saved_prefer_dynamic);
1601 }
1602 else
1603 {
1604 // No OS plug-in, the new thread list is the same as the real thread list
1605 new_thread_list = real_thread_list;
Jim Ingham09437922013-03-01 20:04:25 +00001606 }
Jim Ingham02ff8e02013-06-22 00:55:02 +00001607
1608 m_thread_list_real.Update(real_thread_list);
Andrew Kaylorba4e61d2013-05-07 18:35:34 +00001609 m_thread_list.Update (new_thread_list);
1610 m_thread_list.SetStopID (stop_id);
Jason Molendaa6e91302013-11-19 05:44:41 +00001611
Jason Molenda4ff13262013-11-20 00:31:38 +00001612 if (GetLastNaturalStopID () != m_extended_thread_stop_id)
1613 {
1614 // Clear any extended threads that we may have accumulated previously
1615 m_extended_thread_list.Clear();
1616 m_extended_thread_stop_id = GetLastNaturalStopID ();
Jason Molenda5e8dce42013-12-13 00:29:16 +00001617
1618 m_queue_list.Clear();
1619 m_queue_list_stop_id = GetLastNaturalStopID ();
Jason Molenda4ff13262013-11-20 00:31:38 +00001620 }
Greg Clayton9fc13552012-04-10 00:18:59 +00001621 }
Greg Clayton2637f822011-11-17 01:23:07 +00001622 }
Greg Clayton56d9a1b2011-08-22 02:49:39 +00001623 }
1624}
1625
Jason Molenda5e8dce42013-12-13 00:29:16 +00001626void
1627Process::UpdateQueueListIfNeeded ()
1628{
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001629 if (m_system_runtime_ap)
Jason Molenda5e8dce42013-12-13 00:29:16 +00001630 {
1631 if (m_queue_list.GetSize() == 0 || m_queue_list_stop_id != GetLastNaturalStopID())
1632 {
1633 const StateType state = GetPrivateState();
1634 if (StateIsStoppedState (state, true))
1635 {
1636 m_system_runtime_ap->PopulateQueueList (m_queue_list);
1637 m_queue_list_stop_id = GetLastNaturalStopID();
1638 }
1639 }
1640 }
1641}
1642
Greg Claytona4d87472013-01-18 23:41:08 +00001643ThreadSP
1644Process::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context)
1645{
1646 OperatingSystem *os = GetOperatingSystem ();
1647 if (os)
1648 return os->CreateThread(tid, context);
1649 return ThreadSP();
1650}
1651
Han Ming Ongc2c423e2013-01-08 22:10:01 +00001652uint32_t
1653Process::GetNextThreadIndexID (uint64_t thread_id)
1654{
1655 return AssignIndexIDToThread(thread_id);
1656}
1657
1658bool
1659Process::HasAssignedIndexIDToThread(uint64_t thread_id)
1660{
Eugene Zelenko8f30a652015-10-23 18:39:37 +00001661 return (m_thread_id_to_index_id_map.find(thread_id) != m_thread_id_to_index_id_map.end());
Han Ming Ongc2c423e2013-01-08 22:10:01 +00001662}
1663
1664uint32_t
1665Process::AssignIndexIDToThread(uint64_t thread_id)
1666{
1667 uint32_t result = 0;
1668 std::map<uint64_t, uint32_t>::iterator iterator = m_thread_id_to_index_id_map.find(thread_id);
1669 if (iterator == m_thread_id_to_index_id_map.end())
1670 {
1671 result = ++m_thread_index_id;
1672 m_thread_id_to_index_id_map[thread_id] = result;
1673 }
1674 else
1675 {
1676 result = iterator->second;
1677 }
1678
1679 return result;
1680}
1681
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001682StateType
1683Process::GetState()
1684{
1685 // If any other threads access this we will need a mutex for it
1686 return m_public_state.GetValue ();
1687}
1688
Greg Claytondc6224e2014-10-21 01:00:42 +00001689bool
1690Process::StateChangedIsExternallyHijacked()
1691{
1692 if (IsHijackedForEvent(eBroadcastBitStateChanged))
1693 {
Jim Ingham583bbb12016-03-07 21:50:25 +00001694 const char *hijacking_name = GetHijackingListenerName();
1695 if (hijacking_name && strcmp(hijacking_name, "lldb.Process.ResumeSynchronous.hijack"))
Greg Claytondc6224e2014-10-21 01:00:42 +00001696 return true;
1697 }
1698 return false;
1699}
1700
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001701void
Jim Ingham221d51c2013-05-08 00:35:16 +00001702Process::SetPublicState (StateType new_state, bool restarted)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001703{
Greg Clayton5160ce52013-03-27 23:08:40 +00001704 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001705 if (log)
Jim Ingham221d51c2013-05-08 00:35:16 +00001706 log->Printf("Process::SetPublicState (state = %s, restarted = %i)", StateAsCString(new_state), restarted);
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001707 const StateType old_state = m_public_state.GetValue();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001708 m_public_state.SetValue (new_state);
Jim Ingham3b8285d2012-04-19 01:40:33 +00001709
1710 // On the transition from Run to Stopped, we unlock the writer end of the
1711 // run lock. The lock gets locked in Resume, which is the public API
1712 // to tell the program to run.
Greg Claytondc6224e2014-10-21 01:00:42 +00001713 if (!StateChangedIsExternallyHijacked())
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001714 {
Sean Callanan8b0737f2012-06-02 01:16:20 +00001715 if (new_state == eStateDetached)
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001716 {
Sean Callanan8b0737f2012-06-02 01:16:20 +00001717 if (log)
1718 log->Printf("Process::SetPublicState (%s) -- unlocking run lock for detach", StateAsCString(new_state));
Ed Maste64fad602013-07-29 20:58:06 +00001719 m_public_run_lock.SetStopped();
Sean Callanan8b0737f2012-06-02 01:16:20 +00001720 }
1721 else
1722 {
1723 const bool old_state_is_stopped = StateIsStoppedState(old_state, false);
1724 const bool new_state_is_stopped = StateIsStoppedState(new_state, false);
Jim Ingham221d51c2013-05-08 00:35:16 +00001725 if ((old_state_is_stopped != new_state_is_stopped))
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001726 {
Jim Ingham221d51c2013-05-08 00:35:16 +00001727 if (new_state_is_stopped && !restarted)
Sean Callanan8b0737f2012-06-02 01:16:20 +00001728 {
1729 if (log)
1730 log->Printf("Process::SetPublicState (%s) -- unlocking run lock", StateAsCString(new_state));
Ed Maste64fad602013-07-29 20:58:06 +00001731 m_public_run_lock.SetStopped();
Sean Callanan8b0737f2012-06-02 01:16:20 +00001732 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001733 }
Greg Clayton7fdf9ef2012-04-05 16:12:35 +00001734 }
1735 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001736}
1737
Jim Ingham3b8285d2012-04-19 01:40:33 +00001738Error
1739Process::Resume ()
1740{
Greg Clayton5160ce52013-03-27 23:08:40 +00001741 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
Jim Ingham3b8285d2012-04-19 01:40:33 +00001742 if (log)
1743 log->Printf("Process::Resume -- locking run lock");
Ed Maste64fad602013-07-29 20:58:06 +00001744 if (!m_public_run_lock.TrySetRunning())
Jim Ingham3b8285d2012-04-19 01:40:33 +00001745 {
1746 Error error("Resume request failed - process still running.");
1747 if (log)
Ed Maste64fad602013-07-29 20:58:06 +00001748 log->Printf ("Process::Resume: -- TrySetRunning failed, not resuming.");
Jim Ingham3b8285d2012-04-19 01:40:33 +00001749 return error;
1750 }
1751 return PrivateResume();
1752}
1753
Greg Claytondc6224e2014-10-21 01:00:42 +00001754Error
1755Process::ResumeSynchronous (Stream *stream)
1756{
1757 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
1758 if (log)
1759 log->Printf("Process::ResumeSynchronous -- locking run lock");
1760 if (!m_public_run_lock.TrySetRunning())
1761 {
1762 Error error("Resume request failed - process still running.");
1763 if (log)
1764 log->Printf ("Process::Resume: -- TrySetRunning failed, not resuming.");
1765 return error;
1766 }
1767
Jim Ingham583bbb12016-03-07 21:50:25 +00001768 ListenerSP listener_sp (Listener::MakeListener("lldb.Process.ResumeSynchronous.hijack"));
1769 HijackProcessEvents(listener_sp);
Greg Claytondc6224e2014-10-21 01:00:42 +00001770
1771 Error error = PrivateResume();
Ilia Kd8c14752015-04-30 13:10:32 +00001772 if (error.Success())
1773 {
Jim Ingham583bbb12016-03-07 21:50:25 +00001774 StateType state = WaitForProcessToStop (NULL, NULL, true, listener_sp, stream);
Ilia Kd8c14752015-04-30 13:10:32 +00001775 const bool must_be_alive = false; // eStateExited is ok, so this must be false
1776 if (!StateIsStoppedState(state, must_be_alive))
1777 error.SetErrorStringWithFormat("process not in stopped state after synchronous resume: %s", StateAsCString(state));
1778 }
Greg Claytondc6224e2014-10-21 01:00:42 +00001779
1780 // Undo the hijacking of process events...
1781 RestoreProcessEvents();
1782
Greg Claytondc6224e2014-10-21 01:00:42 +00001783 return error;
1784}
1785
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001786StateType
1787Process::GetPrivateState ()
1788{
1789 return m_private_state.GetValue();
1790}
1791
1792void
1793Process::SetPrivateState (StateType new_state)
1794{
Greg Claytonfb8b37a2014-07-14 23:09:29 +00001795 if (m_finalize_called)
1796 return;
1797
Greg Clayton5160ce52013-03-27 23:08:40 +00001798 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001799 bool state_changed = false;
1800
1801 if (log)
1802 log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state));
1803
Andrew Kaylor29d65742013-05-10 17:19:04 +00001804 Mutex::Locker thread_locker(m_thread_list.GetMutex());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001805 Mutex::Locker locker(m_private_state.GetMutex());
1806
1807 const StateType old_state = m_private_state.GetValueNoLock ();
1808 state_changed = old_state != new_state;
Ed Mastec29693f2013-07-02 16:35:47 +00001809
Greg Claytonaa49c832013-05-03 22:25:56 +00001810 const bool old_state_is_stopped = StateIsStoppedState(old_state, false);
1811 const bool new_state_is_stopped = StateIsStoppedState(new_state, false);
1812 if (old_state_is_stopped != new_state_is_stopped)
1813 {
1814 if (new_state_is_stopped)
Ed Maste64fad602013-07-29 20:58:06 +00001815 m_private_run_lock.SetStopped();
Greg Claytonaa49c832013-05-03 22:25:56 +00001816 else
Ed Maste64fad602013-07-29 20:58:06 +00001817 m_private_run_lock.SetRunning();
Greg Claytonaa49c832013-05-03 22:25:56 +00001818 }
Andrew Kaylor93132f52013-05-28 23:04:25 +00001819
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001820 if (state_changed)
1821 {
1822 m_private_state.SetValueNoLock (new_state);
Ilia K38810f42015-05-20 10:15:47 +00001823 EventSP event_sp (new Event (eBroadcastBitStateChanged, new ProcessEventData (shared_from_this(), new_state)));
Greg Clayton2637f822011-11-17 01:23:07 +00001824 if (StateIsStoppedState(new_state, false))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001825 {
Andrew Kaylor29d65742013-05-10 17:19:04 +00001826 // Note, this currently assumes that all threads in the list
1827 // stop when the process stops. In the future we will want to
1828 // support a debugging model where some threads continue to run
1829 // while others are stopped. When that happens we will either need
1830 // a way for the thread list to identify which threads are stopping
1831 // or create a special thread list containing only threads which
1832 // actually stopped.
1833 //
1834 // The process plugin is responsible for managing the actual
1835 // behavior of the threads and should have stopped any threads
1836 // that are going to stop before we get here.
1837 m_thread_list.DidStop();
1838
Jim Ingham4b536182011-08-09 02:12:22 +00001839 m_mod_id.BumpStopID();
Ilia K38810f42015-05-20 10:15:47 +00001840 if (!m_mod_id.IsLastResumeForUserExpression())
1841 m_mod_id.SetStopEventForLastNaturalStopID(event_sp);
Greg Clayton58be07b2011-01-07 06:08:19 +00001842 m_memory_cache.Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001843 if (log)
Jim Ingham4b536182011-08-09 02:12:22 +00001844 log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_mod_id.GetStopID());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001845 }
Ilia K38810f42015-05-20 10:15:47 +00001846
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001847 // Use our target to get a shared pointer to ourselves...
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001848 if (m_finalize_called && !PrivateStateThreadIsValid())
Ilia K38810f42015-05-20 10:15:47 +00001849 BroadcastEvent (event_sp);
Greg Clayton35a4cc52012-10-29 20:52:08 +00001850 else
Ilia K38810f42015-05-20 10:15:47 +00001851 m_private_state_broadcaster.BroadcastEvent (event_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001852 }
1853 else
1854 {
1855 if (log)
Jason Molendafd54b362011-09-20 21:44:10 +00001856 log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001857 }
1858}
1859
Jim Ingham0faa43f2011-11-08 03:00:11 +00001860void
1861Process::SetRunningUserExpression (bool on)
1862{
1863 m_mod_id.SetRunningUserExpression (on);
1864}
1865
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001866addr_t
1867Process::GetImageInfoAddress()
1868{
1869 return LLDB_INVALID_ADDRESS;
1870}
1871
Greg Clayton31f1d2f2011-05-11 18:39:18 +00001872const lldb::ABISP &
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001873Process::GetABI()
1874{
Greg Clayton31f1d2f2011-05-11 18:39:18 +00001875 if (!m_abi_sp)
Zachary Turner7529df92015-09-01 20:02:29 +00001876 m_abi_sp = ABI::FindPlugin(GetTarget().GetArchitecture());
Greg Clayton31f1d2f2011-05-11 18:39:18 +00001877 return m_abi_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001878}
1879
Jim Ingham22777012010-09-23 02:01:19 +00001880LanguageRuntime *
Jim Inghamab175242012-03-10 00:22:19 +00001881Process::GetLanguageRuntime(lldb::LanguageType language, bool retry_if_null)
Jim Ingham22777012010-09-23 02:01:19 +00001882{
Greg Claytonc00ca312015-04-02 18:44:58 +00001883 if (m_finalizing)
1884 return nullptr;
1885
Jim Ingham22777012010-09-23 02:01:19 +00001886 LanguageRuntimeCollection::iterator pos;
1887 pos = m_language_runtimes.find (language);
Jim Inghamab175242012-03-10 00:22:19 +00001888 if (pos == m_language_runtimes.end() || (retry_if_null && !(*pos).second))
Jim Ingham22777012010-09-23 02:01:19 +00001889 {
Jim Inghamab175242012-03-10 00:22:19 +00001890 lldb::LanguageRuntimeSP runtime_sp(LanguageRuntime::FindPlugin(this, language));
Jim Ingham22777012010-09-23 02:01:19 +00001891
Jim Inghamab175242012-03-10 00:22:19 +00001892 m_language_runtimes[language] = runtime_sp;
1893 return runtime_sp.get();
Jim Ingham22777012010-09-23 02:01:19 +00001894 }
1895 else
1896 return (*pos).second.get();
1897}
1898
1899CPPLanguageRuntime *
Jim Inghamab175242012-03-10 00:22:19 +00001900Process::GetCPPLanguageRuntime (bool retry_if_null)
Jim Ingham22777012010-09-23 02:01:19 +00001901{
Jim Inghamab175242012-03-10 00:22:19 +00001902 LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus, retry_if_null);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001903 if (runtime != nullptr && runtime->GetLanguageType() == eLanguageTypeC_plus_plus)
Jim Ingham22777012010-09-23 02:01:19 +00001904 return static_cast<CPPLanguageRuntime *> (runtime);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001905 return nullptr;
Jim Ingham22777012010-09-23 02:01:19 +00001906}
1907
1908ObjCLanguageRuntime *
Jim Inghamab175242012-03-10 00:22:19 +00001909Process::GetObjCLanguageRuntime (bool retry_if_null)
Jim Ingham22777012010-09-23 02:01:19 +00001910{
Jim Inghamab175242012-03-10 00:22:19 +00001911 LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC, retry_if_null);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001912 if (runtime != nullptr && runtime->GetLanguageType() == eLanguageTypeObjC)
Jim Ingham22777012010-09-23 02:01:19 +00001913 return static_cast<ObjCLanguageRuntime *> (runtime);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00001914 return nullptr;
Jim Ingham22777012010-09-23 02:01:19 +00001915}
1916
Enrico Granatafd4c84e2012-05-21 16:51:35 +00001917bool
1918Process::IsPossibleDynamicValue (ValueObject& in_value)
1919{
Greg Claytonc00ca312015-04-02 18:44:58 +00001920 if (m_finalizing)
1921 return false;
1922
Enrico Granatafd4c84e2012-05-21 16:51:35 +00001923 if (in_value.IsDynamic())
1924 return false;
1925 LanguageType known_type = in_value.GetObjectRuntimeLanguage();
1926
1927 if (known_type != eLanguageTypeUnknown && known_type != eLanguageTypeC)
1928 {
1929 LanguageRuntime *runtime = GetLanguageRuntime (known_type);
1930 return runtime ? runtime->CouldHaveDynamicValue(in_value) : false;
1931 }
1932
1933 LanguageRuntime *cpp_runtime = GetLanguageRuntime (eLanguageTypeC_plus_plus);
1934 if (cpp_runtime && cpp_runtime->CouldHaveDynamicValue(in_value))
1935 return true;
1936
1937 LanguageRuntime *objc_runtime = GetLanguageRuntime (eLanguageTypeObjC);
1938 return objc_runtime ? objc_runtime->CouldHaveDynamicValue(in_value) : false;
1939}
1940
Zachary Turner93749ab2015-03-03 21:51:25 +00001941void
1942Process::SetDynamicCheckers(DynamicCheckerFunctions *dynamic_checkers)
1943{
1944 m_dynamic_checkers_ap.reset(dynamic_checkers);
1945}
1946
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001947BreakpointSiteList &
1948Process::GetBreakpointSiteList()
1949{
1950 return m_breakpoint_site_list;
1951}
1952
1953const BreakpointSiteList &
1954Process::GetBreakpointSiteList() const
1955{
1956 return m_breakpoint_site_list;
1957}
1958
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001959void
1960Process::DisableAllBreakpointSites ()
1961{
Greg Claytond8cf1a12013-06-12 00:46:38 +00001962 m_breakpoint_site_list.ForEach([this](BreakpointSite *bp_site) -> void {
1963// bp_site->SetEnabled(true);
1964 DisableBreakpointSite(bp_site);
1965 });
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001966}
1967
1968Error
1969Process::ClearBreakpointSiteByID (lldb::user_id_t break_id)
1970{
1971 Error error (DisableBreakpointSiteByID (break_id));
1972
1973 if (error.Success())
1974 m_breakpoint_site_list.Remove(break_id);
1975
1976 return error;
1977}
1978
1979Error
1980Process::DisableBreakpointSiteByID (lldb::user_id_t break_id)
1981{
1982 Error error;
1983 BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
1984 if (bp_site_sp)
1985 {
1986 if (bp_site_sp->IsEnabled())
Jim Ingham299c0c12013-02-15 02:06:30 +00001987 error = DisableBreakpointSite (bp_site_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001988 }
1989 else
1990 {
Daniel Malead01b2952012-11-29 21:49:15 +00001991 error.SetErrorStringWithFormat("invalid breakpoint site ID: %" PRIu64, break_id);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001992 }
1993
1994 return error;
1995}
1996
1997Error
1998Process::EnableBreakpointSiteByID (lldb::user_id_t break_id)
1999{
2000 Error error;
2001 BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id);
2002 if (bp_site_sp)
2003 {
2004 if (!bp_site_sp->IsEnabled())
Jim Ingham299c0c12013-02-15 02:06:30 +00002005 error = EnableBreakpointSite (bp_site_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002006 }
2007 else
2008 {
Daniel Malead01b2952012-11-29 21:49:15 +00002009 error.SetErrorStringWithFormat("invalid breakpoint site ID: %" PRIu64, break_id);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002010 }
2011 return error;
2012}
2013
Stephen Wilson50bd94f2010-07-17 00:56:13 +00002014lldb::break_id_t
Greg Claytone1cd1be2012-01-29 20:56:30 +00002015Process::CreateBreakpointSite (const BreakpointLocationSP &owner, bool use_hardware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002016{
Jim Ingham1460e4b2014-01-10 23:46:59 +00002017 addr_t load_addr = LLDB_INVALID_ADDRESS;
2018
2019 bool show_error = true;
2020 switch (GetState())
2021 {
2022 case eStateInvalid:
2023 case eStateUnloaded:
2024 case eStateConnected:
2025 case eStateAttaching:
2026 case eStateLaunching:
2027 case eStateDetached:
2028 case eStateExited:
2029 show_error = false;
2030 break;
2031
2032 case eStateStopped:
2033 case eStateRunning:
2034 case eStateStepping:
2035 case eStateCrashed:
2036 case eStateSuspended:
2037 show_error = IsAlive();
2038 break;
2039 }
2040
2041 // Reset the IsIndirect flag here, in case the location changes from
2042 // pointing to a indirect symbol to a regular symbol.
2043 owner->SetIsIndirect (false);
2044
2045 if (owner->ShouldResolveIndirectFunctions())
2046 {
2047 Symbol *symbol = owner->GetAddress().CalculateSymbolContextSymbol();
2048 if (symbol && symbol->IsIndirect())
2049 {
2050 Error error;
Greg Clayton358cf1e2015-06-25 21:46:34 +00002051 Address symbol_address = symbol->GetAddress();
2052 load_addr = ResolveIndirectFunction (&symbol_address, error);
Jim Ingham1460e4b2014-01-10 23:46:59 +00002053 if (!error.Success() && show_error)
2054 {
Zachary Turner7529df92015-09-01 20:02:29 +00002055 GetTarget().GetDebugger().GetErrorFile()->Printf ("warning: failed to resolve indirect function at 0x%" PRIx64 " for breakpoint %i.%i: %s\n",
2056 symbol->GetLoadAddress(&GetTarget()),
2057 owner->GetBreakpoint().GetID(),
2058 owner->GetID(),
2059 error.AsCString() ? error.AsCString() : "unknown error");
Jim Ingham1460e4b2014-01-10 23:46:59 +00002060 return LLDB_INVALID_BREAK_ID;
2061 }
2062 Address resolved_address(load_addr);
Zachary Turner7529df92015-09-01 20:02:29 +00002063 load_addr = resolved_address.GetOpcodeLoadAddress (&GetTarget());
Jim Ingham1460e4b2014-01-10 23:46:59 +00002064 owner->SetIsIndirect(true);
2065 }
2066 else
Zachary Turner7529df92015-09-01 20:02:29 +00002067 load_addr = owner->GetAddress().GetOpcodeLoadAddress (&GetTarget());
Jim Ingham1460e4b2014-01-10 23:46:59 +00002068 }
2069 else
Zachary Turner7529df92015-09-01 20:02:29 +00002070 load_addr = owner->GetAddress().GetOpcodeLoadAddress (&GetTarget());
Jim Ingham1460e4b2014-01-10 23:46:59 +00002071
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002072 if (load_addr != LLDB_INVALID_ADDRESS)
2073 {
2074 BreakpointSiteSP bp_site_sp;
2075
2076 // Look up this breakpoint site. If it exists, then add this new owner, otherwise
2077 // create a new breakpoint site and add it.
2078
2079 bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr);
2080
2081 if (bp_site_sp)
2082 {
2083 bp_site_sp->AddOwner (owner);
2084 owner->SetBreakpointSite (bp_site_sp);
2085 return bp_site_sp->GetID();
2086 }
2087 else
2088 {
Greg Claytonc7bece562013-01-25 18:06:21 +00002089 bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, use_hardware));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002090 if (bp_site_sp)
2091 {
Greg Claytoneb023e72013-10-11 19:48:25 +00002092 Error error = EnableBreakpointSite (bp_site_sp.get());
2093 if (error.Success())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002094 {
2095 owner->SetBreakpointSite (bp_site_sp);
2096 return m_breakpoint_site_list.Add (bp_site_sp);
2097 }
Greg Claytoneb023e72013-10-11 19:48:25 +00002098 else
2099 {
Greg Claytonfbb76342013-11-20 21:07:01 +00002100 if (show_error)
2101 {
2102 // Report error for setting breakpoint...
Zachary Turner7529df92015-09-01 20:02:29 +00002103 GetTarget().GetDebugger().GetErrorFile()->Printf ("warning: failed to set breakpoint site at 0x%" PRIx64 " for breakpoint %i.%i: %s\n",
2104 load_addr,
2105 owner->GetBreakpoint().GetID(),
2106 owner->GetID(),
2107 error.AsCString() ? error.AsCString() : "unknown error");
Greg Claytonfbb76342013-11-20 21:07:01 +00002108 }
Greg Claytoneb023e72013-10-11 19:48:25 +00002109 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002110 }
2111 }
2112 }
2113 // We failed to enable the breakpoint
2114 return LLDB_INVALID_BREAK_ID;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002115}
2116
2117void
2118Process::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp)
2119{
2120 uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id);
2121 if (num_owners == 0)
2122 {
Jim Inghamf1ff3bb2013-04-06 00:16:39 +00002123 // Don't try to disable the site if we don't have a live process anymore.
2124 if (IsAlive())
2125 DisableBreakpointSite (bp_site_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002126 m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress());
2127 }
2128}
2129
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002130size_t
2131Process::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const
2132{
2133 size_t bytes_removed = 0;
Jim Ingham20c77192011-06-29 19:42:28 +00002134 BreakpointSiteList bp_sites_in_range;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002135
Jim Ingham20c77192011-06-29 19:42:28 +00002136 if (m_breakpoint_site_list.FindInRange (bp_addr, bp_addr + size, bp_sites_in_range))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002137 {
Greg Claytond8cf1a12013-06-12 00:46:38 +00002138 bp_sites_in_range.ForEach([bp_addr, size, buf, &bytes_removed](BreakpointSite *bp_site) -> void {
2139 if (bp_site->GetType() == BreakpointSite::eSoftware)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002140 {
Greg Claytond8cf1a12013-06-12 00:46:38 +00002141 addr_t intersect_addr;
2142 size_t intersect_size;
2143 size_t opcode_offset;
2144 if (bp_site->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset))
Jim Ingham20c77192011-06-29 19:42:28 +00002145 {
2146 assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size);
2147 assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size);
Greg Claytond8cf1a12013-06-12 00:46:38 +00002148 assert(opcode_offset + intersect_size <= bp_site->GetByteSize());
Jim Ingham20c77192011-06-29 19:42:28 +00002149 size_t buf_offset = intersect_addr - bp_addr;
Greg Claytond8cf1a12013-06-12 00:46:38 +00002150 ::memcpy(buf + buf_offset, bp_site->GetSavedOpcodeBytes() + opcode_offset, intersect_size);
Jim Ingham20c77192011-06-29 19:42:28 +00002151 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002152 }
Greg Claytond8cf1a12013-06-12 00:46:38 +00002153 });
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002154 }
2155 return bytes_removed;
2156}
2157
Greg Claytonded470d2011-03-19 01:12:21 +00002158size_t
2159Process::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site)
2160{
Zachary Turner7529df92015-09-01 20:02:29 +00002161 PlatformSP platform_sp (GetTarget().GetPlatform());
Greg Claytonded470d2011-03-19 01:12:21 +00002162 if (platform_sp)
Zachary Turner7529df92015-09-01 20:02:29 +00002163 return platform_sp->GetSoftwareBreakpointTrapOpcode (GetTarget(), bp_site);
Greg Claytonded470d2011-03-19 01:12:21 +00002164 return 0;
2165}
2166
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002167Error
2168Process::EnableSoftwareBreakpoint (BreakpointSite *bp_site)
2169{
2170 Error error;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00002171 assert(bp_site != nullptr);
Greg Clayton5160ce52013-03-27 23:08:40 +00002172 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002173 const addr_t bp_addr = bp_site->GetLoadAddress();
2174 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002175 log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64, bp_site->GetID(), (uint64_t)bp_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002176 if (bp_site->IsEnabled())
2177 {
2178 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002179 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 +00002180 return error;
2181 }
2182
2183 if (bp_addr == LLDB_INVALID_ADDRESS)
2184 {
2185 error.SetErrorString("BreakpointSite contains an invalid load address.");
2186 return error;
2187 }
2188 // Ask the lldb::Process subclass to fill in the correct software breakpoint
2189 // trap for the breakpoint site
2190 const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site);
2191
2192 if (bp_opcode_size == 0)
2193 {
Daniel Malead01b2952012-11-29 21:49:15 +00002194 error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%" PRIx64, bp_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002195 }
2196 else
2197 {
2198 const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes();
2199
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00002200 if (bp_opcode_bytes == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002201 {
2202 error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode.");
2203 return error;
2204 }
2205
2206 // Save the original opcode by reading it
2207 if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size)
2208 {
2209 // Write a software breakpoint in place of the original opcode
2210 if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
2211 {
2212 uint8_t verify_bp_opcode_bytes[64];
2213 if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size)
2214 {
2215 if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0)
2216 {
2217 bp_site->SetEnabled(true);
2218 bp_site->SetType (BreakpointSite::eSoftware);
2219 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002220 log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- SUCCESS",
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002221 bp_site->GetID(),
2222 (uint64_t)bp_addr);
2223 }
2224 else
Greg Clayton86edbf42011-10-26 00:56:27 +00002225 error.SetErrorString("failed to verify the breakpoint trap in memory.");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002226 }
2227 else
2228 error.SetErrorString("Unable to read memory to verify breakpoint trap.");
2229 }
2230 else
2231 error.SetErrorString("Unable to write breakpoint trap to memory.");
2232 }
2233 else
2234 error.SetErrorString("Unable to read memory at breakpoint address.");
2235 }
Stephen Wilson78a4feb2011-01-12 04:20:03 +00002236 if (log && error.Fail())
Daniel Malead01b2952012-11-29 21:49:15 +00002237 log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- FAILED: %s",
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002238 bp_site->GetID(),
2239 (uint64_t)bp_addr,
2240 error.AsCString());
2241 return error;
2242}
2243
2244Error
2245Process::DisableSoftwareBreakpoint (BreakpointSite *bp_site)
2246{
2247 Error error;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00002248 assert(bp_site != nullptr);
Greg Clayton5160ce52013-03-27 23:08:40 +00002249 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002250 addr_t bp_addr = bp_site->GetLoadAddress();
2251 lldb::user_id_t breakID = bp_site->GetID();
2252 if (log)
Jim Ingham299c0c12013-02-15 02:06:30 +00002253 log->Printf ("Process::DisableSoftwareBreakpoint (breakID = %" PRIu64 ") addr = 0x%" PRIx64, breakID, (uint64_t)bp_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002254
2255 if (bp_site->IsHardware())
2256 {
2257 error.SetErrorString("Breakpoint site is a hardware breakpoint.");
2258 }
2259 else if (bp_site->IsEnabled())
2260 {
2261 const size_t break_op_size = bp_site->GetByteSize();
2262 const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes();
2263 if (break_op_size > 0)
2264 {
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00002265 // Clear a software breakpoint instruction
Greg Claytonc982c762010-07-09 20:39:50 +00002266 uint8_t curr_break_op[8];
Stephen Wilson4ab47682010-07-20 18:41:11 +00002267 assert (break_op_size <= sizeof(curr_break_op));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002268 bool break_op_found = false;
2269
2270 // Read the breakpoint opcode
2271 if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size)
2272 {
2273 bool verify = false;
Bruce Mitchener58ef3912015-06-18 05:27:05 +00002274 // Make sure the breakpoint opcode exists at this address
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002275 if (::memcmp (curr_break_op, break_op, break_op_size) == 0)
2276 {
2277 break_op_found = true;
2278 // We found a valid breakpoint opcode at this address, now restore
2279 // the saved opcode.
2280 if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size)
2281 {
2282 verify = true;
2283 }
2284 else
2285 error.SetErrorString("Memory write failed when restoring original opcode.");
2286 }
2287 else
2288 {
2289 error.SetErrorString("Original breakpoint trap is no longer in memory.");
2290 // Set verify to true and so we can check if the original opcode has already been restored
2291 verify = true;
2292 }
2293
2294 if (verify)
2295 {
Greg Claytonc982c762010-07-09 20:39:50 +00002296 uint8_t verify_opcode[8];
Stephen Wilson4ab47682010-07-20 18:41:11 +00002297 assert (break_op_size < sizeof(verify_opcode));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002298 // Verify that our original opcode made it back to the inferior
2299 if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size)
2300 {
2301 // compare the memory we just read with the original opcode
2302 if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0)
2303 {
2304 // SUCCESS
2305 bp_site->SetEnabled(false);
2306 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002307 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 +00002308 return error;
2309 }
2310 else
2311 {
2312 if (break_op_found)
2313 error.SetErrorString("Failed to restore original opcode.");
2314 }
2315 }
2316 else
2317 error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored.");
2318 }
2319 }
2320 else
2321 error.SetErrorString("Unable to read memory that should contain the breakpoint trap.");
2322 }
2323 }
2324 else
2325 {
2326 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002327 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 +00002328 return error;
2329 }
2330
2331 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002332 log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- FAILED: %s",
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002333 bp_site->GetID(),
2334 (uint64_t)bp_addr,
2335 error.AsCString());
2336 return error;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002337}
2338
Greg Clayton58be07b2011-01-07 06:08:19 +00002339// Uncomment to verify memory caching works after making changes to caching code
2340//#define VERIFY_MEMORY_READS
2341
Sean Callanan64c0cf22012-06-07 22:26:42 +00002342size_t
2343Process::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
2344{
Jason Molendaa7b5afa2013-11-15 00:17:32 +00002345 error.Clear();
Sean Callanan64c0cf22012-06-07 22:26:42 +00002346 if (!GetDisableMemoryCache())
2347 {
Greg Clayton58be07b2011-01-07 06:08:19 +00002348#if defined (VERIFY_MEMORY_READS)
Sean Callanan64c0cf22012-06-07 22:26:42 +00002349 // Memory caching is enabled, with debug verification
2350
2351 if (buf && size)
2352 {
2353 // Uncomment the line below to make sure memory caching is working.
2354 // I ran this through the test suite and got no assertions, so I am
2355 // pretty confident this is working well. If any changes are made to
2356 // memory caching, uncomment the line below and test your changes!
2357
2358 // Verify all memory reads by using the cache first, then redundantly
2359 // reading the same memory from the inferior and comparing to make sure
2360 // everything is exactly the same.
2361 std::string verify_buf (size, '\0');
2362 assert (verify_buf.size() == size);
2363 const size_t cache_bytes_read = m_memory_cache.Read (this, addr, buf, size, error);
2364 Error verify_error;
2365 const size_t verify_bytes_read = ReadMemoryFromInferior (addr, const_cast<char *>(verify_buf.data()), verify_buf.size(), verify_error);
2366 assert (cache_bytes_read == verify_bytes_read);
2367 assert (memcmp(buf, verify_buf.data(), verify_buf.size()) == 0);
2368 assert (verify_error.Success() == error.Success());
2369 return cache_bytes_read;
2370 }
2371 return 0;
2372#else // !defined(VERIFY_MEMORY_READS)
2373 // Memory caching is enabled, without debug verification
2374
2375 return m_memory_cache.Read (addr, buf, size, error);
2376#endif // defined (VERIFY_MEMORY_READS)
Greg Clayton58be07b2011-01-07 06:08:19 +00002377 }
Sean Callanan64c0cf22012-06-07 22:26:42 +00002378 else
2379 {
2380 // Memory caching is disabled
2381
2382 return ReadMemoryFromInferior (addr, buf, size, error);
2383 }
Greg Clayton58be07b2011-01-07 06:08:19 +00002384}
Greg Clayton58be07b2011-01-07 06:08:19 +00002385
Greg Clayton4c82d422012-05-18 23:20:01 +00002386size_t
2387Process::ReadCStringFromMemory (addr_t addr, std::string &out_str, Error &error)
2388{
Greg Claytonde87c0f2012-05-19 00:18:00 +00002389 char buf[256];
Greg Clayton4c82d422012-05-18 23:20:01 +00002390 out_str.clear();
2391 addr_t curr_addr = addr;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00002392 while (true)
Greg Clayton4c82d422012-05-18 23:20:01 +00002393 {
2394 size_t length = ReadCStringFromMemory (curr_addr, buf, sizeof(buf), error);
2395 if (length == 0)
2396 break;
2397 out_str.append(buf, length);
2398 // If we got "length - 1" bytes, we didn't get the whole C string, we
2399 // need to read some more characters
2400 if (length == sizeof(buf) - 1)
2401 curr_addr += length;
2402 else
2403 break;
2404 }
2405 return out_str.size();
2406}
2407
Greg Clayton58be07b2011-01-07 06:08:19 +00002408size_t
Ashok Thirumurthi6ac9d132013-04-19 15:58:38 +00002409Process::ReadStringFromMemory (addr_t addr, char *dst, size_t max_bytes, Error &error,
2410 size_t type_width)
2411{
2412 size_t total_bytes_read = 0;
2413 if (dst && max_bytes && type_width && max_bytes >= type_width)
2414 {
2415 // Ensure a null terminator independent of the number of bytes that is read.
2416 memset (dst, 0, max_bytes);
2417 size_t bytes_left = max_bytes - type_width;
2418
2419 const char terminator[4] = {'\0', '\0', '\0', '\0'};
2420 assert(sizeof(terminator) >= type_width &&
2421 "Attempting to validate a string with more than 4 bytes per character!");
2422
2423 addr_t curr_addr = addr;
2424 const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize();
2425 char *curr_dst = dst;
2426
2427 error.Clear();
2428 while (bytes_left > 0 && error.Success())
2429 {
2430 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
2431 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
2432 size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error);
2433
2434 if (bytes_read == 0)
2435 break;
2436
2437 // Search for a null terminator of correct size and alignment in bytes_read
2438 size_t aligned_start = total_bytes_read - total_bytes_read % type_width;
2439 for (size_t i = aligned_start; i + type_width <= total_bytes_read + bytes_read; i += type_width)
Ulrich Weigand0501eeb2016-04-14 14:33:47 +00002440 if (::memcmp(&dst[i], terminator, type_width) == 0)
Ashok Thirumurthi6ac9d132013-04-19 15:58:38 +00002441 {
2442 error.Clear();
2443 return i;
2444 }
2445
2446 total_bytes_read += bytes_read;
2447 curr_dst += bytes_read;
2448 curr_addr += bytes_read;
2449 bytes_left -= bytes_read;
2450 }
2451 }
2452 else
2453 {
2454 if (max_bytes)
2455 error.SetErrorString("invalid arguments");
2456 }
2457 return total_bytes_read;
2458}
2459
2460// Deprecated in favor of ReadStringFromMemory which has wchar support and correct code to find
2461// null terminators.
2462size_t
Greg Claytone91b7952011-12-15 03:14:23 +00002463Process::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len, Error &result_error)
Greg Clayton8b82f082011-04-12 05:54:46 +00002464{
2465 size_t total_cstr_len = 0;
2466 if (dst && dst_max_len)
2467 {
Greg Claytone91b7952011-12-15 03:14:23 +00002468 result_error.Clear();
Greg Clayton8b82f082011-04-12 05:54:46 +00002469 // NULL out everything just to be safe
2470 memset (dst, 0, dst_max_len);
2471 Error error;
2472 addr_t curr_addr = addr;
2473 const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize();
2474 size_t bytes_left = dst_max_len - 1;
2475 char *curr_dst = dst;
2476
2477 while (bytes_left > 0)
2478 {
2479 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
2480 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
2481 size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error);
2482
2483 if (bytes_read == 0)
2484 {
Greg Claytone91b7952011-12-15 03:14:23 +00002485 result_error = error;
Greg Clayton8b82f082011-04-12 05:54:46 +00002486 dst[total_cstr_len] = '\0';
2487 break;
2488 }
2489 const size_t len = strlen(curr_dst);
2490
2491 total_cstr_len += len;
2492
2493 if (len < bytes_to_read)
2494 break;
2495
2496 curr_dst += bytes_read;
2497 curr_addr += bytes_read;
2498 bytes_left -= bytes_read;
2499 }
2500 }
Greg Claytone91b7952011-12-15 03:14:23 +00002501 else
2502 {
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00002503 if (dst == nullptr)
Greg Claytone91b7952011-12-15 03:14:23 +00002504 result_error.SetErrorString("invalid arguments");
2505 else
2506 result_error.Clear();
2507 }
Greg Clayton8b82f082011-04-12 05:54:46 +00002508 return total_cstr_len;
2509}
2510
2511size_t
Greg Clayton58be07b2011-01-07 06:08:19 +00002512Process::ReadMemoryFromInferior (addr_t addr, void *buf, size_t size, Error &error)
2513{
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00002514 if (buf == nullptr || size == 0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002515 return 0;
2516
2517 size_t bytes_read = 0;
2518 uint8_t *bytes = (uint8_t *)buf;
2519
2520 while (bytes_read < size)
2521 {
2522 const size_t curr_size = size - bytes_read;
2523 const size_t curr_bytes_read = DoReadMemory (addr + bytes_read,
2524 bytes + bytes_read,
2525 curr_size,
2526 error);
2527 bytes_read += curr_bytes_read;
2528 if (curr_bytes_read == curr_size || curr_bytes_read == 0)
2529 break;
2530 }
2531
2532 // Replace any software breakpoint opcodes that fall into this range back
2533 // into "buf" before we return
2534 if (bytes_read > 0)
2535 RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf);
2536 return bytes_read;
2537}
2538
Greg Clayton58a4c462010-12-16 20:01:20 +00002539uint64_t
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002540Process::ReadUnsignedIntegerFromMemory (lldb::addr_t vm_addr, size_t integer_byte_size, uint64_t fail_value, Error &error)
Greg Clayton58a4c462010-12-16 20:01:20 +00002541{
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002542 Scalar scalar;
2543 if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar, error))
2544 return scalar.ULongLong(fail_value);
2545 return fail_value;
2546}
2547
2548addr_t
2549Process::ReadPointerFromMemory (lldb::addr_t vm_addr, Error &error)
2550{
2551 Scalar scalar;
2552 if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar, error))
2553 return scalar.ULongLong(LLDB_INVALID_ADDRESS);
2554 return LLDB_INVALID_ADDRESS;
2555}
2556
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002557bool
2558Process::WritePointerToMemory (lldb::addr_t vm_addr,
2559 lldb::addr_t ptr_value,
2560 Error &error)
2561{
2562 Scalar scalar;
2563 const uint32_t addr_byte_size = GetAddressByteSize();
2564 if (addr_byte_size <= 4)
2565 scalar = (uint32_t)ptr_value;
Greg Clayton58a4c462010-12-16 20:01:20 +00002566 else
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002567 scalar = ptr_value;
2568 return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) == addr_byte_size;
Greg Clayton58a4c462010-12-16 20:01:20 +00002569}
2570
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002571size_t
2572Process::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error)
2573{
2574 size_t bytes_written = 0;
2575 const uint8_t *bytes = (const uint8_t *)buf;
2576
2577 while (bytes_written < size)
2578 {
2579 const size_t curr_size = size - bytes_written;
2580 const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written,
2581 bytes + bytes_written,
2582 curr_size,
2583 error);
2584 bytes_written += curr_bytes_written;
2585 if (curr_bytes_written == curr_size || curr_bytes_written == 0)
2586 break;
2587 }
2588 return bytes_written;
2589}
2590
2591size_t
2592Process::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error)
2593{
Greg Clayton58be07b2011-01-07 06:08:19 +00002594#if defined (ENABLE_MEMORY_CACHING)
2595 m_memory_cache.Flush (addr, size);
2596#endif
2597
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00002598 if (buf == nullptr || size == 0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002599 return 0;
Jim Ingham78a685a2011-04-16 00:01:13 +00002600
Jim Ingham4b536182011-08-09 02:12:22 +00002601 m_mod_id.BumpMemoryID();
Jim Ingham78a685a2011-04-16 00:01:13 +00002602
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002603 // We need to write any data that would go where any current software traps
2604 // (enabled software breakpoints) any software traps (breakpoints) that we
2605 // may have placed in our tasks memory.
2606
Greg Claytond8cf1a12013-06-12 00:46:38 +00002607 BreakpointSiteList bp_sites_in_range;
2608
2609 if (m_breakpoint_site_list.FindInRange (addr, addr + size, bp_sites_in_range))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002610 {
Greg Claytond8cf1a12013-06-12 00:46:38 +00002611 // No breakpoint sites overlap
2612 if (bp_sites_in_range.IsEmpty())
2613 return WriteMemoryPrivate (addr, buf, size, error);
2614 else
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002615 {
Greg Claytond8cf1a12013-06-12 00:46:38 +00002616 const uint8_t *ubuf = (const uint8_t *)buf;
2617 uint64_t bytes_written = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002618
Greg Claytond8cf1a12013-06-12 00:46:38 +00002619 bp_sites_in_range.ForEach([this, addr, size, &bytes_written, &ubuf, &error](BreakpointSite *bp) -> void {
2620
2621 if (error.Success())
2622 {
2623 addr_t intersect_addr;
2624 size_t intersect_size;
2625 size_t opcode_offset;
2626 const bool intersects = bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset);
Bruce Mitchener8a67bf72015-07-24 00:23:29 +00002627 UNUSED_IF_ASSERT_DISABLED(intersects);
Greg Claytond8cf1a12013-06-12 00:46:38 +00002628 assert(intersects);
2629 assert(addr <= intersect_addr && intersect_addr < addr + size);
2630 assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size);
2631 assert(opcode_offset + intersect_size <= bp->GetByteSize());
2632
2633 // Check for bytes before this breakpoint
2634 const addr_t curr_addr = addr + bytes_written;
2635 if (intersect_addr > curr_addr)
2636 {
2637 // There are some bytes before this breakpoint that we need to
2638 // just write to memory
2639 size_t curr_size = intersect_addr - curr_addr;
2640 size_t curr_bytes_written = WriteMemoryPrivate (curr_addr,
2641 ubuf + bytes_written,
2642 curr_size,
2643 error);
2644 bytes_written += curr_bytes_written;
2645 if (curr_bytes_written != curr_size)
2646 {
2647 // We weren't able to write all of the requested bytes, we
2648 // are done looping and will return the number of bytes that
2649 // we have written so far.
2650 if (error.Success())
2651 error.SetErrorToGenericError();
2652 }
2653 }
2654 // Now write any bytes that would cover up any software breakpoints
2655 // directly into the breakpoint opcode buffer
2656 ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size);
2657 bytes_written += intersect_size;
2658 }
2659 });
2660
2661 if (bytes_written < size)
Jason Molenda8b5f2cf2014-10-16 07:49:27 +00002662 WriteMemoryPrivate (addr + bytes_written,
2663 ubuf + bytes_written,
2664 size - bytes_written,
2665 error);
Greg Claytond8cf1a12013-06-12 00:46:38 +00002666 }
2667 }
2668 else
2669 {
2670 return WriteMemoryPrivate (addr, buf, size, error);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002671 }
2672
2673 // Write any remaining bytes after the last breakpoint if we have any left
Greg Claytond8cf1a12013-06-12 00:46:38 +00002674 return 0; //bytes_written;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002675}
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002676
2677size_t
Greg Claytonc7bece562013-01-25 18:06:21 +00002678Process::WriteScalarToMemory (addr_t addr, const Scalar &scalar, size_t byte_size, Error &error)
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002679{
2680 if (byte_size == UINT32_MAX)
2681 byte_size = scalar.GetByteSize();
2682 if (byte_size > 0)
2683 {
2684 uint8_t buf[32];
2685 const size_t mem_size = scalar.GetAsMemoryData (buf, byte_size, GetByteOrder(), error);
2686 if (mem_size > 0)
2687 return WriteMemory(addr, buf, mem_size, error);
2688 else
2689 error.SetErrorString ("failed to get scalar as memory data");
2690 }
2691 else
2692 {
2693 error.SetErrorString ("invalid scalar value");
2694 }
2695 return 0;
2696}
2697
2698size_t
2699Process::ReadScalarIntegerFromMemory (addr_t addr,
2700 uint32_t byte_size,
2701 bool is_signed,
2702 Scalar &scalar,
2703 Error &error)
2704{
Greg Clayton7060f892013-05-01 23:41:30 +00002705 uint64_t uval = 0;
2706 if (byte_size == 0)
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002707 {
Greg Clayton7060f892013-05-01 23:41:30 +00002708 error.SetErrorString ("byte size is zero");
2709 }
2710 else if (byte_size & (byte_size - 1))
2711 {
2712 error.SetErrorStringWithFormat ("byte size %u is not a power of 2", byte_size);
2713 }
2714 else if (byte_size <= sizeof(uval))
2715 {
2716 const size_t bytes_read = ReadMemory (addr, &uval, byte_size, error);
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002717 if (bytes_read == byte_size)
2718 {
2719 DataExtractor data (&uval, sizeof(uval), GetByteOrder(), GetAddressByteSize());
Greg Claytonc7bece562013-01-25 18:06:21 +00002720 lldb::offset_t offset = 0;
Greg Clayton7060f892013-05-01 23:41:30 +00002721 if (byte_size <= 4)
2722 scalar = data.GetMaxU32 (&offset, byte_size);
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002723 else
Greg Clayton7060f892013-05-01 23:41:30 +00002724 scalar = data.GetMaxU64 (&offset, byte_size);
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002725 if (is_signed)
2726 scalar.SignExtend(byte_size * 8);
2727 return bytes_read;
2728 }
2729 }
2730 else
2731 {
2732 error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
2733 }
2734 return 0;
2735}
2736
Greg Claytond495c532011-05-17 03:37:42 +00002737#define USE_ALLOCATE_MEMORY_CACHE 1
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002738addr_t
2739Process::AllocateMemory(size_t size, uint32_t permissions, Error &error)
2740{
Jim Inghamf72ce3a2011-06-20 17:32:44 +00002741 if (GetPrivateState() != eStateStopped)
2742 return LLDB_INVALID_ADDRESS;
2743
Greg Claytond495c532011-05-17 03:37:42 +00002744#if defined (USE_ALLOCATE_MEMORY_CACHE)
2745 return m_allocated_memory_cache.AllocateMemory(size, permissions, error);
2746#else
Greg Claytonb2daec92011-01-23 19:58:49 +00002747 addr_t allocated_addr = DoAllocateMemory (size, permissions, error);
Greg Clayton5160ce52013-03-27 23:08:40 +00002748 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Greg Claytonb2daec92011-01-23 19:58:49 +00002749 if (log)
Greg Clayton45989072013-10-23 18:24:30 +00002750 log->Printf("Process::AllocateMemory(size=%" PRIu64 ", permissions=%s) => 0x%16.16" PRIx64 " (m_stop_id = %u m_memory_id = %u)",
Deepak Panickald66b50c2013-10-22 12:27:43 +00002751 (uint64_t)size,
Greg Claytond495c532011-05-17 03:37:42 +00002752 GetPermissionsAsCString (permissions),
Greg Claytonb2daec92011-01-23 19:58:49 +00002753 (uint64_t)allocated_addr,
Jim Ingham4b536182011-08-09 02:12:22 +00002754 m_mod_id.GetStopID(),
2755 m_mod_id.GetMemoryID());
Greg Claytonb2daec92011-01-23 19:58:49 +00002756 return allocated_addr;
Greg Claytond495c532011-05-17 03:37:42 +00002757#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002758}
2759
Jim Ingham2c381412015-11-04 20:32:27 +00002760addr_t
2761Process::CallocateMemory(size_t size, uint32_t permissions, Error &error)
2762{
2763 addr_t return_addr = AllocateMemory(size, permissions, error);
2764 if (error.Success())
2765 {
2766 std::string buffer(size, 0);
2767 WriteMemory(return_addr, buffer.c_str(), size, error);
2768 }
2769 return return_addr;
2770}
2771
Sean Callanan90539452011-09-20 23:01:51 +00002772bool
2773Process::CanJIT ()
2774{
Sean Callanana7b443a2012-02-14 22:50:38 +00002775 if (m_can_jit == eCanJITDontKnow)
2776 {
Todd Fialaaf245d12014-06-30 21:05:18 +00002777 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Sean Callanana7b443a2012-02-14 22:50:38 +00002778 Error err;
2779
2780 uint64_t allocated_memory = AllocateMemory(8,
2781 ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable,
2782 err);
2783
2784 if (err.Success())
Todd Fialaaf245d12014-06-30 21:05:18 +00002785 {
Sean Callanana7b443a2012-02-14 22:50:38 +00002786 m_can_jit = eCanJITYes;
Todd Fialaaf245d12014-06-30 21:05:18 +00002787 if (log)
2788 log->Printf ("Process::%s pid %" PRIu64 " allocation test passed, CanJIT () is true", __FUNCTION__, GetID ());
2789 }
Sean Callanana7b443a2012-02-14 22:50:38 +00002790 else
Todd Fialaaf245d12014-06-30 21:05:18 +00002791 {
Sean Callanana7b443a2012-02-14 22:50:38 +00002792 m_can_jit = eCanJITNo;
Todd Fialaaf245d12014-06-30 21:05:18 +00002793 if (log)
2794 log->Printf ("Process::%s pid %" PRIu64 " allocation test failed, CanJIT () is false: %s", __FUNCTION__, GetID (), err.AsCString ());
2795 }
Sean Callanana7b443a2012-02-14 22:50:38 +00002796
2797 DeallocateMemory (allocated_memory);
2798 }
2799
Sean Callanan90539452011-09-20 23:01:51 +00002800 return m_can_jit == eCanJITYes;
2801}
2802
2803void
2804Process::SetCanJIT (bool can_jit)
2805{
2806 m_can_jit = (can_jit ? eCanJITYes : eCanJITNo);
2807}
2808
Ewan Crawford90ff7912015-07-14 10:56:58 +00002809void
2810Process::SetCanRunCode (bool can_run_code)
2811{
2812 SetCanJIT(can_run_code);
2813 m_can_interpret_function_calls = can_run_code;
2814}
2815
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002816Error
2817Process::DeallocateMemory (addr_t ptr)
2818{
Greg Claytond495c532011-05-17 03:37:42 +00002819 Error error;
2820#if defined (USE_ALLOCATE_MEMORY_CACHE)
2821 if (!m_allocated_memory_cache.DeallocateMemory(ptr))
2822 {
Daniel Malead01b2952012-11-29 21:49:15 +00002823 error.SetErrorStringWithFormat ("deallocation of memory at 0x%" PRIx64 " failed.", (uint64_t)ptr);
Greg Claytond495c532011-05-17 03:37:42 +00002824 }
2825#else
2826 error = DoDeallocateMemory (ptr);
Greg Claytonb2daec92011-01-23 19:58:49 +00002827
Greg Clayton5160ce52013-03-27 23:08:40 +00002828 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Greg Claytonb2daec92011-01-23 19:58:49 +00002829 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00002830 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 +00002831 ptr,
2832 error.AsCString("SUCCESS"),
Jim Ingham4b536182011-08-09 02:12:22 +00002833 m_mod_id.GetStopID(),
2834 m_mod_id.GetMemoryID());
Greg Claytond495c532011-05-17 03:37:42 +00002835#endif
Greg Claytonb2daec92011-01-23 19:58:49 +00002836 return error;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002837}
2838
Greg Claytonc9660542012-02-05 02:38:54 +00002839ModuleSP
Greg Claytonc859e2d2012-02-13 23:10:39 +00002840Process::ReadModuleFromMemory (const FileSpec& file_spec,
Andrew MacPherson17220c12014-03-05 10:12:43 +00002841 lldb::addr_t header_addr,
2842 size_t size_to_read)
Greg Claytonc9660542012-02-05 02:38:54 +00002843{
Jason Molenda08a32582015-07-25 02:39:42 +00002844 Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_HOST);
2845 if (log)
2846 {
2847 log->Printf ("Process::ReadModuleFromMemory reading %s binary from memory", file_spec.GetPath().c_str());
2848 }
Greg Claytonc7f09cc2012-02-24 21:55:59 +00002849 ModuleSP module_sp (new Module (file_spec, ArchSpec()));
Greg Claytonc9660542012-02-05 02:38:54 +00002850 if (module_sp)
2851 {
Greg Claytonc7f09cc2012-02-24 21:55:59 +00002852 Error error;
Andrew MacPherson17220c12014-03-05 10:12:43 +00002853 ObjectFile *objfile = module_sp->GetMemoryObjectFile (shared_from_this(), header_addr, error, size_to_read);
Greg Claytonc7f09cc2012-02-24 21:55:59 +00002854 if (objfile)
Greg Claytonc7f09cc2012-02-24 21:55:59 +00002855 return module_sp;
Greg Claytonc9660542012-02-05 02:38:54 +00002856 }
Greg Claytonc7f09cc2012-02-24 21:55:59 +00002857 return ModuleSP();
Greg Claytonc9660542012-02-05 02:38:54 +00002858}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002859
Zachary Turner93749ab2015-03-03 21:51:25 +00002860bool
2861Process::GetLoadAddressPermissions (lldb::addr_t load_addr, uint32_t &permissions)
2862{
2863 MemoryRegionInfo range_info;
2864 permissions = 0;
2865 Error error (GetMemoryRegionInfo (load_addr, range_info));
2866 if (!error.Success())
2867 return false;
2868 if (range_info.GetReadable() == MemoryRegionInfo::eDontKnow
2869 || range_info.GetWritable() == MemoryRegionInfo::eDontKnow
2870 || range_info.GetExecutable() == MemoryRegionInfo::eDontKnow)
2871 {
2872 return false;
2873 }
2874
2875 if (range_info.GetReadable() == MemoryRegionInfo::eYes)
2876 permissions |= lldb::ePermissionsReadable;
2877
2878 if (range_info.GetWritable() == MemoryRegionInfo::eYes)
2879 permissions |= lldb::ePermissionsWritable;
2880
2881 if (range_info.GetExecutable() == MemoryRegionInfo::eYes)
2882 permissions |= lldb::ePermissionsExecutable;
2883
2884 return true;
2885}
2886
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002887Error
Jim Ingham1b5792e2012-12-18 02:03:49 +00002888Process::EnableWatchpoint (Watchpoint *watchpoint, bool notify)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002889{
2890 Error error;
2891 error.SetErrorString("watchpoints are not supported");
2892 return error;
2893}
2894
2895Error
Jim Ingham1b5792e2012-12-18 02:03:49 +00002896Process::DisableWatchpoint (Watchpoint *watchpoint, bool notify)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002897{
2898 Error error;
2899 error.SetErrorString("watchpoints are not supported");
2900 return error;
2901}
2902
2903StateType
2904Process::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp)
2905{
2906 StateType state;
2907 // Now wait for the process to launch and return control to us, and then
2908 // call DidLaunch:
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00002909 while (true)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002910 {
Greg Clayton6779606a2011-01-22 23:43:18 +00002911 event_sp.reset();
2912 state = WaitForStateChangedEventsPrivate (timeout, event_sp);
2913
Greg Clayton2637f822011-11-17 01:23:07 +00002914 if (StateIsStoppedState(state, false))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002915 break;
Greg Clayton6779606a2011-01-22 23:43:18 +00002916
2917 // If state is invalid, then we timed out
2918 if (state == eStateInvalid)
2919 break;
2920
2921 if (event_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002922 HandlePrivateEvent (event_sp);
2923 }
2924 return state;
2925}
2926
Greg Clayton332e8b12015-01-13 21:13:08 +00002927void
2928Process::LoadOperatingSystemPlugin(bool flush)
2929{
2930 if (flush)
2931 m_thread_list.Clear();
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00002932 m_os_ap.reset(OperatingSystem::FindPlugin(this, nullptr));
Greg Clayton332e8b12015-01-13 21:13:08 +00002933 if (flush)
2934 Flush();
2935}
2936
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002937Error
Greg Claytonfbb76342013-11-20 21:07:01 +00002938Process::Launch (ProcessLaunchInfo &launch_info)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002939{
2940 Error error;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002941 m_abi_sp.reset();
Greg Clayton93d3c8332011-02-16 04:46:07 +00002942 m_dyld_ap.reset();
Andrew MacPherson17220c12014-03-05 10:12:43 +00002943 m_jit_loaders_ap.reset();
Jason Molendaeef51062013-11-05 03:57:19 +00002944 m_system_runtime_ap.reset();
Greg Clayton56d9a1b2011-08-22 02:49:39 +00002945 m_os_ap.reset();
Caroline Ticeef5c6d02010-11-16 05:07:41 +00002946 m_process_input_reader.reset();
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00002947 m_stop_info_override_callback = nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002948
Zachary Turner7529df92015-09-01 20:02:29 +00002949 Module *exe_module = GetTarget().GetExecutableModulePointer();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002950 if (exe_module)
2951 {
Greg Clayton2289fa42011-04-30 01:09:13 +00002952 char local_exec_file_path[PATH_MAX];
2953 char platform_exec_file_path[PATH_MAX];
2954 exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path));
2955 exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002956 if (exe_module->GetFileSpec().Exists())
2957 {
Greg Claytonfbb76342013-11-20 21:07:01 +00002958 // Install anything that might need to be installed prior to launching.
2959 // For host systems, this will do nothing, but if we are connected to a
2960 // remote platform it will install any needed binaries
2961 error = GetTarget().Install(&launch_info);
2962 if (error.Fail())
2963 return error;
2964
Greg Clayton71337622011-02-24 22:24:29 +00002965 if (PrivateStateThreadIsValid ())
2966 PausePrivateStateThread ();
2967
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002968 error = WillLaunch (exe_module);
2969 if (error.Success())
2970 {
Jim Ingham221d51c2013-05-08 00:35:16 +00002971 const bool restarted = false;
2972 SetPublicState (eStateLaunching, restarted);
Greg Claytone24c4ac2011-11-17 04:46:02 +00002973 m_should_detach = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002974
Ed Maste64fad602013-07-29 20:58:06 +00002975 if (m_public_run_lock.TrySetRunning())
Greg Clayton69fd4be2012-09-04 20:29:05 +00002976 {
2977 // Now launch using these arguments.
2978 error = DoLaunch (exe_module, launch_info);
2979 }
2980 else
2981 {
2982 // This shouldn't happen
2983 error.SetErrorString("failed to acquire process run lock");
2984 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002985
2986 if (error.Fail())
2987 {
2988 if (GetID() != LLDB_INVALID_PROCESS_ID)
2989 {
2990 SetID (LLDB_INVALID_PROCESS_ID);
2991 const char *error_string = error.AsCString();
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00002992 if (error_string == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002993 error_string = "launch failed";
2994 SetExitStatus (-1, error_string);
2995 }
2996 }
2997 else
2998 {
2999 EventSP event_sp;
Greg Clayton1a38ea72011-06-22 01:42:17 +00003000 TimeValue timeout_time;
3001 timeout_time = TimeValue::Now();
3002 timeout_time.OffsetWithSeconds(10);
3003 StateType state = WaitForProcessStopPrivate(&timeout_time, event_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003004
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003005 if (state == eStateInvalid || !event_sp)
Greg Clayton1a38ea72011-06-22 01:42:17 +00003006 {
3007 // We were able to launch the process, but we failed to
3008 // catch the initial stop.
Tamas Berghammer04e63142015-02-23 10:59:54 +00003009 error.SetErrorString ("failed to catch stop after launch");
Greg Clayton1a38ea72011-06-22 01:42:17 +00003010 SetExitStatus (0, "failed to catch stop after launch");
Jason Molendaede31932015-04-17 05:01:58 +00003011 Destroy(false);
Greg Clayton1a38ea72011-06-22 01:42:17 +00003012 }
3013 else if (state == eStateStopped || state == eStateCrashed)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003014 {
3015 DidLaunch ();
3016
Greg Claytonc859e2d2012-02-13 23:10:39 +00003017 DynamicLoader *dyld = GetDynamicLoader ();
3018 if (dyld)
3019 dyld->DidLaunch();
Greg Clayton93d3c8332011-02-16 04:46:07 +00003020
Andrew MacPhersoneb4d0602014-03-13 09:37:02 +00003021 GetJITLoaders().DidLaunch();
Andrew MacPherson17220c12014-03-05 10:12:43 +00003022
Jason Molendaeef51062013-11-05 03:57:19 +00003023 SystemRuntime *system_runtime = GetSystemRuntime ();
3024 if (system_runtime)
3025 system_runtime->DidLaunch();
3026
Greg Clayton332e8b12015-01-13 21:13:08 +00003027 LoadOperatingSystemPlugin(false);
Todd Fialaf72fa672014-10-07 16:05:21 +00003028
3029 // Note, the stop event was consumed above, but not handled. This was done
3030 // to give DidLaunch a chance to run. The target is either stopped or crashed.
3031 // Directly set the state. This is done to prevent a stop message with a bunch
3032 // of spurious output on thread status, as well as not pop a ProcessIOHandler.
3033 SetPublicState(state, false);
Greg Clayton71337622011-02-24 22:24:29 +00003034
3035 if (PrivateStateThreadIsValid ())
3036 ResumePrivateStateThread ();
3037 else
3038 StartPrivateStateThread ();
Greg Claytona97c4d22014-12-09 23:31:02 +00003039
3040 m_stop_info_override_callback = GetTarget().GetArchitecture().GetStopInfoOverrideCallback();
Ilia K6af632f2015-02-06 18:15:05 +00003041
3042 // Target was stopped at entry as was intended. Need to notify the listeners
3043 // about it.
Ilia K333fc182015-02-11 11:24:20 +00003044 if (state == eStateStopped && launch_info.GetFlags().Test(eLaunchFlagStopAtEntry))
Ilia K6af632f2015-02-06 18:15:05 +00003045 HandlePrivateEvent(event_sp);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003046 }
3047 else if (state == eStateExited)
3048 {
3049 // We exited while trying to launch somehow. Don't call DidLaunch as that's
3050 // not likely to work, and return an invalid pid.
3051 HandlePrivateEvent (event_sp);
3052 }
3053 }
3054 }
3055 }
3056 else
3057 {
Greg Clayton86edbf42011-10-26 00:56:27 +00003058 error.SetErrorStringWithFormat("file doesn't exist: '%s'", local_exec_file_path);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003059 }
3060 }
3061 return error;
3062}
3063
Greg Claytonc3776bf2012-02-09 06:16:32 +00003064Error
3065Process::LoadCore ()
3066{
3067 Error error = DoLoadCore();
3068 if (error.Success())
3069 {
Jim Ingham583bbb12016-03-07 21:50:25 +00003070 ListenerSP listener_sp (Listener::MakeListener("lldb.process.load_core_listener"));
3071 HijackProcessEvents(listener_sp);
Greg Clayton35824e32015-02-20 20:59:47 +00003072
Greg Claytonc3776bf2012-02-09 06:16:32 +00003073 if (PrivateStateThreadIsValid ())
3074 ResumePrivateStateThread ();
3075 else
3076 StartPrivateStateThread ();
3077
Greg Claytonc859e2d2012-02-13 23:10:39 +00003078 DynamicLoader *dyld = GetDynamicLoader ();
3079 if (dyld)
3080 dyld->DidAttach();
Andrew MacPherson17220c12014-03-05 10:12:43 +00003081
Andrew MacPhersoneb4d0602014-03-13 09:37:02 +00003082 GetJITLoaders().DidAttach();
Greg Claytonc859e2d2012-02-13 23:10:39 +00003083
Jason Molendaeef51062013-11-05 03:57:19 +00003084 SystemRuntime *system_runtime = GetSystemRuntime ();
3085 if (system_runtime)
3086 system_runtime->DidAttach();
3087
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003088 m_os_ap.reset(OperatingSystem::FindPlugin(this, nullptr));
Greg Claytonc3776bf2012-02-09 06:16:32 +00003089 // We successfully loaded a core file, now pretend we stopped so we can
3090 // show all of the threads in the core file and explore the crashed
3091 // state.
3092 SetPrivateState (eStateStopped);
Greg Clayton35824e32015-02-20 20:59:47 +00003093
3094 // Wait indefinitely for a stopped event since we just posted one above...
3095 lldb::EventSP event_sp;
Jim Ingham583bbb12016-03-07 21:50:25 +00003096 listener_sp->WaitForEvent (nullptr, event_sp);
Greg Clayton35824e32015-02-20 20:59:47 +00003097 StateType state = ProcessEventData::GetStateFromEvent(event_sp.get());
3098
3099 if (!StateIsStoppedState (state, false))
3100 {
3101 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3102 if (log)
3103 log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state));
3104 error.SetErrorString ("Did not get stopped event after loading the core file.");
3105 }
Greg Clayton338d0bd2015-02-20 21:51:06 +00003106 RestoreProcessEvents ();
Greg Claytonc3776bf2012-02-09 06:16:32 +00003107 }
3108 return error;
3109}
3110
Greg Claytonc859e2d2012-02-13 23:10:39 +00003111DynamicLoader *
3112Process::GetDynamicLoader ()
3113{
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003114 if (!m_dyld_ap)
3115 m_dyld_ap.reset(DynamicLoader::FindPlugin(this, nullptr));
Greg Claytonc859e2d2012-02-13 23:10:39 +00003116 return m_dyld_ap.get();
3117}
Greg Claytonc3776bf2012-02-09 06:16:32 +00003118
Todd Fialaaf245d12014-06-30 21:05:18 +00003119const lldb::DataBufferSP
3120Process::GetAuxvData()
3121{
3122 return DataBufferSP ();
3123}
3124
Andrew MacPherson17220c12014-03-05 10:12:43 +00003125JITLoaderList &
3126Process::GetJITLoaders ()
3127{
3128 if (!m_jit_loaders_ap)
3129 {
3130 m_jit_loaders_ap.reset(new JITLoaderList());
3131 JITLoader::LoadPlugins(this, *m_jit_loaders_ap);
3132 }
3133 return *m_jit_loaders_ap;
3134}
3135
Jason Molendaeef51062013-11-05 03:57:19 +00003136SystemRuntime *
3137Process::GetSystemRuntime ()
3138{
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003139 if (!m_system_runtime_ap)
3140 m_system_runtime_ap.reset(SystemRuntime::FindPlugin(this));
Jason Molendaeef51062013-11-05 03:57:19 +00003141 return m_system_runtime_ap.get();
3142}
3143
Todd Fiala76e0fc92014-08-27 22:58:26 +00003144Process::AttachCompletionHandler::AttachCompletionHandler (Process *process, uint32_t exec_count) :
3145 NextEventAction (process),
3146 m_exec_count (exec_count)
3147{
3148 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3149 if (log)
3150 log->Printf ("Process::AttachCompletionHandler::%s process=%p, exec_count=%" PRIu32, __FUNCTION__, static_cast<void*>(process), exec_count);
3151}
Greg Claytonc3776bf2012-02-09 06:16:32 +00003152
Jim Inghambb3a2832011-01-29 01:49:25 +00003153Process::NextEventAction::EventActionResult
3154Process::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003155{
Todd Fiala76e0fc92014-08-27 22:58:26 +00003156 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3157
Jim Inghambb3a2832011-01-29 01:49:25 +00003158 StateType state = ProcessEventData::GetStateFromEvent (event_sp.get());
Todd Fiala76e0fc92014-08-27 22:58:26 +00003159 if (log)
3160 log->Printf ("Process::AttachCompletionHandler::%s called with state %s (%d)", __FUNCTION__, StateAsCString(state), static_cast<int> (state));
3161
3162 switch (state)
Greg Clayton19388cf2010-10-18 01:45:30 +00003163 {
Zachary Turnerc62733b2015-05-20 18:31:17 +00003164 case eStateAttaching:
3165 return eEventActionSuccess;
3166
Greg Clayton513c26c2011-01-29 07:10:55 +00003167 case eStateRunning:
Greg Clayton71337622011-02-24 22:24:29 +00003168 case eStateConnected:
Greg Clayton513c26c2011-01-29 07:10:55 +00003169 return eEventActionRetry;
3170
3171 case eStateStopped:
3172 case eStateCrashed:
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003173 // During attach, prior to sending the eStateStopped event,
3174 // lldb_private::Process subclasses must set the new process ID.
3175 assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID);
3176 // We don't want these events to be reported, so go set the ShouldReportStop here:
3177 m_process->GetThreadList().SetShouldReportStop (eVoteNo);
3178
3179 if (m_exec_count > 0)
Greg Claytonc9ed4782011-11-12 02:10:56 +00003180 {
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003181 --m_exec_count;
Todd Fiala76e0fc92014-08-27 22:58:26 +00003182
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003183 if (log)
3184 log->Printf ("Process::AttachCompletionHandler::%s state %s: reduced remaining exec count to %" PRIu32 ", requesting resume", __FUNCTION__, StateAsCString(state), m_exec_count);
Todd Fiala76e0fc92014-08-27 22:58:26 +00003185
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003186 RequestResume();
3187 return eEventActionRetry;
3188 }
3189 else
3190 {
3191 if (log)
3192 log->Printf ("Process::AttachCompletionHandler::%s state %s: no more execs expected to start, continuing with attach", __FUNCTION__, StateAsCString(state));
Todd Fiala76e0fc92014-08-27 22:58:26 +00003193
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003194 m_process->CompleteAttach ();
3195 return eEventActionSuccess;
Greg Claytonc9ed4782011-11-12 02:10:56 +00003196 }
Greg Clayton513c26c2011-01-29 07:10:55 +00003197 break;
Greg Claytonc9ed4782011-11-12 02:10:56 +00003198
Greg Clayton513c26c2011-01-29 07:10:55 +00003199 default:
3200 case eStateExited:
3201 case eStateInvalid:
Greg Clayton513c26c2011-01-29 07:10:55 +00003202 break;
Jim Inghambb3a2832011-01-29 01:49:25 +00003203 }
Greg Claytonc9ed4782011-11-12 02:10:56 +00003204
3205 m_exit_string.assign ("No valid Process");
3206 return eEventActionExit;
Jim Inghambb3a2832011-01-29 01:49:25 +00003207}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003208
Jim Inghambb3a2832011-01-29 01:49:25 +00003209Process::NextEventAction::EventActionResult
3210Process::AttachCompletionHandler::HandleBeingInterrupted()
3211{
3212 return eEventActionSuccess;
3213}
3214
3215const char *
3216Process::AttachCompletionHandler::GetExitString ()
3217{
3218 return m_exit_string.c_str();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003219}
3220
Jim Ingham583bbb12016-03-07 21:50:25 +00003221ListenerSP
Greg Clayton8012cad2014-11-17 19:39:20 +00003222ProcessAttachInfo::GetListenerForProcess (Debugger &debugger)
3223{
Jim Ingham583bbb12016-03-07 21:50:25 +00003224 if (m_listener_sp)
3225 return m_listener_sp;
3226 else
3227 return debugger.GetListener();
Greg Clayton8012cad2014-11-17 19:39:20 +00003228}
3229
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003230Error
Greg Clayton144f3a92011-11-15 03:53:30 +00003231Process::Attach (ProcessAttachInfo &attach_info)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003232{
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003233 m_abi_sp.reset();
Caroline Ticeef5c6d02010-11-16 05:07:41 +00003234 m_process_input_reader.reset();
Greg Clayton93d3c8332011-02-16 04:46:07 +00003235 m_dyld_ap.reset();
Andrew MacPherson17220c12014-03-05 10:12:43 +00003236 m_jit_loaders_ap.reset();
Jason Molendaeef51062013-11-05 03:57:19 +00003237 m_system_runtime_ap.reset();
Greg Clayton56d9a1b2011-08-22 02:49:39 +00003238 m_os_ap.reset();
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003239 m_stop_info_override_callback = nullptr;
Jim Ingham5aee1622010-08-09 23:31:02 +00003240
Greg Clayton144f3a92011-11-15 03:53:30 +00003241 lldb::pid_t attach_pid = attach_info.GetProcessID();
Greg Claytone996fd32011-03-08 22:40:15 +00003242 Error error;
Greg Clayton144f3a92011-11-15 03:53:30 +00003243 if (attach_pid == LLDB_INVALID_PROCESS_ID)
Jim Ingham5aee1622010-08-09 23:31:02 +00003244 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003245 char process_name[PATH_MAX];
Jim Ingham4299fdb2011-09-15 01:10:17 +00003246
Greg Clayton144f3a92011-11-15 03:53:30 +00003247 if (attach_info.GetExecutableFile().GetPath (process_name, sizeof(process_name)))
Jim Ingham2ecb7422010-08-17 21:54:19 +00003248 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003249 const bool wait_for_launch = attach_info.GetWaitForLaunch();
3250
3251 if (wait_for_launch)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003252 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003253 error = WillAttachToProcessWithName(process_name, wait_for_launch);
3254 if (error.Success())
3255 {
Ed Maste64fad602013-07-29 20:58:06 +00003256 if (m_public_run_lock.TrySetRunning())
Greg Clayton926cce72012-10-12 16:10:12 +00003257 {
3258 m_should_detach = true;
Jim Ingham221d51c2013-05-08 00:35:16 +00003259 const bool restarted = false;
3260 SetPublicState (eStateAttaching, restarted);
Greg Clayton926cce72012-10-12 16:10:12 +00003261 // Now attach using these arguments.
Jean-Daniel Dupas9c517c02013-12-23 22:32:54 +00003262 error = DoAttachToProcessWithName (process_name, attach_info);
Greg Clayton926cce72012-10-12 16:10:12 +00003263 }
3264 else
3265 {
3266 // This shouldn't happen
3267 error.SetErrorString("failed to acquire process run lock");
3268 }
Greg Claytone24c4ac2011-11-17 04:46:02 +00003269
Greg Clayton144f3a92011-11-15 03:53:30 +00003270 if (error.Fail())
3271 {
3272 if (GetID() != LLDB_INVALID_PROCESS_ID)
3273 {
3274 SetID (LLDB_INVALID_PROCESS_ID);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003275 if (error.AsCString() == nullptr)
Greg Clayton144f3a92011-11-15 03:53:30 +00003276 error.SetErrorString("attach failed");
3277
3278 SetExitStatus(-1, error.AsCString());
3279 }
3280 }
3281 else
3282 {
3283 SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount()));
3284 StartPrivateStateThread();
3285 }
3286 return error;
3287 }
Greg Claytone996fd32011-03-08 22:40:15 +00003288 }
Greg Clayton144f3a92011-11-15 03:53:30 +00003289 else
Greg Claytone996fd32011-03-08 22:40:15 +00003290 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003291 ProcessInstanceInfoList process_infos;
Zachary Turner7529df92015-09-01 20:02:29 +00003292 PlatformSP platform_sp (GetTarget().GetPlatform ());
Greg Clayton144f3a92011-11-15 03:53:30 +00003293
3294 if (platform_sp)
3295 {
3296 ProcessInstanceInfoMatch match_info;
3297 match_info.GetProcessInfo() = attach_info;
3298 match_info.SetNameMatchType (eNameMatchEquals);
3299 platform_sp->FindProcesses (match_info, process_infos);
3300 const uint32_t num_matches = process_infos.GetSize();
3301 if (num_matches == 1)
3302 {
3303 attach_pid = process_infos.GetProcessIDAtIndex(0);
3304 // Fall through and attach using the above process ID
3305 }
3306 else
3307 {
3308 match_info.GetProcessInfo().GetExecutableFile().GetPath (process_name, sizeof(process_name));
3309 if (num_matches > 1)
Jim Ingham368ac222014-08-15 17:05:27 +00003310 {
3311 StreamString s;
3312 ProcessInstanceInfo::DumpTableHeader (s, platform_sp.get(), true, false);
3313 for (size_t i = 0; i < num_matches; i++)
3314 {
3315 process_infos.GetProcessInfoAtIndex(i).DumpAsTableRow(s, platform_sp.get(), true, false);
3316 }
3317 error.SetErrorStringWithFormat ("more than one process named %s:\n%s",
3318 process_name,
3319 s.GetData());
3320 }
Greg Clayton144f3a92011-11-15 03:53:30 +00003321 else
3322 error.SetErrorStringWithFormat ("could not find a process named %s", process_name);
3323 }
3324 }
3325 else
3326 {
3327 error.SetErrorString ("invalid platform, can't find processes by name");
3328 return error;
3329 }
Greg Claytone996fd32011-03-08 22:40:15 +00003330 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003331 }
3332 else
Greg Clayton144f3a92011-11-15 03:53:30 +00003333 {
3334 error.SetErrorString ("invalid process name");
Greg Claytone996fd32011-03-08 22:40:15 +00003335 }
3336 }
Greg Clayton144f3a92011-11-15 03:53:30 +00003337
3338 if (attach_pid != LLDB_INVALID_PROCESS_ID)
Greg Claytone996fd32011-03-08 22:40:15 +00003339 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003340 error = WillAttachToProcessWithID(attach_pid);
Greg Claytone996fd32011-03-08 22:40:15 +00003341 if (error.Success())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003342 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003343
Ed Maste64fad602013-07-29 20:58:06 +00003344 if (m_public_run_lock.TrySetRunning())
Greg Clayton926cce72012-10-12 16:10:12 +00003345 {
3346 // Now attach using these arguments.
3347 m_should_detach = true;
Jim Ingham221d51c2013-05-08 00:35:16 +00003348 const bool restarted = false;
3349 SetPublicState (eStateAttaching, restarted);
Greg Clayton926cce72012-10-12 16:10:12 +00003350 error = DoAttachToProcessWithID (attach_pid, attach_info);
3351 }
3352 else
3353 {
3354 // This shouldn't happen
3355 error.SetErrorString("failed to acquire process run lock");
3356 }
3357
Greg Clayton144f3a92011-11-15 03:53:30 +00003358 if (error.Success())
3359 {
Greg Clayton144f3a92011-11-15 03:53:30 +00003360 SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount()));
3361 StartPrivateStateThread();
3362 }
3363 else
Greg Claytone996fd32011-03-08 22:40:15 +00003364 {
3365 if (GetID() != LLDB_INVALID_PROCESS_ID)
Greg Claytone996fd32011-03-08 22:40:15 +00003366 SetID (LLDB_INVALID_PROCESS_ID);
Greg Claytone996fd32011-03-08 22:40:15 +00003367
Oleksiy Vyalov5d064742014-11-19 18:27:45 +00003368 const char *error_string = error.AsCString();
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003369 if (error_string == nullptr)
Oleksiy Vyalov5d064742014-11-19 18:27:45 +00003370 error_string = "attach failed";
3371
3372 SetExitStatus(-1, error_string);
Greg Claytone996fd32011-03-08 22:40:15 +00003373 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003374 }
3375 }
3376 return error;
3377}
3378
Greg Clayton93d3c8332011-02-16 04:46:07 +00003379void
3380Process::CompleteAttach ()
3381{
Jason Molenda7d002762016-04-07 22:00:55 +00003382 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_TARGET));
Todd Fiala76e0fc92014-08-27 22:58:26 +00003383 if (log)
3384 log->Printf ("Process::%s()", __FUNCTION__);
3385
Greg Clayton93d3c8332011-02-16 04:46:07 +00003386 // Let the process subclass figure out at much as it can about the process
3387 // before we go looking for a dynamic loader plug-in.
Jim Inghambb006ce2014-08-02 00:33:35 +00003388 ArchSpec process_arch;
3389 DidAttach(process_arch);
3390
3391 if (process_arch.IsValid())
Todd Fiala76e0fc92014-08-27 22:58:26 +00003392 {
Zachary Turner7529df92015-09-01 20:02:29 +00003393 GetTarget().SetArchitecture(process_arch);
Todd Fiala76e0fc92014-08-27 22:58:26 +00003394 if (log)
3395 {
3396 const char *triple_str = process_arch.GetTriple().getTriple().c_str ();
3397 log->Printf ("Process::%s replacing process architecture with DidAttach() architecture: %s",
3398 __FUNCTION__,
3399 triple_str ? triple_str : "<null>");
3400 }
3401 }
Greg Clayton93d3c8332011-02-16 04:46:07 +00003402
Jim Ingham4299fdb2011-09-15 01:10:17 +00003403 // We just attached. If we have a platform, ask it for the process architecture, and if it isn't
3404 // the same as the one we've already set, switch architectures.
Zachary Turner7529df92015-09-01 20:02:29 +00003405 PlatformSP platform_sp (GetTarget().GetPlatform ());
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003406 assert(platform_sp);
Jim Ingham4299fdb2011-09-15 01:10:17 +00003407 if (platform_sp)
3408 {
Zachary Turner7529df92015-09-01 20:02:29 +00003409 const ArchSpec &target_arch = GetTarget().GetArchitecture();
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003410 if (target_arch.IsValid() && !platform_sp->IsCompatibleArchitecture(target_arch, false, nullptr))
Greg Clayton70512312012-05-08 01:45:38 +00003411 {
3412 ArchSpec platform_arch;
3413 platform_sp = platform_sp->GetPlatformForArchitecture (target_arch, &platform_arch);
3414 if (platform_sp)
3415 {
Zachary Turner7529df92015-09-01 20:02:29 +00003416 GetTarget().SetPlatform (platform_sp);
3417 GetTarget().SetArchitecture(platform_arch);
Todd Fiala76e0fc92014-08-27 22:58:26 +00003418 if (log)
3419 log->Printf ("Process::%s switching platform to %s and architecture to %s based on info from attach", __FUNCTION__, platform_sp->GetName().AsCString (""), platform_arch.GetTriple().getTriple().c_str ());
Greg Clayton70512312012-05-08 01:45:38 +00003420 }
3421 }
Jim Inghambb006ce2014-08-02 00:33:35 +00003422 else if (!process_arch.IsValid())
Greg Clayton70512312012-05-08 01:45:38 +00003423 {
3424 ProcessInstanceInfo process_info;
Pavel Labatha933d512016-04-05 13:07:16 +00003425 GetProcessInfo(process_info);
Greg Clayton70512312012-05-08 01:45:38 +00003426 const ArchSpec &process_arch = process_info.GetArchitecture();
Zachary Turner7529df92015-09-01 20:02:29 +00003427 if (process_arch.IsValid() && !GetTarget().GetArchitecture().IsExactMatch(process_arch))
Todd Fiala76e0fc92014-08-27 22:58:26 +00003428 {
Zachary Turner7529df92015-09-01 20:02:29 +00003429 GetTarget().SetArchitecture (process_arch);
Todd Fiala76e0fc92014-08-27 22:58:26 +00003430 if (log)
3431 log->Printf ("Process::%s switching architecture to %s based on info the platform retrieved for pid %" PRIu64, __FUNCTION__, process_arch.GetTriple().getTriple().c_str (), GetID ());
3432 }
Greg Clayton70512312012-05-08 01:45:38 +00003433 }
Jim Ingham4299fdb2011-09-15 01:10:17 +00003434 }
3435
3436 // We have completed the attach, now it is time to find the dynamic loader
Greg Clayton93d3c8332011-02-16 04:46:07 +00003437 // plug-in
Greg Claytonc859e2d2012-02-13 23:10:39 +00003438 DynamicLoader *dyld = GetDynamicLoader ();
3439 if (dyld)
Todd Fiala76e0fc92014-08-27 22:58:26 +00003440 {
Greg Claytonc859e2d2012-02-13 23:10:39 +00003441 dyld->DidAttach();
Todd Fiala76e0fc92014-08-27 22:58:26 +00003442 if (log)
3443 {
Zachary Turner7529df92015-09-01 20:02:29 +00003444 ModuleSP exe_module_sp = GetTarget().GetExecutableModule ();
Todd Fiala76e0fc92014-08-27 22:58:26 +00003445 log->Printf ("Process::%s after DynamicLoader::DidAttach(), target executable is %s (using %s plugin)",
3446 __FUNCTION__,
3447 exe_module_sp ? exe_module_sp->GetFileSpec().GetPath().c_str () : "<none>",
3448 dyld->GetPluginName().AsCString ("<unnamed>"));
3449 }
3450 }
Greg Clayton93d3c8332011-02-16 04:46:07 +00003451
Andrew MacPhersoneb4d0602014-03-13 09:37:02 +00003452 GetJITLoaders().DidAttach();
Andrew MacPherson17220c12014-03-05 10:12:43 +00003453
Jason Molendaeef51062013-11-05 03:57:19 +00003454 SystemRuntime *system_runtime = GetSystemRuntime ();
3455 if (system_runtime)
Todd Fiala76e0fc92014-08-27 22:58:26 +00003456 {
Jason Molendaeef51062013-11-05 03:57:19 +00003457 system_runtime->DidAttach();
Todd Fiala76e0fc92014-08-27 22:58:26 +00003458 if (log)
3459 {
Zachary Turner7529df92015-09-01 20:02:29 +00003460 ModuleSP exe_module_sp = GetTarget().GetExecutableModule ();
Todd Fiala76e0fc92014-08-27 22:58:26 +00003461 log->Printf ("Process::%s after SystemRuntime::DidAttach(), target executable is %s (using %s plugin)",
3462 __FUNCTION__,
3463 exe_module_sp ? exe_module_sp->GetFileSpec().GetPath().c_str () : "<none>",
3464 system_runtime->GetPluginName().AsCString("<unnamed>"));
3465 }
3466 }
Jason Molendaeef51062013-11-05 03:57:19 +00003467
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003468 m_os_ap.reset(OperatingSystem::FindPlugin(this, nullptr));
Greg Clayton93d3c8332011-02-16 04:46:07 +00003469 // Figure out which one is the executable, and set that in our target:
Zachary Turner7529df92015-09-01 20:02:29 +00003470 const ModuleList &target_modules = GetTarget().GetImages();
Jim Ingham3ee12ef2012-05-30 02:19:25 +00003471 Mutex::Locker modules_locker(target_modules.GetMutex());
3472 size_t num_modules = target_modules.GetSize();
3473 ModuleSP new_executable_module_sp;
Greg Clayton93d3c8332011-02-16 04:46:07 +00003474
Andy Gibbsa297a972013-06-19 19:04:53 +00003475 for (size_t i = 0; i < num_modules; i++)
Greg Clayton93d3c8332011-02-16 04:46:07 +00003476 {
Jim Ingham3ee12ef2012-05-30 02:19:25 +00003477 ModuleSP module_sp (target_modules.GetModuleAtIndexUnlocked (i));
Greg Clayton8b82f082011-04-12 05:54:46 +00003478 if (module_sp && module_sp->IsExecutable())
Greg Clayton93d3c8332011-02-16 04:46:07 +00003479 {
Zachary Turner7529df92015-09-01 20:02:29 +00003480 if (GetTarget().GetExecutableModulePointer() != module_sp.get())
Jim Ingham3ee12ef2012-05-30 02:19:25 +00003481 new_executable_module_sp = module_sp;
Greg Clayton93d3c8332011-02-16 04:46:07 +00003482 break;
3483 }
3484 }
Jim Ingham3ee12ef2012-05-30 02:19:25 +00003485 if (new_executable_module_sp)
Todd Fiala76e0fc92014-08-27 22:58:26 +00003486 {
Zachary Turner7529df92015-09-01 20:02:29 +00003487 GetTarget().SetExecutableModule (new_executable_module_sp, false);
Todd Fiala76e0fc92014-08-27 22:58:26 +00003488 if (log)
3489 {
Zachary Turner7529df92015-09-01 20:02:29 +00003490 ModuleSP exe_module_sp = GetTarget().GetExecutableModule ();
Todd Fiala76e0fc92014-08-27 22:58:26 +00003491 log->Printf ("Process::%s after looping through modules, target executable is %s",
3492 __FUNCTION__,
3493 exe_module_sp ? exe_module_sp->GetFileSpec().GetPath().c_str () : "<none>");
3494 }
3495 }
Greg Claytona97c4d22014-12-09 23:31:02 +00003496
3497 m_stop_info_override_callback = process_arch.GetStopInfoOverrideCallback();
Greg Clayton93d3c8332011-02-16 04:46:07 +00003498}
3499
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003500Error
Jason Molenda4bd4e7e2012-09-29 04:02:01 +00003501Process::ConnectRemote (Stream *strm, const char *remote_url)
Greg Claytonb766a732011-02-04 01:58:07 +00003502{
Greg Claytonb766a732011-02-04 01:58:07 +00003503 m_abi_sp.reset();
3504 m_process_input_reader.reset();
3505
3506 // Find the process and its architecture. Make sure it matches the architecture
3507 // of the current Target, and if not adjust it.
3508
Jason Molenda4bd4e7e2012-09-29 04:02:01 +00003509 Error error (DoConnectRemote (strm, remote_url));
Greg Claytonb766a732011-02-04 01:58:07 +00003510 if (error.Success())
3511 {
Greg Clayton71337622011-02-24 22:24:29 +00003512 if (GetID() != LLDB_INVALID_PROCESS_ID)
3513 {
Greg Clayton32e0a752011-03-30 18:16:51 +00003514 EventSP event_sp;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003515 StateType state = WaitForProcessStopPrivate(nullptr, event_sp);
Greg Clayton32e0a752011-03-30 18:16:51 +00003516
3517 if (state == eStateStopped || state == eStateCrashed)
3518 {
3519 // If we attached and actually have a process on the other end, then
3520 // this ended up being the equivalent of an attach.
3521 CompleteAttach ();
3522
3523 // This delays passing the stopped event to listeners till
3524 // CompleteAttach gets a chance to complete...
3525 HandlePrivateEvent (event_sp);
Greg Clayton32e0a752011-03-30 18:16:51 +00003526 }
Greg Clayton71337622011-02-24 22:24:29 +00003527 }
Greg Clayton32e0a752011-03-30 18:16:51 +00003528
3529 if (PrivateStateThreadIsValid ())
3530 ResumePrivateStateThread ();
3531 else
3532 StartPrivateStateThread ();
Greg Claytonb766a732011-02-04 01:58:07 +00003533 }
3534 return error;
3535}
3536
Greg Claytonb766a732011-02-04 01:58:07 +00003537Error
Jim Ingham3b8285d2012-04-19 01:40:33 +00003538Process::PrivateResume ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003539{
Greg Clayton5160ce52013-03-27 23:08:40 +00003540 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS|LIBLLDB_LOG_STEP));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003541 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00003542 log->Printf("Process::PrivateResume() m_stop_id = %u, public state: %s private state: %s",
Jim Ingham4b536182011-08-09 02:12:22 +00003543 m_mod_id.GetStopID(),
Jim Ingham444586b2011-01-24 06:34:17 +00003544 StateAsCString(m_public_state.GetValue()),
3545 StateAsCString(m_private_state.GetValue()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003546
3547 Error error (WillResume());
3548 // Tell the process it is about to resume before the thread list
3549 if (error.Success())
3550 {
Johnny Chenc4221e42010-12-02 20:53:05 +00003551 // Now let the thread list know we are about to resume so it
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003552 // can let all of our threads know that they are about to be
3553 // resumed. Threads will each be called with
3554 // Thread::WillResume(StateType) where StateType contains the state
3555 // that they are supposed to have when the process is resumed
3556 // (suspended/running/stepping). Threads should also check
3557 // their resume signal in lldb::Thread::GetResumeSignal()
Jim Ingham221d51c2013-05-08 00:35:16 +00003558 // to see if they are supposed to start back up with a signal.
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003559 if (m_thread_list.WillResume())
3560 {
Jim Ingham372787f2012-04-07 00:00:41 +00003561 // Last thing, do the PreResumeActions.
3562 if (!RunPreResumeActions())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003563 {
Jim Ingham0161b492013-02-09 01:29:05 +00003564 error.SetErrorStringWithFormat ("Process::PrivateResume PreResumeActions failed, not resuming.");
Jim Ingham372787f2012-04-07 00:00:41 +00003565 }
3566 else
3567 {
3568 m_mod_id.BumpResumeID();
3569 error = DoResume();
3570 if (error.Success())
3571 {
3572 DidResume();
3573 m_thread_list.DidResume();
3574 if (log)
3575 log->Printf ("Process thinks the process has resumed.");
3576 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003577 }
3578 }
3579 else
3580 {
Jim Inghamd5ac1ab2015-01-19 23:51:51 +00003581 // Somebody wanted to run without running (e.g. we were faking a step from one frame of a set of inlined
3582 // frames that share the same PC to another.) So generate a continue & a stopped event,
Jim Ingham513c6bb2012-09-01 01:02:41 +00003583 // and let the world handle them.
3584 if (log)
3585 log->Printf ("Process::PrivateResume() asked to simulate a start & stop.");
3586
3587 SetPrivateState(eStateRunning);
3588 SetPrivateState(eStateStopped);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003589 }
3590 }
Jim Ingham444586b2011-01-24 06:34:17 +00003591 else if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00003592 log->Printf ("Process::PrivateResume() got an error \"%s\".", error.AsCString("<unknown error>"));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003593 return error;
3594}
3595
3596Error
Pavel Labath19da1f12015-12-07 12:36:52 +00003597Process::Halt (bool clear_thread_plans, bool use_run_lock)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003598{
Pavel Labath19da1f12015-12-07 12:36:52 +00003599 if (! StateIsRunningState(m_public_state.GetValue()))
3600 return Error("Process is not running.");
3601
Greg Claytonf9b57b92013-05-10 23:48:10 +00003602 // Don't clear the m_clear_thread_plans_on_stop, only set it to true if
3603 // in case it was already set and some thread plan logic calls halt on its
3604 // own.
3605 m_clear_thread_plans_on_stop |= clear_thread_plans;
3606
Jim Ingham583bbb12016-03-07 21:50:25 +00003607 ListenerSP halt_listener_sp (Listener::MakeListener("lldb.process.halt_listener"));
3608 HijackProcessEvents(halt_listener_sp);
Greg Clayton3af9ea52010-11-18 05:57:03 +00003609
Jim Inghambb3a2832011-01-29 01:49:25 +00003610 EventSP event_sp;
Jim Inghambb3a2832011-01-29 01:49:25 +00003611
Pavel Labath19da1f12015-12-07 12:36:52 +00003612 SendAsyncInterrupt();
3613
3614 if (m_public_state.GetValue() == eStateAttaching)
Jim Inghambb3a2832011-01-29 01:49:25 +00003615 {
Pavel Labath19da1f12015-12-07 12:36:52 +00003616 // Don't hijack and eat the eStateExited as the code that was doing
3617 // the attach will be waiting for this event...
3618 RestoreProcessEvents();
3619 SetExitStatus(SIGKILL, "Cancelled async attach.");
3620 Destroy (false);
3621 return Error();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003622 }
Jim Inghambb3a2832011-01-29 01:49:25 +00003623
Pavel Labath19da1f12015-12-07 12:36:52 +00003624 // Wait for 10 second for the process to stop.
3625 TimeValue timeout_time;
3626 timeout_time = TimeValue::Now();
3627 timeout_time.OffsetWithSeconds(10);
Jim Ingham583bbb12016-03-07 21:50:25 +00003628 StateType state = WaitForProcessToStop(&timeout_time, &event_sp, true, halt_listener_sp,
Pavel Labath19da1f12015-12-07 12:36:52 +00003629 nullptr, use_run_lock);
3630 RestoreProcessEvents();
Jim Inghambb3a2832011-01-29 01:49:25 +00003631
Pavel Labath19da1f12015-12-07 12:36:52 +00003632 if (state == eStateInvalid || ! event_sp)
3633 {
3634 // We timed out and didn't get a stop event...
3635 return Error("Halt timed out. State = %s", StateAsCString(GetState()));
3636 }
3637
3638 BroadcastEvent(event_sp);
3639
3640 return Error();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003641}
3642
3643Error
Pavel Labathfcc7f662015-10-07 15:11:11 +00003644Process::StopForDestroyOrDetach(lldb::EventSP &exit_event_sp)
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003645{
3646 Error error;
3647 if (m_public_state.GetValue() == eStateRunning)
3648 {
3649 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
3650 if (log)
Pavel Labathfcc7f662015-10-07 15:11:11 +00003651 log->Printf("Process::%s() About to stop.", __FUNCTION__);
3652
Jim Ingham583bbb12016-03-07 21:50:25 +00003653 ListenerSP listener_sp (Listener::MakeListener("lldb.Process.StopForDestroyOrDetach.hijack"));
3654 HijackProcessEvents(listener_sp);
Pavel Labathfcc7f662015-10-07 15:11:11 +00003655
3656 SendAsyncInterrupt();
3657
3658 // Consume the interrupt event.
3659 TimeValue timeout (TimeValue::Now());
3660 timeout.OffsetWithSeconds(10);
3661
Jim Ingham583bbb12016-03-07 21:50:25 +00003662 StateType state = WaitForProcessToStop (&timeout, &exit_event_sp, true, listener_sp);
Pavel Labathfcc7f662015-10-07 15:11:11 +00003663
3664 RestoreProcessEvents();
3665
3666 // If the process exited while we were waiting for it to stop, put the exited event into
3667 // the shared pointer passed in and return. Our caller doesn't need to do anything else, since
3668 // they don't have a process anymore...
3669
3670 if (state == eStateExited || m_private_state.GetValue() == eStateExited)
Pavel Labathc8c77d42015-09-28 09:37:51 +00003671 {
3672 if (log)
Pavel Labathfcc7f662015-10-07 15:11:11 +00003673 log->Printf("Process::%s() Process exited while waiting to stop.", __FUNCTION__);
3674 return error;
3675 }
3676 else
3677 exit_event_sp.reset(); // It is ok to consume any non-exit stop events
3678
3679 if (state != eStateStopped)
3680 {
3681 if (log)
3682 log->Printf("Process::%s() failed to stop, state is: %s", __FUNCTION__, StateAsCString(state));
3683 // If we really couldn't stop the process then we should just error out here, but if the
3684 // lower levels just bobbled sending the event and we really are stopped, then continue on.
3685 StateType private_state = m_private_state.GetValue();
3686 if (private_state != eStateStopped)
3687 {
3688 return error;
3689 }
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003690 }
3691 }
3692 return error;
3693}
3694
3695Error
Jim Inghamacff8952013-05-02 00:27:30 +00003696Process::Detach (bool keep_stopped)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003697{
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003698 EventSP exit_event_sp;
3699 Error error;
3700 m_destroy_in_process = true;
3701
3702 error = WillDetach();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003703
3704 if (error.Success())
3705 {
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003706 if (DetachRequiresHalt())
3707 {
Pavel Labathfcc7f662015-10-07 15:11:11 +00003708 error = StopForDestroyOrDetach (exit_event_sp);
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003709 if (!error.Success())
3710 {
3711 m_destroy_in_process = false;
3712 return error;
3713 }
3714 else if (exit_event_sp)
3715 {
3716 // We shouldn't need to do anything else here. There's no process left to detach from...
3717 StopPrivateStateThread();
3718 m_destroy_in_process = false;
3719 return error;
3720 }
3721 }
3722
Andrew MacPhersonc3826b52014-03-25 19:59:36 +00003723 m_thread_list.DiscardThreadPlans();
3724 DisableAllBreakpointSites();
3725
Jim Inghamacff8952013-05-02 00:27:30 +00003726 error = DoDetach(keep_stopped);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003727 if (error.Success())
3728 {
3729 DidDetach();
3730 StopPrivateStateThread();
3731 }
Jim Inghamacff8952013-05-02 00:27:30 +00003732 else
3733 {
3734 return error;
3735 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003736 }
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003737 m_destroy_in_process = false;
3738
3739 // If we exited when we were waiting for a process to stop, then
3740 // forward the event here so we don't lose the event
3741 if (exit_event_sp)
3742 {
3743 // Directly broadcast our exited event because we shut down our
3744 // private state thread above
3745 BroadcastEvent(exit_event_sp);
3746 }
3747
3748 // If we have been interrupted (to kill us) in the middle of running, we may not end up propagating
3749 // the last events through the event system, in which case we might strand the write lock. Unlock
3750 // it here so when we do to tear down the process we don't get an error destroying the lock.
3751
Ed Maste64fad602013-07-29 20:58:06 +00003752 m_public_run_lock.SetStopped();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003753 return error;
3754}
3755
3756Error
Jason Molendaede31932015-04-17 05:01:58 +00003757Process::Destroy (bool force_kill)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003758{
Pavel Labath19da1f12015-12-07 12:36:52 +00003759
Jim Ingham09437922013-03-01 20:04:25 +00003760 // Tell ourselves we are in the process of destroying the process, so that we don't do any unnecessary work
3761 // that might hinder the destruction. Remember to set this back to false when we are done. That way if the attempt
3762 // failed and the process stays around for some reason it won't be in a confused state.
Jason Molendaede31932015-04-17 05:01:58 +00003763
3764 if (force_kill)
3765 m_should_detach = false;
Jim Ingham09437922013-03-01 20:04:25 +00003766
Ilia Kfcc89a02015-03-26 07:08:47 +00003767 if (GetShouldDetach())
3768 {
3769 // FIXME: This will have to be a process setting:
3770 bool keep_stopped = false;
3771 Detach(keep_stopped);
3772 }
3773
Jim Ingham09437922013-03-01 20:04:25 +00003774 m_destroy_in_process = true;
3775
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003776 Error error (WillDestroy());
3777 if (error.Success())
3778 {
Greg Clayton85fb1b92012-09-11 02:33:37 +00003779 EventSP exit_event_sp;
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003780 if (DestroyRequiresHalt())
Jim Ingham04e0a222012-05-23 15:46:31 +00003781 {
Pavel Labathfcc7f662015-10-07 15:11:11 +00003782 error = StopForDestroyOrDetach(exit_event_sp);
Jim Ingham04e0a222012-05-23 15:46:31 +00003783 }
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003784
Jim Inghamaacc3182012-06-06 00:29:30 +00003785 if (m_public_state.GetValue() != eStateRunning)
3786 {
3787 // Ditch all thread plans, and remove all our breakpoints: in case we have to restart the target to
3788 // kill it, we don't want it hitting a breakpoint...
3789 // Only do this if we've stopped, however, since if we didn't manage to halt it above, then
3790 // we're not going to have much luck doing this now.
3791 m_thread_list.DiscardThreadPlans();
3792 DisableAllBreakpointSites();
3793 }
Jim Ingham8af3b9c2013-03-29 01:18:12 +00003794
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003795 error = DoDestroy();
3796 if (error.Success())
3797 {
3798 DidDestroy();
3799 StopPrivateStateThread();
3800 }
Caroline Ticeef5c6d02010-11-16 05:07:41 +00003801 m_stdio_communication.Disconnect();
Greg Clayton23d54f42015-06-03 00:34:01 +00003802 m_stdio_communication.StopReadThread();
Vince Harrondf3f00f2015-02-10 21:09:04 +00003803 m_stdin_forward = false;
Greg Claytonb4874f12014-02-28 18:22:24 +00003804
Caroline Ticeef5c6d02010-11-16 05:07:41 +00003805 if (m_process_input_reader)
Greg Claytonb4874f12014-02-28 18:22:24 +00003806 {
3807 m_process_input_reader->SetIsDone(true);
3808 m_process_input_reader->Cancel();
Caroline Ticeef5c6d02010-11-16 05:07:41 +00003809 m_process_input_reader.reset();
Greg Claytonb4874f12014-02-28 18:22:24 +00003810 }
3811
Greg Clayton85fb1b92012-09-11 02:33:37 +00003812 // If we exited when we were waiting for a process to stop, then
3813 // forward the event here so we don't lose the event
3814 if (exit_event_sp)
3815 {
3816 // Directly broadcast our exited event because we shut down our
3817 // private state thread above
3818 BroadcastEvent(exit_event_sp);
3819 }
3820
Jim Inghamb1e2e842012-04-12 18:49:31 +00003821 // If we have been interrupted (to kill us) in the middle of running, we may not end up propagating
3822 // the last events through the event system, in which case we might strand the write lock. Unlock
3823 // it here so when we do to tear down the process we don't get an error destroying the lock.
Ed Maste64fad602013-07-29 20:58:06 +00003824 m_public_run_lock.SetStopped();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003825 }
Jim Ingham09437922013-03-01 20:04:25 +00003826
3827 m_destroy_in_process = false;
3828
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003829 return error;
3830}
3831
3832Error
3833Process::Signal (int signal)
3834{
3835 Error error (WillSignal());
3836 if (error.Success())
3837 {
3838 error = DoSignal(signal);
3839 if (error.Success())
3840 DidSignal();
3841 }
3842 return error;
3843}
3844
Zachary Turner93749ab2015-03-03 21:51:25 +00003845void
Chaoren Linc963a222015-09-01 16:58:45 +00003846Process::SetUnixSignals(UnixSignalsSP &&signals_sp)
Zachary Turner93749ab2015-03-03 21:51:25 +00003847{
3848 assert (signals_sp && "null signals_sp");
3849 m_unix_signals_sp = signals_sp;
3850}
3851
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00003852const lldb::UnixSignalsSP &
Zachary Turner93749ab2015-03-03 21:51:25 +00003853Process::GetUnixSignals ()
3854{
3855 assert (m_unix_signals_sp && "null m_unix_signals_sp");
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00003856 return m_unix_signals_sp;
Zachary Turner93749ab2015-03-03 21:51:25 +00003857}
3858
Greg Clayton514487e2011-02-15 21:59:32 +00003859lldb::ByteOrder
3860Process::GetByteOrder () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003861{
Zachary Turner7529df92015-09-01 20:02:29 +00003862 return GetTarget().GetArchitecture().GetByteOrder();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003863}
3864
3865uint32_t
Greg Clayton514487e2011-02-15 21:59:32 +00003866Process::GetAddressByteSize () const
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003867{
Zachary Turner7529df92015-09-01 20:02:29 +00003868 return GetTarget().GetArchitecture().GetAddressByteSize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003869}
3870
3871bool
3872Process::ShouldBroadcastEvent (Event *event_ptr)
3873{
3874 const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr);
3875 bool return_value = true;
Greg Clayton5160ce52013-03-27 23:08:40 +00003876 Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_EVENTS | LIBLLDB_LOG_PROCESS));
Jim Ingham0161b492013-02-09 01:29:05 +00003877
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003878 switch (state)
3879 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003880 case eStateDetached:
3881 case eStateExited:
3882 case eStateUnloaded:
Pavel Labath3f5df532015-03-12 10:12:41 +00003883 m_stdio_communication.SynchronizeWithReadThread();
Pavel Labatha9a43372015-09-03 09:30:17 +00003884 m_stdio_communication.Disconnect();
3885 m_stdio_communication.StopReadThread();
3886 m_stdin_forward = false;
3887
Jason Molenda62e06812016-02-16 04:14:33 +00003888 LLVM_FALLTHROUGH;
Pavel Labath3f5df532015-03-12 10:12:41 +00003889 case eStateConnected:
3890 case eStateAttaching:
3891 case eStateLaunching:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003892 // These events indicate changes in the state of the debugging session, always report them.
3893 return_value = true;
3894 break;
3895 case eStateInvalid:
3896 // We stopped for no apparent reason, don't report it.
3897 return_value = false;
3898 break;
3899 case eStateRunning:
3900 case eStateStepping:
3901 // If we've started the target running, we handle the cases where we
3902 // are already running and where there is a transition from stopped to
3903 // running differently.
3904 // running -> running: Automatically suppress extra running events
3905 // stopped -> running: Report except when there is one or more no votes
3906 // and no yes votes.
3907 SynchronouslyNotifyStateChanged (state);
Jim Ingham1460e4b2014-01-10 23:46:59 +00003908 if (m_force_next_event_delivery)
3909 return_value = true;
3910 else
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003911 {
Jim Ingham1460e4b2014-01-10 23:46:59 +00003912 switch (m_last_broadcast_state)
3913 {
3914 case eStateRunning:
3915 case eStateStepping:
3916 // We always suppress multiple runnings with no PUBLIC stop in between.
3917 return_value = false;
3918 break;
3919 default:
3920 // TODO: make this work correctly. For now always report
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00003921 // run if we aren't running so we don't miss any running
Jim Ingham1460e4b2014-01-10 23:46:59 +00003922 // events. If I run the lldb/test/thread/a.out file and
3923 // break at main.cpp:58, run and hit the breakpoints on
3924 // multiple threads, then somehow during the stepping over
3925 // of all breakpoints no run gets reported.
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003926
Jim Ingham1460e4b2014-01-10 23:46:59 +00003927 // This is a transition from stop to run.
3928 switch (m_thread_list.ShouldReportRun (event_ptr))
3929 {
3930 case eVoteYes:
3931 case eVoteNoOpinion:
3932 return_value = true;
3933 break;
3934 case eVoteNo:
3935 return_value = false;
3936 break;
3937 }
3938 break;
3939 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003940 }
3941 break;
3942 case eStateStopped:
3943 case eStateCrashed:
3944 case eStateSuspended:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003945 // We've stopped. First see if we're going to restart the target.
3946 // If we are going to stop, then we always broadcast the event.
3947 // 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 +00003948 // If no thread has an opinion, we don't report it.
Jim Ingham221d51c2013-05-08 00:35:16 +00003949
Pavel Labath3f5df532015-03-12 10:12:41 +00003950 m_stdio_communication.SynchronizeWithReadThread();
Jim Inghamcb4ca112012-05-16 01:32:14 +00003951 RefreshStateAfterStop ();
Jim Ingham0d8bcc72010-11-17 02:32:00 +00003952 if (ProcessEventData::GetInterruptedFromEvent (event_ptr))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003953 {
Greg Clayton3af9ea52010-11-18 05:57:03 +00003954 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00003955 log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003956 static_cast<void*>(event_ptr),
Jim Ingham0161b492013-02-09 01:29:05 +00003957 StateAsCString(state));
Jim Ingham35878c42014-04-08 21:33:21 +00003958 // Even though we know we are going to stop, we should let the threads have a look at the stop,
3959 // so they can properly set their state.
3960 m_thread_list.ShouldStop (event_ptr);
Jim Ingham0161b492013-02-09 01:29:05 +00003961 return_value = true;
Jim Ingham0d8bcc72010-11-17 02:32:00 +00003962 }
3963 else
3964 {
Jim Ingham221d51c2013-05-08 00:35:16 +00003965 bool was_restarted = ProcessEventData::GetRestartedFromEvent (event_ptr);
3966 bool should_resume = false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003967
Jim Ingham0161b492013-02-09 01:29:05 +00003968 // It makes no sense to ask "ShouldStop" if we've already been restarted...
3969 // Asking the thread list is also not likely to go well, since we are running again.
3970 // So in that case just report the event.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003971
Jim Ingham0161b492013-02-09 01:29:05 +00003972 if (!was_restarted)
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00003973 should_resume = !m_thread_list.ShouldStop(event_ptr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003974
Jim Ingham221d51c2013-05-08 00:35:16 +00003975 if (was_restarted || should_resume || m_resume_requested)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003976 {
Jim Ingham0161b492013-02-09 01:29:05 +00003977 Vote stop_vote = m_thread_list.ShouldReportStop (event_ptr);
3978 if (log)
Pavel Labath2acc4882016-01-05 17:55:32 +00003979 log->Printf ("Process::ShouldBroadcastEvent: should_resume: %i state: %s was_restarted: %i stop_vote: %d.",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003980 should_resume, StateAsCString(state),
3981 was_restarted, stop_vote);
3982
Jim Ingham0161b492013-02-09 01:29:05 +00003983 switch (stop_vote)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003984 {
3985 case eVoteYes:
Jim Ingham0161b492013-02-09 01:29:05 +00003986 return_value = true;
3987 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003988 case eVoteNoOpinion:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003989 case eVoteNo:
3990 return_value = false;
3991 break;
3992 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003993
Jim Inghamcb95f342012-09-05 21:13:56 +00003994 if (!was_restarted)
Jim Ingham0161b492013-02-09 01:29:05 +00003995 {
3996 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00003997 log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s",
3998 static_cast<void*>(event_ptr),
3999 StateAsCString(state));
Jim Ingham0161b492013-02-09 01:29:05 +00004000 ProcessEventData::SetRestartedInEvent(event_ptr, true);
Jim Inghamcb95f342012-09-05 21:13:56 +00004001 PrivateResume ();
Jim Ingham0161b492013-02-09 01:29:05 +00004002 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004003 }
4004 else
4005 {
4006 return_value = true;
4007 SynchronouslyNotifyStateChanged (state);
4008 }
4009 }
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004010 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004011 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004012
Jim Ingham1460e4b2014-01-10 23:46:59 +00004013 // Forcing the next event delivery is a one shot deal. So reset it here.
4014 m_force_next_event_delivery = false;
4015
Jim Ingham0161b492013-02-09 01:29:05 +00004016 // We do some coalescing of events (for instance two consecutive running events get coalesced.)
4017 // But we only coalesce against events we actually broadcast. So we use m_last_broadcast_state
4018 // to track that. NB - you can't use "m_public_state.GetValue()" for that purpose, as was originally done,
4019 // because the PublicState reflects the last event pulled off the queue, and there may be several
4020 // events stacked up on the queue unserviced. So the PublicState may not reflect the last broadcasted event
4021 // yet. m_last_broadcast_state gets updated here.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004022
Jim Ingham0161b492013-02-09 01:29:05 +00004023 if (return_value)
4024 m_last_broadcast_state = state;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004025
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004026 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00004027 log->Printf ("Process::ShouldBroadcastEvent (%p) => new state: %s, last broadcast state: %s - %s",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004028 static_cast<void*>(event_ptr), StateAsCString(state),
Jim Ingham0161b492013-02-09 01:29:05 +00004029 StateAsCString(m_last_broadcast_state),
4030 return_value ? "YES" : "NO");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004031 return return_value;
4032}
4033
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004034bool
Jim Ingham60c915e2015-06-23 21:02:45 +00004035Process::StartPrivateStateThread (bool is_secondary_thread)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004036{
Greg Clayton5160ce52013-03-27 23:08:40 +00004037 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004038
Greg Clayton8b82f082011-04-12 05:54:46 +00004039 bool already_running = PrivateStateThreadIsValid ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004040 if (log)
Greg Clayton8b82f082011-04-12 05:54:46 +00004041 log->Printf ("Process::%s()%s ", __FUNCTION__, already_running ? " already running" : " starting private state thread");
4042
Jim Ingham60c915e2015-06-23 21:02:45 +00004043 if (!is_secondary_thread && already_running)
Greg Clayton8b82f082011-04-12 05:54:46 +00004044 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004045
4046 // Create a thread that watches our internal state and controls which
4047 // events make it to clients (into the DCProcess event queue).
Greg Clayton3e06bd92011-01-09 21:07:35 +00004048 char thread_name[1024];
Todd Fiala17096d72014-07-16 19:03:16 +00004049
Zachary Turner39de3112014-09-09 20:54:56 +00004050 if (HostInfo::GetMaxThreadNameLength() <= 30)
Todd Fiala17096d72014-07-16 19:03:16 +00004051 {
Zachary Turner39de3112014-09-09 20:54:56 +00004052 // On platforms with abbreviated thread name lengths, choose thread names that fit within the limit.
4053 if (already_running)
4054 snprintf(thread_name, sizeof(thread_name), "intern-state-OV");
4055 else
4056 snprintf(thread_name, sizeof(thread_name), "intern-state");
Todd Fiala17096d72014-07-16 19:03:16 +00004057 }
Jim Ingham372787f2012-04-07 00:00:41 +00004058 else
Todd Fiala17096d72014-07-16 19:03:16 +00004059 {
4060 if (already_running)
Zachary Turner39de3112014-09-09 20:54:56 +00004061 snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state-override(pid=%" PRIu64 ")>", GetID());
Todd Fiala17096d72014-07-16 19:03:16 +00004062 else
Zachary Turner39de3112014-09-09 20:54:56 +00004063 snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state(pid=%" PRIu64 ")>", GetID());
Todd Fiala17096d72014-07-16 19:03:16 +00004064 }
4065
Jim Ingham076b3042012-04-10 01:21:57 +00004066 // Create the private state thread, and start it running.
Jim Inghama1ca8142016-02-04 01:34:33 +00004067 PrivateStateThreadArgs *args_ptr = new PrivateStateThreadArgs(this, is_secondary_thread);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004068 m_private_state_thread = ThreadLauncher::LaunchThread(thread_name, Process::PrivateStateThread, (void *) args_ptr, nullptr, 8 * 1024 * 1024);
Zachary Turneracee96a2014-09-23 18:32:09 +00004069 if (m_private_state_thread.IsJoinable())
Jim Ingham076b3042012-04-10 01:21:57 +00004070 {
4071 ResumePrivateStateThread();
4072 return true;
4073 }
4074 else
4075 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004076}
4077
4078void
4079Process::PausePrivateStateThread ()
4080{
4081 ControlPrivateStateThread (eBroadcastInternalStateControlPause);
4082}
4083
4084void
4085Process::ResumePrivateStateThread ()
4086{
4087 ControlPrivateStateThread (eBroadcastInternalStateControlResume);
4088}
4089
4090void
4091Process::StopPrivateStateThread ()
4092{
Greg Clayton8b82f082011-04-12 05:54:46 +00004093 if (PrivateStateThreadIsValid ())
4094 ControlPrivateStateThread (eBroadcastInternalStateControlStop);
Jim Inghamb1e2e842012-04-12 18:49:31 +00004095 else
4096 {
Greg Clayton5160ce52013-03-27 23:08:40 +00004097 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
Jim Inghamb1e2e842012-04-12 18:49:31 +00004098 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00004099 log->Printf ("Went to stop the private state thread, but it was already invalid.");
Jim Inghamb1e2e842012-04-12 18:49:31 +00004100 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004101}
4102
4103void
4104Process::ControlPrivateStateThread (uint32_t signal)
4105{
Greg Clayton5160ce52013-03-27 23:08:40 +00004106 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004107
4108 assert (signal == eBroadcastInternalStateControlStop ||
4109 signal == eBroadcastInternalStateControlPause ||
4110 signal == eBroadcastInternalStateControlResume);
4111
4112 if (log)
Greg Clayton7ecb3a02011-01-22 17:43:17 +00004113 log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004114
Greg Clayton7ecb3a02011-01-22 17:43:17 +00004115 // Signal the private state thread. First we should copy this is case the
4116 // thread starts exiting since the private state thread will NULL this out
4117 // when it exits
Zachary Turner39de3112014-09-09 20:54:56 +00004118 HostThread private_state_thread(m_private_state_thread);
Zachary Turneracee96a2014-09-23 18:32:09 +00004119 if (private_state_thread.IsJoinable())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004120 {
4121 TimeValue timeout_time;
4122 bool timed_out;
4123
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004124 m_private_state_control_broadcaster.BroadcastEvent(signal, nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004125
4126 timeout_time = TimeValue::Now();
4127 timeout_time.OffsetWithSeconds(2);
Jim Inghamb1e2e842012-04-12 18:49:31 +00004128 if (log)
4129 log->Printf ("Sending control event of type: %d.", signal);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004130 m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out);
4131 m_private_state_control_wait.SetValue (false, eBroadcastNever);
4132
4133 if (signal == eBroadcastInternalStateControlStop)
4134 {
4135 if (timed_out)
Jim Inghamb1e2e842012-04-12 18:49:31 +00004136 {
Zachary Turner39de3112014-09-09 20:54:56 +00004137 Error error = private_state_thread.Cancel();
Jim Inghamb1e2e842012-04-12 18:49:31 +00004138 if (log)
4139 log->Printf ("Timed out responding to the control event, cancel got error: \"%s\".", error.AsCString());
4140 }
4141 else
4142 {
4143 if (log)
4144 log->Printf ("The control event killed the private state thread without having to cancel.");
4145 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004146
Eugene Zelenko9b0a8012016-03-01 02:08:37 +00004147 thread_result_t result = NULL;
Zachary Turner39de3112014-09-09 20:54:56 +00004148 private_state_thread.Join(&result);
4149 m_private_state_thread.Reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004150 }
4151 }
Jim Inghamb1e2e842012-04-12 18:49:31 +00004152 else
4153 {
4154 if (log)
4155 log->Printf ("Private state thread already dead, no need to signal it to stop.");
4156 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004157}
4158
4159void
Jim Inghamcfc09352012-07-27 23:57:19 +00004160Process::SendAsyncInterrupt ()
4161{
4162 if (PrivateStateThreadIsValid())
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004163 m_private_state_broadcaster.BroadcastEvent(Process::eBroadcastBitInterrupt, nullptr);
Jim Inghamcfc09352012-07-27 23:57:19 +00004164 else
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004165 BroadcastEvent(Process::eBroadcastBitInterrupt, nullptr);
Jim Inghamcfc09352012-07-27 23:57:19 +00004166}
4167
4168void
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004169Process::HandlePrivateEvent (EventSP &event_sp)
4170{
Greg Clayton5160ce52013-03-27 23:08:40 +00004171 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Jim Ingham221d51c2013-05-08 00:35:16 +00004172 m_resume_requested = false;
4173
Greg Clayton414f5d32011-01-25 02:58:48 +00004174 const StateType new_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
Jim Inghambb3a2832011-01-29 01:49:25 +00004175
4176 // First check to see if anybody wants a shot at this event:
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004177 if (m_next_event_action_ap)
Jim Inghambb3a2832011-01-29 01:49:25 +00004178 {
Jim Ingham754ab982011-01-29 04:05:41 +00004179 NextEventAction::EventActionResult action_result = m_next_event_action_ap->PerformAction(event_sp);
Jim Ingham0161b492013-02-09 01:29:05 +00004180 if (log)
4181 log->Printf ("Ran next event action, result was %d.", action_result);
4182
Jim Inghambb3a2832011-01-29 01:49:25 +00004183 switch (action_result)
4184 {
4185 case NextEventAction::eEventActionSuccess:
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004186 SetNextEventAction(nullptr);
Jim Inghambb3a2832011-01-29 01:49:25 +00004187 break;
Greg Claytonc9ed4782011-11-12 02:10:56 +00004188
Jim Inghambb3a2832011-01-29 01:49:25 +00004189 case NextEventAction::eEventActionRetry:
4190 break;
Greg Claytonc9ed4782011-11-12 02:10:56 +00004191
Jim Inghambb3a2832011-01-29 01:49:25 +00004192 case NextEventAction::eEventActionExit:
Jim Ingham2a5fdd42011-01-29 01:57:31 +00004193 // Handle Exiting Here. If we already got an exited event,
4194 // we should just propagate it. Otherwise, swallow this event,
4195 // and set our state to exit so the next event will kill us.
4196 if (new_state != eStateExited)
4197 {
4198 // FIXME: should cons up an exited event, and discard this one.
Jim Ingham754ab982011-01-29 04:05:41 +00004199 SetExitStatus(0, m_next_event_action_ap->GetExitString());
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004200 SetNextEventAction(nullptr);
Jim Ingham2a5fdd42011-01-29 01:57:31 +00004201 return;
4202 }
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004203 SetNextEventAction(nullptr);
Jim Inghambb3a2832011-01-29 01:49:25 +00004204 break;
4205 }
4206 }
4207
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004208 // See if we should broadcast this state to external clients?
4209 const bool should_broadcast = ShouldBroadcastEvent (event_sp.get());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004210
4211 if (should_broadcast)
4212 {
Greg Claytonb4874f12014-02-28 18:22:24 +00004213 const bool is_hijacked = IsHijackedForEvent(eBroadcastBitStateChanged);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004214 if (log)
4215 {
Daniel Malead01b2952012-11-29 21:49:15 +00004216 log->Printf ("Process::%s (pid = %" PRIu64 ") broadcasting new state %s (old state %s) to %s",
Greg Clayton414f5d32011-01-25 02:58:48 +00004217 __FUNCTION__,
4218 GetID(),
4219 StateAsCString(new_state),
4220 StateAsCString (GetState ()),
Greg Claytonb4874f12014-02-28 18:22:24 +00004221 is_hijacked ? "hijacked" : "public");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004222 }
Jim Ingham9575d842011-03-11 03:53:59 +00004223 Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get());
Greg Clayton414f5d32011-01-25 02:58:48 +00004224 if (StateIsRunningState (new_state))
Greg Clayton44d93782014-01-27 23:43:24 +00004225 {
4226 // Only push the input handler if we aren't fowarding events,
4227 // as this means the curses GUI is in use...
Todd Fialaf72fa672014-10-07 16:05:21 +00004228 // Or don't push it if we are launching since it will come up stopped.
Zachary Turnerc62733b2015-05-20 18:31:17 +00004229 if (!GetTarget().GetDebugger().IsForwardingEvents() && new_state != eStateLaunching &&
4230 new_state != eStateAttaching)
Pavel Labath44464872015-05-27 12:40:32 +00004231 {
Greg Clayton44d93782014-01-27 23:43:24 +00004232 PushProcessIOHandler ();
Pavel Labath44464872015-05-27 12:40:32 +00004233 m_iohandler_sync.SetValue(m_iohandler_sync.GetValue()+1, eBroadcastAlways);
4234 if (log)
4235 log->Printf("Process::%s updated m_iohandler_sync to %d", __FUNCTION__, m_iohandler_sync.GetValue());
4236 }
Greg Clayton44d93782014-01-27 23:43:24 +00004237 }
Greg Claytonb4874f12014-02-28 18:22:24 +00004238 else if (StateIsStoppedState(new_state, false))
4239 {
4240 if (!Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
4241 {
4242 // If the lldb_private::Debugger is handling the events, we don't
4243 // want to pop the process IOHandler here, we want to do it when
4244 // we receive the stopped event so we can carefully control when
4245 // the process IOHandler is popped because when we stop we want to
4246 // display some text stating how and why we stopped, then maybe some
4247 // process/thread/frame info, and then we want the "(lldb) " prompt
4248 // to show up. If we pop the process IOHandler here, then we will
4249 // cause the command interpreter to become the top IOHandler after
4250 // the process pops off and it will update its prompt right away...
4251 // See the Debugger.cpp file where it calls the function as
4252 // "process_sp->PopProcessIOHandler()" to see where I am talking about.
4253 // Otherwise we end up getting overlapping "(lldb) " prompts and
4254 // garbled output.
4255 //
4256 // If we aren't handling the events in the debugger (which is indicated
4257 // by "m_target.GetDebugger().IsHandlingEvents()" returning false) or we
4258 // are hijacked, then we always pop the process IO handler manually.
4259 // Hijacking happens when the internal process state thread is running
4260 // thread plans, or when commands want to run in synchronous mode
4261 // and they call "process->WaitForProcessToStop()". An example of something
4262 // that will hijack the events is a simple expression:
4263 //
4264 // (lldb) expr (int)puts("hello")
4265 //
4266 // This will cause the internal process state thread to resume and halt
4267 // the process (and _it_ will hijack the eBroadcastBitStateChanged
4268 // events) and we do need the IO handler to be pushed and popped
4269 // correctly.
4270
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004271 if (is_hijacked || !GetTarget().GetDebugger().IsHandlingEvents())
Greg Claytonb4874f12014-02-28 18:22:24 +00004272 PopProcessIOHandler ();
4273 }
4274 }
Jim Ingham9575d842011-03-11 03:53:59 +00004275
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004276 BroadcastEvent (event_sp);
4277 }
4278 else
4279 {
4280 if (log)
4281 {
Daniel Malead01b2952012-11-29 21:49:15 +00004282 log->Printf ("Process::%s (pid = %" PRIu64 ") suppressing state %s (old state %s): should_broadcast == false",
Greg Clayton414f5d32011-01-25 02:58:48 +00004283 __FUNCTION__,
4284 GetID(),
4285 StateAsCString(new_state),
Jason Molendafd54b362011-09-20 21:44:10 +00004286 StateAsCString (GetState ()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004287 }
4288 }
Pavel Labath19da1f12015-12-07 12:36:52 +00004289}
4290
4291Error
4292Process::HaltPrivate()
4293{
4294 EventSP event_sp;
4295 Error error (WillHalt());
4296 if (error.Fail())
4297 return error;
4298
4299 // Ask the process subclass to actually halt our process
4300 bool caused_stop;
4301 error = DoHalt(caused_stop);
4302
4303 DidHalt();
4304 return error;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004305}
4306
Virgile Bellob2f1fb22013-08-23 12:44:05 +00004307thread_result_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004308Process::PrivateStateThread (void *arg)
4309{
Jim Inghama1ca8142016-02-04 01:34:33 +00004310 PrivateStateThreadArgs real_args = *static_cast<PrivateStateThreadArgs *> (arg);
4311 free (arg);
4312 thread_result_t result = real_args.process->RunPrivateStateThread(real_args.is_secondary_thread);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004313 return result;
4314}
4315
Virgile Bellob2f1fb22013-08-23 12:44:05 +00004316thread_result_t
Jim Ingham60c915e2015-06-23 21:02:45 +00004317Process::RunPrivateStateThread (bool is_secondary_thread)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004318{
Jim Ingham076b3042012-04-10 01:21:57 +00004319 bool control_only = true;
Jim Inghamb1e2e842012-04-12 18:49:31 +00004320 m_private_state_control_wait.SetValue (false, eBroadcastNever);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004321
Greg Clayton5160ce52013-03-27 23:08:40 +00004322 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004323 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004324 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") thread starting...",
4325 __FUNCTION__, static_cast<void*>(this), GetID());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004326
4327 bool exit_now = false;
Pavel Labath19da1f12015-12-07 12:36:52 +00004328 bool interrupt_requested = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004329 while (!exit_now)
4330 {
4331 EventSP event_sp;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004332 WaitForEventsPrivate(nullptr, event_sp, control_only);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004333 if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster))
4334 {
Jim Inghamb1e2e842012-04-12 18:49:31 +00004335 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004336 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") got a control event: %d",
4337 __FUNCTION__, static_cast<void*>(this), GetID(),
4338 event_sp->GetType());
Jim Inghamb1e2e842012-04-12 18:49:31 +00004339
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004340 switch (event_sp->GetType())
4341 {
4342 case eBroadcastInternalStateControlStop:
4343 exit_now = true;
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00004344 break; // doing any internal state management below
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004345
4346 case eBroadcastInternalStateControlPause:
4347 control_only = true;
4348 break;
4349
4350 case eBroadcastInternalStateControlResume:
4351 control_only = false;
4352 break;
4353 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004354
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004355 m_private_state_control_wait.SetValue (true, eBroadcastAlways);
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004356 continue;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004357 }
Jim Inghamcfc09352012-07-27 23:57:19 +00004358 else if (event_sp->GetType() == eBroadcastBitInterrupt)
4359 {
4360 if (m_public_state.GetValue() == eStateAttaching)
4361 {
4362 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004363 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") woke up with an interrupt while attaching - forwarding interrupt.",
4364 __FUNCTION__, static_cast<void*>(this),
4365 GetID());
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004366 BroadcastEvent(eBroadcastBitInterrupt, nullptr);
Jim Inghamcfc09352012-07-27 23:57:19 +00004367 }
Pavel Labath19da1f12015-12-07 12:36:52 +00004368 else if(StateIsRunningState(m_last_broadcast_state))
Jim Inghamcfc09352012-07-27 23:57:19 +00004369 {
4370 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004371 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") woke up with an interrupt - Halting.",
4372 __FUNCTION__, static_cast<void*>(this),
4373 GetID());
Pavel Labath19da1f12015-12-07 12:36:52 +00004374 Error error = HaltPrivate();
4375 if (error.Fail() && log)
4376 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") failed to halt the process: %s",
4377 __FUNCTION__, static_cast<void*>(this),
4378 GetID(), error.AsCString());
4379 // Halt should generate a stopped event. Make a note of the fact that we were
4380 // doing the interrupt, so we can set the interrupted flag after we receive the
4381 // event. We deliberately set this to true even if HaltPrivate failed, so that we
4382 // can interrupt on the next natural stop.
4383 interrupt_requested = true;
4384 }
4385 else
4386 {
4387 // This can happen when someone (e.g. Process::Halt) sees that we are running and
4388 // sends an interrupt request, but the process actually stops before we receive
4389 // it. In that case, we can just ignore the request. We use
4390 // m_last_broadcast_state, because the Stopped event may not have been popped of
4391 // the event queue yet, which is when the public state gets updated.
4392 if (log)
4393 log->Printf("Process::%s ignoring interrupt as we have already stopped.", __FUNCTION__);
Jim Inghamcfc09352012-07-27 23:57:19 +00004394 }
4395 continue;
4396 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004397
4398 const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
4399
4400 if (internal_state != eStateInvalid)
4401 {
Greg Claytonf9b57b92013-05-10 23:48:10 +00004402 if (m_clear_thread_plans_on_stop &&
4403 StateIsStoppedState(internal_state, true))
4404 {
4405 m_clear_thread_plans_on_stop = false;
4406 m_thread_list.DiscardThreadPlans();
4407 }
Pavel Labath19da1f12015-12-07 12:36:52 +00004408
4409 if (interrupt_requested)
4410 {
4411 if (StateIsStoppedState (internal_state, true))
4412 {
4413 // We requested the interrupt, so mark this as such in the stop event so
4414 // clients can tell an interrupted process from a natural stop
4415 ProcessEventData::SetInterruptedInEvent (event_sp.get(), true);
4416 interrupt_requested = false;
4417 }
4418 else if (log)
4419 {
4420 log->Printf("Process::%s interrupt_requested, but a non-stopped state '%s' received.",
4421 __FUNCTION__, StateAsCString(internal_state));
4422 }
4423 }
4424
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004425 HandlePrivateEvent (event_sp);
4426 }
4427
Greg Clayton58d1c9a2010-10-18 04:14:23 +00004428 if (internal_state == eStateInvalid ||
4429 internal_state == eStateExited ||
4430 internal_state == eStateDetached )
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004431 {
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004432 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004433 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") about to exit with internal state %s...",
4434 __FUNCTION__, static_cast<void*>(this), GetID(),
4435 StateAsCString(internal_state));
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004436
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004437 break;
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004438 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004439 }
4440
Caroline Tice20ad3c42010-10-29 21:48:37 +00004441 // Verify log is still enabled before attempting to write to it...
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004442 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004443 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") thread exiting...",
4444 __FUNCTION__, static_cast<void*>(this), GetID());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004445
Jim Ingham60c915e2015-06-23 21:02:45 +00004446 // If we are a secondary thread, then the primary thread we are working for will have already
4447 // acquired the public_run_lock, and isn't done with what it was doing yet, so don't
4448 // try to change it on the way out.
4449 if (!is_secondary_thread)
4450 m_public_run_lock.SetStopped();
Greg Clayton6ed95942011-01-22 07:12:45 +00004451 m_private_state_control_wait.SetValue (true, eBroadcastAlways);
Zachary Turner39de3112014-09-09 20:54:56 +00004452 m_private_state_thread.Reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004453 return NULL;
4454}
4455
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004456//------------------------------------------------------------------
4457// Process Event Data
4458//------------------------------------------------------------------
4459
4460Process::ProcessEventData::ProcessEventData () :
4461 EventData (),
Greg Claytonaeb3b8b2015-05-29 03:20:37 +00004462 m_process_wp (),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004463 m_state (eStateInvalid),
Greg Claytonc982c762010-07-09 20:39:50 +00004464 m_restarted (false),
Jim Inghama8604692011-05-22 21:45:01 +00004465 m_update_state (0),
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004466 m_interrupted (false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004467{
4468}
4469
4470Process::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) :
4471 EventData (),
Greg Claytonaeb3b8b2015-05-29 03:20:37 +00004472 m_process_wp (),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004473 m_state (state),
Greg Claytonc982c762010-07-09 20:39:50 +00004474 m_restarted (false),
Jim Inghama8604692011-05-22 21:45:01 +00004475 m_update_state (0),
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004476 m_interrupted (false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004477{
Greg Claytonaeb3b8b2015-05-29 03:20:37 +00004478 if (process_sp)
4479 m_process_wp = process_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004480}
4481
Eugene Zelenko8f30a652015-10-23 18:39:37 +00004482Process::ProcessEventData::~ProcessEventData() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004483
4484const ConstString &
4485Process::ProcessEventData::GetFlavorString ()
4486{
4487 static ConstString g_flavor ("Process::ProcessEventData");
4488 return g_flavor;
4489}
4490
4491const ConstString &
4492Process::ProcessEventData::GetFlavor () const
4493{
4494 return ProcessEventData::GetFlavorString ();
4495}
4496
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004497void
4498Process::ProcessEventData::DoOnRemoval (Event *event_ptr)
4499{
Greg Claytonaeb3b8b2015-05-29 03:20:37 +00004500 ProcessSP process_sp(m_process_wp.lock());
4501
4502 if (!process_sp)
4503 return;
4504
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004505 // This function gets called twice for each event, once when the event gets pulled
Jim Inghama8604692011-05-22 21:45:01 +00004506 // off of the private process event queue, and then any number of times, first when it gets pulled off of
4507 // the public event queue, then other times when we're pretending that this is where we stopped at the
4508 // end of expression evaluation. m_update_state is used to distinguish these
4509 // three cases; it is 0 when we're just pulling it off for private handling,
Jim Ingham221d51c2013-05-08 00:35:16 +00004510 // and > 1 for expression evaluation, and we don't want to do the breakpoint command handling then.
Jim Inghama8604692011-05-22 21:45:01 +00004511 if (m_update_state != 1)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004512 return;
Jim Ingham0161b492013-02-09 01:29:05 +00004513
Greg Claytonaeb3b8b2015-05-29 03:20:37 +00004514 process_sp->SetPublicState (m_state, Process::ProcessEventData::GetRestartedFromEvent(event_ptr));
Jim Ingham35878c42014-04-08 21:33:21 +00004515
4516 // If this is a halt event, even if the halt stopped with some reason other than a plain interrupt (e.g. we had
4517 // already stopped for a breakpoint when the halt request came through) don't do the StopInfo actions, as they may
4518 // end up restarting the process.
4519 if (m_interrupted)
4520 return;
4521
4522 // If we're stopped and haven't restarted, then do the StopInfo actions here:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004523 if (m_state == eStateStopped && ! m_restarted)
Greg Clayton2e309072015-07-17 23:42:28 +00004524 {
4525 // Let process subclasses know we are about to do a public stop and
4526 // do anything they might need to in order to speed up register and
4527 // memory accesses.
4528 process_sp->WillPublicStop();
4529
Greg Claytonaeb3b8b2015-05-29 03:20:37 +00004530 ThreadList &curr_thread_list = process_sp->GetThreadList();
Greg Clayton61e7a582011-12-01 23:28:38 +00004531 uint32_t num_threads = curr_thread_list.GetSize();
4532 uint32_t idx;
Greg Claytonf4b47e12010-08-04 01:40:35 +00004533
Jim Ingham4b536182011-08-09 02:12:22 +00004534 // The actions might change one of the thread's stop_info's opinions about whether we should
4535 // stop the process, so we need to query that as we go.
Jim Ingham0faa43f2011-11-08 03:00:11 +00004536
4537 // One other complication here, is that we try to catch any case where the target has run (except for expressions)
4538 // and immediately exit, but if we get that wrong (which is possible) then the thread list might have changed, and
4539 // that would cause our iteration here to crash. We could make a copy of the thread list, but we'd really like
4540 // 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
4541 // against this list & bag out if anything differs.
Greg Clayton61e7a582011-12-01 23:28:38 +00004542 std::vector<uint32_t> thread_index_array(num_threads);
Jim Ingham0faa43f2011-11-08 03:00:11 +00004543 for (idx = 0; idx < num_threads; ++idx)
4544 thread_index_array[idx] = curr_thread_list.GetThreadAtIndex(idx)->GetIndexID();
4545
Jim Inghamc7078c22012-12-13 22:24:15 +00004546 // Use this to track whether we should continue from here. We will only continue the target running if
4547 // no thread says we should stop. Of course if some thread's PerformAction actually sets the target running,
4548 // then it doesn't matter what the other threads say...
4549
4550 bool still_should_stop = false;
Jim Ingham4b536182011-08-09 02:12:22 +00004551
Jim Ingham0ad7e052013-04-25 02:04:59 +00004552 // Sometimes - for instance if we have a bug in the stub we are talking to, we stop but no thread has a
4553 // valid stop reason. In that case we should just stop, because we have no way of telling what the right
4554 // thing to do is, and it's better to let the user decide than continue behind their backs.
4555
4556 bool does_anybody_have_an_opinion = false;
4557
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004558 for (idx = 0; idx < num_threads; ++idx)
4559 {
Greg Claytonaeb3b8b2015-05-29 03:20:37 +00004560 curr_thread_list = process_sp->GetThreadList();
Jim Ingham0faa43f2011-11-08 03:00:11 +00004561 if (curr_thread_list.GetSize() != num_threads)
4562 {
Greg Clayton5160ce52013-03-27 23:08:40 +00004563 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
Jim Ingham87c665f2011-12-01 20:26:15 +00004564 if (log)
Greg Clayton61e7a582011-12-01 23:28:38 +00004565 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 +00004566 break;
4567 }
4568
4569 lldb::ThreadSP thread_sp = curr_thread_list.GetThreadAtIndex(idx);
4570
4571 if (thread_sp->GetIndexID() != thread_index_array[idx])
4572 {
Greg Clayton5160ce52013-03-27 23:08:40 +00004573 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
Jim Ingham87c665f2011-12-01 20:26:15 +00004574 if (log)
Greg Clayton61e7a582011-12-01 23:28:38 +00004575 log->Printf("The thread at position %u changed from %u to %u while processing event.",
Jim Ingham87c665f2011-12-01 20:26:15 +00004576 idx,
4577 thread_index_array[idx],
4578 thread_sp->GetIndexID());
Jim Ingham0faa43f2011-11-08 03:00:11 +00004579 break;
4580 }
4581
Jim Inghamb15bfc72010-10-20 00:39:53 +00004582 StopInfoSP stop_info_sp = thread_sp->GetStopInfo ();
Jim Ingham5d88a062012-10-16 00:09:33 +00004583 if (stop_info_sp && stop_info_sp->IsValid())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004584 {
Jim Ingham0ad7e052013-04-25 02:04:59 +00004585 does_anybody_have_an_opinion = true;
Jim Ingham0161b492013-02-09 01:29:05 +00004586 bool this_thread_wants_to_stop;
4587 if (stop_info_sp->GetOverrideShouldStop())
Jim Ingham4b536182011-08-09 02:12:22 +00004588 {
Jim Ingham0161b492013-02-09 01:29:05 +00004589 this_thread_wants_to_stop = stop_info_sp->GetOverriddenShouldStopValue();
4590 }
4591 else
4592 {
4593 stop_info_sp->PerformAction(event_ptr);
4594 // The stop action might restart the target. If it does, then we want to mark that in the
4595 // event so that whoever is receiving it will know to wait for the running event and reflect
4596 // that state appropriately.
4597 // We also need to stop processing actions, since they aren't expecting the target to be running.
4598
4599 // FIXME: we might have run.
4600 if (stop_info_sp->HasTargetRunSinceMe())
4601 {
4602 SetRestarted (true);
4603 break;
4604 }
4605
4606 this_thread_wants_to_stop = stop_info_sp->ShouldStop(event_ptr);
Jim Ingham4b536182011-08-09 02:12:22 +00004607 }
Jim Inghamc7078c22012-12-13 22:24:15 +00004608
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004609 if (!still_should_stop)
Jim Inghamc7078c22012-12-13 22:24:15 +00004610 still_should_stop = this_thread_wants_to_stop;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004611 }
4612 }
Ashok Thirumurthicf7c55e2013-04-18 14:38:20 +00004613
Jim Inghama8ca6e22013-05-03 23:04:37 +00004614 if (!GetRestarted())
Jim Ingham9575d842011-03-11 03:53:59 +00004615 {
Jim Ingham0ad7e052013-04-25 02:04:59 +00004616 if (!still_should_stop && does_anybody_have_an_opinion)
Jim Ingham4b536182011-08-09 02:12:22 +00004617 {
4618 // We've been asked to continue, so do that here.
Jim Ingham9575d842011-03-11 03:53:59 +00004619 SetRestarted(true);
Jim Ingham3b8285d2012-04-19 01:40:33 +00004620 // Use the public resume method here, since this is just
4621 // extending a public resume.
Greg Claytonaeb3b8b2015-05-29 03:20:37 +00004622 process_sp->PrivateResume();
Jim Ingham4b536182011-08-09 02:12:22 +00004623 }
4624 else
4625 {
4626 // If we didn't restart, run the Stop Hooks here:
4627 // They might also restart the target, so watch for that.
Greg Claytonaeb3b8b2015-05-29 03:20:37 +00004628 process_sp->GetTarget().RunStopHooks();
4629 if (process_sp->GetPrivateState() == eStateRunning)
Jim Ingham4b536182011-08-09 02:12:22 +00004630 SetRestarted(true);
4631 }
Jim Ingham9575d842011-03-11 03:53:59 +00004632 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004633 }
4634}
4635
4636void
4637Process::ProcessEventData::Dump (Stream *s) const
4638{
Greg Claytonaeb3b8b2015-05-29 03:20:37 +00004639 ProcessSP process_sp(m_process_wp.lock());
4640
4641 if (process_sp)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004642 s->Printf(" process = %p (pid = %" PRIu64 "), ",
Greg Claytonaeb3b8b2015-05-29 03:20:37 +00004643 static_cast<void*>(process_sp.get()), process_sp->GetID());
4644 else
4645 s->PutCString(" process = NULL, ");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004646
Greg Clayton8b82f082011-04-12 05:54:46 +00004647 s->Printf("state = %s", StateAsCString(GetState()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004648}
4649
4650const Process::ProcessEventData *
4651Process::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr)
4652{
4653 if (event_ptr)
4654 {
4655 const EventData *event_data = event_ptr->GetData();
4656 if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString())
4657 return static_cast <const ProcessEventData *> (event_ptr->GetData());
4658 }
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004659 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004660}
4661
4662ProcessSP
4663Process::ProcessEventData::GetProcessFromEvent (const Event *event_ptr)
4664{
4665 ProcessSP process_sp;
4666 const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
4667 if (data)
4668 process_sp = data->GetProcessSP();
4669 return process_sp;
4670}
4671
4672StateType
4673Process::ProcessEventData::GetStateFromEvent (const Event *event_ptr)
4674{
4675 const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004676 if (data == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004677 return eStateInvalid;
4678 else
4679 return data->GetState();
4680}
4681
4682bool
4683Process::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr)
4684{
4685 const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004686 if (data == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004687 return false;
4688 else
4689 return data->GetRestarted();
4690}
4691
4692void
4693Process::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value)
4694{
4695 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004696 if (data != nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004697 data->SetRestarted(new_value);
4698}
4699
Jim Ingham0161b492013-02-09 01:29:05 +00004700size_t
4701Process::ProcessEventData::GetNumRestartedReasons(const Event *event_ptr)
4702{
4703 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004704 if (data != nullptr)
Jim Ingham0161b492013-02-09 01:29:05 +00004705 return data->GetNumRestartedReasons();
4706 else
4707 return 0;
4708}
4709
4710const char *
4711Process::ProcessEventData::GetRestartedReasonAtIndex(const Event *event_ptr, size_t idx)
4712{
4713 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004714 if (data != nullptr)
Jim Ingham0161b492013-02-09 01:29:05 +00004715 return data->GetRestartedReasonAtIndex(idx);
4716 else
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004717 return nullptr;
Jim Ingham0161b492013-02-09 01:29:05 +00004718}
4719
4720void
4721Process::ProcessEventData::AddRestartedReason (Event *event_ptr, const char *reason)
4722{
4723 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004724 if (data != nullptr)
Jim Ingham0161b492013-02-09 01:29:05 +00004725 data->AddRestartedReason(reason);
4726}
4727
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004728bool
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004729Process::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr)
4730{
4731 const ProcessEventData *data = GetEventDataFromEvent (event_ptr);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004732 if (data == nullptr)
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004733 return false;
4734 else
4735 return data->GetInterrupted ();
4736}
4737
4738void
4739Process::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value)
4740{
4741 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004742 if (data != nullptr)
Jim Ingham0d8bcc72010-11-17 02:32:00 +00004743 data->SetInterrupted(new_value);
4744}
4745
4746bool
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004747Process::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr)
4748{
4749 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr));
4750 if (data)
4751 {
4752 data->SetUpdateStateOnRemoval();
4753 return true;
4754 }
4755 return false;
4756}
4757
Greg Claytond9e416c2012-02-18 05:35:26 +00004758lldb::TargetSP
4759Process::CalculateTarget ()
4760{
Zachary Turner7529df92015-09-01 20:02:29 +00004761 return m_target_sp.lock();
Greg Claytond9e416c2012-02-18 05:35:26 +00004762}
4763
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004764void
Greg Clayton0603aa92010-10-04 01:05:56 +00004765Process::CalculateExecutionContext (ExecutionContext &exe_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004766{
Zachary Turner7529df92015-09-01 20:02:29 +00004767 exe_ctx.SetTargetPtr (&GetTarget());
Greg Claytonc14ee322011-09-22 04:58:26 +00004768 exe_ctx.SetProcessPtr (this);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004769 exe_ctx.SetThreadPtr(nullptr);
4770 exe_ctx.SetFramePtr(nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004771}
4772
Greg Claytone996fd32011-03-08 22:40:15 +00004773//uint32_t
4774//Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids)
4775//{
4776// return 0;
4777//}
4778//
4779//ArchSpec
4780//Process::GetArchSpecForExistingProcess (lldb::pid_t pid)
4781//{
4782// return Host::GetArchSpecForExistingProcess (pid);
4783//}
4784//
4785//ArchSpec
4786//Process::GetArchSpecForExistingProcess (const char *process_name)
4787//{
4788// return Host::GetArchSpecForExistingProcess (process_name);
4789//}
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004790
Caroline Ticeef5c6d02010-11-16 05:07:41 +00004791void
4792Process::AppendSTDOUT (const char * s, size_t len)
4793{
Greg Clayton3af9ea52010-11-18 05:57:03 +00004794 Mutex::Locker locker (m_stdio_communication_mutex);
Caroline Ticeef5c6d02010-11-16 05:07:41 +00004795 m_stdout_data.append (s, len);
Greg Clayton35a4cc52012-10-29 20:52:08 +00004796 BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (shared_from_this(), GetState()));
Caroline Ticeef5c6d02010-11-16 05:07:41 +00004797}
4798
4799void
Greg Clayton93e86192011-11-13 04:45:22 +00004800Process::AppendSTDERR (const char * s, size_t len)
4801{
4802 Mutex::Locker locker (m_stdio_communication_mutex);
4803 m_stderr_data.append (s, len);
Greg Clayton35a4cc52012-10-29 20:52:08 +00004804 BroadcastEventIfUnique (eBroadcastBitSTDERR, new ProcessEventData (shared_from_this(), GetState()));
Greg Clayton93e86192011-11-13 04:45:22 +00004805}
4806
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004807void
Han Ming Ong91ed6b82013-06-24 18:15:05 +00004808Process::BroadcastAsyncProfileData(const std::string &one_profile_data)
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004809{
4810 Mutex::Locker locker (m_profile_data_comm_mutex);
Han Ming Ong91ed6b82013-06-24 18:15:05 +00004811 m_profile_data.push_back(one_profile_data);
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004812 BroadcastEventIfUnique (eBroadcastBitProfileData, new ProcessEventData (shared_from_this(), GetState()));
4813}
4814
4815size_t
4816Process::GetAsyncProfileData (char *buf, size_t buf_size, Error &error)
4817{
4818 Mutex::Locker locker(m_profile_data_comm_mutex);
Han Ming Ong929a94f2012-11-29 22:14:45 +00004819 if (m_profile_data.empty())
4820 return 0;
Han Ming Ong91ed6b82013-06-24 18:15:05 +00004821
4822 std::string &one_profile_data = m_profile_data.front();
4823 size_t bytes_available = one_profile_data.size();
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004824 if (bytes_available > 0)
4825 {
Greg Clayton5160ce52013-03-27 23:08:40 +00004826 Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004827 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004828 log->Printf ("Process::GetProfileData (buf = %p, size = %" PRIu64 ")",
4829 static_cast<void*>(buf),
4830 static_cast<uint64_t>(buf_size));
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004831 if (bytes_available > buf_size)
4832 {
Han Ming Ong91ed6b82013-06-24 18:15:05 +00004833 memcpy(buf, one_profile_data.c_str(), buf_size);
4834 one_profile_data.erase(0, buf_size);
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004835 bytes_available = buf_size;
4836 }
4837 else
4838 {
Han Ming Ong91ed6b82013-06-24 18:15:05 +00004839 memcpy(buf, one_profile_data.c_str(), bytes_available);
Han Ming Ong929a94f2012-11-29 22:14:45 +00004840 m_profile_data.erase(m_profile_data.begin());
Han Ming Ongab3b8b22012-11-17 00:21:04 +00004841 }
4842 }
4843 return bytes_available;
4844}
4845
Greg Clayton93e86192011-11-13 04:45:22 +00004846//------------------------------------------------------------------
4847// Process STDIO
4848//------------------------------------------------------------------
4849
4850size_t
4851Process::GetSTDOUT (char *buf, size_t buf_size, Error &error)
4852{
4853 Mutex::Locker locker(m_stdio_communication_mutex);
4854 size_t bytes_available = m_stdout_data.size();
4855 if (bytes_available > 0)
4856 {
Greg Clayton5160ce52013-03-27 23:08:40 +00004857 Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Greg Clayton93e86192011-11-13 04:45:22 +00004858 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004859 log->Printf ("Process::GetSTDOUT (buf = %p, size = %" PRIu64 ")",
4860 static_cast<void*>(buf),
4861 static_cast<uint64_t>(buf_size));
Greg Clayton93e86192011-11-13 04:45:22 +00004862 if (bytes_available > buf_size)
4863 {
4864 memcpy(buf, m_stdout_data.c_str(), buf_size);
4865 m_stdout_data.erase(0, buf_size);
4866 bytes_available = buf_size;
4867 }
4868 else
4869 {
4870 memcpy(buf, m_stdout_data.c_str(), bytes_available);
4871 m_stdout_data.clear();
4872 }
4873 }
4874 return bytes_available;
4875}
4876
Greg Clayton93e86192011-11-13 04:45:22 +00004877size_t
4878Process::GetSTDERR (char *buf, size_t buf_size, Error &error)
4879{
4880 Mutex::Locker locker(m_stdio_communication_mutex);
4881 size_t bytes_available = m_stderr_data.size();
4882 if (bytes_available > 0)
4883 {
Greg Clayton5160ce52013-03-27 23:08:40 +00004884 Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Greg Clayton93e86192011-11-13 04:45:22 +00004885 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00004886 log->Printf ("Process::GetSTDERR (buf = %p, size = %" PRIu64 ")",
4887 static_cast<void*>(buf),
4888 static_cast<uint64_t>(buf_size));
Greg Clayton93e86192011-11-13 04:45:22 +00004889 if (bytes_available > buf_size)
4890 {
4891 memcpy(buf, m_stderr_data.c_str(), buf_size);
4892 m_stderr_data.erase(0, buf_size);
4893 bytes_available = buf_size;
4894 }
4895 else
4896 {
4897 memcpy(buf, m_stderr_data.c_str(), bytes_available);
4898 m_stderr_data.clear();
4899 }
4900 }
4901 return bytes_available;
4902}
4903
4904void
Caroline Ticeef5c6d02010-11-16 05:07:41 +00004905Process::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len)
4906{
4907 Process *process = (Process *) baton;
4908 process->AppendSTDOUT (static_cast<const char *>(src), src_len);
4909}
4910
Greg Clayton44d93782014-01-27 23:43:24 +00004911class IOHandlerProcessSTDIO :
4912 public IOHandler
4913{
4914public:
4915 IOHandlerProcessSTDIO (Process *process,
4916 int write_fd) :
Kate Stonee30f11d2014-11-17 19:06:59 +00004917 IOHandler(process->GetTarget().GetDebugger(), IOHandler::Type::ProcessIO),
Greg Clayton44d93782014-01-27 23:43:24 +00004918 m_process (process),
4919 m_read_file (),
4920 m_write_file (write_fd, false),
Greg Clayton100eb932014-07-02 21:10:39 +00004921 m_pipe ()
Greg Clayton44d93782014-01-27 23:43:24 +00004922 {
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004923 m_pipe.CreateNew(false);
Greg Clayton44d93782014-01-27 23:43:24 +00004924 m_read_file.SetDescriptor(GetInputFD(), false);
4925 }
4926
Eugene Zelenko8f30a652015-10-23 18:39:37 +00004927 ~IOHandlerProcessSTDIO() override = default;
4928
Greg Clayton44d93782014-01-27 23:43:24 +00004929 // Each IOHandler gets to run until it is done. It should read data
4930 // from the "in" and place output into "out" and "err and return
4931 // when done.
Pavel Labath44464872015-05-27 12:40:32 +00004932 void
4933 Run () override
Greg Clayton44d93782014-01-27 23:43:24 +00004934 {
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004935 if (!m_read_file.IsValid() || !m_write_file.IsValid() || !m_pipe.CanRead() || !m_pipe.CanWrite())
Greg Clayton44d93782014-01-27 23:43:24 +00004936 {
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004937 SetIsDone(true);
4938 return;
4939 }
4940
4941 SetIsDone(false);
4942 const int read_fd = m_read_file.GetDescriptor();
4943 TerminalState terminal_state;
4944 terminal_state.Save (read_fd, false);
4945 Terminal terminal(read_fd);
4946 terminal.SetCanonical(false);
4947 terminal.SetEcho(false);
Deepak Panickal914b8d92014-01-31 18:48:46 +00004948// FD_ZERO, FD_SET are not supported on windows
Hafiz Abid Qadeer6eff1012014-03-12 10:45:23 +00004949#ifndef _WIN32
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004950 const int pipe_read_fd = m_pipe.GetReadFileDescriptor();
Greg Clayton860582f2016-02-26 17:36:44 +00004951 m_is_running = true;
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004952 while (!GetIsDone())
4953 {
4954 fd_set read_fdset;
4955 FD_ZERO (&read_fdset);
4956 FD_SET (read_fd, &read_fdset);
4957 FD_SET (pipe_read_fd, &read_fdset);
4958 const int nfds = std::max<int>(read_fd, pipe_read_fd) + 1;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00004959 int num_set_fds = select(nfds, &read_fdset, nullptr, nullptr, nullptr);
Greg Clayton860582f2016-02-26 17:36:44 +00004960
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004961 if (num_set_fds < 0)
4962 {
4963 const int select_errno = errno;
4964
4965 if (select_errno != EINTR)
4966 SetIsDone(true);
4967 }
4968 else if (num_set_fds > 0)
4969 {
4970 char ch = 0;
4971 size_t n;
4972 if (FD_ISSET (read_fd, &read_fdset))
Greg Clayton44d93782014-01-27 23:43:24 +00004973 {
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004974 n = 1;
4975 if (m_read_file.Read(&ch, n).Success() && n == 1)
Greg Clayton44d93782014-01-27 23:43:24 +00004976 {
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004977 if (m_write_file.Write(&ch, n).Fail() || n != 1)
Greg Clayton44d93782014-01-27 23:43:24 +00004978 SetIsDone(true);
4979 }
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004980 else
4981 SetIsDone(true);
4982 }
4983 if (FD_ISSET (pipe_read_fd, &read_fdset))
4984 {
4985 size_t bytes_read;
4986 // Consume the interrupt byte
4987 Error error = m_pipe.Read(&ch, 1, bytes_read);
4988 if (error.Success())
Greg Clayton44d93782014-01-27 23:43:24 +00004989 {
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004990 switch (ch)
Greg Clayton44d93782014-01-27 23:43:24 +00004991 {
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004992 case 'q':
Greg Clayton44d93782014-01-27 23:43:24 +00004993 SetIsDone(true);
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004994 break;
4995 case 'i':
4996 if (StateIsRunningState(m_process->GetState()))
Pavel Labathfcc7f662015-10-07 15:11:11 +00004997 m_process->SendAsyncInterrupt();
Pavel Labathfb7d5b82015-05-28 13:41:08 +00004998 break;
Greg Clayton44d93782014-01-27 23:43:24 +00004999 }
5000 }
5001 }
Greg Clayton44d93782014-01-27 23:43:24 +00005002 }
Greg Clayton44d93782014-01-27 23:43:24 +00005003 }
Greg Clayton860582f2016-02-26 17:36:44 +00005004 m_is_running = false;
Pavel Labathfb7d5b82015-05-28 13:41:08 +00005005#endif
5006 terminal_state.Restore();
Greg Clayton44d93782014-01-27 23:43:24 +00005007 }
5008
Pavel Labath44464872015-05-27 12:40:32 +00005009 void
5010 Cancel () override
Greg Clayton44d93782014-01-27 23:43:24 +00005011 {
Greg Clayton860582f2016-02-26 17:36:44 +00005012 SetIsDone(true);
5013 // Only write to our pipe to cancel if we are in IOHandlerProcessSTDIO::Run().
5014 // We can end up with a python command that is being run from the command
5015 // interpreter:
5016 //
5017 // (lldb) step_process_thousands_of_times
5018 //
5019 // In this case the command interpreter will be in the middle of handling
5020 // the command and if the process pushes and pops the IOHandler thousands
5021 // of times, we can end up writing to m_pipe without ever consuming the
5022 // bytes from the pipe in IOHandlerProcessSTDIO::Run() and end up
5023 // deadlocking when the pipe gets fed up and blocks until data is consumed.
5024 if (m_is_running)
5025 {
5026 char ch = 'q'; // Send 'q' for quit
5027 size_t bytes_written = 0;
5028 m_pipe.Write(&ch, 1, bytes_written);
5029 }
Greg Clayton44d93782014-01-27 23:43:24 +00005030 }
Greg Claytone68f5d62014-02-24 22:50:57 +00005031
Pavel Labath44464872015-05-27 12:40:32 +00005032 bool
5033 Interrupt () override
Greg Claytone68f5d62014-02-24 22:50:57 +00005034 {
Greg Clayton19e11352014-02-26 22:47:33 +00005035 // Do only things that are safe to do in an interrupt context (like in
5036 // a SIGINT handler), like write 1 byte to a file descriptor. This will
5037 // interrupt the IOHandlerProcessSTDIO::Run() and we can look at the byte
Pavel Labathfcc7f662015-10-07 15:11:11 +00005038 // that was written to the pipe and then call m_process->SendAsyncInterrupt()
5039 // from a much safer location in code.
Greg Clayton0fdd3ae2014-07-16 21:05:41 +00005040 if (m_active)
5041 {
5042 char ch = 'i'; // Send 'i' for interrupt
Zachary Turner0b9d3ee2014-12-17 18:02:19 +00005043 size_t bytes_written = 0;
5044 Error result = m_pipe.Write(&ch, 1, bytes_written);
5045 return result.Success();
Greg Clayton0fdd3ae2014-07-16 21:05:41 +00005046 }
5047 else
5048 {
5049 // This IOHandler might be pushed on the stack, but not being run currently
5050 // so do the right thing if we aren't actively watching for STDIN by sending
5051 // the interrupt to the process. Otherwise the write to the pipe above would
5052 // do nothing. This can happen when the command interpreter is running and
5053 // gets a "expression ...". It will be on the IOHandler thread and sending
5054 // the input is complete to the delegate which will cause the expression to
5055 // run, which will push the process IO handler, but not run it.
5056
5057 if (StateIsRunningState(m_process->GetState()))
5058 {
5059 m_process->SendAsyncInterrupt();
5060 return true;
5061 }
5062 }
5063 return false;
Greg Claytone68f5d62014-02-24 22:50:57 +00005064 }
Greg Clayton44d93782014-01-27 23:43:24 +00005065
Pavel Labath44464872015-05-27 12:40:32 +00005066 void
5067 GotEOF() override
Greg Clayton44d93782014-01-27 23:43:24 +00005068 {
Greg Clayton44d93782014-01-27 23:43:24 +00005069 }
5070
5071protected:
5072 Process *m_process;
5073 File m_read_file; // Read from this file (usually actual STDIN for LLDB
5074 File m_write_file; // Write to this file (usually the master pty for getting io to debuggee)
Greg Clayton100eb932014-07-02 21:10:39 +00005075 Pipe m_pipe;
Greg Clayton860582f2016-02-26 17:36:44 +00005076 std::atomic<bool> m_is_running;
Greg Clayton44d93782014-01-27 23:43:24 +00005077};
5078
Caroline Ticeef5c6d02010-11-16 05:07:41 +00005079void
Greg Clayton44d93782014-01-27 23:43:24 +00005080Process::SetSTDIOFileDescriptor (int fd)
Caroline Ticeef5c6d02010-11-16 05:07:41 +00005081{
5082 // First set up the Read Thread for reading/handling process I/O
5083
Greg Clayton44d93782014-01-27 23:43:24 +00005084 std::unique_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (fd, true));
Caroline Ticeef5c6d02010-11-16 05:07:41 +00005085
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005086 if (conn_ap)
Caroline Ticeef5c6d02010-11-16 05:07:41 +00005087 {
5088 m_stdio_communication.SetConnection (conn_ap.release());
5089 if (m_stdio_communication.IsConnected())
5090 {
5091 m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this);
5092 m_stdio_communication.StartReadThread();
5093
5094 // Now read thread is set up, set up input reader.
5095
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005096 if (!m_process_input_reader)
Greg Clayton44d93782014-01-27 23:43:24 +00005097 m_process_input_reader.reset (new IOHandlerProcessSTDIO (this, fd));
Caroline Ticeef5c6d02010-11-16 05:07:41 +00005098 }
5099 }
5100}
5101
Greg Claytonb4874f12014-02-28 18:22:24 +00005102bool
Greg Clayton6fea17e2014-03-03 19:15:20 +00005103Process::ProcessIOHandlerIsActive ()
5104{
5105 IOHandlerSP io_handler_sp (m_process_input_reader);
5106 if (io_handler_sp)
Zachary Turner7529df92015-09-01 20:02:29 +00005107 return GetTarget().GetDebugger().IsTopIOHandler (io_handler_sp);
Greg Clayton6fea17e2014-03-03 19:15:20 +00005108 return false;
5109}
5110bool
Greg Clayton44d93782014-01-27 23:43:24 +00005111Process::PushProcessIOHandler ()
Caroline Ticeef5c6d02010-11-16 05:07:41 +00005112{
Greg Clayton44d93782014-01-27 23:43:24 +00005113 IOHandlerSP io_handler_sp (m_process_input_reader);
5114 if (io_handler_sp)
5115 {
Pavel Labath44464872015-05-27 12:40:32 +00005116 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
5117 if (log)
5118 log->Printf("Process::%s pushing IO handler", __FUNCTION__);
5119
Greg Clayton44d93782014-01-27 23:43:24 +00005120 io_handler_sp->SetIsDone(false);
Zachary Turner7529df92015-09-01 20:02:29 +00005121 GetTarget().GetDebugger().PushIOHandler (io_handler_sp);
Greg Claytonb4874f12014-02-28 18:22:24 +00005122 return true;
Greg Clayton44d93782014-01-27 23:43:24 +00005123 }
Greg Claytonb4874f12014-02-28 18:22:24 +00005124 return false;
Caroline Ticeef5c6d02010-11-16 05:07:41 +00005125}
5126
Greg Claytonb4874f12014-02-28 18:22:24 +00005127bool
Greg Clayton44d93782014-01-27 23:43:24 +00005128Process::PopProcessIOHandler ()
Caroline Ticeef5c6d02010-11-16 05:07:41 +00005129{
Greg Clayton44d93782014-01-27 23:43:24 +00005130 IOHandlerSP io_handler_sp (m_process_input_reader);
5131 if (io_handler_sp)
Zachary Turner7529df92015-09-01 20:02:29 +00005132 return GetTarget().GetDebugger().PopIOHandler (io_handler_sp);
Greg Claytonb4874f12014-02-28 18:22:24 +00005133 return false;
Caroline Ticeef5c6d02010-11-16 05:07:41 +00005134}
5135
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00005136// The process needs to know about installed plug-ins
Greg Clayton99d0faf2010-11-18 23:32:35 +00005137void
Caroline Tice20bd37f2011-03-10 22:14:10 +00005138Process::SettingsInitialize ()
Caroline Tice3df9a8d2010-09-04 00:03:46 +00005139{
Greg Clayton6920b522012-08-22 18:39:03 +00005140 Thread::SettingsInitialize ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00005141}
Caroline Tice3df9a8d2010-09-04 00:03:46 +00005142
Greg Clayton99d0faf2010-11-18 23:32:35 +00005143void
Caroline Tice20bd37f2011-03-10 22:14:10 +00005144Process::SettingsTerminate ()
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00005145{
Greg Clayton6920b522012-08-22 18:39:03 +00005146 Thread::SettingsTerminate ();
Greg Clayton99d0faf2010-11-18 23:32:35 +00005147}
Caroline Tice3df9a8d2010-09-04 00:03:46 +00005148
Jim Inghamc60963c2015-10-12 19:11:03 +00005149namespace
5150{
5151 // RestorePlanState is used to record the "is private", "is master" and "okay to discard" fields of
5152 // the plan we are running, and reset it on Clean or on destruction.
5153 // It will only reset the state once, so you can call Clean and then monkey with the state and it
5154 // won't get reset on you again.
5155
5156 class RestorePlanState
5157 {
5158 public:
5159 RestorePlanState (lldb::ThreadPlanSP thread_plan_sp) :
5160 m_thread_plan_sp(thread_plan_sp),
5161 m_already_reset(false)
5162 {
5163 if (m_thread_plan_sp)
5164 {
5165 m_private = m_thread_plan_sp->GetPrivate();
5166 m_is_master = m_thread_plan_sp->IsMasterPlan();
5167 m_okay_to_discard = m_thread_plan_sp->OkayToDiscard();
5168 }
5169 }
5170
5171 ~RestorePlanState()
5172 {
5173 Clean();
5174 }
5175
5176 void
5177 Clean ()
5178 {
5179 if (!m_already_reset && m_thread_plan_sp)
5180 {
5181 m_already_reset = true;
5182 m_thread_plan_sp->SetPrivate(m_private);
5183 m_thread_plan_sp->SetIsMasterPlan (m_is_master);
5184 m_thread_plan_sp->SetOkayToDiscard(m_okay_to_discard);
5185 }
5186 }
Eugene Zelenko8f30a652015-10-23 18:39:37 +00005187
Jim Inghamc60963c2015-10-12 19:11:03 +00005188 private:
5189 lldb::ThreadPlanSP m_thread_plan_sp;
5190 bool m_already_reset;
5191 bool m_private;
5192 bool m_is_master;
5193 bool m_okay_to_discard;
5194 };
Eugene Zelenko8f30a652015-10-23 18:39:37 +00005195} // anonymous namespace
Jim Inghamc60963c2015-10-12 19:11:03 +00005196
Jim Ingham1624a2d2014-05-05 02:26:40 +00005197ExpressionResults
Sean Callanan579e70c2016-03-19 00:03:59 +00005198Process::RunThreadPlan(ExecutionContext &exe_ctx, lldb::ThreadPlanSP &thread_plan_sp,
5199 const EvaluateExpressionOptions &options, DiagnosticManager &diagnostic_manager)
Jim Inghamf48169b2010-11-30 02:22:11 +00005200{
Jim Ingham8646d3c2014-05-05 02:47:44 +00005201 ExpressionResults return_value = eExpressionSetupError;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005202
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005203 if (!thread_plan_sp)
Jim Ingham77787032011-01-20 02:03:18 +00005204 {
Sean Callanan579e70c2016-03-19 00:03:59 +00005205 diagnostic_manager.PutCString(eDiagnosticSeverityError, "RunThreadPlan called with empty thread plan.");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005206 return eExpressionSetupError;
Jim Ingham77787032011-01-20 02:03:18 +00005207 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005208
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005209 if (!thread_plan_sp->ValidatePlan(nullptr))
Jim Ingham7d7931d2013-03-28 00:05:34 +00005210 {
Sean Callanan579e70c2016-03-19 00:03:59 +00005211 diagnostic_manager.PutCString(eDiagnosticSeverityError, "RunThreadPlan called with an invalid thread plan.");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005212 return eExpressionSetupError;
Jim Ingham7d7931d2013-03-28 00:05:34 +00005213 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005214
Greg Claytonc14ee322011-09-22 04:58:26 +00005215 if (exe_ctx.GetProcessPtr() != this)
5216 {
Sean Callanan579e70c2016-03-19 00:03:59 +00005217 diagnostic_manager.PutCString(eDiagnosticSeverityError, "RunThreadPlan called on wrong process.");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005218 return eExpressionSetupError;
Greg Claytonc14ee322011-09-22 04:58:26 +00005219 }
5220
5221 Thread *thread = exe_ctx.GetThreadPtr();
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005222 if (thread == nullptr)
Greg Claytonc14ee322011-09-22 04:58:26 +00005223 {
Sean Callanan579e70c2016-03-19 00:03:59 +00005224 diagnostic_manager.PutCString(eDiagnosticSeverityError, "RunThreadPlan called with invalid thread.");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005225 return eExpressionSetupError;
Greg Claytonc14ee322011-09-22 04:58:26 +00005226 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005227
Jim Inghamc60963c2015-10-12 19:11:03 +00005228 // We need to change some of the thread plan attributes for the thread plan runner. This will restore them
5229 // when we are done:
5230
5231 RestorePlanState thread_plan_restorer(thread_plan_sp);
5232
Jim Ingham17e5c4e2011-05-17 22:24:54 +00005233 // We rely on the thread plan we are running returning "PlanCompleted" if when it successfully completes.
5234 // For that to be true the plan can't be private - since private plans suppress themselves in the
5235 // GetCompletedPlan call.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005236
Jim Ingham17e5c4e2011-05-17 22:24:54 +00005237 thread_plan_sp->SetPrivate(false);
Jim Inghamc60963c2015-10-12 19:11:03 +00005238
5239 // The plans run with RunThreadPlan also need to be terminal master plans or when they are done we will end
5240 // up asking the plan above us whether we should stop, which may give the wrong answer.
5241
5242 thread_plan_sp->SetIsMasterPlan (true);
5243 thread_plan_sp->SetOkayToDiscard(false);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005244
Jim Ingham444586b2011-01-24 06:34:17 +00005245 if (m_private_state.GetValue() != eStateStopped)
5246 {
Sean Callanan579e70c2016-03-19 00:03:59 +00005247 diagnostic_manager.PutCString(eDiagnosticSeverityError,
5248 "RunThreadPlan called while the private state was not stopped.");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005249 return eExpressionSetupError;
Jim Ingham444586b2011-01-24 06:34:17 +00005250 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005251
Jim Ingham66243842011-08-13 00:56:10 +00005252 // Save the thread & frame from the exe_ctx for restoration after we run
Greg Claytonc14ee322011-09-22 04:58:26 +00005253 const uint32_t thread_idx_id = thread->GetIndexID();
Jason Molendab57e4a12013-11-04 09:33:30 +00005254 StackFrameSP selected_frame_sp = thread->GetSelectedFrame();
Jim Ingham11b0e052013-02-19 23:22:45 +00005255 if (!selected_frame_sp)
5256 {
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005257 thread->SetSelectedFrame(nullptr);
Jim Ingham11b0e052013-02-19 23:22:45 +00005258 selected_frame_sp = thread->GetSelectedFrame();
5259 if (!selected_frame_sp)
5260 {
Sean Callanan579e70c2016-03-19 00:03:59 +00005261 diagnostic_manager.Printf(eDiagnosticSeverityError,
5262 "RunThreadPlan called without a selected frame on thread %d", thread_idx_id);
Jim Ingham8646d3c2014-05-05 02:47:44 +00005263 return eExpressionSetupError;
Jim Ingham11b0e052013-02-19 23:22:45 +00005264 }
5265 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005266
Jim Ingham11b0e052013-02-19 23:22:45 +00005267 StackID ctx_frame_id = selected_frame_sp->GetStackID();
Jim Inghamf48169b2010-11-30 02:22:11 +00005268
5269 // N.B. Running the target may unset the currently selected thread and frame. We don't want to do that either,
5270 // so we should arrange to reset them as well.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005271
Greg Claytonc14ee322011-09-22 04:58:26 +00005272 lldb::ThreadSP selected_thread_sp = GetThreadList().GetSelectedThread();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005273
Jim Ingham66243842011-08-13 00:56:10 +00005274 uint32_t selected_tid;
5275 StackID selected_stack_id;
Greg Clayton762f7132011-09-18 18:59:15 +00005276 if (selected_thread_sp)
Jim Inghamf48169b2010-11-30 02:22:11 +00005277 {
5278 selected_tid = selected_thread_sp->GetIndexID();
Jim Ingham66243842011-08-13 00:56:10 +00005279 selected_stack_id = selected_thread_sp->GetSelectedFrame()->GetStackID();
Jim Inghamf48169b2010-11-30 02:22:11 +00005280 }
5281 else
5282 {
5283 selected_tid = LLDB_INVALID_THREAD_ID;
5284 }
5285
Zachary Turner39de3112014-09-09 20:54:56 +00005286 HostThread backup_private_state_thread;
Jason Molenda76513fd2014-10-15 23:39:31 +00005287 lldb::StateType old_state = eStateInvalid;
Jim Ingham076b3042012-04-10 01:21:57 +00005288 lldb::ThreadPlanSP stopper_base_plan_sp;
Jim Ingham372787f2012-04-07 00:00:41 +00005289
Greg Clayton5160ce52013-03-27 23:08:40 +00005290 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS));
Zachary Turner39de3112014-09-09 20:54:56 +00005291 if (m_private_state_thread.EqualsThread(Host::GetCurrentThread()))
Jim Ingham372787f2012-04-07 00:00:41 +00005292 {
Jim Ingham076b3042012-04-10 01:21:57 +00005293 // Yikes, we are running on the private state thread! So we can't wait for public events on this thread, since
5294 // we are the thread that is generating public events.
Jim Ingham372787f2012-04-07 00:00:41 +00005295 // 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 +00005296 // we are fielding public events here.
5297 if (log)
Jason Molendad251c9d2012-11-17 01:41:04 +00005298 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 +00005299
Jim Ingham372787f2012-04-07 00:00:41 +00005300 backup_private_state_thread = m_private_state_thread;
Jim Ingham076b3042012-04-10 01:21:57 +00005301
5302 // One other bit of business: we want to run just this thread plan and anything it pushes, and then stop,
5303 // returning control here.
5304 // But in the normal course of things, the plan above us on the stack would be given a shot at the stop
5305 // event before deciding to stop, and we don't want that. So we insert a "stopper" base plan on the stack
5306 // before the plan we want to run. Since base plans always stop and return control to the user, that will
5307 // do just what we want.
5308 stopper_base_plan_sp.reset(new ThreadPlanBase (*thread));
5309 thread->QueueThreadPlan (stopper_base_plan_sp, false);
5310 // Have to make sure our public state is stopped, since otherwise the reporting logic below doesn't work correctly.
5311 old_state = m_public_state.GetValue();
5312 m_public_state.SetValueNoLock(eStateStopped);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005313
Jim Ingham076b3042012-04-10 01:21:57 +00005314 // Now spin up the private state thread:
Jim Ingham372787f2012-04-07 00:00:41 +00005315 StartPrivateStateThread(true);
5316 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005317
Jim Ingham372787f2012-04-07 00:00:41 +00005318 thread->QueueThreadPlan(thread_plan_sp, false); // This used to pass "true" does that make sense?
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005319
Jim Ingham6fbc48b2013-11-07 00:11:47 +00005320 if (options.GetDebug())
5321 {
5322 // In this case, we aren't actually going to run, we just want to stop right away.
5323 // Flush this thread so we will refetch the stacks and show the correct backtrace.
5324 // FIXME: To make this prettier we should invent some stop reason for this, but that
5325 // is only cosmetic, and this functionality is only of use to lldb developers who can
5326 // live with not pretty...
5327 thread->Flush();
Jim Ingham8646d3c2014-05-05 02:47:44 +00005328 return eExpressionStoppedForDebug;
Jim Ingham6fbc48b2013-11-07 00:11:47 +00005329 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005330
Jim Ingham583bbb12016-03-07 21:50:25 +00005331 ListenerSP listener_sp(Listener::MakeListener("lldb.process.listener.run-thread-plan"));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005332
Sean Callanana46ec452012-07-11 21:31:24 +00005333 lldb::EventSP event_to_broadcast_sp;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005334
Jim Ingham77787032011-01-20 02:03:18 +00005335 {
Sean Callanana46ec452012-07-11 21:31:24 +00005336 // This process event hijacker Hijacks the Public events and its destructor makes sure that the process events get
5337 // restored on exit to the function.
5338 //
5339 // If the event needs to propagate beyond the hijacker (e.g., the process exits during execution), then the event
5340 // is put into event_to_broadcast_sp for rebroadcasting.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005341
Jim Ingham583bbb12016-03-07 21:50:25 +00005342 ProcessEventHijacker run_thread_plan_hijacker (*this, listener_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005343
Jim Inghamf48169b2010-11-30 02:22:11 +00005344 if (log)
Jim Ingham0f16e732011-02-08 05:20:59 +00005345 {
5346 StreamString s;
Sean Callanana46ec452012-07-11 21:31:24 +00005347 thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
Daniel Malead01b2952012-11-29 21:49:15 +00005348 log->Printf ("Process::RunThreadPlan(): Resuming thread %u - 0x%4.4" PRIx64 " to run thread plan \"%s\".",
Sean Callanana46ec452012-07-11 21:31:24 +00005349 thread->GetIndexID(),
5350 thread->GetID(),
5351 s.GetData());
5352 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005353
Sean Callanana46ec452012-07-11 21:31:24 +00005354 bool got_event;
5355 lldb::EventSP event_sp;
5356 lldb::StateType stop_state = lldb::eStateInvalid;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005357
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005358 TimeValue* timeout_ptr = nullptr;
Sean Callanana46ec452012-07-11 21:31:24 +00005359 TimeValue real_timeout;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005360
Jim Ingham0161b492013-02-09 01:29:05 +00005361 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 +00005362 bool do_resume = true;
Jim Ingham184e9812013-01-15 02:47:48 +00005363 bool handle_running_event = true;
Jim Ingham35e1bda2012-10-16 21:41:58 +00005364 const uint64_t default_one_thread_timeout_usec = 250000;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005365
Jim Ingham0161b492013-02-09 01:29:05 +00005366 // This is just for accounting:
5367 uint32_t num_resumes = 0;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005368
Jim Ingham6fbc48b2013-11-07 00:11:47 +00005369 uint32_t timeout_usec = options.GetTimeoutUsec();
Jim Inghamfd95f892014-04-22 01:41:52 +00005370 uint32_t one_thread_timeout_usec;
5371 uint32_t all_threads_timeout_usec = 0;
Jim Inghamfe1c3422014-04-16 02:24:48 +00005372
5373 // If we are going to run all threads the whole time, or if we are only going to run one thread,
5374 // then we don't need the first timeout. So we set the final timeout, and pretend we are after the
5375 // first timeout already.
5376
5377 if (!options.GetStopOthers() || !options.GetTryAllThreads())
Jim Ingham286fb1e2014-02-28 02:52:06 +00005378 {
5379 before_first_timeout = false;
Jim Inghamfd95f892014-04-22 01:41:52 +00005380 one_thread_timeout_usec = 0;
5381 all_threads_timeout_usec = timeout_usec;
Jim Ingham286fb1e2014-02-28 02:52:06 +00005382 }
Jim Inghamfe1c3422014-04-16 02:24:48 +00005383 else
Jim Ingham0161b492013-02-09 01:29:05 +00005384 {
Jim Inghamfd95f892014-04-22 01:41:52 +00005385 uint32_t option_one_thread_timeout = options.GetOneThreadTimeoutUsec();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005386
Jim Ingham914f4e72014-03-28 21:58:28 +00005387 // If the overall wait is forever, then we only need to set the one thread timeout:
5388 if (timeout_usec == 0)
5389 {
Ed Maste801335c2014-03-31 19:28:14 +00005390 if (option_one_thread_timeout != 0)
Jim Inghamfd95f892014-04-22 01:41:52 +00005391 one_thread_timeout_usec = option_one_thread_timeout;
Jim Ingham914f4e72014-03-28 21:58:28 +00005392 else
Jim Inghamfd95f892014-04-22 01:41:52 +00005393 one_thread_timeout_usec = default_one_thread_timeout_usec;
Jim Ingham914f4e72014-03-28 21:58:28 +00005394 }
Jim Ingham0161b492013-02-09 01:29:05 +00005395 else
5396 {
Jim Ingham914f4e72014-03-28 21:58:28 +00005397 // Otherwise, if the one thread timeout is set, make sure it isn't longer than the overall timeout,
5398 // and use it, otherwise use half the total timeout, bounded by the default_one_thread_timeout_usec.
5399 uint64_t computed_one_thread_timeout;
5400 if (option_one_thread_timeout != 0)
5401 {
5402 if (timeout_usec < option_one_thread_timeout)
5403 {
Sean Callanan579e70c2016-03-19 00:03:59 +00005404 diagnostic_manager.PutCString(
5405 eDiagnosticSeverityError,
5406 "RunThreadPlan called without one thread timeout greater than total timeout");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005407 return eExpressionSetupError;
Jim Ingham914f4e72014-03-28 21:58:28 +00005408 }
5409 computed_one_thread_timeout = option_one_thread_timeout;
5410 }
5411 else
5412 {
5413 computed_one_thread_timeout = timeout_usec / 2;
5414 if (computed_one_thread_timeout > default_one_thread_timeout_usec)
5415 computed_one_thread_timeout = default_one_thread_timeout_usec;
5416 }
Jim Inghamfd95f892014-04-22 01:41:52 +00005417 one_thread_timeout_usec = computed_one_thread_timeout;
5418 all_threads_timeout_usec = timeout_usec - one_thread_timeout_usec;
Jim Ingham0161b492013-02-09 01:29:05 +00005419 }
Jim Ingham0161b492013-02-09 01:29:05 +00005420 }
Jim Inghamfe1c3422014-04-16 02:24:48 +00005421
5422 if (log)
Jim Inghamfd95f892014-04-22 01:41:52 +00005423 log->Printf ("Stop others: %u, try all: %u, before_first: %u, one thread: %" PRIu32 " - all threads: %" PRIu32 ".\n",
Jim Inghamfe1c3422014-04-16 02:24:48 +00005424 options.GetStopOthers(),
5425 options.GetTryAllThreads(),
Jim Inghamfd95f892014-04-22 01:41:52 +00005426 before_first_timeout,
5427 one_thread_timeout_usec,
5428 all_threads_timeout_usec);
Jim Ingham0161b492013-02-09 01:29:05 +00005429
Jim Ingham1460e4b2014-01-10 23:46:59 +00005430 // This isn't going to work if there are unfetched events on the queue.
5431 // Are there cases where we might want to run the remaining events here, and then try to
5432 // call the function? That's probably being too tricky for our own good.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005433
Jim Ingham583bbb12016-03-07 21:50:25 +00005434 Event *other_events = listener_sp->PeekAtNextEvent();
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005435 if (other_events != nullptr)
Jim Ingham1460e4b2014-01-10 23:46:59 +00005436 {
Sean Callanan579e70c2016-03-19 00:03:59 +00005437 diagnostic_manager.PutCString(eDiagnosticSeverityError,
5438 "RunThreadPlan called with pending events on the queue.");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005439 return eExpressionSetupError;
Jim Ingham1460e4b2014-01-10 23:46:59 +00005440 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005441
Jim Ingham1460e4b2014-01-10 23:46:59 +00005442 // We also need to make sure that the next event is delivered. We might be calling a function as part of
5443 // a thread plan, in which case the last delivered event could be the running event, and we don't want
5444 // event coalescing to cause us to lose OUR running event...
5445 ForceNextEventDelivery();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005446
Jim Ingham8559a352012-11-26 23:52:18 +00005447 // This while loop must exit out the bottom, there's cleanup that we need to do when we are done.
5448 // So don't call return anywhere within it.
Jim Ingham35878c42014-04-08 21:33:21 +00005449
5450#ifdef LLDB_RUN_THREAD_HALT_WITH_EVENT
5451 // It's pretty much impossible to write test cases for things like:
5452 // One thread timeout expires, I go to halt, but the process already stopped
5453 // on the function call stop breakpoint. Turning on this define will make us not
5454 // fetch the first event till after the halt. So if you run a quick function, it will have
5455 // completed, and the completion event will be waiting, when you interrupt for halt.
5456 // The expression evaluation should still succeed.
5457 bool miss_first_event = true;
5458#endif
Jim Inghamfd95f892014-04-22 01:41:52 +00005459 TimeValue one_thread_timeout;
5460 TimeValue final_timeout;
Eugene Zelenko8f30a652015-10-23 18:39:37 +00005461
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005462 while (true)
Sean Callanana46ec452012-07-11 21:31:24 +00005463 {
5464 // We usually want to resume the process if we get to the top of the loop.
5465 // The only exception is if we get two running events with no intervening
5466 // stop, which can happen, we will just wait for then next stop event.
Jim Ingham0161b492013-02-09 01:29:05 +00005467 if (log)
5468 log->Printf ("Top of while loop: do_resume: %i handle_running_event: %i before_first_timeout: %i.",
5469 do_resume,
5470 handle_running_event,
5471 before_first_timeout);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005472
Jim Ingham184e9812013-01-15 02:47:48 +00005473 if (do_resume || handle_running_event)
Sean Callanana46ec452012-07-11 21:31:24 +00005474 {
5475 // Do the initial resume and wait for the running event before going further.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005476
Jim Ingham184e9812013-01-15 02:47:48 +00005477 if (do_resume)
Sean Callanana46ec452012-07-11 21:31:24 +00005478 {
Jim Ingham0161b492013-02-09 01:29:05 +00005479 num_resumes++;
Sean Callanan579e70c2016-03-19 00:03:59 +00005480 Error resume_error = PrivateResume();
Jim Ingham184e9812013-01-15 02:47:48 +00005481 if (!resume_error.Success())
5482 {
Sean Callanan579e70c2016-03-19 00:03:59 +00005483 diagnostic_manager.Printf(eDiagnosticSeverityError,
5484 "couldn't resume inferior the %d time: \"%s\".", num_resumes,
5485 resume_error.AsCString());
Jim Ingham8646d3c2014-05-05 02:47:44 +00005486 return_value = eExpressionSetupError;
Jim Ingham184e9812013-01-15 02:47:48 +00005487 break;
5488 }
Sean Callanana46ec452012-07-11 21:31:24 +00005489 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005490
Jim Ingham0161b492013-02-09 01:29:05 +00005491 TimeValue resume_timeout = TimeValue::Now();
5492 resume_timeout.OffsetWithMicroSeconds(500000);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005493
Jim Ingham583bbb12016-03-07 21:50:25 +00005494 got_event = listener_sp->WaitForEvent(&resume_timeout, event_sp);
Sean Callanana46ec452012-07-11 21:31:24 +00005495 if (!got_event)
5496 {
5497 if (log)
Sean Callanan579e70c2016-03-19 00:03:59 +00005498 log->Printf("Process::RunThreadPlan(): didn't get any event after resume %" PRIu32 ", exiting.",
5499 num_resumes);
Sean Callanana46ec452012-07-11 21:31:24 +00005500
Sean Callanan579e70c2016-03-19 00:03:59 +00005501 diagnostic_manager.Printf(eDiagnosticSeverityError,
5502 "didn't get any event after resume %" PRIu32 ", exiting.", num_resumes);
Jim Ingham8646d3c2014-05-05 02:47:44 +00005503 return_value = eExpressionSetupError;
Sean Callanana46ec452012-07-11 21:31:24 +00005504 break;
5505 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005506
Sean Callanana46ec452012-07-11 21:31:24 +00005507 stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
Jim Ingham0161b492013-02-09 01:29:05 +00005508
Sean Callanana46ec452012-07-11 21:31:24 +00005509 if (stop_state != eStateRunning)
5510 {
Jim Ingham0161b492013-02-09 01:29:05 +00005511 bool restarted = false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005512
Jim Ingham0161b492013-02-09 01:29:05 +00005513 if (stop_state == eStateStopped)
5514 {
5515 restarted = Process::ProcessEventData::GetRestartedFromEvent(event_sp.get());
5516 if (log)
5517 log->Printf("Process::RunThreadPlan(): didn't get running event after "
5518 "resume %d, got %s instead (restarted: %i, do_resume: %i, handle_running_event: %i).",
5519 num_resumes,
5520 StateAsCString(stop_state),
5521 restarted,
5522 do_resume,
5523 handle_running_event);
5524 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005525
Jim Ingham0161b492013-02-09 01:29:05 +00005526 if (restarted)
5527 {
5528 // This is probably an overabundance of caution, I don't think I should ever get a stopped & restarted
5529 // event here. But if I do, the best thing is to Halt and then get out of here.
Pavel Labath19da1f12015-12-07 12:36:52 +00005530 const bool clear_thread_plans = false;
5531 const bool use_run_lock = false;
5532 Halt(clear_thread_plans, use_run_lock);
Jim Ingham0161b492013-02-09 01:29:05 +00005533 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005534
Sean Callanan579e70c2016-03-19 00:03:59 +00005535 diagnostic_manager.Printf(eDiagnosticSeverityError,
5536 "didn't get running event after initial resume, got %s instead.",
5537 StateAsCString(stop_state));
Jim Ingham8646d3c2014-05-05 02:47:44 +00005538 return_value = eExpressionSetupError;
Sean Callanana46ec452012-07-11 21:31:24 +00005539 break;
5540 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005541
Sean Callanana46ec452012-07-11 21:31:24 +00005542 if (log)
5543 log->PutCString ("Process::RunThreadPlan(): resuming succeeded.");
5544 // We need to call the function synchronously, so spin waiting for it to return.
5545 // If we get interrupted while executing, we're going to lose our context, and
5546 // won't be able to gather the result at this point.
5547 // We set the timeout AFTER the resume, since the resume takes some time and we
5548 // don't want to charge that to the timeout.
Sean Callanana46ec452012-07-11 21:31:24 +00005549 }
Jim Ingham0f16e732011-02-08 05:20:59 +00005550 else
5551 {
Sean Callanana46ec452012-07-11 21:31:24 +00005552 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00005553 log->PutCString ("Process::RunThreadPlan(): waiting for next event.");
Jim Ingham0f16e732011-02-08 05:20:59 +00005554 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005555
Jim Ingham0161b492013-02-09 01:29:05 +00005556 if (before_first_timeout)
5557 {
Jim Ingham6fbc48b2013-11-07 00:11:47 +00005558 if (options.GetTryAllThreads())
Jim Inghamfd95f892014-04-22 01:41:52 +00005559 {
5560 one_thread_timeout = TimeValue::Now();
5561 one_thread_timeout.OffsetWithMicroSeconds(one_thread_timeout_usec);
Jim Ingham0161b492013-02-09 01:29:05 +00005562 timeout_ptr = &one_thread_timeout;
Jim Inghamfd95f892014-04-22 01:41:52 +00005563 }
Jim Ingham0161b492013-02-09 01:29:05 +00005564 else
5565 {
5566 if (timeout_usec == 0)
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005567 timeout_ptr = nullptr;
Jim Ingham0161b492013-02-09 01:29:05 +00005568 else
Jim Inghamfd95f892014-04-22 01:41:52 +00005569 {
5570 final_timeout = TimeValue::Now();
5571 final_timeout.OffsetWithMicroSeconds (timeout_usec);
Jim Ingham0161b492013-02-09 01:29:05 +00005572 timeout_ptr = &final_timeout;
Jim Inghamfd95f892014-04-22 01:41:52 +00005573 }
Jim Ingham0161b492013-02-09 01:29:05 +00005574 }
5575 }
5576 else
5577 {
5578 if (timeout_usec == 0)
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005579 timeout_ptr = nullptr;
Jim Ingham0161b492013-02-09 01:29:05 +00005580 else
Jim Inghamfd95f892014-04-22 01:41:52 +00005581 {
5582 final_timeout = TimeValue::Now();
5583 final_timeout.OffsetWithMicroSeconds (all_threads_timeout_usec);
Jim Ingham0161b492013-02-09 01:29:05 +00005584 timeout_ptr = &final_timeout;
Jim Inghamfd95f892014-04-22 01:41:52 +00005585 }
Jim Ingham0161b492013-02-09 01:29:05 +00005586 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005587
Jim Ingham0161b492013-02-09 01:29:05 +00005588 do_resume = true;
5589 handle_running_event = true;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005590
Sean Callanana46ec452012-07-11 21:31:24 +00005591 // Now wait for the process to stop again:
Sean Callanana46ec452012-07-11 21:31:24 +00005592 event_sp.reset();
Jim Ingham0f16e732011-02-08 05:20:59 +00005593
Jim Ingham0f16e732011-02-08 05:20:59 +00005594 if (log)
Jim Ingham20829ac2011-08-09 22:24:33 +00005595 {
Sean Callanana46ec452012-07-11 21:31:24 +00005596 if (timeout_ptr)
5597 {
Matt Kopec676a4872013-02-21 23:55:31 +00005598 log->Printf ("Process::RunThreadPlan(): about to wait - now is %" PRIu64 " - endpoint is %" PRIu64,
Jim Ingham0161b492013-02-09 01:29:05 +00005599 TimeValue::Now().GetAsMicroSecondsSinceJan1_1970(),
5600 timeout_ptr->GetAsMicroSecondsSinceJan1_1970());
Sean Callanana46ec452012-07-11 21:31:24 +00005601 }
Jim Ingham20829ac2011-08-09 22:24:33 +00005602 else
Sean Callanana46ec452012-07-11 21:31:24 +00005603 {
5604 log->Printf ("Process::RunThreadPlan(): about to wait forever.");
5605 }
5606 }
Jim Ingham35878c42014-04-08 21:33:21 +00005607
5608#ifdef LLDB_RUN_THREAD_HALT_WITH_EVENT
5609 // See comment above...
5610 if (miss_first_event)
5611 {
5612 usleep(1000);
5613 miss_first_event = false;
5614 got_event = false;
5615 }
5616 else
5617#endif
Jim Ingham583bbb12016-03-07 21:50:25 +00005618 got_event = listener_sp->WaitForEvent (timeout_ptr, event_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005619
Sean Callanana46ec452012-07-11 21:31:24 +00005620 if (got_event)
5621 {
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005622 if (event_sp)
Sean Callanana46ec452012-07-11 21:31:24 +00005623 {
5624 bool keep_going = false;
Jim Inghamcfc09352012-07-27 23:57:19 +00005625 if (event_sp->GetType() == eBroadcastBitInterrupt)
Sean Callanana46ec452012-07-11 21:31:24 +00005626 {
Pavel Labath19da1f12015-12-07 12:36:52 +00005627 const bool clear_thread_plans = false;
5628 const bool use_run_lock = false;
5629 Halt(clear_thread_plans, use_run_lock);
Jim Ingham8646d3c2014-05-05 02:47:44 +00005630 return_value = eExpressionInterrupted;
Sean Callanan579e70c2016-03-19 00:03:59 +00005631 diagnostic_manager.PutCString(eDiagnosticSeverityRemark, "execution halted by user interrupt.");
Jim Inghamcfc09352012-07-27 23:57:19 +00005632 if (log)
Sean Callanan579e70c2016-03-19 00:03:59 +00005633 log->Printf(
5634 "Process::RunThreadPlan(): Got interrupted by eBroadcastBitInterrupted, exiting.");
Jim Ingham0161b492013-02-09 01:29:05 +00005635 break;
Jim Inghamcfc09352012-07-27 23:57:19 +00005636 }
5637 else
5638 {
5639 stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
5640 if (log)
5641 log->Printf("Process::RunThreadPlan(): in while loop, got event: %s.", StateAsCString(stop_state));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005642
Jim Inghamcfc09352012-07-27 23:57:19 +00005643 switch (stop_state)
Sean Callanana46ec452012-07-11 21:31:24 +00005644 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005645 case lldb::eStateStopped:
Sean Callanana46ec452012-07-11 21:31:24 +00005646 {
Jim Ingham0161b492013-02-09 01:29:05 +00005647 // We stopped, figure out what we are going to do now.
Jim Inghamcfc09352012-07-27 23:57:19 +00005648 ThreadSP thread_sp = GetThreadList().FindThreadByIndexID (thread_idx_id);
5649 if (!thread_sp)
Sean Callanana46ec452012-07-11 21:31:24 +00005650 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005651 // Ooh, our thread has vanished. Unlikely that this was successful execution...
Sean Callanana46ec452012-07-11 21:31:24 +00005652 if (log)
Jim Inghamcfc09352012-07-27 23:57:19 +00005653 log->Printf ("Process::RunThreadPlan(): execution completed but our thread (index-id=%u) has vanished.", thread_idx_id);
Jim Ingham8646d3c2014-05-05 02:47:44 +00005654 return_value = eExpressionInterrupted;
Sean Callanana46ec452012-07-11 21:31:24 +00005655 }
5656 else
5657 {
Jim Ingham0161b492013-02-09 01:29:05 +00005658 // If we were restarted, we just need to go back up to fetch another event.
5659 if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
Jim Inghamcfc09352012-07-27 23:57:19 +00005660 {
5661 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00005662 {
5663 log->Printf ("Process::RunThreadPlan(): Got a stop and restart, so we'll continue waiting.");
5664 }
5665 keep_going = true;
5666 do_resume = false;
5667 handle_running_event = true;
Jim Inghamcfc09352012-07-27 23:57:19 +00005668 }
5669 else
5670 {
Jim Ingham0161b492013-02-09 01:29:05 +00005671 StopInfoSP stop_info_sp (thread_sp->GetStopInfo ());
5672 StopReason stop_reason = eStopReasonInvalid;
5673 if (stop_info_sp)
5674 stop_reason = stop_info_sp->GetStopReason();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005675
Jim Ingham0161b492013-02-09 01:29:05 +00005676 // FIXME: We only check if the stop reason is plan complete, should we make sure that
5677 // it is OUR plan that is complete?
5678 if (stop_reason == eStopReasonPlanComplete)
Jim Ingham184e9812013-01-15 02:47:48 +00005679 {
5680 if (log)
Jim Ingham0161b492013-02-09 01:29:05 +00005681 log->PutCString ("Process::RunThreadPlan(): execution completed successfully.");
Jim Inghamc60963c2015-10-12 19:11:03 +00005682
5683 // Restore the plan state so it will get reported as intended when we are done.
5684 thread_plan_restorer.Clean();
5685
Jim Ingham8646d3c2014-05-05 02:47:44 +00005686 return_value = eExpressionCompleted;
Jim Ingham184e9812013-01-15 02:47:48 +00005687 }
5688 else
5689 {
Jim Ingham0161b492013-02-09 01:29:05 +00005690 // Something restarted the target, so just wait for it to stop for real.
Jim Ingham184e9812013-01-15 02:47:48 +00005691 if (stop_reason == eStopReasonBreakpoint)
Jim Ingham0161b492013-02-09 01:29:05 +00005692 {
5693 if (log)
5694 log->Printf ("Process::RunThreadPlan() stopped for breakpoint: %s.", stop_info_sp->GetDescription());
Jim Ingham8646d3c2014-05-05 02:47:44 +00005695 return_value = eExpressionHitBreakpoint;
Jim Ingham6fbc48b2013-11-07 00:11:47 +00005696 if (!options.DoesIgnoreBreakpoints())
Sean Callanan4b388c92013-07-30 19:54:09 +00005697 {
Jim Inghamc60963c2015-10-12 19:11:03 +00005698 // Restore the plan state and then force Private to false. We are
5699 // going to stop because of this plan so we need it to become a public
5700 // plan or it won't report correctly when we continue to its termination
5701 // later on.
5702 thread_plan_restorer.Clean();
5703 if (thread_plan_sp)
5704 thread_plan_sp->SetPrivate(false);
Sean Callanan4b388c92013-07-30 19:54:09 +00005705 event_to_broadcast_sp = event_sp;
5706 }
Jim Ingham0161b492013-02-09 01:29:05 +00005707 }
Jim Ingham184e9812013-01-15 02:47:48 +00005708 else
Jim Ingham0161b492013-02-09 01:29:05 +00005709 {
5710 if (log)
5711 log->PutCString ("Process::RunThreadPlan(): thread plan didn't successfully complete.");
Jim Ingham6fbc48b2013-11-07 00:11:47 +00005712 if (!options.DoesUnwindOnError())
Sean Callanan4b388c92013-07-30 19:54:09 +00005713 event_to_broadcast_sp = event_sp;
Jim Ingham8646d3c2014-05-05 02:47:44 +00005714 return_value = eExpressionInterrupted;
Jim Ingham0161b492013-02-09 01:29:05 +00005715 }
Jim Ingham184e9812013-01-15 02:47:48 +00005716 }
Jim Inghamcfc09352012-07-27 23:57:19 +00005717 }
Sean Callanana46ec452012-07-11 21:31:24 +00005718 }
Jim Inghamcfc09352012-07-27 23:57:19 +00005719 }
5720 break;
Sean Callanana46ec452012-07-11 21:31:24 +00005721
Jim Inghamcfc09352012-07-27 23:57:19 +00005722 case lldb::eStateRunning:
Jim Ingham0161b492013-02-09 01:29:05 +00005723 // This shouldn't really happen, but sometimes we do get two running events without an
5724 // intervening stop, and in that case we should just go back to waiting for the stop.
Jim Inghamcfc09352012-07-27 23:57:19 +00005725 do_resume = false;
5726 keep_going = true;
Jim Ingham184e9812013-01-15 02:47:48 +00005727 handle_running_event = false;
Jim Inghamcfc09352012-07-27 23:57:19 +00005728 break;
Sean Callanana46ec452012-07-11 21:31:24 +00005729
Jim Inghamcfc09352012-07-27 23:57:19 +00005730 default:
5731 if (log)
5732 log->Printf("Process::RunThreadPlan(): execution stopped with unexpected state: %s.", StateAsCString(stop_state));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005733
Jim Inghamcfc09352012-07-27 23:57:19 +00005734 if (stop_state == eStateExited)
5735 event_to_broadcast_sp = event_sp;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005736
Sean Callanan579e70c2016-03-19 00:03:59 +00005737 diagnostic_manager.PutCString(eDiagnosticSeverityError,
5738 "execution stopped with unexpected state.");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005739 return_value = eExpressionInterrupted;
Jim Inghamcfc09352012-07-27 23:57:19 +00005740 break;
5741 }
Sean Callanana46ec452012-07-11 21:31:24 +00005742 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005743
Sean Callanana46ec452012-07-11 21:31:24 +00005744 if (keep_going)
5745 continue;
5746 else
5747 break;
5748 }
5749 else
5750 {
5751 if (log)
5752 log->PutCString ("Process::RunThreadPlan(): got_event was true, but the event pointer was null. How odd...");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005753 return_value = eExpressionInterrupted;
Sean Callanana46ec452012-07-11 21:31:24 +00005754 break;
5755 }
5756 }
5757 else
5758 {
5759 // If we didn't get an event that means we've timed out...
5760 // We will interrupt the process here. Depending on what we were asked to do we will
5761 // either exit, or try with all threads running for the same timeout.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005762
Sean Callanana46ec452012-07-11 21:31:24 +00005763 if (log) {
Jim Ingham6fbc48b2013-11-07 00:11:47 +00005764 if (options.GetTryAllThreads())
Sean Callanana46ec452012-07-11 21:31:24 +00005765 {
Jim Ingham0161b492013-02-09 01:29:05 +00005766 if (before_first_timeout)
Jim Inghamfe1c3422014-04-16 02:24:48 +00005767 {
5768 if (timeout_usec != 0)
5769 {
Jim Inghamfe1c3422014-04-16 02:24:48 +00005770 log->Printf ("Process::RunThreadPlan(): Running function with one thread timeout timed out, "
Jim Inghamfd95f892014-04-22 01:41:52 +00005771 "running for %" PRIu32 " usec with all threads enabled.",
5772 all_threads_timeout_usec);
Jim Inghamfe1c3422014-04-16 02:24:48 +00005773 }
5774 else
5775 {
5776 log->Printf ("Process::RunThreadPlan(): Running function with one thread timeout timed out, "
Ed Mastee61c7b02014-04-29 17:48:06 +00005777 "running forever with all threads enabled.");
Jim Inghamfe1c3422014-04-16 02:24:48 +00005778 }
5779 }
Sean Callanana46ec452012-07-11 21:31:24 +00005780 else
5781 log->Printf ("Process::RunThreadPlan(): Restarting function with all threads enabled "
Jason Molenda6a8658a2013-10-27 02:32:23 +00005782 "and timeout: %u timed out, abandoning execution.",
Jim Ingham35e1bda2012-10-16 21:41:58 +00005783 timeout_usec);
Sean Callanana46ec452012-07-11 21:31:24 +00005784 }
5785 else
Jason Molenda6a8658a2013-10-27 02:32:23 +00005786 log->Printf ("Process::RunThreadPlan(): Running function with timeout: %u timed out, "
Jim Ingham35e1bda2012-10-16 21:41:58 +00005787 "abandoning execution.",
5788 timeout_usec);
Sean Callanana46ec452012-07-11 21:31:24 +00005789 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005790
Jim Ingham0161b492013-02-09 01:29:05 +00005791 // It is possible that between the time we issued the Halt, and we get around to calling Halt the target
5792 // could have stopped. That's fine, Halt will figure that out and send the appropriate Stopped event.
5793 // BUT it is also possible that we stopped & restarted (e.g. hit a signal with "stop" set to false.) In
5794 // that case, we'll get the stopped & restarted event, and we should go back to waiting for the Halt's
5795 // stopped event. That's what this while loop does.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005796
Jim Ingham0161b492013-02-09 01:29:05 +00005797 bool back_to_top = true;
5798 uint32_t try_halt_again = 0;
5799 bool do_halt = true;
5800 const uint32_t num_retries = 5;
5801 while (try_halt_again < num_retries)
Sean Callanana46ec452012-07-11 21:31:24 +00005802 {
Jim Ingham0161b492013-02-09 01:29:05 +00005803 Error halt_error;
5804 if (do_halt)
5805 {
5806 if (log)
5807 log->Printf ("Process::RunThreadPlan(): Running Halt.");
Pavel Labath19da1f12015-12-07 12:36:52 +00005808 const bool clear_thread_plans = false;
5809 const bool use_run_lock = false;
5810 Halt(clear_thread_plans, use_run_lock);
Jim Ingham0161b492013-02-09 01:29:05 +00005811 }
5812 if (halt_error.Success())
5813 {
5814 if (log)
5815 log->PutCString ("Process::RunThreadPlan(): Halt succeeded.");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005816
Jim Ingham0161b492013-02-09 01:29:05 +00005817 real_timeout = TimeValue::Now();
5818 real_timeout.OffsetWithMicroSeconds(500000);
5819
Jim Ingham583bbb12016-03-07 21:50:25 +00005820 got_event = listener_sp->WaitForEvent(&real_timeout, event_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005821
Jim Ingham0161b492013-02-09 01:29:05 +00005822 if (got_event)
Sean Callanana46ec452012-07-11 21:31:24 +00005823 {
Jim Ingham0161b492013-02-09 01:29:05 +00005824 stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get());
5825 if (log)
Sean Callanana46ec452012-07-11 21:31:24 +00005826 {
Jim Ingham0161b492013-02-09 01:29:05 +00005827 log->Printf ("Process::RunThreadPlan(): Stopped with event: %s", StateAsCString(stop_state));
5828 if (stop_state == lldb::eStateStopped
5829 && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get()))
5830 log->PutCString (" Event was the Halt interruption event.");
Sean Callanana46ec452012-07-11 21:31:24 +00005831 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005832
Jim Ingham0161b492013-02-09 01:29:05 +00005833 if (stop_state == lldb::eStateStopped)
Sean Callanana46ec452012-07-11 21:31:24 +00005834 {
Jim Ingham0161b492013-02-09 01:29:05 +00005835 // Between the time we initiated the Halt and the time we delivered it, the process could have
5836 // already finished its job. Check that here:
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005837
Jim Ingham0161b492013-02-09 01:29:05 +00005838 if (thread->IsThreadPlanDone (thread_plan_sp.get()))
5839 {
5840 if (log)
5841 log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done. "
5842 "Exiting wait loop.");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005843 return_value = eExpressionCompleted;
Jim Ingham0161b492013-02-09 01:29:05 +00005844 back_to_top = false;
5845 break;
5846 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005847
Jim Ingham0161b492013-02-09 01:29:05 +00005848 if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()))
5849 {
5850 if (log)
5851 log->PutCString ("Process::RunThreadPlan(): Went to halt but got a restarted event, there must be an un-restarted stopped event so try again... "
5852 "Exiting wait loop.");
5853 try_halt_again++;
5854 do_halt = false;
5855 continue;
5856 }
Sean Callanana46ec452012-07-11 21:31:24 +00005857
Jim Ingham6fbc48b2013-11-07 00:11:47 +00005858 if (!options.GetTryAllThreads())
Jim Ingham0161b492013-02-09 01:29:05 +00005859 {
5860 if (log)
5861 log->PutCString ("Process::RunThreadPlan(): try_all_threads was false, we stopped so now we're quitting.");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005862 return_value = eExpressionInterrupted;
Jim Ingham0161b492013-02-09 01:29:05 +00005863 back_to_top = false;
5864 break;
5865 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005866
Jim Ingham0161b492013-02-09 01:29:05 +00005867 if (before_first_timeout)
5868 {
5869 // Set all the other threads to run, and return to the top of the loop, which will continue;
5870 before_first_timeout = false;
5871 thread_plan_sp->SetStopOthers (false);
5872 if (log)
5873 log->PutCString ("Process::RunThreadPlan(): about to resume.");
Sean Callanana46ec452012-07-11 21:31:24 +00005874
Jim Ingham0161b492013-02-09 01:29:05 +00005875 back_to_top = true;
5876 break;
5877 }
5878 else
5879 {
5880 // Running all threads failed, so return Interrupted.
5881 if (log)
5882 log->PutCString("Process::RunThreadPlan(): running all threads timed out.");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005883 return_value = eExpressionInterrupted;
Jim Ingham0161b492013-02-09 01:29:05 +00005884 back_to_top = false;
5885 break;
5886 }
Sean Callanana46ec452012-07-11 21:31:24 +00005887 }
5888 }
5889 else
Jim Ingham0161b492013-02-09 01:29:05 +00005890 { if (log)
5891 log->PutCString("Process::RunThreadPlan(): halt said it succeeded, but I got no event. "
5892 "I'm getting out of here passing Interrupted.");
Jim Ingham8646d3c2014-05-05 02:47:44 +00005893 return_value = eExpressionInterrupted;
Jim Ingham0161b492013-02-09 01:29:05 +00005894 back_to_top = false;
5895 break;
Sean Callanana46ec452012-07-11 21:31:24 +00005896 }
5897 }
Jim Ingham0161b492013-02-09 01:29:05 +00005898 else
5899 {
5900 try_halt_again++;
5901 continue;
5902 }
Sean Callanana46ec452012-07-11 21:31:24 +00005903 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005904
Jim Ingham0161b492013-02-09 01:29:05 +00005905 if (!back_to_top || try_halt_again > num_retries)
5906 break;
5907 else
5908 continue;
Sean Callanana46ec452012-07-11 21:31:24 +00005909 }
Sean Callanana46ec452012-07-11 21:31:24 +00005910 } // END WAIT LOOP
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005911
Sean Callanana46ec452012-07-11 21:31:24 +00005912 // If we had to start up a temporary private state thread to run this thread plan, shut it down now.
Zachary Turneracee96a2014-09-23 18:32:09 +00005913 if (backup_private_state_thread.IsJoinable())
Sean Callanana46ec452012-07-11 21:31:24 +00005914 {
5915 StopPrivateStateThread();
5916 Error error;
5917 m_private_state_thread = backup_private_state_thread;
Sean Callanan9a028512012-08-09 00:50:26 +00005918 if (stopper_base_plan_sp)
Sean Callanana46ec452012-07-11 21:31:24 +00005919 {
5920 thread->DiscardThreadPlansUpToPlan(stopper_base_plan_sp);
5921 }
Jason Molenda76513fd2014-10-15 23:39:31 +00005922 if (old_state != eStateInvalid)
5923 m_public_state.SetValueNoLock(old_state);
Sean Callanana46ec452012-07-11 21:31:24 +00005924 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005925
Jim Inghamc60963c2015-10-12 19:11:03 +00005926 if (return_value != eExpressionCompleted && log)
5927 {
5928 // Print a backtrace into the log so we can figure out where we are:
5929 StreamString s;
5930 s.PutCString("Thread state after unsuccessful completion: \n");
5931 thread->GetStackFrameStatus (s,
5932 0,
5933 UINT32_MAX,
5934 true,
5935 UINT32_MAX);
5936 log->PutCString(s.GetData());
5937
5938 }
Jim Ingham184e9812013-01-15 02:47:48 +00005939 // Restore the thread state if we are going to discard the plan execution. There are three cases where this
5940 // could happen:
5941 // 1) The execution successfully completed
5942 // 2) We hit a breakpoint, and ignore_breakpoints was true
5943 // 3) We got some other error, and discard_on_error was true
Jim Ingham8646d3c2014-05-05 02:47:44 +00005944 bool should_unwind = (return_value == eExpressionInterrupted && options.DoesUnwindOnError())
5945 || (return_value == eExpressionHitBreakpoint && options.DoesIgnoreBreakpoints());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005946
Jim Ingham8646d3c2014-05-05 02:47:44 +00005947 if (return_value == eExpressionCompleted
Jim Ingham184e9812013-01-15 02:47:48 +00005948 || should_unwind)
Jim Ingham8559a352012-11-26 23:52:18 +00005949 {
5950 thread_plan_sp->RestoreThreadState();
5951 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005952
Sean Callanana46ec452012-07-11 21:31:24 +00005953 // Now do some processing on the results of the run:
Jim Ingham8646d3c2014-05-05 02:47:44 +00005954 if (return_value == eExpressionInterrupted || return_value == eExpressionHitBreakpoint)
Sean Callanana46ec452012-07-11 21:31:24 +00005955 {
5956 if (log)
5957 {
5958 StreamString s;
5959 if (event_sp)
5960 event_sp->Dump (&s);
5961 else
5962 {
5963 log->PutCString ("Process::RunThreadPlan(): Stop event that interrupted us is NULL.");
5964 }
5965
5966 StreamString ts;
5967
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00005968 const char *event_explanation = nullptr;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005969
Sean Callanana46ec452012-07-11 21:31:24 +00005970 do
5971 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005972 if (!event_sp)
Sean Callanana46ec452012-07-11 21:31:24 +00005973 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005974 event_explanation = "<no event>";
Sean Callanana46ec452012-07-11 21:31:24 +00005975 break;
5976 }
Jim Inghamcfc09352012-07-27 23:57:19 +00005977 else if (event_sp->GetType() == eBroadcastBitInterrupt)
Sean Callanana46ec452012-07-11 21:31:24 +00005978 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005979 event_explanation = "<user interrupt>";
Sean Callanana46ec452012-07-11 21:31:24 +00005980 break;
5981 }
Jim Inghamcfc09352012-07-27 23:57:19 +00005982 else
Sean Callanana46ec452012-07-11 21:31:24 +00005983 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005984 const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get());
5985
5986 if (!event_data)
Sean Callanana46ec452012-07-11 21:31:24 +00005987 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005988 event_explanation = "<no event data>";
5989 break;
Sean Callanana46ec452012-07-11 21:31:24 +00005990 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005991
Jim Inghamcfc09352012-07-27 23:57:19 +00005992 Process *process = event_data->GetProcessSP().get();
5993
5994 if (!process)
Sean Callanana46ec452012-07-11 21:31:24 +00005995 {
Jim Inghamcfc09352012-07-27 23:57:19 +00005996 event_explanation = "<no process>";
5997 break;
Sean Callanana46ec452012-07-11 21:31:24 +00005998 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005999
Jim Inghamcfc09352012-07-27 23:57:19 +00006000 ThreadList &thread_list = process->GetThreadList();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006001
Jim Inghamcfc09352012-07-27 23:57:19 +00006002 uint32_t num_threads = thread_list.GetSize();
6003 uint32_t thread_index;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006004
Jim Inghamcfc09352012-07-27 23:57:19 +00006005 ts.Printf("<%u threads> ", num_threads);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006006
Jim Inghamcfc09352012-07-27 23:57:19 +00006007 for (thread_index = 0;
6008 thread_index < num_threads;
6009 ++thread_index)
6010 {
6011 Thread *thread = thread_list.GetThreadAtIndex(thread_index).get();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006012
Jim Inghamcfc09352012-07-27 23:57:19 +00006013 if (!thread)
6014 {
6015 ts.Printf("<?> ");
6016 continue;
6017 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006018
Daniel Malead01b2952012-11-29 21:49:15 +00006019 ts.Printf("<0x%4.4" PRIx64 " ", thread->GetID());
Jim Inghamcfc09352012-07-27 23:57:19 +00006020 RegisterContext *register_context = thread->GetRegisterContext().get();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006021
Jim Inghamcfc09352012-07-27 23:57:19 +00006022 if (register_context)
Daniel Malead01b2952012-11-29 21:49:15 +00006023 ts.Printf("[ip 0x%" PRIx64 "] ", register_context->GetPC());
Jim Inghamcfc09352012-07-27 23:57:19 +00006024 else
6025 ts.Printf("[ip unknown] ");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006026
Jim Inghamc60963c2015-10-12 19:11:03 +00006027 // Show the private stop info here, the public stop info will be from the last natural stop.
6028 lldb::StopInfoSP stop_info_sp = thread->GetPrivateStopInfo();
Jim Inghamcfc09352012-07-27 23:57:19 +00006029 if (stop_info_sp)
6030 {
6031 const char *stop_desc = stop_info_sp->GetDescription();
6032 if (stop_desc)
6033 ts.PutCString (stop_desc);
6034 }
6035 ts.Printf(">");
6036 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006037
Jim Inghamcfc09352012-07-27 23:57:19 +00006038 event_explanation = ts.GetData();
Sean Callanana46ec452012-07-11 21:31:24 +00006039 }
Sean Callanana46ec452012-07-11 21:31:24 +00006040 } while (0);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006041
Jim Inghamcfc09352012-07-27 23:57:19 +00006042 if (event_explanation)
6043 log->Printf("Process::RunThreadPlan(): execution interrupted: %s %s", s.GetData(), event_explanation);
Sean Callanana46ec452012-07-11 21:31:24 +00006044 else
Jim Inghamcfc09352012-07-27 23:57:19 +00006045 log->Printf("Process::RunThreadPlan(): execution interrupted: %s", s.GetData());
6046 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006047
Jim Inghame4483cf2013-09-27 01:13:01 +00006048 if (should_unwind)
Jim Inghamcfc09352012-07-27 23:57:19 +00006049 {
6050 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006051 log->Printf ("Process::RunThreadPlan: ExecutionInterrupted - discarding thread plans up to %p.",
6052 static_cast<void*>(thread_plan_sp.get()));
Jim Inghamcfc09352012-07-27 23:57:19 +00006053 thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
Jim Inghamcfc09352012-07-27 23:57:19 +00006054 }
6055 else
6056 {
6057 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006058 log->Printf ("Process::RunThreadPlan: ExecutionInterrupted - for plan: %p not discarding.",
6059 static_cast<void*>(thread_plan_sp.get()));
Sean Callanana46ec452012-07-11 21:31:24 +00006060 }
6061 }
Jim Ingham8646d3c2014-05-05 02:47:44 +00006062 else if (return_value == eExpressionSetupError)
Sean Callanana46ec452012-07-11 21:31:24 +00006063 {
6064 if (log)
6065 log->PutCString("Process::RunThreadPlan(): execution set up error.");
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006066
Jim Ingham6fbc48b2013-11-07 00:11:47 +00006067 if (options.DoesUnwindOnError())
Jim Ingham0f16e732011-02-08 05:20:59 +00006068 {
Greg Claytonc14ee322011-09-22 04:58:26 +00006069 thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
Jim Ingham0f16e732011-02-08 05:20:59 +00006070 }
Jim Inghamf48169b2010-11-30 02:22:11 +00006071 }
6072 else
6073 {
Sean Callanana46ec452012-07-11 21:31:24 +00006074 if (thread->IsThreadPlanDone (thread_plan_sp.get()))
Jim Inghamf48169b2010-11-30 02:22:11 +00006075 {
Jim Ingham0f16e732011-02-08 05:20:59 +00006076 if (log)
Sean Callanana46ec452012-07-11 21:31:24 +00006077 log->PutCString("Process::RunThreadPlan(): thread plan is done");
Jim Ingham8646d3c2014-05-05 02:47:44 +00006078 return_value = eExpressionCompleted;
Sean Callanana46ec452012-07-11 21:31:24 +00006079 }
6080 else if (thread->WasThreadPlanDiscarded (thread_plan_sp.get()))
6081 {
6082 if (log)
6083 log->PutCString("Process::RunThreadPlan(): thread plan was discarded");
Jim Ingham8646d3c2014-05-05 02:47:44 +00006084 return_value = eExpressionDiscarded;
Sean Callanana46ec452012-07-11 21:31:24 +00006085 }
6086 else
6087 {
6088 if (log)
6089 log->PutCString("Process::RunThreadPlan(): thread plan stopped in mid course");
Jim Ingham6fbc48b2013-11-07 00:11:47 +00006090 if (options.DoesUnwindOnError() && thread_plan_sp)
Sean Callanana46ec452012-07-11 21:31:24 +00006091 {
6092 if (log)
Jim Ingham184e9812013-01-15 02:47:48 +00006093 log->PutCString("Process::RunThreadPlan(): discarding thread plan 'cause unwind_on_error is set.");
Sean Callanana46ec452012-07-11 21:31:24 +00006094 thread->DiscardThreadPlansUpToPlan (thread_plan_sp);
Sean Callanana46ec452012-07-11 21:31:24 +00006095 }
6096 }
6097 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006098
Sean Callanana46ec452012-07-11 21:31:24 +00006099 // Thread we ran the function in may have gone away because we ran the target
6100 // Check that it's still there, and if it is put it back in the context. Also restore the
6101 // frame in the context if it is still present.
6102 thread = GetThreadList().FindThreadByIndexID(thread_idx_id, true).get();
6103 if (thread)
6104 {
6105 exe_ctx.SetFrameSP (thread->GetFrameWithStackID (ctx_frame_id));
6106 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006107
Sean Callanana46ec452012-07-11 21:31:24 +00006108 // Also restore the current process'es selected frame & thread, since this function calling may
6109 // be done behind the user's back.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006110
Sean Callanana46ec452012-07-11 21:31:24 +00006111 if (selected_tid != LLDB_INVALID_THREAD_ID)
6112 {
6113 if (GetThreadList().SetSelectedThreadByIndexID (selected_tid) && selected_stack_id.IsValid())
6114 {
6115 // We were able to restore the selected thread, now restore the frame:
Daniel Maleaa012d3a2013-07-31 20:21:20 +00006116 Mutex::Locker lock(GetThreadList().GetMutex());
Jason Molendab57e4a12013-11-04 09:33:30 +00006117 StackFrameSP old_frame_sp = GetThreadList().GetSelectedThread()->GetFrameWithStackID(selected_stack_id);
Sean Callanana46ec452012-07-11 21:31:24 +00006118 if (old_frame_sp)
6119 GetThreadList().GetSelectedThread()->SetSelectedFrame(old_frame_sp.get());
Jim Inghamf48169b2010-11-30 02:22:11 +00006120 }
Jim Inghamf48169b2010-11-30 02:22:11 +00006121 }
6122 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006123
Sean Callanana46ec452012-07-11 21:31:24 +00006124 // If the process exited during the run of the thread plan, notify everyone.
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006125
Sean Callanana46ec452012-07-11 21:31:24 +00006126 if (event_to_broadcast_sp)
Jim Inghamf48169b2010-11-30 02:22:11 +00006127 {
Sean Callanana46ec452012-07-11 21:31:24 +00006128 if (log)
6129 log->PutCString("Process::RunThreadPlan(): rebroadcasting event.");
6130 BroadcastEvent(event_to_broadcast_sp);
Jim Inghamf48169b2010-11-30 02:22:11 +00006131 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00006132
Jim Inghamf48169b2010-11-30 02:22:11 +00006133 return return_value;
6134}
6135
6136const char *
Jim Ingham1624a2d2014-05-05 02:26:40 +00006137Process::ExecutionResultAsCString (ExpressionResults result)
Jim Inghamf48169b2010-11-30 02:22:11 +00006138{
6139 const char *result_name;
6140
6141 switch (result)
6142 {
Jim Ingham8646d3c2014-05-05 02:47:44 +00006143 case eExpressionCompleted:
6144 result_name = "eExpressionCompleted";
Jim Inghamf48169b2010-11-30 02:22:11 +00006145 break;
Jim Ingham8646d3c2014-05-05 02:47:44 +00006146 case eExpressionDiscarded:
6147 result_name = "eExpressionDiscarded";
Jim Inghamf48169b2010-11-30 02:22:11 +00006148 break;
Jim Ingham8646d3c2014-05-05 02:47:44 +00006149 case eExpressionInterrupted:
6150 result_name = "eExpressionInterrupted";
Jim Inghamf48169b2010-11-30 02:22:11 +00006151 break;
Jim Ingham8646d3c2014-05-05 02:47:44 +00006152 case eExpressionHitBreakpoint:
6153 result_name = "eExpressionHitBreakpoint";
Jim Ingham184e9812013-01-15 02:47:48 +00006154 break;
Jim Ingham8646d3c2014-05-05 02:47:44 +00006155 case eExpressionSetupError:
6156 result_name = "eExpressionSetupError";
Jim Inghamf48169b2010-11-30 02:22:11 +00006157 break;
Jim Ingham8646d3c2014-05-05 02:47:44 +00006158 case eExpressionParseError:
6159 result_name = "eExpressionParseError";
Jim Ingham1624a2d2014-05-05 02:26:40 +00006160 break;
Jim Ingham8646d3c2014-05-05 02:47:44 +00006161 case eExpressionResultUnavailable:
6162 result_name = "eExpressionResultUnavailable";
Jim Ingham1624a2d2014-05-05 02:26:40 +00006163 break;
Jim Ingham8646d3c2014-05-05 02:47:44 +00006164 case eExpressionTimedOut:
6165 result_name = "eExpressionTimedOut";
Jim Inghamf48169b2010-11-30 02:22:11 +00006166 break;
Jim Ingham8646d3c2014-05-05 02:47:44 +00006167 case eExpressionStoppedForDebug:
6168 result_name = "eExpressionStoppedForDebug";
Jim Ingham6fbc48b2013-11-07 00:11:47 +00006169 break;
Jim Inghamf48169b2010-11-30 02:22:11 +00006170 }
6171 return result_name;
6172}
6173
Greg Clayton7260f622011-04-18 08:33:37 +00006174void
6175Process::GetStatus (Stream &strm)
6176{
6177 const StateType state = GetState();
Greg Clayton2637f822011-11-17 01:23:07 +00006178 if (StateIsStoppedState(state, false))
Greg Clayton7260f622011-04-18 08:33:37 +00006179 {
6180 if (state == eStateExited)
6181 {
6182 int exit_status = GetExitStatus();
6183 const char *exit_description = GetExitDescription();
Daniel Malead01b2952012-11-29 21:49:15 +00006184 strm.Printf ("Process %" PRIu64 " exited with status = %i (0x%8.8x) %s\n",
Greg Clayton7260f622011-04-18 08:33:37 +00006185 GetID(),
6186 exit_status,
6187 exit_status,
6188 exit_description ? exit_description : "");
6189 }
6190 else
6191 {
6192 if (state == eStateConnected)
6193 strm.Printf ("Connected to remote target.\n");
6194 else
Daniel Malead01b2952012-11-29 21:49:15 +00006195 strm.Printf ("Process %" PRIu64 " %s\n", GetID(), StateAsCString (state));
Greg Clayton7260f622011-04-18 08:33:37 +00006196 }
6197 }
6198 else
6199 {
Daniel Malead01b2952012-11-29 21:49:15 +00006200 strm.Printf ("Process %" PRIu64 " is running.\n", GetID());
Greg Clayton7260f622011-04-18 08:33:37 +00006201 }
6202}
6203
6204size_t
6205Process::GetThreadStatus (Stream &strm,
6206 bool only_threads_with_stop_reason,
6207 uint32_t start_frame,
6208 uint32_t num_frames,
6209 uint32_t num_frames_with_source)
6210{
6211 size_t num_thread_infos_dumped = 0;
6212
Jim Ingham4a65fb12014-03-07 11:20:03 +00006213 // You can't hold the thread list lock while calling Thread::GetStatus. That very well might run code (e.g. if we need it
6214 // to get return values or arguments.) For that to work the process has to be able to acquire it. So instead copy the thread
6215 // ID's, and look them up one by one:
6216
6217 uint32_t num_threads;
Greg Clayton332e8b12015-01-13 21:13:08 +00006218 std::vector<lldb::tid_t> thread_id_array;
Jim Ingham4a65fb12014-03-07 11:20:03 +00006219 //Scope for thread list locker;
6220 {
6221 Mutex::Locker locker (GetThreadList().GetMutex());
6222 ThreadList &curr_thread_list = GetThreadList();
6223 num_threads = curr_thread_list.GetSize();
6224 uint32_t idx;
Greg Clayton332e8b12015-01-13 21:13:08 +00006225 thread_id_array.resize(num_threads);
Jim Ingham4a65fb12014-03-07 11:20:03 +00006226 for (idx = 0; idx < num_threads; ++idx)
Greg Clayton332e8b12015-01-13 21:13:08 +00006227 thread_id_array[idx] = curr_thread_list.GetThreadAtIndex(idx)->GetID();
Jim Ingham4a65fb12014-03-07 11:20:03 +00006228 }
6229
Greg Clayton7260f622011-04-18 08:33:37 +00006230 for (uint32_t i = 0; i < num_threads; i++)
6231 {
Greg Clayton332e8b12015-01-13 21:13:08 +00006232 ThreadSP thread_sp(GetThreadList().FindThreadByID(thread_id_array[i]));
Jim Ingham4a65fb12014-03-07 11:20:03 +00006233 if (thread_sp)
Greg Clayton7260f622011-04-18 08:33:37 +00006234 {
6235 if (only_threads_with_stop_reason)
6236 {
Jim Ingham4a65fb12014-03-07 11:20:03 +00006237 StopInfoSP stop_info_sp = thread_sp->GetStopInfo();
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006238 if (!stop_info_sp || !stop_info_sp->IsValid())
Greg Clayton7260f622011-04-18 08:33:37 +00006239 continue;
6240 }
Jim Ingham4a65fb12014-03-07 11:20:03 +00006241 thread_sp->GetStatus (strm,
Greg Clayton7260f622011-04-18 08:33:37 +00006242 start_frame,
6243 num_frames,
6244 num_frames_with_source);
6245 ++num_thread_infos_dumped;
6246 }
Jim Ingham4a65fb12014-03-07 11:20:03 +00006247 else
6248 {
6249 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS));
6250 if (log)
6251 log->Printf("Process::GetThreadStatus - thread 0x" PRIu64 " vanished while running Thread::GetStatus.");
Jim Ingham4a65fb12014-03-07 11:20:03 +00006252 }
Greg Clayton7260f622011-04-18 08:33:37 +00006253 }
6254 return num_thread_infos_dumped;
6255}
6256
Greg Claytona9f40ad2012-02-22 04:37:26 +00006257void
6258Process::AddInvalidMemoryRegion (const LoadRange &region)
6259{
6260 m_memory_cache.AddInvalidRange(region.GetRangeBase(), region.GetByteSize());
6261}
6262
6263bool
6264Process::RemoveInvalidMemoryRange (const LoadRange &region)
6265{
6266 return m_memory_cache.RemoveInvalidRange(region.GetRangeBase(), region.GetByteSize());
6267}
6268
Jim Ingham372787f2012-04-07 00:00:41 +00006269void
6270Process::AddPreResumeAction (PreResumeActionCallback callback, void *baton)
6271{
6272 m_pre_resume_actions.push_back(PreResumeCallbackAndBaton (callback, baton));
6273}
6274
6275bool
6276Process::RunPreResumeActions ()
6277{
6278 bool result = true;
6279 while (!m_pre_resume_actions.empty())
6280 {
6281 struct PreResumeCallbackAndBaton action = m_pre_resume_actions.back();
6282 m_pre_resume_actions.pop_back();
6283 bool this_result = action.callback (action.baton);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006284 if (result)
Jason Molenda55710932014-11-17 20:10:15 +00006285 result = this_result;
Jim Ingham372787f2012-04-07 00:00:41 +00006286 }
6287 return result;
6288}
6289
6290void
6291Process::ClearPreResumeActions ()
6292{
6293 m_pre_resume_actions.clear();
6294}
Greg Claytona9f40ad2012-02-22 04:37:26 +00006295
Zachary Turner93749ab2015-03-03 21:51:25 +00006296ProcessRunLock &
6297Process::GetRunLock()
6298{
6299 if (m_private_state_thread.EqualsThread(Host::GetCurrentThread()))
6300 return m_private_run_lock;
6301 else
6302 return m_public_run_lock;
6303}
6304
Greg Claytonfa559e52012-05-18 02:38:05 +00006305void
6306Process::Flush ()
6307{
6308 m_thread_list.Flush();
Jason Molenda5e8dce42013-12-13 00:29:16 +00006309 m_extended_thread_list.Flush();
6310 m_extended_thread_stop_id = 0;
6311 m_queue_list.Clear();
6312 m_queue_list_stop_id = 0;
Greg Claytonfa559e52012-05-18 02:38:05 +00006313}
Greg Clayton90ba8112012-12-05 00:16:59 +00006314
6315void
6316Process::DidExec ()
6317{
Todd Fiala76e0fc92014-08-27 22:58:26 +00006318 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
6319 if (log)
6320 log->Printf ("Process::%s()", __FUNCTION__);
6321
Greg Clayton90ba8112012-12-05 00:16:59 +00006322 Target &target = GetTarget();
6323 target.CleanupProcess ();
Greg Claytonb35db632013-11-09 00:03:31 +00006324 target.ClearModules(false);
Greg Clayton90ba8112012-12-05 00:16:59 +00006325 m_dynamic_checkers_ap.reset();
6326 m_abi_sp.reset();
Jason Molendaeef51062013-11-05 03:57:19 +00006327 m_system_runtime_ap.reset();
Greg Clayton90ba8112012-12-05 00:16:59 +00006328 m_os_ap.reset();
Greg Clayton15fc2be2013-05-21 01:00:52 +00006329 m_dyld_ap.reset();
Andrew MacPherson17220c12014-03-05 10:12:43 +00006330 m_jit_loaders_ap.reset();
Greg Clayton90ba8112012-12-05 00:16:59 +00006331 m_image_tokens.clear();
6332 m_allocated_memory_cache.Clear();
6333 m_language_runtimes.clear();
Kuba Breckaafdf8422014-10-10 23:43:03 +00006334 m_instrumentation_runtimes.clear();
Greg Clayton15fc2be2013-05-21 01:00:52 +00006335 m_thread_list.DiscardThreadPlans();
Greg Clayton15fc2be2013-05-21 01:00:52 +00006336 m_memory_cache.Clear(true);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006337 m_stop_info_override_callback = nullptr;
Greg Clayton90ba8112012-12-05 00:16:59 +00006338 DoDidExec();
6339 CompleteAttach ();
Greg Clayton095eeaa2013-11-05 23:28:00 +00006340 // Flush the process (threads and all stack frames) after running CompleteAttach()
6341 // in case the dynamic loader loaded things in new locations.
6342 Flush();
Greg Claytonb35db632013-11-09 00:03:31 +00006343
6344 // After we figure out what was loaded/unloaded in CompleteAttach,
6345 // we need to let the target know so it can do any cleanup it needs to.
6346 target.DidExec();
Greg Clayton90ba8112012-12-05 00:16:59 +00006347}
Greg Clayton095eeaa2013-11-05 23:28:00 +00006348
Jim Ingham1460e4b2014-01-10 23:46:59 +00006349addr_t
6350Process::ResolveIndirectFunction(const Address *address, Error &error)
6351{
6352 if (address == nullptr)
6353 {
Jean-Daniel Dupasef37711f2014-02-08 20:22:05 +00006354 error.SetErrorString("Invalid address argument");
Jim Ingham1460e4b2014-01-10 23:46:59 +00006355 return LLDB_INVALID_ADDRESS;
6356 }
6357
6358 addr_t function_addr = LLDB_INVALID_ADDRESS;
6359
6360 addr_t addr = address->GetLoadAddress(&GetTarget());
6361 std::map<addr_t,addr_t>::const_iterator iter = m_resolved_indirect_addresses.find(addr);
6362 if (iter != m_resolved_indirect_addresses.end())
6363 {
6364 function_addr = (*iter).second;
6365 }
6366 else
6367 {
6368 if (!InferiorCall(this, address, function_addr))
6369 {
6370 Symbol *symbol = address->CalculateSymbolContextSymbol();
6371 error.SetErrorStringWithFormat ("Unable to call resolver for indirect function %s",
6372 symbol ? symbol->GetName().AsCString() : "<UNKNOWN>");
6373 function_addr = LLDB_INVALID_ADDRESS;
6374 }
6375 else
6376 {
6377 m_resolved_indirect_addresses.insert(std::pair<addr_t, addr_t>(addr, function_addr));
6378 }
6379 }
6380 return function_addr;
6381}
6382
Andrew MacPhersoneb4d0602014-03-13 09:37:02 +00006383void
6384Process::ModulesDidLoad (ModuleList &module_list)
6385{
Kuba Breckaafdf8422014-10-10 23:43:03 +00006386 SystemRuntime *sys_runtime = GetSystemRuntime();
6387 if (sys_runtime)
6388 {
6389 sys_runtime->ModulesDidLoad (module_list);
6390 }
Andrew MacPhersoneb4d0602014-03-13 09:37:02 +00006391
Kuba Breckaafdf8422014-10-10 23:43:03 +00006392 GetJITLoaders().ModulesDidLoad (module_list);
6393
6394 // Give runtimes a chance to be created.
6395 InstrumentationRuntime::ModulesDidLoad(module_list, this, m_instrumentation_runtimes);
6396
6397 // Tell runtimes about new modules.
6398 for (auto pos = m_instrumentation_runtimes.begin(); pos != m_instrumentation_runtimes.end(); ++pos)
6399 {
6400 InstrumentationRuntimeSP runtime = pos->second;
6401 runtime->ModulesDidLoad(module_list);
6402 }
6403
Greg Clayton35ca64b2015-04-16 17:13:34 +00006404 // Let any language runtimes we have already created know
6405 // about the modules that loaded.
6406
6407 // Iterate over a copy of this language runtime list in case
6408 // the language runtime ModulesDidLoad somehow causes the language
6409 // riuntime to be unloaded.
6410 LanguageRuntimeCollection language_runtimes(m_language_runtimes);
6411 for (const auto &pair: language_runtimes)
6412 {
6413 // We must check language_runtime_sp to make sure it is not
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006414 // nullptr as we might cache the fact that we didn't have a
Greg Clayton35ca64b2015-04-16 17:13:34 +00006415 // language runtime for a language.
6416 LanguageRuntimeSP language_runtime_sp = pair.second;
6417 if (language_runtime_sp)
6418 language_runtime_sp->ModulesDidLoad(module_list);
6419 }
Ryan Brown65d4d5c2015-09-16 21:20:44 +00006420
Greg Clayton2591fe12016-03-15 22:44:07 +00006421 // If we don't have an operating system plug-in, try to load one since
6422 // loading shared libraries might cause a new one to try and load
6423 if (!m_os_ap)
6424 LoadOperatingSystemPlugin(false);
Andrew MacPhersoneb4d0602014-03-13 09:37:02 +00006425}
Kuba Breckaa51ea382014-09-06 01:33:13 +00006426
Jason Molendaef7d6412015-08-06 03:27:10 +00006427void
Sean Callanan77decf52015-12-09 01:25:01 +00006428Process::PrintWarning (uint64_t warning_type, const void *repeat_key, const char *fmt, ...)
Jason Molendaef7d6412015-08-06 03:27:10 +00006429{
6430 bool print_warning = true;
6431
6432 StreamSP stream_sp = GetTarget().GetDebugger().GetAsyncOutputStream();
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006433 if (!stream_sp)
Jason Molendaef7d6412015-08-06 03:27:10 +00006434 return;
6435 if (warning_type == eWarningsOptimization
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006436 && !GetWarningsOptimization())
Jason Molendaef7d6412015-08-06 03:27:10 +00006437 {
6438 return;
6439 }
6440
6441 if (repeat_key != nullptr)
6442 {
6443 WarningsCollection::iterator it = m_warnings_issued.find (warning_type);
6444 if (it == m_warnings_issued.end())
6445 {
6446 m_warnings_issued[warning_type] = WarningsPointerSet();
6447 m_warnings_issued[warning_type].insert (repeat_key);
6448 }
6449 else
6450 {
6451 if (it->second.find (repeat_key) != it->second.end())
6452 {
6453 print_warning = false;
6454 }
6455 else
6456 {
6457 it->second.insert (repeat_key);
6458 }
6459 }
6460 }
6461
6462 if (print_warning)
6463 {
6464 va_list args;
6465 va_start (args, fmt);
6466 stream_sp->PrintfVarArg (fmt, args);
6467 va_end (args);
6468 }
6469}
6470
Jason Molenda484900b2015-08-10 07:55:25 +00006471void
6472Process::PrintWarningOptimization (const SymbolContext &sc)
6473{
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006474 if (GetWarningsOptimization()
6475 && sc.module_sp
6476 && !sc.module_sp->GetFileSpec().GetFilename().IsEmpty()
Jason Molenda484900b2015-08-10 07:55:25 +00006477 && sc.function
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006478 && sc.function->GetIsOptimized())
Jason Molenda484900b2015-08-10 07:55:25 +00006479 {
6480 PrintWarning (Process::Warnings::eWarningsOptimization, sc.module_sp.get(), "%s was compiled with optimization - stepping may behave oddly; variables may not be available.\n", sc.module_sp->GetFileSpec().GetFilename().GetCString());
6481 }
6482}
6483
Pavel Labatha933d512016-04-05 13:07:16 +00006484bool
6485Process::GetProcessInfo(ProcessInstanceInfo &info)
6486{
6487 info.Clear();
6488
6489 PlatformSP platform_sp = GetTarget().GetPlatform();
6490 if (! platform_sp)
6491 return false;
6492
6493 return platform_sp->GetProcessInfo(GetID(), info);
6494}
6495
Kuba Breckaa51ea382014-09-06 01:33:13 +00006496ThreadCollectionSP
6497Process::GetHistoryThreads(lldb::addr_t addr)
6498{
6499 ThreadCollectionSP threads;
Greg Clayton35ca64b2015-04-16 17:13:34 +00006500
Kuba Breckaa51ea382014-09-06 01:33:13 +00006501 const MemoryHistorySP &memory_history = MemoryHistory::FindPlugin(shared_from_this());
6502
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006503 if (!memory_history) {
Kuba Breckaa51ea382014-09-06 01:33:13 +00006504 return threads;
6505 }
6506
6507 threads.reset(new ThreadCollection(memory_history->GetHistoryThreads(addr)));
6508
6509 return threads;
6510}
Kuba Brecka63927542014-10-11 01:59:32 +00006511
6512InstrumentationRuntimeSP
6513Process::GetInstrumentationRuntime(lldb::InstrumentationRuntimeType type)
6514{
6515 InstrumentationRuntimeCollection::iterator pos;
6516 pos = m_instrumentation_runtimes.find (type);
6517 if (pos == m_instrumentation_runtimes.end())
6518 {
6519 return InstrumentationRuntimeSP();
6520 }
6521 else
6522 return (*pos).second;
6523}
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00006524
6525bool
6526Process::GetModuleSpec(const FileSpec& module_file_spec,
6527 const ArchSpec& arch,
6528 ModuleSpec& module_spec)
6529{
6530 module_spec.Clear();
6531 return false;
6532}
Tamas Berghammer3cb132a2015-12-02 11:58:51 +00006533
6534size_t
6535Process::AddImageToken(lldb::addr_t image_ptr)
6536{
6537 m_image_tokens.push_back(image_ptr);
6538 return m_image_tokens.size() - 1;
6539}
6540
6541lldb::addr_t
6542Process::GetImagePtrFromToken(size_t token) const
6543{
6544 if (token < m_image_tokens.size())
6545 return m_image_tokens[token];
6546 return LLDB_INVALID_IMAGE_TOKEN;
6547}
6548
6549void
6550Process::ResetImageToken(size_t token)
6551{
6552 if (token < m_image_tokens.size())
6553 m_image_tokens[token] = LLDB_INVALID_IMAGE_TOKEN;
Enrico Granataf3129cb2015-12-03 23:53:45 +00006554}
Jason Molendafd4cea52016-01-08 21:40:11 +00006555
6556Address
6557Process::AdvanceAddressToNextBranchInstruction (Address default_stop_addr, AddressRange range_bounds)
6558{
6559 Target &target = GetTarget();
6560 DisassemblerSP disassembler_sp;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006561 InstructionList *insn_list = nullptr;
Jason Molendafd4cea52016-01-08 21:40:11 +00006562
6563 Address retval = default_stop_addr;
6564
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006565 if (!target.GetUseFastStepping())
Jason Molendafd4cea52016-01-08 21:40:11 +00006566 return retval;
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006567 if (!default_stop_addr.IsValid())
Jason Molendafd4cea52016-01-08 21:40:11 +00006568 return retval;
6569
6570 ExecutionContext exe_ctx (this);
6571 const char *plugin_name = nullptr;
6572 const char *flavor = nullptr;
6573 const bool prefer_file_cache = true;
6574 disassembler_sp = Disassembler::DisassembleRange(target.GetArchitecture(),
6575 plugin_name,
6576 flavor,
6577 exe_ctx,
6578 range_bounds,
6579 prefer_file_cache);
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006580 if (disassembler_sp)
Jason Molendafd4cea52016-01-08 21:40:11 +00006581 insn_list = &disassembler_sp->GetInstructionList();
6582
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006583 if (insn_list == nullptr)
Jason Molendafd4cea52016-01-08 21:40:11 +00006584 {
6585 return retval;
6586 }
6587
6588 size_t insn_offset = insn_list->GetIndexOfInstructionAtAddress (default_stop_addr);
6589 if (insn_offset == UINT32_MAX)
6590 {
6591 return retval;
6592 }
6593
6594 uint32_t branch_index = insn_list->GetIndexOfNextBranchInstruction (insn_offset, target);
6595 if (branch_index == UINT32_MAX)
6596 {
6597 return retval;
6598 }
6599
6600 if (branch_index > insn_offset)
6601 {
6602 Address next_branch_insn_address = insn_list->GetInstructionAtIndex (branch_index)->GetAddress();
6603 if (next_branch_insn_address.IsValid() && range_bounds.ContainsFileAddress (next_branch_insn_address))
6604 {
6605 retval = next_branch_insn_address;
6606 }
6607 }
6608
Eugene Zelenkoda8cf8a2016-03-01 00:55:51 +00006609 if (disassembler_sp)
Jason Molendafd4cea52016-01-08 21:40:11 +00006610 {
6611 // FIXME: The DisassemblerLLVMC has a reference cycle and won't go away if it has any active instructions.
6612 disassembler_sp->GetInstructionList().Clear();
6613 }
6614
6615 return retval;
6616}