124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Process.cpp ---------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/StoppointCallbackContext.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointLocation.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Event.h" 19861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice#include "lldb/Core/ConnectionFileDescriptor.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h" 21861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice#include "lldb/Core/InputReader.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 2349ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 26f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton#include "lldb/Expression/ClangUserExpression.h" 276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice#include "lldb/Interpreter/CommandInterpreter.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Host.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ABI.h" 300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton#include "lldb/Target/DynamicLoader.h" 3137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton#include "lldb/Target/OperatingSystem.h" 32642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/LanguageRuntime.h" 33642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/CPPLanguageRuntime.h" 34642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/ObjCLanguageRuntime.h" 35e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Platform.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 37643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/StopInfo.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h" 42d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham#include "lldb/Target/ThreadPlanBase.h" 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 4873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Comment out line below to disable memory caching, overriding the process setting 4973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// target.process.disable-memory-cache 5073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define ENABLE_MEMORY_CACHING 5173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 5273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#ifdef ENABLE_MEMORY_CACHING 5373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define DISABLE_MEM_CACHE_DEFAULT false 5473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#else 5573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define DISABLE_MEM_CACHE_DEFAULT true 5673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#endif 5773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 5873844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonclass ProcessOptionValueProperties : public OptionValueProperties 5973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 6073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonpublic: 6173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ProcessOptionValueProperties (const ConstString &name) : 6273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton OptionValueProperties (name) 6373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 6473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 6573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 6673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // This constructor is used when creating ProcessOptionValueProperties when it 6773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // is part of a new lldb_private::Process instance. It will copy all current 6873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // global property values as needed 6973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ProcessOptionValueProperties (ProcessProperties *global_properties) : 7073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton OptionValueProperties(*global_properties->GetValueProperties()) 7173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 7273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 7373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 7473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton virtual const Property * 7573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const 7673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 7773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // When gettings the value for a key from the process options, we will always 7873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // try and grab the setting from the current process if there is one. Else we just 7973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // use the one from this instance. 8073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (exe_ctx) 8173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 8273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Process *process = exe_ctx->GetProcessPtr(); 8373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (process) 8473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 8573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ProcessOptionValueProperties *instance_properties = static_cast<ProcessOptionValueProperties *>(process->GetValueProperties().get()); 8673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (this != instance_properties) 8773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return instance_properties->ProtectedGetPropertyAtIndex (idx); 8873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 8973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 9073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return ProtectedGetPropertyAtIndex (idx); 9173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 9273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 9373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 9473844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonstatic PropertyDefinition 9573844aa19a7360b662e2be710fc3c969d6c86606Greg Claytong_properties[] = 9673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 9773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { "disable-memory-cache" , OptionValue::eTypeBoolean, false, DISABLE_MEM_CACHE_DEFAULT, NULL, NULL, "Disable reading and caching of memory in fixed-size units." }, 98dacdc0156a2b548a19110cd63b800331cd512032Jim Ingham { "extra-startup-command", OptionValue::eTypeArray , false, OptionValue::eTypeString, NULL, NULL, "A list containing extra commands understood by the particular process plugin used. " 99dacdc0156a2b548a19110cd63b800331cd512032Jim Ingham "For instance, to turn on debugserver logging set this to \"QSetLogging:bitmask=LOG_DEFAULT;\"" }, 10046be7f2e4321966f22385fafa82bbb67ebd32232Jim Ingham { "ignore-breakpoints-in-expressions", OptionValue::eTypeBoolean, true, true, NULL, NULL, "If true, breakpoints will be ignored during expression evaluation." }, 10146be7f2e4321966f22385fafa82bbb67ebd32232Jim Ingham { "unwind-on-error-in-expressions", OptionValue::eTypeBoolean, true, true, NULL, NULL, "If true, errors in expression evaluation will unwind the stack back to the state before the call." }, 102507a638609d962bf330c4ec08ee6c381ffd8695eGreg Clayton { "python-os-plugin-path", OptionValue::eTypeFileSpec, false, true, NULL, NULL, "A path to a python OS plug-in module file that contains a OperatingSystemPlugIn class." }, 103090f83176695d86197b0e86b67dee4160ec5003dJim Ingham { "stop-on-sharedlibrary-events" , OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true, stop when a shared library is loaded or unloaded." }, 104761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham { "detach-keeps-stopped" , OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true, detach will attempt to keep the process stopped." }, 10573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { NULL , OptionValue::eTypeInvalid, false, 0, NULL, NULL, NULL } 10673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 10773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 10873844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonenum { 10973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyDisableMemCache, 1102e7f313dc473b036788319690116b324cb44b765Greg Clayton ePropertyExtraStartCommand, 111b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham ePropertyIgnoreBreakpointsInExpressions, 112b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham ePropertyUnwindOnErrorInExpressions, 113090f83176695d86197b0e86b67dee4160ec5003dJim Ingham ePropertyPythonOSPluginPath, 114761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham ePropertyStopOnSharedLibraryEvents, 115761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham ePropertyDetachKeepsStopped 11673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 11773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 11873844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonProcessProperties::ProcessProperties (bool is_global) : 11973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Properties () 12073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 12173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (is_global) 12273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 12373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp.reset (new ProcessOptionValueProperties(ConstString("process"))); 12473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp->Initialize(g_properties); 12573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp->AppendProperty(ConstString("thread"), 126090f83176695d86197b0e86b67dee4160ec5003dJim Ingham ConstString("Settings specific to threads."), 12773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton true, 12873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Thread::GetGlobalProperties()->GetValueProperties()); 12973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 13073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else 13173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp.reset (new ProcessOptionValueProperties(Process::GetGlobalProperties().get())); 13273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 13373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 13473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonProcessProperties::~ProcessProperties() 13573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 13673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 13773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 13873844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 13973844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonProcessProperties::GetDisableMemoryCache() const 14073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 14173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyDisableMemCache; 14273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 14373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 14473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 14573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonArgs 14673844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonProcessProperties::GetExtraStartupCommands () const 14773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 14873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Args args; 14973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyExtraStartCommand; 15073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp->GetPropertyAtIndexAsArgs(NULL, idx, args); 15173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return args; 15273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 15373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 15473844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonvoid 15573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonProcessProperties::SetExtraStartupCommands (const Args &args) 15673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 15773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyExtraStartCommand; 15873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp->SetPropertyAtIndexFromArgs(NULL, idx, args); 15973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 16073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 1612e7f313dc473b036788319690116b324cb44b765Greg ClaytonFileSpec 1622e7f313dc473b036788319690116b324cb44b765Greg ClaytonProcessProperties::GetPythonOSPluginPath () const 1632e7f313dc473b036788319690116b324cb44b765Greg Clayton{ 1642e7f313dc473b036788319690116b324cb44b765Greg Clayton const uint32_t idx = ePropertyPythonOSPluginPath; 1652e7f313dc473b036788319690116b324cb44b765Greg Clayton return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx); 1662e7f313dc473b036788319690116b324cb44b765Greg Clayton} 1672e7f313dc473b036788319690116b324cb44b765Greg Clayton 1682e7f313dc473b036788319690116b324cb44b765Greg Claytonvoid 1692e7f313dc473b036788319690116b324cb44b765Greg ClaytonProcessProperties::SetPythonOSPluginPath (const FileSpec &file) 1702e7f313dc473b036788319690116b324cb44b765Greg Clayton{ 1712e7f313dc473b036788319690116b324cb44b765Greg Clayton const uint32_t idx = ePropertyPythonOSPluginPath; 1722e7f313dc473b036788319690116b324cb44b765Greg Clayton m_collection_sp->SetPropertyAtIndexAsFileSpec(NULL, idx, file); 1732e7f313dc473b036788319690116b324cb44b765Greg Clayton} 1742e7f313dc473b036788319690116b324cb44b765Greg Clayton 175b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham 176b794020ffbd6473c59a6e98be044df50abf7fc30Jim Inghambool 177b794020ffbd6473c59a6e98be044df50abf7fc30Jim InghamProcessProperties::GetIgnoreBreakpointsInExpressions () const 178b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham{ 179b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions; 180b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0); 181b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham} 182b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham 183b794020ffbd6473c59a6e98be044df50abf7fc30Jim Inghamvoid 184b794020ffbd6473c59a6e98be044df50abf7fc30Jim InghamProcessProperties::SetIgnoreBreakpointsInExpressions (bool ignore) 185b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham{ 186b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions; 187b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, ignore); 188b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham} 189b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham 190b794020ffbd6473c59a6e98be044df50abf7fc30Jim Inghambool 191b794020ffbd6473c59a6e98be044df50abf7fc30Jim InghamProcessProperties::GetUnwindOnErrorInExpressions () const 192b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham{ 193b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham const uint32_t idx = ePropertyUnwindOnErrorInExpressions; 194b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0); 195b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham} 196b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham 197b794020ffbd6473c59a6e98be044df50abf7fc30Jim Inghamvoid 198b794020ffbd6473c59a6e98be044df50abf7fc30Jim InghamProcessProperties::SetUnwindOnErrorInExpressions (bool ignore) 199b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham{ 200b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham const uint32_t idx = ePropertyUnwindOnErrorInExpressions; 201b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, ignore); 202b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham} 203b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham 204090f83176695d86197b0e86b67dee4160ec5003dJim Inghambool 205090f83176695d86197b0e86b67dee4160ec5003dJim InghamProcessProperties::GetStopOnSharedLibraryEvents () const 206090f83176695d86197b0e86b67dee4160ec5003dJim Ingham{ 207090f83176695d86197b0e86b67dee4160ec5003dJim Ingham const uint32_t idx = ePropertyStopOnSharedLibraryEvents; 208090f83176695d86197b0e86b67dee4160ec5003dJim Ingham return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0); 209090f83176695d86197b0e86b67dee4160ec5003dJim Ingham} 210090f83176695d86197b0e86b67dee4160ec5003dJim Ingham 211090f83176695d86197b0e86b67dee4160ec5003dJim Inghamvoid 212090f83176695d86197b0e86b67dee4160ec5003dJim InghamProcessProperties::SetStopOnSharedLibraryEvents (bool stop) 213090f83176695d86197b0e86b67dee4160ec5003dJim Ingham{ 214090f83176695d86197b0e86b67dee4160ec5003dJim Ingham const uint32_t idx = ePropertyStopOnSharedLibraryEvents; 215090f83176695d86197b0e86b67dee4160ec5003dJim Ingham m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, stop); 216090f83176695d86197b0e86b67dee4160ec5003dJim Ingham} 217090f83176695d86197b0e86b67dee4160ec5003dJim Ingham 218761afb822b18c46b2ad84be03f372e90ac1e6143Jim Inghambool 219761afb822b18c46b2ad84be03f372e90ac1e6143Jim InghamProcessProperties::GetDetachKeepsStopped () const 220761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham{ 221761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham const uint32_t idx = ePropertyDetachKeepsStopped; 222761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0); 223761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham} 224761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham 225761afb822b18c46b2ad84be03f372e90ac1e6143Jim Inghamvoid 226761afb822b18c46b2ad84be03f372e90ac1e6143Jim InghamProcessProperties::SetDetachKeepsStopped (bool stop) 227761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham{ 228761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham const uint32_t idx = ePropertyDetachKeepsStopped; 229761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, stop); 230761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham} 231761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham 23224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 233b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::Dump (Stream &s, Platform *platform) const 23424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 23524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *cstr; 236ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_pid != LLDB_INVALID_PROCESS_ID) 2375f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf (" pid = %" PRIu64 "\n", m_pid); 238ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 239ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_parent_pid != LLDB_INVALID_PROCESS_ID) 2405f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf (" parent = %" PRIu64 "\n", m_parent_pid); 241ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 242ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_executable) 243ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 244ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" name = %s\n", m_executable.GetFilename().GetCString()); 245ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString (" file = "); 246ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton m_executable.Dump(&s); 247ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.EOL(); 248ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 249b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t argc = m_arguments.GetArgumentCount(); 250ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (argc > 0) 251ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 252ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton for (uint32_t i=0; i<argc; i++) 253ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 254b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *arg = m_arguments.GetArgumentAtIndex(i); 255ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (i < 10) 256b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" arg[%u] = %s\n", i, arg); 257ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 258b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("arg[%u] = %s\n", i, arg); 259ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 260ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 261b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 262b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t envc = m_environment.GetArgumentCount(); 263b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (envc > 0) 264b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 265b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton for (uint32_t i=0; i<envc; i++) 266b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 267b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *env = m_environment.GetArgumentAtIndex(i); 268b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (i < 10) 269b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" env[%u] = %s\n", i, env); 270b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 271b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("env[%u] = %s\n", i, env); 272b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 273b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 274b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 275ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_arch.IsValid()) 276ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" arch = %s\n", m_arch.GetTriple().str().c_str()); 277ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 278b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_uid != UINT32_MAX) 27924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 280b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_uid); 281b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" uid = %-5u (%s)\n", m_uid, cstr ? cstr : ""); 28224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 283b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_gid != UINT32_MAX) 28424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 285b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_gid); 286b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" gid = %-5u (%s)\n", m_gid, cstr ? cstr : ""); 28724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 288b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_euid != UINT32_MAX) 28924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 290b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_euid); 291b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" euid = %-5u (%s)\n", m_euid, cstr ? cstr : ""); 29224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 293b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_egid != UINT32_MAX) 29424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 295b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_egid); 296b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" egid = %-5u (%s)\n", m_egid, cstr ? cstr : ""); 29724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 29824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 29924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 30024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 301b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose) 30224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 303b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *label; 304b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (show_args || verbose) 305b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton label = "ARGUMENTS"; 306b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 307b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton label = "NAME"; 308b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 309ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (verbose) 310ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 311b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE %s\n", label); 312ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString ("====== ====== ========== ========== ========== ========== ======================== ============================\n"); 313ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 314ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 315ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 316b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("PID PARENT USER ARCH %s\n", label); 317ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString ("====== ====== ========== ======= ============================\n"); 318ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 31924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 32024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 32124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 322b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const 32324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 32424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_pid != LLDB_INVALID_PROCESS_ID) 32524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 32624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *cstr; 3275f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf ("%-6" PRIu64 " %-6" PRIu64 " ", m_pid, m_parent_pid); 32824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 32924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 330ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (verbose) 331ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 332b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_uid); 333ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 334ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 335ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 336b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_uid); 33724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 338b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_gid); 339ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 340ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 341ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 342b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_gid); 343ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 344b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_euid); 345ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 346ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 347ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 348b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_euid); 349ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 350b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_egid); 351ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 352ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 353ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 354b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_egid); 355ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-24s ", m_arch.IsValid() ? m_arch.GetTriple().str().c_str() : ""); 356ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 35724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 358ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 3597e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda s.Printf ("%-10s %-7d %s ", 360b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton platform->GetUserName (m_euid), 361ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton (int)m_arch.GetTriple().getArchName().size(), 362ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton m_arch.GetTriple().getArchName().data()); 363ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 364ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 365b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (verbose || show_args) 366ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 367b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t argc = m_arguments.GetArgumentCount(); 368ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (argc > 0) 369ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 370ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton for (uint32_t i=0; i<argc; i++) 371ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 372ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (i > 0) 373ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutChar (' '); 374b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.PutCString (m_arguments.GetArgumentAtIndex(i)); 375ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 376ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 377ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 37824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 379ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 380ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString (GetName()); 381ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 38224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 383ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.EOL(); 38424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 38524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 38624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 387b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 388b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonvoid 3890c8446cc220c429fb51f8f9864275c8b1c768533Greg ClaytonProcessInfo::SetArguments (char const **argv, bool first_arg_is_executable) 39036bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton{ 39136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton m_arguments.SetArguments (argv); 39236bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton 39336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // Is the first argument the executable? 39436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton if (first_arg_is_executable) 39536bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton { 39636bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton const char *first_arg = m_arguments.GetArgumentAtIndex (0); 39736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton if (first_arg) 39836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton { 39936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // Yes the first argument is an executable, set it as the executable 40036bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // in the launch options. Don't resolve the file path as the path 40136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // could be a remote platform path 40236bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton const bool resolve = false; 40336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton m_executable.SetFile(first_arg, resolve); 40436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton } 40536bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton } 40636bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton} 40736bc5ea5a48c19421d44f559e2165c105657b809Greg Claytonvoid 4080c8446cc220c429fb51f8f9864275c8b1c768533Greg ClaytonProcessInfo::SetArguments (const Args& args, bool first_arg_is_executable) 409b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 410b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Copy all arguments 411b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arguments = args; 412b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 413b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Is the first argument the executable? 414b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (first_arg_is_executable) 415b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 41636bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton const char *first_arg = m_arguments.GetArgumentAtIndex (0); 417b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (first_arg) 418b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 419b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Yes the first argument is an executable, set it as the executable 420b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // in the launch options. Don't resolve the file path as the path 421b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // could be a remote platform path 422b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const bool resolve = false; 423b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_executable.SetFile(first_arg, resolve); 424b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 425b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 426b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 427b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 428abb3302051246273eb92cca203c9a1b9d9736e05Greg Claytonvoid 429464c6161464694412b7472129e789248f1cf21b9Greg ClaytonProcessLaunchInfo::FinalizeFileActions (Target *target, bool default_to_use_pty) 430abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton{ 431abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // If notthing was specified, then check the process for any default 432abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // settings that were set with "settings set" 433abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (m_file_actions.empty()) 434abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 435abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (m_flags.Test(eLaunchFlagDisableSTDIO)) 436abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 43795ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton AppendSuppressFileAction (STDIN_FILENO , true, false); 43895ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton AppendSuppressFileAction (STDOUT_FILENO, false, true); 43995ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton AppendSuppressFileAction (STDERR_FILENO, false, true); 440abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 441abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton else 442abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 443abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // Check for any values that might have gotten set with any of: 444abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // (lldb) settings set target.input-path 445abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // (lldb) settings set target.output-path 446abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // (lldb) settings set target.error-path 44773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FileSpec in_path; 44873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FileSpec out_path; 44973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FileSpec err_path; 450abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (target) 451abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 45295ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton in_path = target->GetStandardInputPath(); 45395ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton out_path = target->GetStandardOutputPath(); 45495ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton err_path = target->GetStandardErrorPath(); 455464c6161464694412b7472129e789248f1cf21b9Greg Clayton } 456464c6161464694412b7472129e789248f1cf21b9Greg Clayton 45773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (in_path || out_path || err_path) 45873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 45973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton char path[PATH_MAX]; 46073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (in_path && in_path.GetPath(path, sizeof(path))) 46173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton AppendOpenFileAction(STDIN_FILENO, path, true, false); 46273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 46373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (out_path && out_path.GetPath(path, sizeof(path))) 46473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton AppendOpenFileAction(STDOUT_FILENO, path, false, true); 46573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 46673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (err_path && err_path.GetPath(path, sizeof(path))) 46773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton AppendOpenFileAction(STDERR_FILENO, path, false, true); 46873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 46973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton else if (default_to_use_pty) 470464c6161464694412b7472129e789248f1cf21b9Greg Clayton { 471464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (m_pty.OpenFirstAvailableMaster (O_RDWR|O_NOCTTY, NULL, 0)) 472abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 47373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const char *slave_path = m_pty.GetSlaveName (NULL, 0); 47473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton AppendOpenFileAction(STDIN_FILENO, slave_path, true, false); 47573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton AppendOpenFileAction(STDOUT_FILENO, slave_path, false, true); 47673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton AppendOpenFileAction(STDERR_FILENO, slave_path, false, true); 477abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 478abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 479abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 480abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 481abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton} 482abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 483527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 484527154d8e532f27f25af226c9e1dac607c48b5d1Greg Claytonbool 48597471184b8823c949bc68bbf54ea3edf3845a750Greg ClaytonProcessLaunchInfo::ConvertArgumentsForLaunchingInShell (Error &error, 48697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton bool localhost, 48797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton bool will_debug, 48897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton bool first_arg_is_full_shell_command) 489527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton{ 490527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.Clear(); 491527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 492527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (GetFlags().Test (eLaunchFlagLaunchInShell)) 493527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 494527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const char *shell_executable = GetShell(); 495527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (shell_executable) 496527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 497527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton char shell_resolved_path[PATH_MAX]; 498527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 499527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (localhost) 500527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 501527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton FileSpec shell_filespec (shell_executable, true); 502527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 503527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (!shell_filespec.Exists()) 504527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 505527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // Resolve the path in case we just got "bash", "sh" or "tcsh" 506527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (!shell_filespec.ResolveExecutableLocation ()) 507527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 508527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorStringWithFormat("invalid shell path '%s'", shell_executable); 509527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return false; 510527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 511527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 512527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_filespec.GetPath (shell_resolved_path, sizeof(shell_resolved_path)); 513527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_executable = shell_resolved_path; 514527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 515527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 5160c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton const char **argv = GetArguments().GetConstArgumentVector (); 5170c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton if (argv == NULL || argv[0] == NULL) 5180c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton return false; 519527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton Args shell_arguments; 520527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton std::string safe_arg; 521527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_arguments.AppendArgument (shell_executable); 522527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_arguments.AppendArgument ("-c"); 52397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton StreamString shell_command; 52497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (will_debug) 525527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 5260c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton // Add a modified PATH environment variable in case argv[0] 5270c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton // is a relative path 5280c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton const char *argv0 = argv[0]; 5290c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton if (argv0 && (argv0[0] != '/' && argv0[0] != '~')) 5300c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton { 5310c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton // We have a relative path to our executable which may not work if 5320c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton // we just try to run "a.out" (without it being converted to "./a.out") 5330c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton const char *working_dir = GetWorkingDirectory(); 53468bd76ffe3cfc53b363d4dd1e8a6b58e07d30fceGreg Clayton // Be sure to put quotes around PATH's value in case any paths have spaces... 53568bd76ffe3cfc53b363d4dd1e8a6b58e07d30fceGreg Clayton std::string new_path("PATH=\""); 5360c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton const size_t empty_path_len = new_path.size(); 5370c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton 5380c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton if (working_dir && working_dir[0]) 5390c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton { 5400c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton new_path += working_dir; 5410c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton } 5420c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton else 5430c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton { 5440c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton char current_working_dir[PATH_MAX]; 5450c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton const char *cwd = getcwd(current_working_dir, sizeof(current_working_dir)); 5460c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton if (cwd && cwd[0]) 5470c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton new_path += cwd; 5480c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton } 5490c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton const char *curr_path = getenv("PATH"); 5500c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton if (curr_path) 5510c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton { 5520c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton if (new_path.size() > empty_path_len) 5530c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton new_path += ':'; 5540c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton new_path += curr_path; 5550c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton } 55668bd76ffe3cfc53b363d4dd1e8a6b58e07d30fceGreg Clayton new_path += "\" "; 5570c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton shell_command.PutCString(new_path.c_str()); 5580c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton } 5590c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton 56097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton shell_command.PutCString ("exec"); 5610c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton 5620c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton // Only Apple supports /usr/bin/arch being able to specify the architecture 56397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (GetArchitecture().IsValid()) 56497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 56597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton shell_command.Printf(" /usr/bin/arch -arch %s", GetArchitecture().GetArchitectureName()); 5660c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton // Set the resume count to 2: 56797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // 1 - stop in shell 56897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // 2 - stop in /usr/bin/arch 56997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // 3 - then we will stop in our program 57097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton SetResumeCount(2); 57197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 57297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton else 57397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 5740c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton // Set the resume count to 1: 57597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // 1 - stop in shell 57697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // 2 - then we will stop in our program 57797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton SetResumeCount(1); 57897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 579527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 5800c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton 5810c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton if (first_arg_is_full_shell_command) 582527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 5830c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton // There should only be one argument that is the shell command itself to be used as is 5840c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton if (argv[0] && !argv[1]) 5850c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton shell_command.Printf("%s", argv[0]); 58697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton else 5870c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton return false; 588527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 58997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton else 59097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 5910c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton for (size_t i=0; argv[i] != NULL; ++i) 5920c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton { 5930c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton const char *arg = Args::GetShellSafeArgument (argv[i], safe_arg); 5940c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton shell_command.Printf(" %s", arg); 5950c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton } 59697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 5970c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton shell_arguments.AppendArgument (shell_command.GetString().c_str()); 598527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_executable.SetFile(shell_executable, false); 599527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_arguments = shell_arguments; 600527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return true; 601527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 602527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 603527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 604527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString ("invalid shell path"); 605527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 606527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 607527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 608527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 609527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString ("not launching in shell"); 610527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 611527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return false; 612527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton} 613527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 614527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 615b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 616b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Open (int fd, const char *path, bool read, bool write) 617b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 618b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if ((read || write) && fd >= 0 && path && path[0]) 619b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 620b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionOpen; 621b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 622b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (read && write) 623527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_arg = O_NOCTTY | O_CREAT | O_RDWR; 624b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else if (read) 625527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_arg = O_NOCTTY | O_RDONLY; 626b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 627527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_arg = O_NOCTTY | O_CREAT | O_WRONLY; 628b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_path.assign (path); 629b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return true; 630b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 631b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 632b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 633b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 634b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 635b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return false; 636b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 637b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 63824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 639b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Close (int fd) 640b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 641b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 642b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (fd >= 0) 643b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 644b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionClose; 645b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 646b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 647b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return m_fd >= 0; 648b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 649b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 650b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 651b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 652b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Duplicate (int fd, int dup_fd) 653b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 654b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 655b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (fd >= 0 && dup_fd >= 0) 656b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 657b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionDuplicate; 658b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 659b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arg = dup_fd; 660b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 661b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return m_fd >= 0; 662b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 663b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 664b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 665b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 666b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 667b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::AddPosixSpawnFileAction (posix_spawn_file_actions_t *file_actions, 668b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const FileAction *info, 669b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Log *log, 670b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error& error) 671b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 672b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info == NULL) 673b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return false; 674b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 675b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton switch (info->m_action) 676b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 677b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionNone: 678b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.Clear(); 679b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 680b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 681b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionClose: 682b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 683b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd for posix_spawn_file_actions_addclose(...)"); 684b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 685b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 686b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_addclose (file_actions, info->m_fd), 687b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 688b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log && (error.Fail() || log)) 689b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, "posix_spawn_file_actions_addclose (action=%p, fd=%i)", 690b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd); 691b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 692b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 693b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 694b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionDuplicate: 695b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 696b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd for posix_spawn_file_actions_adddup2(...)"); 697b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else if (info->m_arg == -1) 698b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid duplicate fd for posix_spawn_file_actions_adddup2(...)"); 699b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 700b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 701b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_adddup2 (file_actions, info->m_fd, info->m_arg), 702b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 703b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log && (error.Fail() || log)) 704b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, "posix_spawn_file_actions_adddup2 (action=%p, fd=%i, dup_fd=%i)", 705b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd, info->m_arg); 706b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 707b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 708b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 709b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionOpen: 710b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 711b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd in posix_spawn_file_actions_addopen(...)"); 712b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 713b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 714b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton int oflag = info->m_arg; 715527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 716b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton mode_t mode = 0; 717b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 718527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (oflag & O_CREAT) 719527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton mode = 0640; 720527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 721b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_addopen (file_actions, 722b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton info->m_fd, 723b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton info->m_path.c_str(), 724b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton oflag, 725b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton mode), 726b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 727b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (error.Fail() || log) 728b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, 729b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton "posix_spawn_file_actions_addopen (action=%p, fd=%i, path='%s', oflag=%i, mode=%i)", 730b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd, info->m_path.c_str(), oflag, mode); 731b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 732b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 733b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 734b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error.Success(); 735b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 736b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 737b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError 738143fcc3a15425659b381502ed4e1e50a3e726f36Greg ClaytonProcessLaunchCommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg) 739b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 740b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 7416475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 742b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 743b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton switch (short_option) 744b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 745b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 's': // Stop at program entry point 746b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagStopAtEntry); 747b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 748b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 74995ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton case 'i': // STDIN for read only 750b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 751b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 75295ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton if (action.Open (STDIN_FILENO, option_arg, true, false)) 753b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 754b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 755b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 756b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 75795ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton case 'o': // Open STDOUT for write only 758b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 759b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 76095ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton if (action.Open (STDOUT_FILENO, option_arg, false, true)) 761b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 762b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 763b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 76495ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton 76595ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton case 'e': // STDERR for write only 766b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 767b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 76895ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton if (action.Open (STDERR_FILENO, option_arg, false, true)) 769b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 770b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 771b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 772b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 77395ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton 774b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'p': // Process plug-in name 775b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.SetProcessPluginName (option_arg); 776b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 777b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 778b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'n': // Disable STDIO 779b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 780b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 78195ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton if (action.Open (STDIN_FILENO, "/dev/null", true, false)) 782b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 78395ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton if (action.Open (STDOUT_FILENO, "/dev/null", false, true)) 784b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 78595ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton if (action.Open (STDERR_FILENO, "/dev/null", false, true)) 786b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 787b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 788b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 789b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 790b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'w': 791b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.SetWorkingDirectory (option_arg); 792b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 793b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 794b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 't': // Open process in new terminal window 795b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY); 796b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 797b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 798b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'a': 799b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!launch_info.GetArchitecture().SetTriple (option_arg, m_interpreter.GetPlatform(true).get())) 800b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton launch_info.GetArchitecture().SetTriple (option_arg); 801b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 802b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 803b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'A': 804b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagDisableASLR); 805b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 806b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 80736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton case 'c': 808527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (option_arg && option_arg[0]) 809527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton launch_info.SetShell (option_arg); 810527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 811527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton launch_info.SetShell ("/bin/bash"); 81236bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton break; 81336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton 814b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'v': 815b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetEnvironmentEntries().AppendArgument(option_arg); 816b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 817b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 818b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton default: 8199c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("unrecognized short option character '%c'", short_option); 820b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 821b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 822b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 823b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error; 824b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 825b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 826b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonOptionDefinition 827b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchCommandOptions::g_option_table[] = 828b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 829b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "stop-at-entry", 's', no_argument, NULL, 0, eArgTypeNone, "Stop at the entry point of the program when launching a process."}, 830b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "disable-aslr", 'A', no_argument, NULL, 0, eArgTypeNone, "Disable address space layout randomization when launching a process."}, 831b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "plugin", 'p', required_argument, NULL, 0, eArgTypePlugin, "Name of the process plugin you want to use."}, 8329a91ef68c2650113da5488e09e9cb5f6aa88f6abSean Callanan{ LLDB_OPT_SET_ALL, false, "working-dir", 'w', required_argument, NULL, 0, eArgTypeDirectoryName, "Set the current working directory to <path> when running the inferior."}, 833b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "arch", 'a', required_argument, NULL, 0, eArgTypeArchitecture, "Set the architecture for the process to launch when ambiguous."}, 834b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "environment", 'v', required_argument, NULL, 0, eArgTypeNone, "Specify an environment variable name/value stirng (--environement NAME=VALUE). Can be specified multiple times for subsequent environment entries."}, 8359a91ef68c2650113da5488e09e9cb5f6aa88f6abSean Callanan{ LLDB_OPT_SET_ALL, false, "shell", 'c', optional_argument, NULL, 0, eArgTypeFilename, "Run the process in a shell (not supported on all platforms)."}, 836b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 8379a91ef68c2650113da5488e09e9cb5f6aa88f6abSean Callanan{ LLDB_OPT_SET_1 , false, "stdin", 'i', required_argument, NULL, 0, eArgTypeFilename, "Redirect stdin for the process to <filename>."}, 8389a91ef68c2650113da5488e09e9cb5f6aa88f6abSean Callanan{ LLDB_OPT_SET_1 , false, "stdout", 'o', required_argument, NULL, 0, eArgTypeFilename, "Redirect stdout for the process to <filename>."}, 8399a91ef68c2650113da5488e09e9cb5f6aa88f6abSean Callanan{ LLDB_OPT_SET_1 , false, "stderr", 'e', required_argument, NULL, 0, eArgTypeFilename, "Redirect stderr for the process to <filename>."}, 840b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 841b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_2 , false, "tty", 't', no_argument, NULL, 0, eArgTypeNone, "Start the process in a terminal (not supported on all platforms)."}, 842b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 843b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_3 , false, "no-stdio", 'n', no_argument, NULL, 0, eArgTypeNone, "Do not set up for terminal I/O to go to running process."}, 844b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 845b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 0 , false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 846b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}; 847b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 848b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 849b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 850b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 851b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::NameMatches (const char *process_name) const 85224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 85324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name_match_type == eNameMatchIgnore || process_name == NULL) 85424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 85524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *match_name = m_match_info.GetName(); 85624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (!match_name) 85724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 85824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 85924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return lldb_private::NameMatches (process_name, m_name_match_type, match_name); 86024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 86124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 86224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 863b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::Matches (const ProcessInstanceInfo &proc_info) const 86424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 86524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (!NameMatches (proc_info.GetName())) 86624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 86724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 86824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ProcessIDIsValid() && 86924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetProcessID() != proc_info.GetProcessID()) 87024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 87124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 87224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ParentProcessIDIsValid() && 87324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetParentProcessID() != proc_info.GetParentProcessID()) 87424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 87524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 876b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.UserIDIsValid () && 877b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_match_info.GetUserID() != proc_info.GetUserID()) 87824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 87924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 880b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.GroupIDIsValid () && 881b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_match_info.GetGroupID() != proc_info.GetGroupID()) 88224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 88324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 88424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveUserIDIsValid () && 88524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID()) 88624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 88724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 88824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveGroupIDIsValid () && 88924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID()) 89024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 89124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 89224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.GetArchitecture().IsValid() && 89340e278caddf5442776f9408f20d757cc85fe630aSean Callanan !m_match_info.GetArchitecture().IsCompatibleMatch(proc_info.GetArchitecture())) 89424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 89524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 89624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 89724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 89824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 899b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::MatchAllProcesses () const 90024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 90124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name_match_type != eNameMatchIgnore) 90224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 90324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 90424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ProcessIDIsValid()) 90524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 90624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 90724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ParentProcessIDIsValid()) 90824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 90924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 910b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.UserIDIsValid ()) 91124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 91224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 913b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.GroupIDIsValid ()) 91424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 91524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 91624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveUserIDIsValid ()) 91724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 91824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 91924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveGroupIDIsValid ()) 92024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 92124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 92224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.GetArchitecture().IsValid()) 92324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 92424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 92524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_all_users) 92624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 92724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 92824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 92924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 93024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 93124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 93224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 933b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::Clear() 93424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 93524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.Clear(); 93624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_name_match_type = eNameMatchIgnore; 93724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_all_users = false; 93824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 939fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 94046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessSP 94146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcess::FindPlugin (Target &target, const char *plugin_name, Listener &listener, const FileSpec *crash_file_path) 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 94364742744396c966e8de770e765130629b0c78335Greg Clayton static uint32_t g_process_unique_id = 0; 94464742744396c966e8de770e765130629b0c78335Greg Clayton 94546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ProcessSP process_sp; 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessCreateInstance create_callback = NULL; 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (plugin_name) 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9490e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton ConstString const_plugin_name(plugin_name); 9500e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton create_callback = PluginManager::GetProcessCreateCallbackForPluginName (const_plugin_name); 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (create_callback) 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton process_sp = create_callback(target, listener, crash_file_path); 95446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (process_sp) 95546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 95664742744396c966e8de770e765130629b0c78335Greg Clayton if (process_sp->CanDebug(target, true)) 95764742744396c966e8de770e765130629b0c78335Greg Clayton { 95864742744396c966e8de770e765130629b0c78335Greg Clayton process_sp->m_process_unique_id = ++g_process_unique_id; 95964742744396c966e8de770e765130629b0c78335Greg Clayton } 96064742744396c966e8de770e765130629b0c78335Greg Clayton else 96146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton process_sp.reset(); 96246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 96754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx) 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 96946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton process_sp = create_callback(target, listener, crash_file_path); 97046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (process_sp) 97146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 97264742744396c966e8de770e765130629b0c78335Greg Clayton if (process_sp->CanDebug(target, false)) 97364742744396c966e8de770e765130629b0c78335Greg Clayton { 97464742744396c966e8de770e765130629b0c78335Greg Clayton process_sp->m_process_unique_id = ++g_process_unique_id; 97546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton break; 97664742744396c966e8de770e765130629b0c78335Greg Clayton } 97764742744396c966e8de770e765130629b0c78335Greg Clayton else 97864742744396c966e8de770e765130629b0c78335Greg Clayton process_sp.reset(); 97946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return process_sp; 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9855a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim InghamConstString & 9865a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim InghamProcess::GetStaticBroadcasterClass () 9875a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham{ 9885a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham static ConstString class_name ("lldb.process"); 9895a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham return class_name; 9905a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham} 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process constructor 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Process(Target &target, Listener &listener) : 99673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ProcessProperties (false), 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UserID (LLDB_INVALID_PROCESS_ID), 9985a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham Broadcaster (&(target.GetDebugger()), "lldb.process"), 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target (target), 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_public_state (eStateUnloaded), 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state (eStateUnloaded), 10025a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_private_state_broadcaster (NULL, "lldb.process.internal_state_broadcaster"), 10035a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_private_state_control_broadcaster (NULL, "lldb.process.internal_state_control_broadcaster"), 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener ("lldb.process.internal_state_listener"), 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait(), 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_thread (LLDB_INVALID_HOST_THREAD), 100721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id (), 100864742744396c966e8de770e765130629b0c78335Greg Clayton m_process_unique_id(0), 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_index_id (0), 1010ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong m_thread_id_to_index_id_map (), 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_status (-1), 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_string (), 10134e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor m_thread_mutex (Mutex::eMutexTypeRecursive), 10144e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor m_thread_list_real (this), 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_list (this), 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications (), 101720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_image_tokens (), 101820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_listener (listener), 101920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_breakpoint_site_list (), 102020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_dynamic_checkers_ap (), 1021861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_unix_signals (), 102220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_abi_sp (), 1023861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader (), 1024a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_stdio_communication ("process.stdio"), 102520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_stdio_communication_mutex (Mutex::eMutexTypeRecursive), 1026fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton m_stdout_data (), 1027bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stderr_data (), 1028fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong m_profile_data_comm_mutex (Mutex::eMutexTypeRecursive), 1029fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong m_profile_data (), 1030613b8739a4d489b7f1c571288d5786768c024205Greg Clayton m_memory_cache (*this), 1031613b8739a4d489b7f1c571288d5786768c024205Greg Clayton m_allocated_memory_cache (*this), 1032ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_should_detach (false), 10336cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan m_next_event_action_ap(), 1034061ca65c4b666f8352ba08700ca4e5fa71ebb4a9Greg Clayton m_public_run_lock (), 1035061ca65c4b666f8352ba08700ca4e5fa71ebb4a9Greg Clayton m_private_run_lock (), 10364389256aecd2693109969c21fa2f00c4612320b3Jim Ingham m_currently_handling_event(false), 1037d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham m_finalize_called(false), 1038addad59552c206466dea98c4a645a471a41252b4Greg Clayton m_clear_thread_plans_on_stop (false), 103989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham m_last_broadcast_state (eStateInvalid), 10401d9c802d12647830b1a9dc037d731d7da0009a13Jason Molenda m_destroy_in_process (false), 10411d9c802d12647830b1a9dc037d731d7da0009a13Jason Molenda m_can_jit(eCanJITDontKnow) 104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10435a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham CheckInWithManager (); 10441ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 1045952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Process::Process()", this); 104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitStateChanged, "state-changed"); 105049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitInterrupt, "interrupt"); 105149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitSTDOUT, "stdout-available"); 105249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitSTDERR, "stderr-available"); 1053fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong SetEventName (eBroadcastBitProfileData, "profile-data-available"); 105449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 1055843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlStop , "control-stop" ); 1056843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlPause , "control-pause" ); 1057843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlResume, "control-resume"); 1058843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner listener.StartListeningForEvents (this, 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitStateChanged | 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitInterrupt | 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitSTDOUT | 1063fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong eBroadcastBitSTDERR | 1064fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong eBroadcastBitProfileData); 106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster, 10675d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham eBroadcastBitStateChanged | 10685d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham eBroadcastBitInterrupt); 106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster, 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlStop | 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlPause | 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlResume); 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::~Process() 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1081952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Process::~Process()", this); 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108773844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst ProcessPropertiesSP & 108873844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonProcess::GetGlobalProperties() 108973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 109073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton static ProcessPropertiesSP g_settings_sp; 109173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (!g_settings_sp) 109273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton g_settings_sp.reset (new ProcessProperties (true)); 109373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return g_settings_sp; 109473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 109573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Finalize() 109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1099ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton switch (GetPrivateState()) 1100ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton { 1101ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateConnected: 1102ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateAttaching: 1103ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateLaunching: 1104ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateStopped: 1105ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateRunning: 1106ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateStepping: 1107ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateCrashed: 1108ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateSuspended: 1109ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton if (GetShouldDetach()) 1110761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham { 1111761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham // FIXME: This will have to be a process setting: 1112761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham bool keep_stopped = false; 1113761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham Detach(keep_stopped); 1114761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham } 1115ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton else 1116ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton Destroy(); 1117ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton break; 1118ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton 1119ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateInvalid: 1120ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateUnloaded: 1121ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateDetached: 1122ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateExited: 1123ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton break; 1124ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton } 1125ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton 11262f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton // Clear our broadcaster before we proceed with destroying 11272f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton Broadcaster::Clear(); 11282f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton 112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Do any cleanup needed prior to being destructed... Subclasses 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // that override this method should call this superclass method as well. 113188fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham 113288fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham // We need to destroy the loader before the derived Process class gets destroyed 113388fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham // since it is very likely that undoing the loader will require access to the real process. 1134182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_dynamic_checkers_ap.reset(); 1135182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_abi_sp.reset(); 113637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 1137182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_dyld_ap.reset(); 11384e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor m_thread_list_real.Destroy(); 113913d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton m_thread_list.Destroy(); 1140182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton std::vector<Notifications> empty_notifications; 1141182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_notifications.swap(empty_notifications); 1142182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_image_tokens.clear(); 1143182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_memory_cache.Clear(); 1144182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_allocated_memory_cache.Clear(); 1145182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_language_runtimes.clear(); 1146182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_next_event_action_ap.reset(); 1147843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton//#ifdef LLDB_CONFIGURATION_DEBUG 1148843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton// StreamFile s(stdout, false); 1149843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton// EventSP event_sp; 1150843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton// while (m_private_state_listener.GetNextEvent(event_sp)) 1151843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton// { 1152843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton// event_sp->Dump (&s); 1153843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton// s.EOL(); 1154843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton// } 1155843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton//#endif 1156843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton // We have to be very careful here as the m_private_state_listener might 1157843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton // contain events that have ProcessSP values in them which can keep this 1158843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton // process around forever. These events need to be cleared out. 1159843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton m_private_state_listener.Clear(); 1160cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste m_public_run_lock.TrySetRunning(); // This will do nothing if already locked 1161cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste m_public_run_lock.SetStopped(); 1162cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste m_private_run_lock.TrySetRunning(); // This will do nothing if already locked 1163cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste m_private_run_lock.SetStopped(); 1164d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham m_finalize_called = true; 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RegisterNotificationCallbacks (const Notifications& callbacks) 116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications.push_back(callbacks); 117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (callbacks.initialize != NULL) 117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner callbacks.initialize (callbacks.baton, this); 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::UnregisterNotificationCallbacks(const Notifications& callbacks) 117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<Notifications>::iterator pos, end = m_notifications.end(); 117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_notifications.begin(); pos != end; ++pos) 118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->baton == callbacks.baton && 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->initialize == callbacks.initialize && 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->process_state_changed == callbacks.process_state_changed) 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications.erase(pos); 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SynchronouslyNotifyStateChanged (StateType state) 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end(); 119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos) 119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (notification_pos->process_state_changed) 119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner notification_pos->process_state_changed (notification_pos->baton, this, state); 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: We need to do some work on events before the general Listener sees them. 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// For instance if we are continuing from a breakpoint, we need to ensure that we do 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the little "insert real insn, step & stop" trick. But we can't do that when the 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// event is delivered by the broadcaster - since that is done on the thread that is 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// waiting for new events, so if we needed more than one event for our handling, we would 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// stall. So instead we do it when we fetch the event off of the queue. 120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextEvent (EventSP &event_sp) 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp) 121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent (event_sp.get()); 121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 1224bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg ClaytonProcess::WaitForProcessToStop (const TimeValue *timeout, lldb::EventSP *event_sp_ptr) 122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 122621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We can't just wait for a "stopped" event, because the stopped event may have restarted the target. 122721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We have to actually check each event, and in the case of a stopped event check the restarted flag 122821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // on the event. 1229bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton if (event_sp_ptr) 1230bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton event_sp_ptr->reset(); 123121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham StateType state = GetState(); 123221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // If we are exited or detached, we won't ever get back to any 123321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // other valid state... 123421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (state == eStateDetached || state == eStateExited) 123521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 123621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 123721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham while (state != eStateInvalid) 123821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 1239bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton EventSP event_sp; 124021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham state = WaitForStateChangedEvents (timeout, event_sp); 1241bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton if (event_sp_ptr && event_sp) 1242bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton *event_sp_ptr = event_sp; 1243bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton 124421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham switch (state) 124521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 124621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateCrashed: 124721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateDetached: 124821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateExited: 124921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateUnloaded: 125021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 125121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateStopped: 125221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get())) 125321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham continue; 125421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else 125521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 125621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham default: 125721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham continue; 125821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 125921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 126021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForState 126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const TimeValue *timeout, 126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType *match_states, const uint32_t num_match_states 126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 1273d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton StateType state = GetState(); 127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (state != eStateInvalid) 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1276d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton // If we are exited or detached, we won't ever get back to any 1277d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton // other valid state... 1278d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton if (state == eStateDetached || state == eStateExited) 1279d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton return state; 1280d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton 128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = WaitForStateChangedEvents (timeout, event_sp); 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_match_states; ++i) 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_states[i] == state) 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghambool 129363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::HijackProcessEvents (Listener *listener) 129463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 129563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham if (listener != NULL) 129663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham { 12975d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham return HijackBroadcaster(listener, eBroadcastBitStateChanged | eBroadcastBitInterrupt); 129863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham } 129963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham else 130063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return false; 130163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 130263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 130363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghamvoid 130463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::RestoreProcessEvents () 130563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 130663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham RestoreBroadcaster(); 130763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 130863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 1309f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghambool 1310f9f40c20b210eea72ab042c63178ca000f005ed9Jim InghamProcess::HijackPrivateProcessEvents (Listener *listener) 1311f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham{ 1312f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (listener != NULL) 1313f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 13145d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham return m_private_state_broadcaster.HijackBroadcaster(listener, eBroadcastBitStateChanged | eBroadcastBitInterrupt); 1315f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 1316f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 1317f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return false; 1318f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham} 1319f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 1320f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghamvoid 1321f9f40c20b210eea72ab042c63178ca000f005ed9Jim InghamProcess::RestorePrivateProcessEvents () 1322f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham{ 1323f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham m_private_state_broadcaster.RestoreBroadcaster(); 1324f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham} 1325f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp) 132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1329952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 133536f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton if (m_listener.WaitForEventForBroadcasterWithType (timeout, 133636f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton this, 13375d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham eBroadcastBitStateChanged | eBroadcastBitInterrupt, 133836f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton event_sp)) 13395d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham { 13405d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged) 13415d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 13425d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham else if (log) 13435d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham log->Printf ("Process::%s got no event or was interrupted.", __FUNCTION__); 13445d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp) => %s", 134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__, 134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout, 135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(state)); 135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent * 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PeekAtStateChangedEvents () 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1357952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s...", __FUNCTION__); 136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Event *event_ptr; 136336f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this, 136436f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton eBroadcastBitStateChanged); 136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_ptr) 136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (event_ptr) => %s", 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__, 137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr))); 137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s no events found", 137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__); 137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return event_ptr; 138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp) 138424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1385952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 139172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (m_private_state_listener.WaitForEventForBroadcasterWithType (timeout, 139272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton &m_private_state_broadcaster, 13935d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham eBroadcastBitStateChanged | eBroadcastBitInterrupt, 139472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton event_sp)) 13955d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged) 13965d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a bit of a hack, but when we wait here we could very well return 139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to the command-line, and that could disable the log, which would render the 140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // log we got above invalid. 140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 140272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton { 140372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (state == eStateInvalid) 140472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton log->Printf ("Process::%s (timeout = %p, event_sp) => TIMEOUT", __FUNCTION__, timeout); 140572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton else 140672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state)); 140772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton } 140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only) 141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1414952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (control_only) 142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp); 142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 142224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_listener.WaitForEvent(timeout, event_sp); 142324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 142424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 142524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 142624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::IsRunning () const 142724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 142824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return StateIsRunningState (m_public_state.GetValue()); 142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 143024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 143124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 143224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitStatus () 143324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 143424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateExited) 143524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_exit_status; 143624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 143824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1439638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitDescription () 144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty()) 144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_exit_string.c_str(); 144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 144872e1c782ba1e4226da37af4722af608de9f39408Greg Claytonbool 144924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetExitStatus (int status, const char *cstr) 145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1451952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 145268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton if (log) 145368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton log->Printf("Process::SetExitStatus (status=%i (0x%8.8x), description=%s%s%s)", 145468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton status, status, 145568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton cstr ? "\"" : "", 145668ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton cstr ? cstr : "NULL", 145768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton cstr ? "\"" : ""); 145868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton 145972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton // We were already in the exited state 146072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (m_private_state.GetValue() == eStateExited) 146168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton { 1462644ddfbc1b36eabdb93c5acb150f9a77a92ee1fdGreg Clayton if (log) 1463644ddfbc1b36eabdb93c5acb150f9a77a92ee1fdGreg Clayton log->Printf("Process::SetExitStatus () ignoring exit status because state was already set to eStateExited"); 146472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton return false; 146568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton } 146672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 146772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_exit_status = status; 146872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (cstr) 146972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_exit_string = cstr; 147072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton else 147172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_exit_string.clear(); 147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 147372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton DidExit (); 147458e844b3561848e73e69d6d98746d4851e78306eGreg Clayton 147572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton SetPrivateState (eStateExited); 147672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton return true; 147724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 147824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 147924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This static callback can be used to watch for local child processes on 148024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the current host. The the child process exits, the process will be 148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// found in the global target list (we want to be completely sure that the 148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// lldb_private::Process doesn't go away before we can deliver the signal. 148324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 14841c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonProcess::SetProcessExitStatus (void *callback_baton, 14851c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton lldb::pid_t pid, 14861c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton bool exited, 14871c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton int signo, // Zero for no signal 14881c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton int exit_status // Exit value of process if signal is zero 148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1491952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS)); 14921c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton if (log) 14935f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::SetProcessExitStatus (baton=%p, pid=%" PRIu64 ", exited=%i, signal=%i, exit_status=%i)\n", 14941c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton callback_baton, 14951c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton pid, 14961c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton exited, 14971c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton signo, 14981c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton exit_status); 14991c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 15001c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton if (exited) 150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 150263094e0bb161580564954dee512955c1c79d3476Greg Clayton TargetSP target_sp(Debugger::FindTargetWithProcessID (pid)); 150324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_sp) 150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 150524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp (target_sp->GetProcessSP()); 150624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process_sp) 150724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 150824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *signal_cstr = NULL; 150924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signo) 151024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo); 151124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 151224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process_sp->SetExitStatus (exit_status, signal_cstr); 151324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 151424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 151524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 151624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 151724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 151824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 151924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 152024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 152137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonvoid 152237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg ClaytonProcess::UpdateThreadListIfNeeded () 152337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{ 152437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton const uint32_t stop_id = GetStopID(); 152537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID()) 152637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton { 1527202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton const StateType state = GetPrivateState(); 1528202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton if (StateIsStoppedState (state, true)) 1529202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton { 1530202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton Mutex::Locker locker (m_thread_list.GetMutex ()); 1531ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // m_thread_list does have its own mutex, but we need to 1532ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // hold onto the mutex between the call to UpdateThreadList(...) 1533ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // and the os->UpdateThreadList(...) so it doesn't change on us 15344e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor ThreadList &old_thread_list = m_thread_list; 15354e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor ThreadList real_thread_list(this); 1536202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton ThreadList new_thread_list(this); 1537202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton // Always update the thread list with the protocol specific 1538ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton // thread list, but only update if "true" is returned 15394e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor if (UpdateThreadList (m_thread_list_real, real_thread_list)) 1540ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton { 1541eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham // Don't call into the OperatingSystem to update the thread list if we are shutting down, since 1542eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham // that may call back into the SBAPI's, requiring the API lock which is already held by whoever is 1543eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham // shutting us down, causing a deadlock. 1544eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham if (!m_destroy_in_process) 1545eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham { 1546eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham OperatingSystem *os = GetOperatingSystem (); 1547eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham if (os) 15489acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton { 15499acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton // Clear any old backing threads where memory threads might have been 15509acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton // backed by actual threads from the lldb_private::Process subclass 15514e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor size_t num_old_threads = old_thread_list.GetSize(false); 15529acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton for (size_t i=0; i<num_old_threads; ++i) 15534e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor old_thread_list.GetThreadAtIndex(i, false)->ClearBackingThread(); 15549acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton 15559acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton // Now let the OperatingSystem plug-in update the thread list 15564e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor os->UpdateThreadList (old_thread_list, // Old list full of threads created by OS plug-in 15574e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor real_thread_list, // The actual thread list full of threads created by each lldb_private::Process subclass 15584e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor new_thread_list); // The new thread list that we will show to the user that gets filled in 15594e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor } 15604e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor else 15614e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor { 15624e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor // No OS plug-in, the new thread list is the same as the real thread list 15634e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor new_thread_list = real_thread_list; 15649acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton } 1565eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham } 156629f30d0f5ccbb6c1f95de7199008ac2448097609Jim Ingham 156729f30d0f5ccbb6c1f95de7199008ac2448097609Jim Ingham m_thread_list_real.Update(real_thread_list); 15684e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor m_thread_list.Update (new_thread_list); 15694e75e3533bddc7cf7264c6c7f7b4d812d4466e96Andrew Kaylor m_thread_list.SetStopID (stop_id); 1570ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton } 1571202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton } 157237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 157337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton} 157437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton 157552ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonThreadSP 157652ebc0aab1fdecb634801deceeddd71a14c2148cGreg ClaytonProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) 157752ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton{ 157852ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton OperatingSystem *os = GetOperatingSystem (); 157952ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton if (os) 158052ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton return os->CreateThread(tid, context); 158152ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton return ThreadSP(); 158252ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton} 158352ebc0aab1fdecb634801deceeddd71a14c2148cGreg Clayton 1584ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Onguint32_t 1585ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming OngProcess::GetNextThreadIndexID (uint64_t thread_id) 1586ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong{ 1587ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong return AssignIndexIDToThread(thread_id); 1588ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong} 1589ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong 1590ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ongbool 1591ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming OngProcess::HasAssignedIndexIDToThread(uint64_t thread_id) 1592ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong{ 1593ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong std::map<uint64_t, uint32_t>::iterator iterator = m_thread_id_to_index_id_map.find(thread_id); 1594ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong if (iterator == m_thread_id_to_index_id_map.end()) 1595ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong { 1596ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong return false; 1597ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong } 1598ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong else 1599ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong { 1600ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong return true; 1601ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong } 1602ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong} 1603ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong 1604ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Onguint32_t 1605ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming OngProcess::AssignIndexIDToThread(uint64_t thread_id) 1606ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong{ 1607ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong uint32_t result = 0; 1608ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong std::map<uint64_t, uint32_t>::iterator iterator = m_thread_id_to_index_id_map.find(thread_id); 1609ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong if (iterator == m_thread_id_to_index_id_map.end()) 1610ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong { 1611ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong result = ++m_thread_index_id; 1612ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong m_thread_id_to_index_id_map[thread_id] = result; 1613ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong } 1614ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong else 1615ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong { 1616ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong result = iterator->second; 1617ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong } 1618ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong 1619ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong return result; 1620ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong} 1621ccd5c4ee85d1592f9ae3da02c85f5647ca02fab2Han Ming Ong 162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetState() 162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 162524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If any other threads access this we will need a mutex for it 162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_public_state.GetValue (); 162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 16307c79a27b955432dfd3ad9439640f0af2eccf37b8Jim InghamProcess::SetPublicState (StateType new_state, bool restarted) 163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1632952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 16347c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham log->Printf("Process::SetPublicState (state = %s, restarted = %i)", StateAsCString(new_state), restarted); 1635a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton const StateType old_state = m_public_state.GetValue(); 163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_public_state.SetValue (new_state); 1637027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham 1638027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham // On the transition from Run to Stopped, we unlock the writer end of the 1639027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham // run lock. The lock gets locked in Resume, which is the public API 1640027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham // to tell the program to run. 1641a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton if (!IsHijackedForEvent(eBroadcastBitStateChanged)) 1642a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton { 1643a3772860a8d4ba6472e8a3c77c85b925ca454556Sean Callanan if (new_state == eStateDetached) 1644a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton { 1645a3772860a8d4ba6472e8a3c77c85b925ca454556Sean Callanan if (log) 1646a3772860a8d4ba6472e8a3c77c85b925ca454556Sean Callanan log->Printf("Process::SetPublicState (%s) -- unlocking run lock for detach", StateAsCString(new_state)); 1647cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste m_public_run_lock.SetStopped(); 1648a3772860a8d4ba6472e8a3c77c85b925ca454556Sean Callanan } 1649a3772860a8d4ba6472e8a3c77c85b925ca454556Sean Callanan else 1650a3772860a8d4ba6472e8a3c77c85b925ca454556Sean Callanan { 1651a3772860a8d4ba6472e8a3c77c85b925ca454556Sean Callanan const bool old_state_is_stopped = StateIsStoppedState(old_state, false); 1652a3772860a8d4ba6472e8a3c77c85b925ca454556Sean Callanan const bool new_state_is_stopped = StateIsStoppedState(new_state, false); 16537c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham if ((old_state_is_stopped != new_state_is_stopped)) 1654a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton { 16557c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham if (new_state_is_stopped && !restarted) 1656a3772860a8d4ba6472e8a3c77c85b925ca454556Sean Callanan { 1657a3772860a8d4ba6472e8a3c77c85b925ca454556Sean Callanan if (log) 1658a3772860a8d4ba6472e8a3c77c85b925ca454556Sean Callanan log->Printf("Process::SetPublicState (%s) -- unlocking run lock", StateAsCString(new_state)); 1659cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste m_public_run_lock.SetStopped(); 1660a3772860a8d4ba6472e8a3c77c85b925ca454556Sean Callanan } 1661a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton } 1662a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton } 1663a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton } 166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1666027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim InghamError 1667027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim InghamProcess::Resume () 1668027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham{ 1669952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 1670027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham if (log) 1671027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham log->Printf("Process::Resume -- locking run lock"); 1672cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste if (!m_public_run_lock.TrySetRunning()) 1673027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham { 1674027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham Error error("Resume request failed - process still running."); 1675027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham if (log) 1676cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste log->Printf ("Process::Resume: -- TrySetRunning failed, not resuming."); 1677027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham return error; 1678027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham } 1679027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham return PrivateResume(); 1680027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham} 1681027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham 168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetPrivateState () 168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state.GetValue(); 168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetPrivateState (StateType new_state) 169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1691952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool state_changed = false; 169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state)); 169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16971f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor Mutex::Locker thread_locker(m_thread_list.GetMutex()); 169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker(m_private_state.GetMutex()); 169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType old_state = m_private_state.GetValueNoLock (); 170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state_changed = old_state != new_state; 17028bf4e92ff9b78a973a3feae2231c972fa156ba9aEd Maste 17035fbfb910d2aa7b0c011f077390880235ee808685Greg Clayton const bool old_state_is_stopped = StateIsStoppedState(old_state, false); 17045fbfb910d2aa7b0c011f077390880235ee808685Greg Clayton const bool new_state_is_stopped = StateIsStoppedState(new_state, false); 17055fbfb910d2aa7b0c011f077390880235ee808685Greg Clayton if (old_state_is_stopped != new_state_is_stopped) 17065fbfb910d2aa7b0c011f077390880235ee808685Greg Clayton { 17075fbfb910d2aa7b0c011f077390880235ee808685Greg Clayton if (new_state_is_stopped) 1708cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste m_private_run_lock.SetStopped(); 17095fbfb910d2aa7b0c011f077390880235ee808685Greg Clayton else 1710cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste m_private_run_lock.SetRunning(); 17115fbfb910d2aa7b0c011f077390880235ee808685Greg Clayton } 17123bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor 171324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state_changed) 171424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state.SetValueNoLock (new_state); 1716202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton if (StateIsStoppedState(new_state, false)) 171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17181f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor // Note, this currently assumes that all threads in the list 17191f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor // stop when the process stops. In the future we will want to 17201f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor // support a debugging model where some threads continue to run 17211f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor // while others are stopped. When that happens we will either need 17221f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor // a way for the thread list to identify which threads are stopping 17231f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor // or create a special thread list containing only threads which 17241f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor // actually stopped. 17251f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor // 17261f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor // The process plugin is responsible for managing the actual 17271f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor // behavior of the threads and should have stopped any threads 17281f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor // that are going to stop before we get here. 17291f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor m_thread_list.DidStop(); 17301f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor 173121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.BumpStopID(); 1732fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton m_memory_cache.Clear(); 173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 173421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_mod_id.GetStopID()); 173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Use our target to get a shared pointer to ourselves... 1737843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton if (m_finalize_called && PrivateStateThreadIsValid() == false) 1738843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (shared_from_this(), new_state)); 1739843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton else 1740843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (shared_from_this(), new_state)); 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 17457e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state)); 174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17490296fe73a7cb1482226b1303a795ede00e12d677Jim Inghamvoid 17500296fe73a7cb1482226b1303a795ede00e12d677Jim InghamProcess::SetRunningUserExpression (bool on) 17510296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham{ 17520296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham m_mod_id.SetRunningUserExpression (on); 17530296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham} 17540296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t 175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetImageInfoAddress() 175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_ADDRESS; 175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17610baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 17620baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// LoadImage 17630baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// 17640baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most 17650baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library 17660baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// loading differently should override LoadImage and UnloadImage and 17670baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed. 17680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 17690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonuint32_t 17700baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::LoadImage (const FileSpec &image_spec, Error &error) 17710baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 177277d40710a275d2b7e68fe005391f77801b9cd480Greg Clayton char path[PATH_MAX]; 177377d40710a275d2b7e68fe005391f77801b9cd480Greg Clayton image_spec.GetPath(path, sizeof(path)); 177477d40710a275d2b7e68fe005391f77801b9cd480Greg Clayton 17750baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton DynamicLoader *loader = GetDynamicLoader(); 17760baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (loader) 17770baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 17780baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = loader->CanLoadImage(); 17790baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Fail()) 17800baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 17810baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 17820baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 17830baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Success()) 17840baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 17850baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 17860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 17870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp) 17880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 17890baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 17900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 17910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (frame_sp) 17920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 17930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 17940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton frame_sp->CalculateExecutionContext (exe_ctx); 1795b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham const bool unwind_on_error = true; 1796b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham const bool ignore_breakpoints = true; 17970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StreamString expr; 17980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton expr.Printf("dlopen (\"%s\", 2)", path); 17990baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n"; 1800360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ValueObjectSP result_valobj_sp; 180134507e41794909465d168af4048ebd07ee7819e8Greg Clayton ClangUserExpression::Evaluate (exe_ctx, 180234507e41794909465d168af4048ebd07ee7819e8Greg Clayton eExecutionPolicyAlways, 180334507e41794909465d168af4048ebd07ee7819e8Greg Clayton lldb::eLanguageTypeUnknown, 180434507e41794909465d168af4048ebd07ee7819e8Greg Clayton ClangUserExpression::eResultTypeAny, 180534507e41794909465d168af4048ebd07ee7819e8Greg Clayton unwind_on_error, 1806b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham ignore_breakpoints, 180734507e41794909465d168af4048ebd07ee7819e8Greg Clayton expr.GetData(), 180834507e41794909465d168af4048ebd07ee7819e8Greg Clayton prefix, 180934507e41794909465d168af4048ebd07ee7819e8Greg Clayton result_valobj_sp, 181034507e41794909465d168af4048ebd07ee7819e8Greg Clayton true, 181134507e41794909465d168af4048ebd07ee7819e8Greg Clayton ClangUserExpression::kDefaultTimeout); 1812b14ec34165772877c8242f5b15acb116b0d9a9b5Johnny Chen error = result_valobj_sp->GetError(); 1813b14ec34165772877c8242f5b15acb116b0d9a9b5Johnny Chen if (error.Success()) 18140baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 18150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Scalar scalar; 1816fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (result_valobj_sp->ResolveValue (scalar)) 18170baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 18180baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS); 18190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS) 18200baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 18210baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton uint32_t image_token = m_image_tokens.size(); 18220baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_image_tokens.push_back (image_ptr); 18230baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return image_token; 18240baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 18250baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 18260baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 18270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 18280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 18290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 183077d40710a275d2b7e68fe005391f77801b9cd480Greg Clayton if (!error.AsCString()) 183177d40710a275d2b7e68fe005391f77801b9cd480Greg Clayton error.SetErrorStringWithFormat("unable to load '%s'", path); 18320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 18330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 18340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 18350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 18360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// UnloadImage 18370baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// 18380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most 18390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library 18400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// loading differently should override LoadImage and UnloadImage and 18410baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed. 18420baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 18430baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonError 18440baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::UnloadImage (uint32_t image_token) 18450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 18460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Error error; 18470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_token < m_image_tokens.size()) 18480baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 18490baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const addr_t image_addr = m_image_tokens[image_token]; 18500baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_addr == LLDB_INVALID_ADDRESS) 18510baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 18520baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorString("image already unloaded"); 18530baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 18540baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 18550baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 18560baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton DynamicLoader *loader = GetDynamicLoader(); 18570baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (loader) 18580baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = loader->CanLoadImage(); 18590baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 18600baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Success()) 18610baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 18620baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 18630baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 18640baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp) 18650baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 18660baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 18670baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 18680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (frame_sp) 18690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 18700baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 18710baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton frame_sp->CalculateExecutionContext (exe_ctx); 1872b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham const bool unwind_on_error = true; 1873b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham const bool ignore_breakpoints = true; 18740baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StreamString expr; 18755f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea expr.Printf("dlclose ((void *)0x%" PRIx64 ")", image_addr); 18760baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const char *prefix = "extern \"C\" int dlclose(void* handle);\n"; 1877360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ValueObjectSP result_valobj_sp; 187834507e41794909465d168af4048ebd07ee7819e8Greg Clayton ClangUserExpression::Evaluate (exe_ctx, 187934507e41794909465d168af4048ebd07ee7819e8Greg Clayton eExecutionPolicyAlways, 188034507e41794909465d168af4048ebd07ee7819e8Greg Clayton lldb::eLanguageTypeUnknown, 188134507e41794909465d168af4048ebd07ee7819e8Greg Clayton ClangUserExpression::eResultTypeAny, 188234507e41794909465d168af4048ebd07ee7819e8Greg Clayton unwind_on_error, 1883b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham ignore_breakpoints, 188434507e41794909465d168af4048ebd07ee7819e8Greg Clayton expr.GetData(), 188534507e41794909465d168af4048ebd07ee7819e8Greg Clayton prefix, 188634507e41794909465d168af4048ebd07ee7819e8Greg Clayton result_valobj_sp, 188734507e41794909465d168af4048ebd07ee7819e8Greg Clayton true, 188834507e41794909465d168af4048ebd07ee7819e8Greg Clayton ClangUserExpression::kDefaultTimeout); 18890baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (result_valobj_sp->GetError().Success()) 18900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 18910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Scalar scalar; 1892fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (result_valobj_sp->ResolveValue (scalar)) 18930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 18940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (scalar.UInt(1)) 18950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 18960baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData()); 18970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 18980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 18990baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 19000baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_image_tokens[image_token] = LLDB_INVALID_ADDRESS; 19010baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 19020baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 19030baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 19040baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 19050baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 19060baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = result_valobj_sp->GetError(); 19070baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 19080baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 19090baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 19100baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 19110baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 19120baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 19130baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 19140baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 19150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorString("invalid image token"); 19160baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 19170baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return error; 19180baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 19190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 192075906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonconst lldb::ABISP & 192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetABI() 192224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 192375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton if (!m_abi_sp) 192475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton m_abi_sp = ABI::FindPlugin(m_target.GetArchitecture()); 192575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return m_abi_sp; 192624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1928642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamLanguageRuntime * 1929e31176627725f4236c9ca049edc027756709780bJim InghamProcess::GetLanguageRuntime(lldb::LanguageType language, bool retry_if_null) 1930642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1931642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntimeCollection::iterator pos; 1932642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham pos = m_language_runtimes.find (language); 1933e31176627725f4236c9ca049edc027756709780bJim Ingham if (pos == m_language_runtimes.end() || (retry_if_null && !(*pos).second)) 1934642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham { 1935e31176627725f4236c9ca049edc027756709780bJim Ingham lldb::LanguageRuntimeSP runtime_sp(LanguageRuntime::FindPlugin(this, language)); 1936642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1937e31176627725f4236c9ca049edc027756709780bJim Ingham m_language_runtimes[language] = runtime_sp; 1938e31176627725f4236c9ca049edc027756709780bJim Ingham return runtime_sp.get(); 1939642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham } 1940642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham else 1941642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return (*pos).second.get(); 1942642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1943642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1944642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamCPPLanguageRuntime * 1945e31176627725f4236c9ca049edc027756709780bJim InghamProcess::GetCPPLanguageRuntime (bool retry_if_null) 1946642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1947e31176627725f4236c9ca049edc027756709780bJim Ingham LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus, retry_if_null); 1948642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus) 1949642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return static_cast<CPPLanguageRuntime *> (runtime); 1950642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return NULL; 1951642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1952642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1953642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamObjCLanguageRuntime * 1954e31176627725f4236c9ca049edc027756709780bJim InghamProcess::GetObjCLanguageRuntime (bool retry_if_null) 1955642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1956e31176627725f4236c9ca049edc027756709780bJim Ingham LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC, retry_if_null); 1957642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC) 1958642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return static_cast<ObjCLanguageRuntime *> (runtime); 1959642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return NULL; 1960642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1961642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 19626b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granatabool 19636b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico GranataProcess::IsPossibleDynamicValue (ValueObject& in_value) 19646b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata{ 19656b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata if (in_value.IsDynamic()) 19666b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata return false; 19676b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata LanguageType known_type = in_value.GetObjectRuntimeLanguage(); 19686b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata 19696b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata if (known_type != eLanguageTypeUnknown && known_type != eLanguageTypeC) 19706b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata { 19716b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata LanguageRuntime *runtime = GetLanguageRuntime (known_type); 19726b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata return runtime ? runtime->CouldHaveDynamicValue(in_value) : false; 19736b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata } 19746b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata 19756b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata LanguageRuntime *cpp_runtime = GetLanguageRuntime (eLanguageTypeC_plus_plus); 19766b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata if (cpp_runtime && cpp_runtime->CouldHaveDynamicValue(in_value)) 19776b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata return true; 19786b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata 19796b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata LanguageRuntime *objc_runtime = GetLanguageRuntime (eLanguageTypeObjC); 19806b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata return objc_runtime ? objc_runtime->CouldHaveDynamicValue(in_value) : false; 19816b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata} 19826b1763b5ab8f182029807293d74a66e1e1c6bafdEnrico Granata 198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointSiteList & 198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetBreakpointSiteList() 198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list; 198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 198824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 198924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst BreakpointSiteList & 199024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetBreakpointSiteList() const 199124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 199224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list; 199324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 199424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 199524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 199624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 199724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableAllBreakpointSites () 199824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1999ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton m_breakpoint_site_list.ForEach([this](BreakpointSite *bp_site) -> void { 2000ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton// bp_site->SetEnabled(true); 2001ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton DisableBreakpointSite(bp_site); 2002ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton }); 200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 200424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ClearBreakpointSiteByID (lldb::user_id_t break_id) 200724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (DisableBreakpointSiteByID (break_id)); 200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 201124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.Remove(break_id); 201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 201524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableBreakpointSiteByID (lldb::user_id_t break_id) 201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 202124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp->IsEnabled()) 2024efb4aeba2bd8411ac0aee9934f08959094d50711Jim Ingham error = DisableBreakpointSite (bp_site_sp.get()); 202524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20285f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat("invalid breakpoint site ID: %" PRIu64, break_id); 202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableBreakpointSiteByID (lldb::user_id_t break_id) 203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 203924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 204024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!bp_site_sp->IsEnabled()) 2042efb4aeba2bd8411ac0aee9934f08959094d50711Jim Ingham error = EnableBreakpointSite (bp_site_sp.get()); 204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 204424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 204524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20465f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat("invalid breakpoint site ID: %" PRIu64, break_id); 204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 204924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20513fd1f36c937575dbf57bae04c7ebaef78d8ecc1dStephen Wilsonlldb::break_id_t 205213d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg ClaytonProcess::CreateBreakpointSite (const BreakpointLocationSP &owner, bool use_hardware) 205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2054265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target); 205524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (load_addr != LLDB_INVALID_ADDRESS) 205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp; 205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Look up this breakpoint site. If it exists, then add this new owner, otherwise 206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // create a new breakpoint site and add it. 206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr); 206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp->AddOwner (owner); 206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner owner->SetBreakpointSite (bp_site_sp); 206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bp_site_sp->GetID(); 206924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 207236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, use_hardware)); 207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2075efb4aeba2bd8411ac0aee9934f08959094d50711Jim Ingham if (EnableBreakpointSite (bp_site_sp.get()).Success()) 207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner owner->SetBreakpointSite (bp_site_sp); 207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list.Add (bp_site_sp); 207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 208024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 208124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 208224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 208324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We failed to enable the breakpoint 208424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_BREAK_ID; 208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 208624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 208724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 208824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 208924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp) 209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 209124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id); 209224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_owners == 0) 209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2094700ff7ea54b2808112a521f51dc8ecb5a7f8d5eaJim Ingham // Don't try to disable the site if we don't have a live process anymore. 2095700ff7ea54b2808112a521f51dc8ecb5a7f8d5eaJim Ingham if (IsAlive()) 2096700ff7ea54b2808112a521f51dc8ecb5a7f8d5eaJim Ingham DisableBreakpointSite (bp_site_sp.get()); 209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress()); 209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const 210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_removed = 0; 210682820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham BreakpointSiteList bp_sites_in_range; 210724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 210882820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham if (m_breakpoint_site_list.FindInRange (bp_addr, bp_addr + size, bp_sites_in_range)) 210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2110ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton bp_sites_in_range.ForEach([bp_addr, size, buf, &bytes_removed](BreakpointSite *bp_site) -> void { 2111ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (bp_site->GetType() == BreakpointSite::eSoftware) 211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2113ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton addr_t intersect_addr; 2114ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton size_t intersect_size; 2115ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton size_t opcode_offset; 2116ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (bp_site->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset)) 211782820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham { 211882820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size); 211982820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size); 2120ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton assert(opcode_offset + intersect_size <= bp_site->GetByteSize()); 212182820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham size_t buf_offset = intersect_addr - bp_addr; 2122ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton ::memcpy(buf + buf_offset, bp_site->GetSavedOpcodeBytes() + opcode_offset, intersect_size); 212382820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham } 212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2125ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton }); 212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_removed; 212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2131b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 2132b1888f24fa181489840b9acf193e224d125d0776Greg Claytonsize_t 2133b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonProcess::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site) 2134b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 2135b1888f24fa181489840b9acf193e224d125d0776Greg Clayton PlatformSP platform_sp (m_target.GetPlatform()); 2136b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (platform_sp) 2137b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return platform_sp->GetSoftwareBreakpointTrapOpcode (m_target, bp_site); 2138b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return 0; 2139b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 2140b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableSoftwareBreakpoint (BreakpointSite *bp_site) 214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bp_site != NULL); 2146952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t bp_addr = bp_site->GetLoadAddress(); 214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 21495f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64, bp_site->GetID(), (uint64_t)bp_addr); 215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site->IsEnabled()) 215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 21535f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- already enabled", bp_site->GetID(), (uint64_t)bp_addr); 215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_addr == LLDB_INVALID_ADDRESS) 215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("BreakpointSite contains an invalid load address."); 216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Ask the lldb::Process subclass to fill in the correct software breakpoint 216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // trap for the breakpoint site 216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site); 216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_opcode_size == 0) 216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21685f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%" PRIx64, bp_addr); 216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes(); 217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 217424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_opcode_bytes == NULL) 217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode."); 217724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 217824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 217924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 218024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Save the original opcode by reading it 218124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size) 218224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Write a software breakpoint in place of the original opcode 218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t verify_bp_opcode_bytes[64]; 218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0) 219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetEnabled(true); 219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetType (BreakpointSite::eSoftware); 219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 21945f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- SUCCESS", 219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr); 219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 21999c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorString("failed to verify the breakpoint trap in memory."); 220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory to verify breakpoint trap."); 220324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 220524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to write breakpoint trap to memory."); 220624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory at breakpoint address."); 220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2210c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson if (log && error.Fail()) 22115f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- FAILED: %s", 221224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 221324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr, 221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.AsCString()); 221524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 221624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 221724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableSoftwareBreakpoint (BreakpointSite *bp_site) 222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bp_site != NULL); 2223952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t bp_addr = bp_site->GetLoadAddress(); 222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t breakID = bp_site->GetID(); 222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 2227efb4aeba2bd8411ac0aee9934f08959094d50711Jim Ingham log->Printf ("Process::DisableSoftwareBreakpoint (breakID = %" PRIu64 ") addr = 0x%" PRIx64, breakID, (uint64_t)bp_addr); 222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site->IsHardware()) 223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Breakpoint site is a hardware breakpoint."); 223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bp_site->IsEnabled()) 223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t break_op_size = bp_site->GetByteSize(); 223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes(); 223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (break_op_size > 0) 223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear a software breakoint instruction 224054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t curr_break_op[8]; 2241141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson assert (break_op_size <= sizeof(curr_break_op)); 224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool break_op_found = false; 224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Read the breakpoint opcode 224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size) 224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool verify = false; 224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure we have the a breakpoint opcode exists at this address 224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp (curr_break_op, break_op, break_op_size) == 0) 225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break_op_found = true; 225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We found a valid breakpoint opcode at this address, now restore 225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the saved opcode. 225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size) 225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner verify = true; 225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Memory write failed when restoring original opcode."); 226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Original breakpoint trap is no longer in memory."); 226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set verify to true and so we can check if the original opcode has already been restored 226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner verify = true; 226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (verify) 226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 227054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t verify_opcode[8]; 2271141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson assert (break_op_size < sizeof(verify_opcode)); 227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Verify that our original opcode made it back to the inferior 227324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size) 227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // compare the memory we just read with the original opcode 227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0) 227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // SUCCESS 227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetEnabled(false); 228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 22815f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr); 228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (break_op_found) 228724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to restore original opcode."); 228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 229124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored."); 229224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 229324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 229424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 229524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory that should contain the breakpoint trap."); 229624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 23015f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- already disabled", bp_site->GetID(), (uint64_t)bp_addr); 230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 23065f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- FAILED: %s", 230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr, 230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.AsCString()); 231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 231324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2314fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton// Uncomment to verify memory caching works after making changes to caching code 2315fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton//#define VERIFY_MEMORY_READS 2316fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 2317fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 2318fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 2319fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 2320f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan if (!GetDisableMemoryCache()) 2321f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan { 2322f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan#if defined (VERIFY_MEMORY_READS) 2323f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan // Memory caching is enabled, with debug verification 2324f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan 2325f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan if (buf && size) 2326f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan { 2327f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan // Uncomment the line below to make sure memory caching is working. 2328f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan // I ran this through the test suite and got no assertions, so I am 2329f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan // pretty confident this is working well. If any changes are made to 2330f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan // memory caching, uncomment the line below and test your changes! 2331f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan 2332f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan // Verify all memory reads by using the cache first, then redundantly 2333f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan // reading the same memory from the inferior and comparing to make sure 2334f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan // everything is exactly the same. 2335f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan std::string verify_buf (size, '\0'); 2336f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan assert (verify_buf.size() == size); 2337f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan const size_t cache_bytes_read = m_memory_cache.Read (this, addr, buf, size, error); 2338f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan Error verify_error; 2339f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan const size_t verify_bytes_read = ReadMemoryFromInferior (addr, const_cast<char *>(verify_buf.data()), verify_buf.size(), verify_error); 2340f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan assert (cache_bytes_read == verify_bytes_read); 2341f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan assert (memcmp(buf, verify_buf.data(), verify_buf.size()) == 0); 2342f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan assert (verify_error.Success() == error.Success()); 2343f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan return cache_bytes_read; 2344f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan } 2345f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan return 0; 2346f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan#else // !defined(VERIFY_MEMORY_READS) 2347f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan // Memory caching is enabled, without debug verification 2348f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan 2349f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan return m_memory_cache.Read (addr, buf, size, error); 2350f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan#endif // defined (VERIFY_MEMORY_READS) 2351f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan } 2352f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan else 2353f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan { 2354f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan // Memory caching is disabled 2355f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan 2356f90b5f34b87e0c1354b4d6f3d24830e69a2949a0Sean Callanan return ReadMemoryFromInferior (addr, buf, size, error); 2357fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton } 2358fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 2359fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 2360dd29b97f71187509df339596c3397dea0e429754Greg Claytonsize_t 2361dd29b97f71187509df339596c3397dea0e429754Greg ClaytonProcess::ReadCStringFromMemory (addr_t addr, std::string &out_str, Error &error) 2362dd29b97f71187509df339596c3397dea0e429754Greg Clayton{ 2363eeeb2afb11f0726a7990101e2d55aa470118dec4Greg Clayton char buf[256]; 2364dd29b97f71187509df339596c3397dea0e429754Greg Clayton out_str.clear(); 2365dd29b97f71187509df339596c3397dea0e429754Greg Clayton addr_t curr_addr = addr; 2366dd29b97f71187509df339596c3397dea0e429754Greg Clayton while (1) 2367dd29b97f71187509df339596c3397dea0e429754Greg Clayton { 2368dd29b97f71187509df339596c3397dea0e429754Greg Clayton size_t length = ReadCStringFromMemory (curr_addr, buf, sizeof(buf), error); 2369dd29b97f71187509df339596c3397dea0e429754Greg Clayton if (length == 0) 2370dd29b97f71187509df339596c3397dea0e429754Greg Clayton break; 2371dd29b97f71187509df339596c3397dea0e429754Greg Clayton out_str.append(buf, length); 2372dd29b97f71187509df339596c3397dea0e429754Greg Clayton // If we got "length - 1" bytes, we didn't get the whole C string, we 2373dd29b97f71187509df339596c3397dea0e429754Greg Clayton // need to read some more characters 2374dd29b97f71187509df339596c3397dea0e429754Greg Clayton if (length == sizeof(buf) - 1) 2375dd29b97f71187509df339596c3397dea0e429754Greg Clayton curr_addr += length; 2376dd29b97f71187509df339596c3397dea0e429754Greg Clayton else 2377dd29b97f71187509df339596c3397dea0e429754Greg Clayton break; 2378dd29b97f71187509df339596c3397dea0e429754Greg Clayton } 2379dd29b97f71187509df339596c3397dea0e429754Greg Clayton return out_str.size(); 2380dd29b97f71187509df339596c3397dea0e429754Greg Clayton} 2381dd29b97f71187509df339596c3397dea0e429754Greg Clayton 2382fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 2383fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 2384347d722127cc6a19b077244305c3d350ea4ef80eAshok ThirumurthiProcess::ReadStringFromMemory (addr_t addr, char *dst, size_t max_bytes, Error &error, 2385347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi size_t type_width) 2386347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi{ 2387347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi size_t total_bytes_read = 0; 2388347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi if (dst && max_bytes && type_width && max_bytes >= type_width) 2389347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi { 2390347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi // Ensure a null terminator independent of the number of bytes that is read. 2391347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi memset (dst, 0, max_bytes); 2392347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi size_t bytes_left = max_bytes - type_width; 2393347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi 2394347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi const char terminator[4] = {'\0', '\0', '\0', '\0'}; 2395347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi assert(sizeof(terminator) >= type_width && 2396347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi "Attempting to validate a string with more than 4 bytes per character!"); 2397347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi 2398347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi addr_t curr_addr = addr; 2399347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize(); 2400347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi char *curr_dst = dst; 2401347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi 2402347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi error.Clear(); 2403347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi while (bytes_left > 0 && error.Success()) 2404347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi { 2405347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size); 2406347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); 2407347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error); 2408347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi 2409347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi if (bytes_read == 0) 2410347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi break; 2411347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi 2412347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi // Search for a null terminator of correct size and alignment in bytes_read 2413347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi size_t aligned_start = total_bytes_read - total_bytes_read % type_width; 2414347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi for (size_t i = aligned_start; i + type_width <= total_bytes_read + bytes_read; i += type_width) 2415347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi if (::strncmp(&dst[i], terminator, type_width) == 0) 2416347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi { 2417347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi error.Clear(); 2418347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi return i; 2419347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi } 2420347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi 2421347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi total_bytes_read += bytes_read; 2422347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi curr_dst += bytes_read; 2423347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi curr_addr += bytes_read; 2424347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi bytes_left -= bytes_read; 2425347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi } 2426347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi } 2427347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi else 2428347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi { 2429347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi if (max_bytes) 2430347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi error.SetErrorString("invalid arguments"); 2431347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi } 2432347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi return total_bytes_read; 2433347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi} 2434347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi 2435347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi// Deprecated in favor of ReadStringFromMemory which has wchar support and correct code to find 2436347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi// null terminators. 2437347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthisize_t 24384a2e33769873d68d5703da5742c0e248f46e3a72Greg ClaytonProcess::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len, Error &result_error) 2439b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 2440b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t total_cstr_len = 0; 2441b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (dst && dst_max_len) 2442b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 24434a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton result_error.Clear(); 2444b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // NULL out everything just to be safe 2445b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton memset (dst, 0, dst_max_len); 2446b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 2447b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton addr_t curr_addr = addr; 2448b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize(); 2449b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t bytes_left = dst_max_len - 1; 2450b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton char *curr_dst = dst; 2451b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 2452b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton while (bytes_left > 0) 2453b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 2454b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size); 2455b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); 2456b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error); 2457b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 2458b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (bytes_read == 0) 2459b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 24604a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton result_error = error; 2461b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton dst[total_cstr_len] = '\0'; 2462b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 2463b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 2464b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const size_t len = strlen(curr_dst); 2465b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 2466b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton total_cstr_len += len; 2467b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 2468b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (len < bytes_to_read) 2469b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 2470b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 2471b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton curr_dst += bytes_read; 2472b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton curr_addr += bytes_read; 2473b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton bytes_left -= bytes_read; 2474b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 2475b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 24764a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton else 24774a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton { 24784a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton if (dst == NULL) 24794a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton result_error.SetErrorString("invalid arguments"); 24804a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton else 24814a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton result_error.Clear(); 24824a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton } 2483b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return total_cstr_len; 2484b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 2485b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 2486b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonsize_t 2487fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemoryFromInferior (addr_t addr, void *buf, size_t size, Error &error) 2488fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (buf == NULL || size == 0) 249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_read = 0; 249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t *bytes = (uint8_t *)buf; 249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (bytes_read < size) 249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_size = size - bytes_read; 249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_bytes_read = DoReadMemory (addr + bytes_read, 249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes + bytes_read, 250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 250124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_read += curr_bytes_read; 250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_read == curr_size || curr_bytes_read == 0) 250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Replace any software breakpoint opcodes that fall into this range back 250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // into "buf" before we return 250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_read > 0) 251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf); 251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_read; 251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2514f72fdeee129bbd7195f3db888b561ede689886aaGreg Claytonuint64_t 2515c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadUnsignedIntegerFromMemory (lldb::addr_t vm_addr, size_t integer_byte_size, uint64_t fail_value, Error &error) 2516f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton{ 2517c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar scalar; 2518c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar, error)) 2519c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return scalar.ULongLong(fail_value); 2520c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return fail_value; 2521c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 2522c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2523c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonaddr_t 2524c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadPointerFromMemory (lldb::addr_t vm_addr, Error &error) 2525c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 2526c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar scalar; 2527c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar, error)) 2528c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return scalar.ULongLong(LLDB_INVALID_ADDRESS); 2529c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return LLDB_INVALID_ADDRESS; 2530c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 2531c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2532c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2533c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonbool 2534c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::WritePointerToMemory (lldb::addr_t vm_addr, 2535c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::addr_t ptr_value, 2536c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error &error) 2537c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 2538c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar scalar; 2539c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton const uint32_t addr_byte_size = GetAddressByteSize(); 2540c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (addr_byte_size <= 4) 2541c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = (uint32_t)ptr_value; 2542f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton else 2543c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = ptr_value; 2544c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) == addr_byte_size; 2545f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton} 2546f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton 254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error) 254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_written = 0; 255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t *bytes = (const uint8_t *)buf; 255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (bytes_written < size) 255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_size = size - bytes_written; 255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written, 255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes + bytes_written, 255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += curr_bytes_written; 256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_written == curr_size || curr_bytes_written == 0) 256224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error) 256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2570fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#if defined (ENABLE_MEMORY_CACHING) 2571fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton m_memory_cache.Flush (addr, size); 2572fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif 2573fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (buf == NULL || size == 0) 257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 2576e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 257721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.BumpMemoryID(); 2578e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We need to write any data that would go where any current software traps 258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // (enabled software breakpoints) any software traps (breakpoints) that we 258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // may have placed in our tasks memory. 258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2583ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton BreakpointSiteList bp_sites_in_range; 2584ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton 2585ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (m_breakpoint_site_list.FindInRange (addr, addr + size, bp_sites_in_range)) 258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2587ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // No breakpoint sites overlap 2588ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (bp_sites_in_range.IsEmpty()) 2589ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton return WriteMemoryPrivate (addr, buf, size, error); 2590ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton else 259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2592ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton const uint8_t *ubuf = (const uint8_t *)buf; 2593ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton uint64_t bytes_written = 0; 259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2595ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton bp_sites_in_range.ForEach([this, addr, size, &bytes_written, &ubuf, &error](BreakpointSite *bp) -> void { 2596ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton 2597ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (error.Success()) 2598ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 2599ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton addr_t intersect_addr; 2600ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton size_t intersect_size; 2601ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton size_t opcode_offset; 2602ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton const bool intersects = bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset); 2603ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton assert(intersects); 2604ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton assert(addr <= intersect_addr && intersect_addr < addr + size); 2605ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size); 2606ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton assert(opcode_offset + intersect_size <= bp->GetByteSize()); 2607ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton 2608ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // Check for bytes before this breakpoint 2609ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton const addr_t curr_addr = addr + bytes_written; 2610ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (intersect_addr > curr_addr) 2611ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 2612ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // There are some bytes before this breakpoint that we need to 2613ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // just write to memory 2614ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton size_t curr_size = intersect_addr - curr_addr; 2615ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton size_t curr_bytes_written = WriteMemoryPrivate (curr_addr, 2616ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton ubuf + bytes_written, 2617ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton curr_size, 2618ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton error); 2619ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton bytes_written += curr_bytes_written; 2620ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (curr_bytes_written != curr_size) 2621ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 2622ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // We weren't able to write all of the requested bytes, we 2623ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // are done looping and will return the number of bytes that 2624ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // we have written so far. 2625ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (error.Success()) 2626ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton error.SetErrorToGenericError(); 2627ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 2628ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 2629ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // Now write any bytes that would cover up any software breakpoints 2630ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton // directly into the breakpoint opcode buffer 2631ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size); 2632ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton bytes_written += intersect_size; 2633ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 2634ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton }); 2635ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton 2636ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton if (bytes_written < size) 2637ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton bytes_written += WriteMemoryPrivate (addr + bytes_written, 2638ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton ubuf + bytes_written, 2639ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton size - bytes_written, 2640ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton error); 2641ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 2642ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton } 2643ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton else 2644ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton { 2645ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton return WriteMemoryPrivate (addr, buf, size, error); 264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Write any remaining bytes after the last breakpoint if we have any left 2649ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton return 0; //bytes_written; 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2651c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2652c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonsize_t 265336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonProcess::WriteScalarToMemory (addr_t addr, const Scalar &scalar, size_t byte_size, Error &error) 2654c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 2655c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size == UINT32_MAX) 2656c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton byte_size = scalar.GetByteSize(); 2657c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size > 0) 2658c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2659c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint8_t buf[32]; 2660c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton const size_t mem_size = scalar.GetAsMemoryData (buf, byte_size, GetByteOrder(), error); 2661c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (mem_size > 0) 2662c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return WriteMemory(addr, buf, mem_size, error); 2663c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 2664c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorString ("failed to get scalar as memory data"); 2665c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2666c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 2667c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2668c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorString ("invalid scalar value"); 2669c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2670c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return 0; 2671c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 2672c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2673c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonsize_t 2674c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadScalarIntegerFromMemory (addr_t addr, 2675c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint32_t byte_size, 2676c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton bool is_signed, 2677c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar &scalar, 2678c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error &error) 2679c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 2680a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton uint64_t uval = 0; 2681a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton if (byte_size == 0) 2682a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton { 2683a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton error.SetErrorString ("byte size is zero"); 2684a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton } 2685a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton else if (byte_size & (byte_size - 1)) 2686c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2687a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton error.SetErrorStringWithFormat ("byte size %u is not a power of 2", byte_size); 2688a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton } 2689a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton else if (byte_size <= sizeof(uval)) 2690a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton { 2691a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton const size_t bytes_read = ReadMemory (addr, &uval, byte_size, error); 2692c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (bytes_read == byte_size) 2693c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2694c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton DataExtractor data (&uval, sizeof(uval), GetByteOrder(), GetAddressByteSize()); 269536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 2696a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton if (byte_size <= 4) 2697a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton scalar = data.GetMaxU32 (&offset, byte_size); 2698c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 2699a0fbd4678915fa07d03ad3bede2342acdbdbf8e7Greg Clayton scalar = data.GetMaxU64 (&offset, byte_size); 2700c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (is_signed) 2701c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar.SignExtend(byte_size * 8); 2702c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return bytes_read; 2703c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2704c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2705c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 2706c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2707c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size); 2708c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2709c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return 0; 2710c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 2711c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2712613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#define USE_ALLOCATE_MEMORY_CACHE 1 271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t 271424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::AllocateMemory(size_t size, uint32_t permissions, Error &error) 271524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2716e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham if (GetPrivateState() != eStateStopped) 2717e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham return LLDB_INVALID_ADDRESS; 2718e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham 2719613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#if defined (USE_ALLOCATE_MEMORY_CACHE) 2720613b8739a4d489b7f1c571288d5786768c024205Greg Clayton return m_allocated_memory_cache.AllocateMemory(size, permissions, error); 2721613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#else 27222860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton addr_t allocated_addr = DoAllocateMemory (size, permissions, error); 2723952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 27242860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton if (log) 27255f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("Process::AllocateMemory(size=%4zu, permissions=%s) => 0x%16.16" PRIx64 " (m_stop_id = %u m_memory_id = %u)", 27262860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton size, 2727613b8739a4d489b7f1c571288d5786768c024205Greg Clayton GetPermissionsAsCString (permissions), 27282860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton (uint64_t)allocated_addr, 272921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetStopID(), 273021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetMemoryID()); 27312860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton return allocated_addr; 2732613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#endif 273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27356cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callananbool 27366cf6c474742a23e7cb6b4f618bf1de711db90a85Sean CallananProcess::CanJIT () 27376cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan{ 273804200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan if (m_can_jit == eCanJITDontKnow) 273904200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan { 274004200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan Error err; 274104200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan 274204200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan uint64_t allocated_memory = AllocateMemory(8, 274304200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable, 274404200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan err); 274504200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan 274604200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan if (err.Success()) 274704200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan m_can_jit = eCanJITYes; 274804200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan else 274904200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan m_can_jit = eCanJITNo; 275004200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan 275104200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan DeallocateMemory (allocated_memory); 275204200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan } 275304200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan 27546cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan return m_can_jit == eCanJITYes; 27556cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan} 27566cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan 27576cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callananvoid 27586cf6c474742a23e7cb6b4f618bf1de711db90a85Sean CallananProcess::SetCanJIT (bool can_jit) 27596cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan{ 27606cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan m_can_jit = (can_jit ? eCanJITYes : eCanJITNo); 27616cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan} 27626cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan 276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DeallocateMemory (addr_t ptr) 276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2766613b8739a4d489b7f1c571288d5786768c024205Greg Clayton Error error; 2767613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#if defined (USE_ALLOCATE_MEMORY_CACHE) 2768613b8739a4d489b7f1c571288d5786768c024205Greg Clayton if (!m_allocated_memory_cache.DeallocateMemory(ptr)) 2769613b8739a4d489b7f1c571288d5786768c024205Greg Clayton { 27705f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat ("deallocation of memory at 0x%" PRIx64 " failed.", (uint64_t)ptr); 2771613b8739a4d489b7f1c571288d5786768c024205Greg Clayton } 2772613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#else 2773613b8739a4d489b7f1c571288d5786768c024205Greg Clayton error = DoDeallocateMemory (ptr); 27742860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton 2775952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 27762860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton if (log) 27775f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("Process::DeallocateMemory(addr=0x%16.16" PRIx64 ") => err = %s (m_stop_id = %u, m_memory_id = %u)", 27782860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton ptr, 27792860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton error.AsCString("SUCCESS"), 278021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetStopID(), 278121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetMemoryID()); 2782613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#endif 27832860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton return error; 278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27862529aa356e8cf9c1395da46f66ea2518dfa1982dHan Ming Ong 2787b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonModuleSP 27889ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcess::ReadModuleFromMemory (const FileSpec& file_spec, 27892ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton lldb::addr_t header_addr) 2790b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 27916c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton ModuleSP module_sp (new Module (file_spec, ArchSpec())); 2792b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (module_sp) 2793b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton { 27946c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton Error error; 27956c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton ObjectFile *objfile = module_sp->GetMemoryObjectFile (shared_from_this(), header_addr, error); 27966c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton if (objfile) 27976c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton return module_sp; 2798b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton } 27996c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton return ModuleSP(); 2800b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 280124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 28039c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamProcess::EnableWatchpoint (Watchpoint *watchpoint, bool notify) 280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("watchpoints are not supported"); 280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 28119c970a371511a0e31ba9360aa841d445792c1ab0Jim InghamProcess::DisableWatchpoint (Watchpoint *watchpoint, bool notify) 281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("watchpoints are not supported"); 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp) 282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state; 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now wait for the process to launch and return control to us, and then 282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // call DidLaunch: 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (1) 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 282672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton event_sp.reset(); 282772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton state = WaitForStateChangedEventsPrivate (timeout, event_sp); 282872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 2829202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton if (StateIsStoppedState(state, false)) 283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 283172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 283272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton // If state is invalid, then we timed out 283372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (state == eStateInvalid) 283472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton break; 283572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 283672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (event_sp) 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 284024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 284336bc5ea5a48c19421d44f559e2165c105657b809Greg ClaytonProcess::Launch (const ProcessLaunchInfo &launch_info) 284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 284775c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap.reset(); 284837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 2849861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28515beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module *exe_module = m_target.GetExecutableModulePointer(); 285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_module) 285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2854180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton char local_exec_file_path[PATH_MAX]; 2855180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton char platform_exec_file_path[PATH_MAX]; 2856180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path)); 2857180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path)); 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_module->GetFileSpec().Exists()) 285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2860a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton if (PrivateStateThreadIsValid ()) 2861a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton PausePrivateStateThread (); 2862a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = WillLaunch (exe_module); 286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28667c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham const bool restarted = false; 28677c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham SetPublicState (eStateLaunching, restarted); 2868ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_should_detach = false; 286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2870cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste if (m_public_run_lock.TrySetRunning()) 2871777c6b7bf6ee77604942de17fc19c0421603fbe1Greg Clayton { 2872777c6b7bf6ee77604942de17fc19c0421603fbe1Greg Clayton // Now launch using these arguments. 2873777c6b7bf6ee77604942de17fc19c0421603fbe1Greg Clayton error = DoLaunch (exe_module, launch_info); 2874777c6b7bf6ee77604942de17fc19c0421603fbe1Greg Clayton } 2875777c6b7bf6ee77604942de17fc19c0421603fbe1Greg Clayton else 2876777c6b7bf6ee77604942de17fc19c0421603fbe1Greg Clayton { 2877777c6b7bf6ee77604942de17fc19c0421603fbe1Greg Clayton // This shouldn't happen 2878777c6b7bf6ee77604942de17fc19c0421603fbe1Greg Clayton error.SetErrorString("failed to acquire process run lock"); 2879777c6b7bf6ee77604942de17fc19c0421603fbe1Greg Clayton } 288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Fail()) 288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetID() != LLDB_INVALID_PROCESS_ID) 288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetID (LLDB_INVALID_PROCESS_ID); 288624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *error_string = error.AsCString(); 288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error_string == NULL) 288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_string = "launch failed"; 288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetExitStatus (-1, error_string); 289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 289124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 28954985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton TimeValue timeout_time; 28964985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton timeout_time = TimeValue::Now(); 28974985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton timeout_time.OffsetWithSeconds(10); 28984985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton StateType state = WaitForProcessStopPrivate(&timeout_time, event_sp); 289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29004985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton if (state == eStateInvalid || event_sp.get() == NULL) 29014985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton { 29024985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton // We were able to launch the process, but we failed to 29034985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton // catch the initial stop. 29044985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton SetExitStatus (0, "failed to catch stop after launch"); 29054985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton Destroy(); 29064985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton } 29074985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton else if (state == eStateStopped || state == eStateCrashed) 290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 290975c703dd8b492bad25a987b96853626641ae7246Greg Clayton 291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidLaunch (); 291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton DynamicLoader *dyld = GetDynamicLoader (); 29139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (dyld) 29149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton dyld->DidLaunch(); 291575c703dd8b492bad25a987b96853626641ae7246Greg Clayton 291637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This delays passing the stopped event to listeners till DidLaunch gets 291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a chance to complete... 291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 2920a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton 2921a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton if (PrivateStateThreadIsValid ()) 2922a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton ResumePrivateStateThread (); 2923a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton else 2924a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton StartPrivateStateThread (); 292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (state == eStateExited) 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We exited while trying to launch somehow. Don't call DidLaunch as that's 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // not likely to work, and return an invalid pid. 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29379c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("file doesn't exist: '%s'", local_exec_file_path); 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 294446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonError 294546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcess::LoadCore () 294646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 294746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Error error = DoLoadCore(); 294846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (error.Success()) 294946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 295046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (PrivateStateThreadIsValid ()) 295146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ResumePrivateStateThread (); 295246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton else 295346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton StartPrivateStateThread (); 295446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 29559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton DynamicLoader *dyld = GetDynamicLoader (); 29569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (dyld) 29579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton dyld->DidAttach(); 29589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 29599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 296046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // We successfully loaded a core file, now pretend we stopped so we can 296146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // show all of the threads in the core file and explore the crashed 296246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // state. 296346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton SetPrivateState (eStateStopped); 296446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 296546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 296646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return error; 296746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 296846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 29699ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonDynamicLoader * 29709ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcess::GetDynamicLoader () 29719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 29729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_dyld_ap.get() == NULL) 29739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL)); 29749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return m_dyld_ap.get(); 29759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 297646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 297746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 2978c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::NextEventAction::EventActionResult 2979c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp) 298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2981c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham StateType state = ProcessEventData::GetStateFromEvent (event_sp.get()); 2982c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham switch (state) 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29847e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateRunning: 2985a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton case eStateConnected: 29867e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton return eEventActionRetry; 29877e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 29887e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateStopped: 29897e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateCrashed: 29902d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton { 29912d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton // During attach, prior to sending the eStateStopped event, 29927fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham // lldb_private::Process subclasses must set the new process ID. 29932d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID); 29947c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham // We don't want these events to be reported, so go set the ShouldReportStop here: 29957c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham m_process->GetThreadList().SetShouldReportStop (eVoteNo); 29967c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham 29972d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton if (m_exec_count > 0) 29982d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton { 29992d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton --m_exec_count; 30007c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham RequestResume(); 30012d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton return eEventActionRetry; 30022d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton } 30032d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton else 30042d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton { 30052d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton m_process->CompleteAttach (); 30062d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton return eEventActionSuccess; 30072d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton } 30082d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton } 30097e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton break; 30102d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton 30117e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton default: 30127e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateExited: 30137e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateInvalid: 30147e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton break; 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30162d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton 30172d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton m_exit_string.assign ("No valid Process"); 30182d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton return eEventActionExit; 3019c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham} 3020c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 3021c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::NextEventAction::EventActionResult 3022c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::AttachCompletionHandler::HandleBeingInterrupted() 3023c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham{ 3024c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham return eEventActionSuccess; 3025c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham} 3026c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 3027c2dc7c88cebe05cce059970cc907768256b28a42Jim Inghamconst char * 3028c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::AttachCompletionHandler::GetExitString () 3029c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham{ 3030c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham return m_exit_string.c_str(); 303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 3034527154d8e532f27f25af226c9e1dac607c48b5d1Greg ClaytonProcess::Attach (ProcessAttachInfo &attach_info) 303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 3037861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 303875c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap.reset(); 303937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 30407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 3041527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton lldb::pid_t attach_pid = attach_info.GetProcessID(); 3042e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 3043527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (attach_pid == LLDB_INVALID_PROCESS_ID) 30447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 3045527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton char process_name[PATH_MAX]; 30460d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham 3047527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (attach_info.GetExecutableFile().GetPath (process_name, sizeof(process_name))) 3048ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham { 3049527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const bool wait_for_launch = attach_info.GetWaitForLaunch(); 3050527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 3051527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (wait_for_launch) 3052e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 3053527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error = WillAttachToProcessWithName(process_name, wait_for_launch); 3054527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (error.Success()) 3055527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 3056cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste if (m_public_run_lock.TrySetRunning()) 3057d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton { 3058d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton m_should_detach = true; 30597c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham const bool restarted = false; 30607c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham SetPublicState (eStateAttaching, restarted); 3061d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton // Now attach using these arguments. 3062d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton error = DoAttachToProcessWithName (process_name, wait_for_launch, attach_info); 3063d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton } 3064d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton else 3065d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton { 3066d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton // This shouldn't happen 3067d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton error.SetErrorString("failed to acquire process run lock"); 3068d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton } 3069ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton 3070527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (error.Fail()) 3071527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 3072527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 3073527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 3074527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetID (LLDB_INVALID_PROCESS_ID); 3075527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (error.AsCString() == NULL) 3076527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString("attach failed"); 3077527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 3078527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetExitStatus(-1, error.AsCString()); 3079527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 3080527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 3081527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 3082527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 3083527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount())); 3084527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton StartPrivateStateThread(); 3085527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 3086527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return error; 3087527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 3088e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 3089527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 3090e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 3091527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton ProcessInstanceInfoList process_infos; 3092527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton PlatformSP platform_sp (m_target.GetPlatform ()); 3093527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 3094527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (platform_sp) 3095527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 3096527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton ProcessInstanceInfoMatch match_info; 3097527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton match_info.GetProcessInfo() = attach_info; 3098527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton match_info.SetNameMatchType (eNameMatchEquals); 3099527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton platform_sp->FindProcesses (match_info, process_infos); 3100527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const uint32_t num_matches = process_infos.GetSize(); 3101527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (num_matches == 1) 3102527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 3103527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton attach_pid = process_infos.GetProcessIDAtIndex(0); 3104527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // Fall through and attach using the above process ID 3105527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 3106527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 3107527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 3108527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton match_info.GetProcessInfo().GetExecutableFile().GetPath (process_name, sizeof(process_name)); 3109527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (num_matches > 1) 3110527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorStringWithFormat ("more than one process named %s", process_name); 3111527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 3112527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorStringWithFormat ("could not find a process named %s", process_name); 3113527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 3114527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 3115527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 3116527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 3117527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString ("invalid platform, can't find processes by name"); 3118527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return error; 3119527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 3120e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 3121e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 3122e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 3123527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 3124527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString ("invalid process name"); 3125ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham } 31267508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 3127527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 3128527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (attach_pid != LLDB_INVALID_PROCESS_ID) 312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3130527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error = WillAttachToProcessWithID(attach_pid); 3131e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error.Success()) 313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3133527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 3134cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste if (m_public_run_lock.TrySetRunning()) 3135d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton { 3136d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton // Now attach using these arguments. 3137d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton m_should_detach = true; 31387c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham const bool restarted = false; 31397c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham SetPublicState (eStateAttaching, restarted); 3140d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton error = DoAttachToProcessWithID (attach_pid, attach_info); 3141d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton } 3142d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton else 3143d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton { 3144d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton // This shouldn't happen 3145d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton error.SetErrorString("failed to acquire process run lock"); 3146d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton } 3147d34a3b23c8a90f7c32cbb0b7a9e4899bfb7ff53cGreg Clayton 3148527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (error.Success()) 3149527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 3150527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 3151527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount())); 3152527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton StartPrivateStateThread(); 3153527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 3154527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3156e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 3157e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 3158e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetID (LLDB_INVALID_PROCESS_ID); 3159e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton const char *error_string = error.AsCString(); 3160e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error_string == NULL) 3161e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error_string = "attach failed"; 316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3163e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetExitStatus(-1, error_string); 3164e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 3165e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 317175c703dd8b492bad25a987b96853626641ae7246Greg Claytonvoid 317275c703dd8b492bad25a987b96853626641ae7246Greg ClaytonProcess::CompleteAttach () 317375c703dd8b492bad25a987b96853626641ae7246Greg Clayton{ 317475c703dd8b492bad25a987b96853626641ae7246Greg Clayton // Let the process subclass figure out at much as it can about the process 317575c703dd8b492bad25a987b96853626641ae7246Greg Clayton // before we go looking for a dynamic loader plug-in. 317675c703dd8b492bad25a987b96853626641ae7246Greg Clayton DidAttach(); 317775c703dd8b492bad25a987b96853626641ae7246Greg Clayton 31780d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham // We just attached. If we have a platform, ask it for the process architecture, and if it isn't 31790d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham // the same as the one we've already set, switch architectures. 31800d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham PlatformSP platform_sp (m_target.GetPlatform ()); 31810d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham assert (platform_sp.get()); 31820d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham if (platform_sp) 31830d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham { 3184b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton const ArchSpec &target_arch = m_target.GetArchitecture(); 3185aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton if (target_arch.IsValid() && !platform_sp->IsCompatibleArchitecture (target_arch, false, NULL)) 3186b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 3187b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ArchSpec platform_arch; 3188b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_sp = platform_sp->GetPlatformForArchitecture (target_arch, &platform_arch); 3189b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (platform_sp) 3190b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 3191b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_target.SetPlatform (platform_sp); 3192b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_target.SetArchitecture(platform_arch); 3193b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 3194b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 3195b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton else 3196b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 3197b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ProcessInstanceInfo process_info; 3198b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_sp->GetProcessInfo (GetID(), process_info); 3199b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton const ArchSpec &process_arch = process_info.GetArchitecture(); 320040e278caddf5442776f9408f20d757cc85fe630aSean Callanan if (process_arch.IsValid() && !m_target.GetArchitecture().IsExactMatch(process_arch)) 3201b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_target.SetArchitecture (process_arch); 3202b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 32030d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham } 32040d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham 32050d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham // We have completed the attach, now it is time to find the dynamic loader 320675c703dd8b492bad25a987b96853626641ae7246Greg Clayton // plug-in 32079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton DynamicLoader *dyld = GetDynamicLoader (); 32089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (dyld) 32099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton dyld->DidAttach(); 321075c703dd8b492bad25a987b96853626641ae7246Greg Clayton 321137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 321275c703dd8b492bad25a987b96853626641ae7246Greg Clayton // Figure out which one is the executable, and set that in our target: 3213146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata const ModuleList &target_modules = m_target.GetImages(); 32149336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham Mutex::Locker modules_locker(target_modules.GetMutex()); 32159336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham size_t num_modules = target_modules.GetSize(); 32169336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham ModuleSP new_executable_module_sp; 321775c703dd8b492bad25a987b96853626641ae7246Greg Clayton 32183e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs for (size_t i = 0; i < num_modules; i++) 321975c703dd8b492bad25a987b96853626641ae7246Greg Clayton { 32209336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham ModuleSP module_sp (target_modules.GetModuleAtIndexUnlocked (i)); 3221b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (module_sp && module_sp->IsExecutable()) 322275c703dd8b492bad25a987b96853626641ae7246Greg Clayton { 32235beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton if (m_target.GetExecutableModulePointer() != module_sp.get()) 32249336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham new_executable_module_sp = module_sp; 322575c703dd8b492bad25a987b96853626641ae7246Greg Clayton break; 322675c703dd8b492bad25a987b96853626641ae7246Greg Clayton } 322775c703dd8b492bad25a987b96853626641ae7246Greg Clayton } 32289336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham if (new_executable_module_sp) 32299336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham m_target.SetExecutableModule (new_executable_module_sp, false); 323075c703dd8b492bad25a987b96853626641ae7246Greg Clayton} 323175c703dd8b492bad25a987b96853626641ae7246Greg Clayton 323224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 3233fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason MolendaProcess::ConnectRemote (Stream *strm, const char *remote_url) 3234e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton{ 3235e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton m_abi_sp.reset(); 3236e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton m_process_input_reader.reset(); 3237e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 3238e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // Find the process and its architecture. Make sure it matches the architecture 3239e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // of the current Target, and if not adjust it. 3240e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 3241fac2e62f08719ba800a440b7ad0d5a55a26dc620Jason Molenda Error error (DoConnectRemote (strm, remote_url)); 3242e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton if (error.Success()) 3243e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton { 3244a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 3245a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton { 324624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton EventSP event_sp; 324724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton StateType state = WaitForProcessStopPrivate(NULL, event_sp); 324824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 324924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (state == eStateStopped || state == eStateCrashed) 325024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 325124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // If we attached and actually have a process on the other end, then 325224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // this ended up being the equivalent of an attach. 325324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton CompleteAttach (); 325424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 325524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // This delays passing the stopped event to listeners till 325624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // CompleteAttach gets a chance to complete... 325724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton HandlePrivateEvent (event_sp); 325824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 325924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 3260a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton } 326124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 326224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (PrivateStateThreadIsValid ()) 326324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ResumePrivateStateThread (); 326424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 326524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton StartPrivateStateThread (); 3266e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton } 3267e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton return error; 3268e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton} 3269e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 3270e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 3271e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg ClaytonError 3272027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim InghamProcess::PrivateResume () 327324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3274952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS|LIBLLDB_LOG_STEP)); 327524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 327689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf("Process::PrivateResume() m_stop_id = %u, public state: %s private state: %s", 327721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetStopID(), 3278ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham StateAsCString(m_public_state.GetValue()), 3279ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham StateAsCString(m_private_state.GetValue())); 328024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 328124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillResume()); 328224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Tell the process it is about to resume before the thread list 328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32859c11d478f7c2a1611b591cd599782b7a0a8c5c37Johnny Chen // Now let the thread list know we are about to resume so it 328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // can let all of our threads know that they are about to be 328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // resumed. Threads will each be called with 328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Thread::WillResume(StateType) where StateType contains the state 328924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // that they are supposed to have when the process is resumed 329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // (suspended/running/stepping). Threads should also check 329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // their resume signal in lldb::Thread::GetResumeSignal() 32927c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham // to see if they are supposed to start back up with a signal. 329324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_list.WillResume()) 329424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32951831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham // Last thing, do the PreResumeActions. 32961831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham if (!RunPreResumeActions()) 329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 329889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham error.SetErrorStringWithFormat ("Process::PrivateResume PreResumeActions failed, not resuming."); 32991831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham } 33001831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham else 33011831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham { 33021831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham m_mod_id.BumpResumeID(); 33031831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham error = DoResume(); 33041831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham if (error.Success()) 33051831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham { 33061831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham DidResume(); 33071831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham m_thread_list.DidResume(); 33081831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham if (log) 33091831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham log->Printf ("Process thinks the process has resumed."); 33101831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham } 331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 331224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33150c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham // Somebody wanted to run without running. So generate a continue & a stopped event, 33160c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham // and let the world handle them. 33170c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham if (log) 33180c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham log->Printf ("Process::PrivateResume() asked to simulate a start & stop."); 33190c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham 33200c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham SetPrivateState(eStateRunning); 33210c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham SetPrivateState(eStateStopped); 332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3324ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham else if (log) 332589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Process::PrivateResume() got an error \"%s\".", error.AsCString("<unknown error>")); 332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 332724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 3330addad59552c206466dea98c4a645a471a41252b4Greg ClaytonProcess::Halt (bool clear_thread_plans) 333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3332addad59552c206466dea98c4a645a471a41252b4Greg Clayton // Don't clear the m_clear_thread_plans_on_stop, only set it to true if 3333addad59552c206466dea98c4a645a471a41252b4Greg Clayton // in case it was already set and some thread plan logic calls halt on its 3334addad59552c206466dea98c4a645a471a41252b4Greg Clayton // own. 3335addad59552c206466dea98c4a645a471a41252b4Greg Clayton m_clear_thread_plans_on_stop |= clear_thread_plans; 3336addad59552c206466dea98c4a645a471a41252b4Greg Clayton 33374389256aecd2693109969c21fa2f00c4612320b3Jim Ingham // First make sure we aren't in the middle of handling an event, or we might restart. This is pretty weak, since 33384389256aecd2693109969c21fa2f00c4612320b3Jim Ingham // we could just straightaway get another event. It just narrows the window... 33394389256aecd2693109969c21fa2f00c4612320b3Jim Ingham m_currently_handling_event.WaitForValueEqualTo(false); 33404389256aecd2693109969c21fa2f00c4612320b3Jim Ingham 33414389256aecd2693109969c21fa2f00c4612320b3Jim Ingham 3342c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Pause our private state thread so we can ensure no one else eats 3343c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // the stop event out from under us. 3344f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Listener halt_listener ("lldb.process.halt_listener"); 3345f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham HijackPrivateProcessEvents(&halt_listener); 3346c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 3347c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham EventSP event_sp; 33487e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton Error error (WillHalt()); 334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33507e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton if (error.Success()) 3351c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 335220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 33537e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton bool caused_stop = false; 33547e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 33557e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // Ask the process subclass to actually halt our process 33567e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton error = DoHalt(caused_stop); 335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 33583ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 33597e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton if (m_public_state.GetValue() == eStateAttaching) 33607e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton { 33617e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton SetExitStatus(SIGKILL, "Cancelled async attach."); 33627e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton Destroy (); 33637e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton } 33647e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton else 33653ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 3366c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // If "caused_stop" is true, then DoHalt stopped the process. If 3367c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // "caused_stop" is false, the process was already stopped. 3368c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // If the DoHalt caused the process to stop, then we want to catch 3369c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // this event and set the interrupted bool to true before we pass 3370c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // this along so clients know that the process was interrupted by 3371c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // a halt command. 3372c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (caused_stop) 337320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 3374f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Wait for 1 second for the process to stop. 3375c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham TimeValue timeout_time; 3376c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham timeout_time = TimeValue::Now(); 3377c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham timeout_time.OffsetWithSeconds(1); 3378f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool got_event = halt_listener.WaitForEvent (&timeout_time, event_sp); 3379f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StateType state = ProcessEventData::GetStateFromEvent(event_sp.get()); 3380c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 3381f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!got_event || state == eStateInvalid) 338220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 3383c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // We timeout out and didn't get a stop event... 3384f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham error.SetErrorStringWithFormat ("Halt timed out. State = %s", StateAsCString(GetState())); 338520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 338620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton else 338720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 3388202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton if (StateIsStoppedState (state, false)) 3389c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 3390c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // We caused the process to interrupt itself, so mark this 3391c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // as such in the stop event so clients can tell an interrupted 3392c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // process from a natural stop 3393c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham ProcessEventData::SetInterruptedInEvent (event_sp.get(), true); 3394c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 3395c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham else 3396c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 3397952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3398c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (log) 3399c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state)); 3400c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham error.SetErrorString ("Did not get stopped event after halt."); 3401c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 340220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 340320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 3404c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham DidHalt(); 3405c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 34063ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 3407c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 3408c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Resume our private state thread before we post the event (if any) 3409f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham RestorePrivateProcessEvents(); 341020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 3411c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Post any event we might have consumed. If all goes well, we will have 3412c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // stopped the process, intercepted the event and set the interrupted 3413c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // bool in the event. Post it to the private event queue and that will end up 3414c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // correctly setting the state. 3415c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (event_sp) 3416c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham m_private_state_broadcaster.BroadcastEvent(event_sp); 341720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 3422e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim InghamProcess::HaltForDestroyOrDetach(lldb::EventSP &exit_event_sp) 3423e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham{ 3424e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham Error error; 3425e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (m_public_state.GetValue() == eStateRunning) 3426e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham { 3427e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3428e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (log) 3429e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham log->Printf("Process::Destroy() About to halt."); 3430e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham error = Halt(); 3431e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (error.Success()) 3432e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham { 3433e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // Consume the halt event. 3434e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham TimeValue timeout (TimeValue::Now()); 3435e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham timeout.OffsetWithSeconds(1); 3436e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham StateType state = WaitForProcessToStop (&timeout, &exit_event_sp); 3437e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham 3438e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // If the process exited while we were waiting for it to stop, put the exited event into 3439e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // the shared pointer passed in and return. Our caller doesn't need to do anything else, since 3440e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // they don't have a process anymore... 3441e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham 3442e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (state == eStateExited || m_private_state.GetValue() == eStateExited) 3443e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham { 3444e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (log) 3445e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham log->Printf("Process::HaltForDestroyOrDetach() Process exited while waiting to Halt."); 3446e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham return error; 3447e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham } 3448e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham else 3449e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham exit_event_sp.reset(); // It is ok to consume any non-exit stop events 3450e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham 3451e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (state != eStateStopped) 3452e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham { 3453e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (log) 3454e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham log->Printf("Process::HaltForDestroyOrDetach() Halt failed to stop, state is: %s", StateAsCString(state)); 3455e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // If we really couldn't stop the process then we should just error out here, but if the 3456e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // lower levels just bobbled sending the event and we really are stopped, then continue on. 3457e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham StateType private_state = m_private_state.GetValue(); 3458e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (private_state != eStateStopped) 3459e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham { 3460e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham return error; 3461e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham } 3462e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham } 3463e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham } 3464e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham else 3465e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham { 3466e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (log) 3467e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham log->Printf("Process::HaltForDestroyOrDetach() Halt got error: %s", error.AsCString()); 3468e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham } 3469e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham } 3470e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham return error; 3471e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham} 3472e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham 3473e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim InghamError 3474761afb822b18c46b2ad84be03f372e90ac1e6143Jim InghamProcess::Detach (bool keep_stopped) 347524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3476e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham EventSP exit_event_sp; 3477e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham Error error; 3478e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham m_destroy_in_process = true; 3479e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham 3480e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham error = WillDetach(); 348124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 348224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 348324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3484e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (DetachRequiresHalt()) 3485e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham { 3486e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham error = HaltForDestroyOrDetach (exit_event_sp); 3487e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (!error.Success()) 3488e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham { 3489e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham m_destroy_in_process = false; 3490e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham return error; 3491e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham } 3492e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham else if (exit_event_sp) 3493e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham { 3494e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // We shouldn't need to do anything else here. There's no process left to detach from... 3495e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham StopPrivateStateThread(); 3496e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham m_destroy_in_process = false; 3497e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham return error; 3498e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham } 3499e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham } 3500e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham 3501761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham error = DoDetach(keep_stopped); 350224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 350324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 350424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidDetach(); 350524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 350624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3507761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham else 3508761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham { 3509761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham return error; 3510761afb822b18c46b2ad84be03f372e90ac1e6143Jim Ingham } 351124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3512e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham m_destroy_in_process = false; 3513e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham 3514e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // If we exited when we were waiting for a process to stop, then 3515e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // forward the event here so we don't lose the event 3516e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (exit_event_sp) 3517e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham { 3518e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // Directly broadcast our exited event because we shut down our 3519e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // private state thread above 3520e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham BroadcastEvent(exit_event_sp); 3521e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham } 3522e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham 3523e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // If we have been interrupted (to kill us) in the middle of running, we may not end up propagating 3524e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // the last events through the event system, in which case we might strand the write lock. Unlock 3525e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham // it here so when we do to tear down the process we don't get an error destroying the lock. 3526e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham 3527cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste m_public_run_lock.SetStopped(); 352824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 353224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Destroy () 353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3534eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham 3535eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham // Tell ourselves we are in the process of destroying the process, so that we don't do any unnecessary work 3536eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham // that might hinder the destruction. Remember to set this back to false when we are done. That way if the attempt 3537eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham // failed and the process stays around for some reason it won't be in a confused state. 3538eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham 3539eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham m_destroy_in_process = true; 3540eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham 354124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillDestroy()); 354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 354324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3544bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton EventSP exit_event_sp; 3545e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham if (DestroyRequiresHalt()) 3546f4928de7bfe2b292b98f97fbf3789b80564755e7Jim Ingham { 3547e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham error = HaltForDestroyOrDetach(exit_event_sp); 3548f4928de7bfe2b292b98f97fbf3789b80564755e7Jim Ingham } 3549e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham 35504389256aecd2693109969c21fa2f00c4612320b3Jim Ingham if (m_public_state.GetValue() != eStateRunning) 35514389256aecd2693109969c21fa2f00c4612320b3Jim Ingham { 35524389256aecd2693109969c21fa2f00c4612320b3Jim Ingham // Ditch all thread plans, and remove all our breakpoints: in case we have to restart the target to 35534389256aecd2693109969c21fa2f00c4612320b3Jim Ingham // kill it, we don't want it hitting a breakpoint... 35544389256aecd2693109969c21fa2f00c4612320b3Jim Ingham // Only do this if we've stopped, however, since if we didn't manage to halt it above, then 35554389256aecd2693109969c21fa2f00c4612320b3Jim Ingham // we're not going to have much luck doing this now. 35564389256aecd2693109969c21fa2f00c4612320b3Jim Ingham m_thread_list.DiscardThreadPlans(); 35574389256aecd2693109969c21fa2f00c4612320b3Jim Ingham DisableAllBreakpointSites(); 35584389256aecd2693109969c21fa2f00c4612320b3Jim Ingham } 3559e33bb5b0dabf62498715afe3d1cd22cda0af1d24Jim Ingham 356024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoDestroy(); 356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidDestroy(); 356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3566861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.StopReadThread(); 3567861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.Disconnect(); 3568861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && m_process_input_reader->IsActive()) 3569861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PopInputReader (m_process_input_reader); 3570861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader) 3571861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 3572bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton 3573bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton // If we exited when we were waiting for a process to stop, then 3574bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton // forward the event here so we don't lose the event 3575bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton if (exit_event_sp) 3576bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton { 3577bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton // Directly broadcast our exited event because we shut down our 3578bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton // private state thread above 3579bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton BroadcastEvent(exit_event_sp); 3580bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton } 3581bb1af9ce3e25eae9916f85cb9a0c82e291c20bb4Greg Clayton 35827fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham // If we have been interrupted (to kill us) in the middle of running, we may not end up propagating 35837fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham // the last events through the event system, in which case we might strand the write lock. Unlock 35847fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham // it here so when we do to tear down the process we don't get an error destroying the lock. 3585cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste m_public_run_lock.SetStopped(); 358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3587eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham 3588eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham m_destroy_in_process = false; 3589eb17530206e3f501476a32c5d28c8dc36bac419aJim Ingham 359024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 359124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 359324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 359424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Signal (int signal) 359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillSignal()); 359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 359924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoSignal(signal); 360024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 360124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidSignal(); 360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 360324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3606395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Claytonlldb::ByteOrder 3607395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonProcess::GetByteOrder () const 360824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3609395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return m_target.GetArchitecture().GetByteOrder(); 361024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 361124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 361224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 3613395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonProcess::GetAddressByteSize () const 361424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3615395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return m_target.GetArchitecture().GetAddressByteSize(); 361624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 361724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3618395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 361924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 362024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ShouldBroadcastEvent (Event *event_ptr) 362124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 362224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr); 362324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool return_value = true; 3624952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_EVENTS | LIBLLDB_LOG_PROCESS)); 362589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 362624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (state) 362724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3628e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton case eStateConnected: 362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateAttaching: 363024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateLaunching: 363124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateDetached: 363224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateExited: 363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateUnloaded: 363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // These events indicate changes in the state of the debugging session, always report them. 363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateInvalid: 363824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We stopped for no apparent reason, don't report it. 363924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 364024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 364124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 364224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 364324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we've started the target running, we handle the cases where we 364424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // are already running and where there is a transition from stopped to 364524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // running differently. 364624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // running -> running: Automatically suppress extra running events 364724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // stopped -> running: Report except when there is one or more no votes 364824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and no yes votes. 364924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SynchronouslyNotifyStateChanged (state); 365089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham switch (m_last_broadcast_state) 365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 365424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We always suppress multiple runnings with no PUBLIC stop in between. 365524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 365624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 365724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 365824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: make this work correctly. For now always report 365924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // run if we aren't running so we don't miss any runnning 366024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // events. If I run the lldb/test/thread/a.out file and 366124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // break at main.cpp:58, run and hit the breakpoints on 366224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // multiple threads, then somehow during the stepping over 366324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // of all breakpoints no run gets reported. 366424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 366524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a transition from stop to run. 366624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_thread_list.ShouldReportRun (event_ptr)) 366724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteYes: 366924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNoOpinion: 367024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 367124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 367224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNo: 367324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 367424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 367524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 367624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 367724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 367824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 367924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStopped: 368024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateCrashed: 368124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateSuspended: 368224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 368324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We've stopped. First see if we're going to restart the target. 368424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we are going to stop, then we always broadcast the event. 368524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't going to stop, let the thread plans decide if we're going to report this event. 36865a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham // If no thread has an opinion, we don't report it. 36877c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham 3688f63f2ba42b9db6fa1a2c3e8d4536d61c2d4ee2d7Jim Ingham RefreshStateAfterStop (); 36893ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (ProcessEventData::GetInterruptedFromEvent (event_ptr)) 36903ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 369120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (log) 369289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s", 369389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham event_ptr, 369489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham StateAsCString(state)); 369589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return_value = true; 36963ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 36973ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham else 369824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36997c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham bool was_restarted = ProcessEventData::GetRestartedFromEvent (event_ptr); 37007c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham bool should_resume = false; 37017c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham 370289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // It makes no sense to ask "ShouldStop" if we've already been restarted... 370389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // Asking the thread list is also not likely to go well, since we are running again. 370489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // So in that case just report the event. 370589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 370689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (!was_restarted) 370789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham should_resume = m_thread_list.ShouldStop (event_ptr) == false; 37087c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham 37097c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham if (was_restarted || should_resume || m_resume_requested) 371024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 371189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham Vote stop_vote = m_thread_list.ShouldReportStop (event_ptr); 371289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 371389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Process::ShouldBroadcastEvent: should_stop: %i state: %s was_restarted: %i stop_vote: %d.", 371489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham should_resume, 371589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham StateAsCString(state), 371689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham was_restarted, 371789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham stop_vote); 371889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 371989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham switch (stop_vote) 372024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 372124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteYes: 372289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return_value = true; 372389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham break; 372424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNoOpinion: 372524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNo: 372624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 372724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 372824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 372989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 37308290bba24800aeb9c1588ae7b81932feef8786c1Jim Ingham if (!was_restarted) 373189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 373289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 373389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state)); 373489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham ProcessEventData::SetRestartedInEvent(event_ptr, true); 37358290bba24800aeb9c1588ae7b81932feef8786c1Jim Ingham PrivateResume (); 373689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 373789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 373824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 373924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 374024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 374124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 374224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SynchronouslyNotifyStateChanged (state); 374324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 374424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 374524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 374689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham break; 374724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 374889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 374989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // We do some coalescing of events (for instance two consecutive running events get coalesced.) 375089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // But we only coalesce against events we actually broadcast. So we use m_last_broadcast_state 375189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // to track that. NB - you can't use "m_public_state.GetValue()" for that purpose, as was originally done, 375289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // because the PublicState reflects the last event pulled off the queue, and there may be several 375389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // events stacked up on the queue unserviced. So the PublicState may not reflect the last broadcasted event 375489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // yet. m_last_broadcast_state gets updated here. 375589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 375689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (return_value) 375789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham m_last_broadcast_state = state; 375889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 375924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 376089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Process::ShouldBroadcastEvent (%p) => new state: %s, last broadcast state: %s - %s", 376189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham event_ptr, 376289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham StateAsCString(state), 376389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham StateAsCString(m_last_broadcast_state), 376489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return_value ? "YES" : "NO"); 376524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_value; 376624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 376724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 376824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 376924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 37701831e78a6253392fca1c99e555e7adaa3f372647Jim InghamProcess::StartPrivateStateThread (bool force) 377124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3772952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 377324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3774b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton bool already_running = PrivateStateThreadIsValid (); 377524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 3776b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton log->Printf ("Process::%s()%s ", __FUNCTION__, already_running ? " already running" : " starting private state thread"); 3777b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 37781831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham if (!force && already_running) 3779b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return true; 378024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 378124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Create a thread that watches our internal state and controls which 378224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // events make it to clients (into the DCProcess event queue). 3783a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton char thread_name[1024]; 37841831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham if (already_running) 37855f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state-override(pid=%" PRIu64 ")>", GetID()); 37861831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham else 37875f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state(pid=%" PRIu64 ")>", GetID()); 3788d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 3789d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // Create the private state thread, and start it running. 3790a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_private_state_thread = Host::ThreadCreate (thread_name, Process::PrivateStateThread, this, NULL); 3791d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham bool success = IS_VALID_LLDB_HOST_THREAD(m_private_state_thread); 3792d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham if (success) 3793d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham { 3794d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham ResumePrivateStateThread(); 3795d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham return true; 3796d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham } 3797d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham else 3798d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham return false; 379924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 380024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 380124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 380224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PausePrivateStateThread () 380324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 380424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ControlPrivateStateThread (eBroadcastInternalStateControlPause); 380524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 380624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 380724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 380824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ResumePrivateStateThread () 380924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 381024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ControlPrivateStateThread (eBroadcastInternalStateControlResume); 381124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 381224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 381324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 381424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StopPrivateStateThread () 381524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3816b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (PrivateStateThreadIsValid ()) 3817b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ControlPrivateStateThread (eBroadcastInternalStateControlStop); 38187fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham else 38197fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham { 3820952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 38217fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham if (log) 382289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Went to stop the private state thread, but it was already invalid."); 38237fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham } 382424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 382524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 382624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 382724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ControlPrivateStateThread (uint32_t signal) 382824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3829952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 383024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 383124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (signal == eBroadcastInternalStateControlStop || 383224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal == eBroadcastInternalStateControlPause || 383324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal == eBroadcastInternalStateControlResume); 383424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 383524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 3836f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal); 383724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3838f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // Signal the private state thread. First we should copy this is case the 3839f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // thread starts exiting since the private state thread will NULL this out 3840f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // when it exits 3841f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton const lldb::thread_t private_state_thread = m_private_state_thread; 384209c81efd010d1c9ac8821bad00cdfc9747fcae79Greg Clayton if (IS_VALID_LLDB_HOST_THREAD(private_state_thread)) 384324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 384424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TimeValue timeout_time; 384524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool timed_out; 384624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 384724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_broadcaster.BroadcastEvent (signal, NULL); 384824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 384924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout_time = TimeValue::Now(); 385024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout_time.OffsetWithSeconds(2); 38517fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham if (log) 38527fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham log->Printf ("Sending control event of type: %d.", signal); 385324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out); 385424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (false, eBroadcastNever); 385524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 385624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signal == eBroadcastInternalStateControlStop) 385724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 385824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (timed_out) 38597fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham { 38607fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham Error error; 38617fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham Host::ThreadCancel (private_state_thread, &error); 38627fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham if (log) 38637fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham log->Printf ("Timed out responding to the control event, cancel got error: \"%s\".", error.AsCString()); 38647fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham } 38657fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham else 38667fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham { 38677fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham if (log) 38687fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham log->Printf ("The control event killed the private state thread without having to cancel."); 38697fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham } 387024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 387124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread_result_t result = NULL; 3872f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton Host::ThreadJoin (private_state_thread, &result, NULL); 3873c607d8681f443d03806f105ceceb11dcadd16184Greg Clayton m_private_state_thread = LLDB_INVALID_HOST_THREAD; 387424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 387524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 38767fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham else 38777fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham { 38787fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham if (log) 38797fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham log->Printf ("Private state thread already dead, no need to signal it to stop."); 38807fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham } 388124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 388224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 388324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 38845d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim InghamProcess::SendAsyncInterrupt () 38855d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham{ 38865d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (PrivateStateThreadIsValid()) 38875d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham m_private_state_broadcaster.BroadcastEvent (Process::eBroadcastBitInterrupt, NULL); 38885d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham else 38895d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham BroadcastEvent (Process::eBroadcastBitInterrupt, NULL); 38905d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham} 38915d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 38925d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Inghamvoid 389324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::HandlePrivateEvent (EventSP &event_sp) 389424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3895952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 38967c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham m_resume_requested = false; 38977c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham 38984389256aecd2693109969c21fa2f00c4612320b3Jim Ingham m_currently_handling_event.SetValue(true, eBroadcastNever); 3899c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 390068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton const StateType new_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3901c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 3902c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // First check to see if anybody wants a shot at this event: 390368bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham if (m_next_event_action_ap.get() != NULL) 3904c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 390568bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham NextEventAction::EventActionResult action_result = m_next_event_action_ap->PerformAction(event_sp); 390689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 390789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Ran next event action, result was %d.", action_result); 390889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 3909c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham switch (action_result) 3910c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 3911c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham case NextEventAction::eEventActionSuccess: 3912c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham SetNextEventAction(NULL); 3913c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham break; 39142d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton 3915c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham case NextEventAction::eEventActionRetry: 3916c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham break; 39172d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton 3918c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham case NextEventAction::eEventActionExit: 391984c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // Handle Exiting Here. If we already got an exited event, 392084c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // we should just propagate it. Otherwise, swallow this event, 392184c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // and set our state to exit so the next event will kill us. 392284c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham if (new_state != eStateExited) 392384c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham { 392484c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // FIXME: should cons up an exited event, and discard this one. 392568bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham SetExitStatus(0, m_next_event_action_ap->GetExitString()); 39267c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham m_currently_handling_event.SetValue(false, eBroadcastAlways); 392784c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham SetNextEventAction(NULL); 392884c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham return; 392984c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham } 393084c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham SetNextEventAction(NULL); 3931c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham break; 3932c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 3933c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 3934c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 393524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if we should broadcast this state to external clients? 393624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const bool should_broadcast = ShouldBroadcastEvent (event_sp.get()); 393724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 393824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (should_broadcast) 393924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 394024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 394124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39425f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::%s (pid = %" PRIu64 ") broadcasting new state %s (old state %s) to %s", 394368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton __FUNCTION__, 394468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton GetID(), 394568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString(new_state), 394668ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString (GetState ()), 394768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public"); 394824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3949d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get()); 395068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton if (StateIsRunningState (new_state)) 3951861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice PushProcessInputReader (); 3952a79c53f83949dbc9337fe00247ea476cfc12a7bfJim Ingham else if (!Process::ProcessEventData::GetRestartedFromEvent(event_sp.get())) 3953861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice PopProcessInputReader (); 3954d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 395524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BroadcastEvent (event_sp); 395624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 395824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 395924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 396024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39615f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::%s (pid = %" PRIu64 ") suppressing state %s (old state %s): should_broadcast == false", 396268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton __FUNCTION__, 396368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton GetID(), 396468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString(new_state), 39657e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda StateAsCString (GetState ())); 396624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 396724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39684389256aecd2693109969c21fa2f00c4612320b3Jim Ingham m_currently_handling_event.SetValue(false, eBroadcastAlways); 396924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 397024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 397124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 397224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PrivateStateThread (void *arg) 397324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 397424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process *proc = static_cast<Process*> (arg); 397524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *result = proc->RunPrivateStateThread (); 397624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 397724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 397824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 397924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 398024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RunPrivateStateThread () 398124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3982d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham bool control_only = true; 39837fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham m_private_state_control_wait.SetValue (false, eBroadcastNever); 398424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3985952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 398624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 39875f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") thread starting...", __FUNCTION__, this, GetID()); 398824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 398924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool exit_now = false; 399024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (!exit_now) 399124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 399224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 399324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WaitForEventsPrivate (NULL, event_sp, control_only); 399424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster)) 399524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39967fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham if (log) 39975f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType()); 39987fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham 399924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (event_sp->GetType()) 400024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 400124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlStop: 400224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exit_now = true; 400324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; // doing any internal state managment below 400424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 400524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlPause: 400624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner control_only = true; 400724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 400824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 400924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlResume: 401024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner control_only = false; 401124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 401224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40133ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 401424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (true, eBroadcastAlways); 40153ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham continue; 401624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40175d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham else if (event_sp->GetType() == eBroadcastBitInterrupt) 40185d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham { 40195d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (m_public_state.GetValue() == eStateAttaching) 40205d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham { 40215d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (log) 40225f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") woke up with an interrupt while attaching - forwarding interrupt.", __FUNCTION__, this, GetID()); 40235d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham BroadcastEvent (eBroadcastBitInterrupt, NULL); 40245d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 40255d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham else 40265d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham { 40275d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (log) 40285f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") woke up with an interrupt - Halting.", __FUNCTION__, this, GetID()); 40295d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham Halt(); 40305d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 40315d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham continue; 40325d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 403324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 403424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 403524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 403624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (internal_state != eStateInvalid) 403724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4038addad59552c206466dea98c4a645a471a41252b4Greg Clayton if (m_clear_thread_plans_on_stop && 4039addad59552c206466dea98c4a645a471a41252b4Greg Clayton StateIsStoppedState(internal_state, true)) 4040addad59552c206466dea98c4a645a471a41252b4Greg Clayton { 4041addad59552c206466dea98c4a645a471a41252b4Greg Clayton m_clear_thread_plans_on_stop = false; 4042addad59552c206466dea98c4a645a471a41252b4Greg Clayton m_thread_list.DiscardThreadPlans(); 4043addad59552c206466dea98c4a645a471a41252b4Greg Clayton } 404424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 404524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 404624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40473b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton if (internal_state == eStateInvalid || 40483b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton internal_state == eStateExited || 40493b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton internal_state == eStateDetached ) 40503ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 40513ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (log) 40525f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state)); 40533ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 405424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 40553ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 405624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 405724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4058926060e198137f8a64face70455324a8cd4362a5Caroline Tice // Verify log is still enabled before attempting to write to it... 405924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 40605f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") thread exiting...", __FUNCTION__, this, GetID()); 406124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4062cf88b95d435873bd312e716da5701cf3882c5da4Ed Maste m_public_run_lock.SetStopped(); 4063a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton m_private_state_control_wait.SetValue (true, eBroadcastAlways); 4064a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton m_private_state_thread = LLDB_INVALID_HOST_THREAD; 406524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 406624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 406724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 406824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 406924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process Event Data 407024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 407124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 407224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData () : 407324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventData (), 407424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp (), 407524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_state (eStateInvalid), 407654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton m_restarted (false), 40776cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham m_update_state (0), 40783ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_interrupted (false) 407924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 408024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 408124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 408224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) : 408324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventData (), 408424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp (process_sp), 408524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_state (state), 408654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton m_restarted (false), 40876cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham m_update_state (0), 40883ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_interrupted (false) 408924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 409024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 409124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 409224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::~ProcessEventData() 409324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 409424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 409524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 409624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 409724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetFlavorString () 409824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 409924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString g_flavor ("Process::ProcessEventData"); 410024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_flavor; 410124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 410224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 410324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 410424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetFlavor () const 410524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 410624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ProcessEventData::GetFlavorString (); 410724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 410824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 410924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 411024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::DoOnRemoval (Event *event_ptr) 411124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 411224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This function gets called twice for each event, once when the event gets pulled 41136cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // off of the private process event queue, and then any number of times, first when it gets pulled off of 41146cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // the public event queue, then other times when we're pretending that this is where we stopped at the 41156cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // end of expression evaluation. m_update_state is used to distinguish these 41166cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // three cases; it is 0 when we're just pulling it off for private handling, 41177c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham // and > 1 for expression evaluation, and we don't want to do the breakpoint command handling then. 41186cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham if (m_update_state != 1) 411924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 412089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 41217c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham m_process_sp->SetPublicState (m_state, Process::ProcessEventData::GetRestartedFromEvent(event_ptr)); 412224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 412324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we're stopped and haven't restarted, then do the breakpoint commands here: 412424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_state == eStateStopped && ! m_restarted) 41250296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 41260296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham ThreadList &curr_thread_list = m_process_sp->GetThreadList(); 4127d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton uint32_t num_threads = curr_thread_list.GetSize(); 4128d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton uint32_t idx; 4129643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 413021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // The actions might change one of the thread's stop_info's opinions about whether we should 413121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // stop the process, so we need to query that as we go. 41320296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 41330296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // One other complication here, is that we try to catch any case where the target has run (except for expressions) 41340296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // and immediately exit, but if we get that wrong (which is possible) then the thread list might have changed, and 41350296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // that would cause our iteration here to crash. We could make a copy of the thread list, but we'd really like 41360296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // 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 41370296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // against this list & bag out if anything differs. 4138d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton std::vector<uint32_t> thread_index_array(num_threads); 41390296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham for (idx = 0; idx < num_threads; ++idx) 41400296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham thread_index_array[idx] = curr_thread_list.GetThreadAtIndex(idx)->GetIndexID(); 41410296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 4142b6059b2b562c6bfeaa4288ad127aad670cff852cJim Ingham // Use this to track whether we should continue from here. We will only continue the target running if 4143b6059b2b562c6bfeaa4288ad127aad670cff852cJim Ingham // no thread says we should stop. Of course if some thread's PerformAction actually sets the target running, 4144b6059b2b562c6bfeaa4288ad127aad670cff852cJim Ingham // then it doesn't matter what the other threads say... 4145b6059b2b562c6bfeaa4288ad127aad670cff852cJim Ingham 4146b6059b2b562c6bfeaa4288ad127aad670cff852cJim Ingham bool still_should_stop = false; 414721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 414868899dab013af7381cf09f8d82b9e4454277941bJim Ingham // Sometimes - for instance if we have a bug in the stub we are talking to, we stop but no thread has a 414968899dab013af7381cf09f8d82b9e4454277941bJim Ingham // valid stop reason. In that case we should just stop, because we have no way of telling what the right 415068899dab013af7381cf09f8d82b9e4454277941bJim Ingham // thing to do is, and it's better to let the user decide than continue behind their backs. 415168899dab013af7381cf09f8d82b9e4454277941bJim Ingham 415268899dab013af7381cf09f8d82b9e4454277941bJim Ingham bool does_anybody_have_an_opinion = false; 415368899dab013af7381cf09f8d82b9e4454277941bJim Ingham 415424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; idx < num_threads; ++idx) 415524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41560296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham curr_thread_list = m_process_sp->GetThreadList(); 41570296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham if (curr_thread_list.GetSize() != num_threads) 41580296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 4159952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 416060526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham if (log) 4161d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton log->Printf("Number of threads changed from %u to %u while processing event.", num_threads, curr_thread_list.GetSize()); 41620296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham break; 41630296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham } 41640296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 41650296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham lldb::ThreadSP thread_sp = curr_thread_list.GetThreadAtIndex(idx); 41660296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 41670296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham if (thread_sp->GetIndexID() != thread_index_array[idx]) 41680296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 4169952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 417060526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham if (log) 4171d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton log->Printf("The thread at position %u changed from %u to %u while processing event.", 417260526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham idx, 417360526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham thread_index_array[idx], 417460526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham thread_sp->GetIndexID()); 41750296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham break; 41760296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham } 41770296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 41786297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham StopInfoSP stop_info_sp = thread_sp->GetStopInfo (); 41796bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham if (stop_info_sp && stop_info_sp->IsValid()) 418024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 418168899dab013af7381cf09f8d82b9e4454277941bJim Ingham does_anybody_have_an_opinion = true; 418289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham bool this_thread_wants_to_stop; 418389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (stop_info_sp->GetOverrideShouldStop()) 418421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 418589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham this_thread_wants_to_stop = stop_info_sp->GetOverriddenShouldStopValue(); 418689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 418789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham else 418889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 418989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham stop_info_sp->PerformAction(event_ptr); 419089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // The stop action might restart the target. If it does, then we want to mark that in the 419189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // event so that whoever is receiving it will know to wait for the running event and reflect 419289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // that state appropriately. 419389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // We also need to stop processing actions, since they aren't expecting the target to be running. 419489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 419589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // FIXME: we might have run. 419689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (stop_info_sp->HasTargetRunSinceMe()) 419789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 419889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham SetRestarted (true); 419989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham break; 420089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 420189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 420289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham this_thread_wants_to_stop = stop_info_sp->ShouldStop(event_ptr); 420321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 4204b6059b2b562c6bfeaa4288ad127aad670cff852cJim Ingham 4205b6059b2b562c6bfeaa4288ad127aad670cff852cJim Ingham if (still_should_stop == false) 4206b6059b2b562c6bfeaa4288ad127aad670cff852cJim Ingham still_should_stop = this_thread_wants_to_stop; 420724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 420824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42096fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham 42106b47bca0e0472439b9c69fb16b9c6a3bcfbe783bAshok Thirumurthi 42115f0bc2bb48344df5f4028e9f1b6fade8ea4515a7Jim Ingham if (!GetRestarted()) 4212d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 421368899dab013af7381cf09f8d82b9e4454277941bJim Ingham if (!still_should_stop && does_anybody_have_an_opinion) 421421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 421521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We've been asked to continue, so do that here. 4216d60d94a5126b93fda98678a68322abc2164073dbJim Ingham SetRestarted(true); 4217027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham // Use the public resume method here, since this is just 4218027aaa74a914823ab4c9cf8f3274d179e97fdb53Jim Ingham // extending a public resume. 421989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham m_process_sp->PrivateResume(); 422021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 422121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else 422221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 422321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // If we didn't restart, run the Stop Hooks here: 422421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // They might also restart the target, so watch for that. 422521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_process_sp->GetTarget().RunStopHooks(); 422621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (m_process_sp->GetPrivateState() == eStateRunning) 422721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham SetRestarted(true); 422821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 4229d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 423024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 423124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 423224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 423324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 423424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::Dump (Stream *s) const 423524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 423624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_process_sp) 42375f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf(" process = %p (pid = %" PRIu64 "), ", m_process_sp.get(), m_process_sp->GetID()); 423824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4239b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s->Printf("state = %s", StateAsCString(GetState())); 424024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 424124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 424224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Process::ProcessEventData * 424324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr) 424424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 424524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_ptr) 424624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 424724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EventData *event_data = event_ptr->GetData(); 424824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString()) 424924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast <const ProcessEventData *> (event_ptr->GetData()); 425024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 425124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 425224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 425324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 425424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcessSP 425524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetProcessFromEvent (const Event *event_ptr) 425624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 425724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp; 425824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 425924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data) 426024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process_sp = data->GetProcessSP(); 426124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return process_sp; 426224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 426324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 426424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 426524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetStateFromEvent (const Event *event_ptr) 426624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 426724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 426824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data == NULL) 426924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eStateInvalid; 427024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 427124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data->GetState(); 427224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 427324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 427424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 427524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr) 427624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 427724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 427824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data == NULL) 427924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 428024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 428124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data->GetRestarted(); 428224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 428324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 428424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 428524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value) 428624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 428724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 428824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data != NULL) 428924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetRestarted(new_value); 429024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 429124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 429289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Inghamsize_t 429389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim InghamProcess::ProcessEventData::GetNumRestartedReasons(const Event *event_ptr) 429489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham{ 429589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 429689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (data != NULL) 429789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return data->GetNumRestartedReasons(); 429889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham else 429989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return 0; 430089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham} 430189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 430289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Inghamconst char * 430389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim InghamProcess::ProcessEventData::GetRestartedReasonAtIndex(const Event *event_ptr, size_t idx) 430489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham{ 430589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 430689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (data != NULL) 430789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return data->GetRestartedReasonAtIndex(idx); 430889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham else 430989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return NULL; 431089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham} 431189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 431289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Inghamvoid 431389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim InghamProcess::ProcessEventData::AddRestartedReason (Event *event_ptr, const char *reason) 431489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham{ 431589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 431689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (data != NULL) 431789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham data->AddRestartedReason(reason); 431889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham} 431989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 432024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 43213ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr) 43223ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{ 43233ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 43243ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (data == NULL) 43253ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return false; 43263ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham else 43273ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return data->GetInterrupted (); 43283ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham} 43293ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 43303ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghamvoid 43313ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value) 43323ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{ 43333ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 43343ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (data != NULL) 43353ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham data->SetInterrupted(new_value); 43363ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham} 43373ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 43383ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghambool 433924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr) 434024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 434124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 434224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data) 434324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 434424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetUpdateStateOnRemoval(); 434524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 434624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 434724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 434824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 434924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4350289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Claytonlldb::TargetSP 4351289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg ClaytonProcess::CalculateTarget () 4352289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton{ 4353289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton return m_target.shared_from_this(); 4354289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton} 4355289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton 435624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 4357a830adbcd63d1995a01e6e18da79893c1426ca43Greg ClaytonProcess::CalculateExecutionContext (ExecutionContext &exe_ctx) 435824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4359567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetTargetPtr (&m_target); 4360567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetProcessPtr (this); 4361567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetThreadPtr(NULL); 4362567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFramePtr (NULL); 436324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 436424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4365e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//uint32_t 4366e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids) 4367e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//{ 4368e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// return 0; 4369e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//} 4370e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 4371e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//ArchSpec 4372e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//Process::GetArchSpecForExistingProcess (lldb::pid_t pid) 4373e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//{ 4374e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// return Host::GetArchSpecForExistingProcess (pid); 4375e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//} 4376e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 4377e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//ArchSpec 4378e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//Process::GetArchSpecForExistingProcess (const char *process_name) 4379e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//{ 4380e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// return Host::GetArchSpecForExistingProcess (process_name); 4381e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//} 4382e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 4383861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 4384861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::AppendSTDOUT (const char * s, size_t len) 4385861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 438620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton Mutex::Locker locker (m_stdio_communication_mutex); 4387861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdout_data.append (s, len); 4388843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (shared_from_this(), GetState())); 4389861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 4390861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4391861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 4392bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg ClaytonProcess::AppendSTDERR (const char * s, size_t len) 4393bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton{ 4394bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton Mutex::Locker locker (m_stdio_communication_mutex); 4395bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stderr_data.append (s, len); 4396843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton BroadcastEventIfUnique (eBroadcastBitSTDERR, new ProcessEventData (shared_from_this(), GetState())); 4397bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton} 4398bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 4399fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ongvoid 4400a1f156aa2695963058615edeabedfcb0f1ca5fabHan Ming OngProcess::BroadcastAsyncProfileData(const std::string &one_profile_data) 4401fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong{ 4402fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong Mutex::Locker locker (m_profile_data_comm_mutex); 4403a1f156aa2695963058615edeabedfcb0f1ca5fabHan Ming Ong m_profile_data.push_back(one_profile_data); 4404fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong BroadcastEventIfUnique (eBroadcastBitProfileData, new ProcessEventData (shared_from_this(), GetState())); 4405fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong} 4406fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong 4407fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ongsize_t 4408fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming OngProcess::GetAsyncProfileData (char *buf, size_t buf_size, Error &error) 4409fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong{ 4410fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong Mutex::Locker locker(m_profile_data_comm_mutex); 4411f14269add7f6fb84da7ccfd866f8e9f7e81068beHan Ming Ong if (m_profile_data.empty()) 4412f14269add7f6fb84da7ccfd866f8e9f7e81068beHan Ming Ong return 0; 4413a1f156aa2695963058615edeabedfcb0f1ca5fabHan Ming Ong 4414a1f156aa2695963058615edeabedfcb0f1ca5fabHan Ming Ong std::string &one_profile_data = m_profile_data.front(); 4415a1f156aa2695963058615edeabedfcb0f1ca5fabHan Ming Ong size_t bytes_available = one_profile_data.size(); 4416fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong if (bytes_available > 0) 4417fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong { 4418952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 4419fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong if (log) 44205f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::GetProfileData (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size); 4421fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong if (bytes_available > buf_size) 4422fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong { 4423a1f156aa2695963058615edeabedfcb0f1ca5fabHan Ming Ong memcpy(buf, one_profile_data.c_str(), buf_size); 4424a1f156aa2695963058615edeabedfcb0f1ca5fabHan Ming Ong one_profile_data.erase(0, buf_size); 4425fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong bytes_available = buf_size; 4426fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong } 4427fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong else 4428fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong { 4429a1f156aa2695963058615edeabedfcb0f1ca5fabHan Ming Ong memcpy(buf, one_profile_data.c_str(), bytes_available); 4430f14269add7f6fb84da7ccfd866f8e9f7e81068beHan Ming Ong m_profile_data.erase(m_profile_data.begin()); 4431fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong } 4432fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong } 4433fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong return bytes_available; 4434fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong} 4435fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong 4436fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong 4437bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton//------------------------------------------------------------------ 4438bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton// Process STDIO 4439bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton//------------------------------------------------------------------ 4440bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 4441bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Claytonsize_t 4442bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg ClaytonProcess::GetSTDOUT (char *buf, size_t buf_size, Error &error) 4443bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton{ 4444bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton Mutex::Locker locker(m_stdio_communication_mutex); 4445bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton size_t bytes_available = m_stdout_data.size(); 4446bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton if (bytes_available > 0) 4447bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 4448952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 4449bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton if (log) 44505f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::GetSTDOUT (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size); 4451bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton if (bytes_available > buf_size) 4452bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 4453bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton memcpy(buf, m_stdout_data.c_str(), buf_size); 4454bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stdout_data.erase(0, buf_size); 4455bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton bytes_available = buf_size; 4456bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 4457bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton else 4458bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 4459bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton memcpy(buf, m_stdout_data.c_str(), bytes_available); 4460bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stdout_data.clear(); 4461bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 4462bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 4463bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton return bytes_available; 4464bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton} 4465bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 4466bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 4467bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Claytonsize_t 4468bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg ClaytonProcess::GetSTDERR (char *buf, size_t buf_size, Error &error) 4469bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton{ 4470bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton Mutex::Locker locker(m_stdio_communication_mutex); 4471bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton size_t bytes_available = m_stderr_data.size(); 4472bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton if (bytes_available > 0) 4473bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 4474952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 4475bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton if (log) 44765f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::GetSTDERR (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size); 4477bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton if (bytes_available > buf_size) 4478bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 4479bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton memcpy(buf, m_stderr_data.c_str(), buf_size); 4480bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stderr_data.erase(0, buf_size); 4481bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton bytes_available = buf_size; 4482bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 4483bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton else 4484bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 4485bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton memcpy(buf, m_stderr_data.c_str(), bytes_available); 4486bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stderr_data.clear(); 4487bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 4488bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 4489bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton return bytes_available; 4490bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton} 4491bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 4492bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Claytonvoid 4493861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len) 4494861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 4495861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Process *process = (Process *) baton; 4496861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice process->AppendSTDOUT (static_cast<const char *>(src), src_len); 4497861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 4498861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4499861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticesize_t 4500861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ProcessInputReaderCallback (void *baton, 4501861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice InputReader &reader, 4502861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice lldb::InputReaderAction notification, 4503861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice const char *bytes, 4504861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice size_t bytes_len) 4505861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 4506861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Process *process = (Process *) baton; 4507861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4508861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice switch (notification) 4509861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 4510861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderActivate: 4511861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 4512861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4513861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderDeactivate: 4514861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 4515861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4516861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderReactivate: 4517861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 4518861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 45194a348081030cdd2af758fddc869518357d9befd3Caroline Tice case eInputReaderAsynchronousOutputWritten: 45204a348081030cdd2af758fddc869518357d9befd3Caroline Tice break; 45214a348081030cdd2af758fddc869518357d9befd3Caroline Tice 4522861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderGotToken: 4523861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 4524861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Error error; 4525861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice process->PutSTDIN (bytes, bytes_len, error); 4526861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 4527861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 4528861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4529c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice case eInputReaderInterrupt: 4530dddd452347338c4878fd8bc4bbc3832c034ce518Jim Ingham process->SendAsyncInterrupt(); 4531c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice break; 4532c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 4533c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice case eInputReaderEndOfFile: 4534c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice process->AppendSTDOUT ("^D", 2); 4535c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice break; 4536c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 4537861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderDone: 4538861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 4539861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4540861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 4541861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4542861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice return bytes_len; 4543861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 4544861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4545861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 4546861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ResetProcessInputReader () 4547861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 4548861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 4549861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 4550861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4551861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 4552464c6161464694412b7472129e789248f1cf21b9Greg ClaytonProcess::SetSTDIOFileDescriptor (int file_descriptor) 4553861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 4554861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // First set up the Read Thread for reading/handling process I/O 4555861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4556102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true)); 4557861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4558861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (conn_ap.get()) 4559861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 4560861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.SetConnection (conn_ap.release()); 4561861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_stdio_communication.IsConnected()) 4562861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 4563861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this); 4564861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.StartReadThread(); 4565861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4566861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // Now read thread is set up, set up input reader. 4567861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4568861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (!m_process_input_reader.get()) 4569861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 4570861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset (new InputReader(m_target.GetDebugger())); 4571861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback, 4572861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice this, 4573861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice eInputReaderGranularityByte, 4574861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice NULL, 4575861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice NULL, 4576861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice false)); 4577861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4578861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (err.Fail()) 4579861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 4580861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 4581861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 4582861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 4583861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 4584861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4585861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 4586861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PushProcessInputReader () 4587861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 4588861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && !m_process_input_reader->IsActive()) 4589861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PushInputReader (m_process_input_reader); 4590861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 4591861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4592861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 4593861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PopProcessInputReader () 4594861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 4595861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && m_process_input_reader->IsActive()) 4596861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PopInputReader (m_process_input_reader); 4597861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 4598861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 4599d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton// The process needs to know about installed plug-ins 4600990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 46012a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceProcess::SettingsInitialize () 4602990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 460373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// static std::vector<OptionEnumValueElement> g_plugins; 460473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 460573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// int i=0; 460673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// const char *name; 460773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// OptionEnumValueElement option_enum; 460873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// while ((name = PluginManager::GetProcessPluginNameAtIndex (i)) != NULL) 460973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 461073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (name) 461173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 461273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// option_enum.value = i; 461373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// option_enum.string_value = name; 461473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// option_enum.usage = PluginManager::GetProcessPluginDescriptionAtIndex (i); 461573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// g_plugins.push_back (option_enum); 461673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 461773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// ++i; 461873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 461973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// option_enum.value = 0; 462073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// option_enum.string_value = NULL; 462173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// option_enum.usage = NULL; 462273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// g_plugins.push_back (option_enum); 462373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 462473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// for (i=0; (name = SettingsController::instance_settings_table[i].var_name); ++i) 462573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 462673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (::strcmp (name, "plugin") == 0) 462773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 462873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// SettingsController::instance_settings_table[i].enum_values = &g_plugins[0]; 462973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// break; 463073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 463173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 463273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 4633c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Thread::SettingsInitialize (); 4634990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 46356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4636990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 46372a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceProcess::SettingsTerminate () 4638990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 4639c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Thread::SettingsTerminate (); 46406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 46416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4642427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonExecutionResults 4643360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::RunThreadPlan (ExecutionContext &exe_ctx, 46441831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham lldb::ThreadPlanSP &thread_plan_sp, 4645360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool stop_others, 464647beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham bool run_others, 4647b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool unwind_on_error, 4648b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool ignore_breakpoints, 464947beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham uint32_t timeout_usec, 4650360f53f3c216ee4fb433da0a367168785328a856Jim Ingham Stream &errors) 4651360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 4652360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ExecutionResults return_value = eExecutionSetupError; 4653360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 465415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham if (thread_plan_sp.get() == NULL) 465515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 465615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham errors.Printf("RunThreadPlan called with empty thread plan."); 4657b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return eExecutionSetupError; 465815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 4659698194cf1a87cda520c74f45bb191d9fc7fdc6d9Jim Ingham 4660698194cf1a87cda520c74f45bb191d9fc7fdc6d9Jim Ingham if (!thread_plan_sp->ValidatePlan(NULL)) 4661698194cf1a87cda520c74f45bb191d9fc7fdc6d9Jim Ingham { 4662698194cf1a87cda520c74f45bb191d9fc7fdc6d9Jim Ingham errors.Printf ("RunThreadPlan called with an invalid thread plan."); 4663698194cf1a87cda520c74f45bb191d9fc7fdc6d9Jim Ingham return eExecutionSetupError; 4664698194cf1a87cda520c74f45bb191d9fc7fdc6d9Jim Ingham } 4665698194cf1a87cda520c74f45bb191d9fc7fdc6d9Jim Ingham 4666567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetProcessPtr() != this) 4667567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 4668567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton errors.Printf("RunThreadPlan called on wrong process."); 4669567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return eExecutionSetupError; 4670567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 4671567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 4672567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 4673567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread == NULL) 4674567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 4675567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton errors.Printf("RunThreadPlan called with invalid thread."); 4676567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return eExecutionSetupError; 4677567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 467815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 46795ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // We rely on the thread plan we are running returning "PlanCompleted" if when it successfully completes. 46805ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // For that to be true the plan can't be private - since private plans suppress themselves in the 46815ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // GetCompletedPlan call. 46825ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham 46835ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham bool orig_plan_private = thread_plan_sp->GetPrivate(); 46845ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham thread_plan_sp->SetPrivate(false); 46855ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham 4686ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham if (m_private_state.GetValue() != eStateStopped) 4687ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham { 4688ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham errors.Printf ("RunThreadPlan called while the private state was not stopped."); 4689b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return eExecutionSetupError; 4690ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham } 4691ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham 46927bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham // Save the thread & frame from the exe_ctx for restoration after we run 4693567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton const uint32_t thread_idx_id = thread->GetIndexID(); 46949da225f5634046120475ca2af89d08b09e3747a8Jim Ingham StackFrameSP selected_frame_sp = thread->GetSelectedFrame(); 46959da225f5634046120475ca2af89d08b09e3747a8Jim Ingham if (!selected_frame_sp) 46969da225f5634046120475ca2af89d08b09e3747a8Jim Ingham { 46979da225f5634046120475ca2af89d08b09e3747a8Jim Ingham thread->SetSelectedFrame(0); 46989da225f5634046120475ca2af89d08b09e3747a8Jim Ingham selected_frame_sp = thread->GetSelectedFrame(); 46999da225f5634046120475ca2af89d08b09e3747a8Jim Ingham if (!selected_frame_sp) 47009da225f5634046120475ca2af89d08b09e3747a8Jim Ingham { 47019da225f5634046120475ca2af89d08b09e3747a8Jim Ingham errors.Printf("RunThreadPlan called without a selected frame on thread %d", thread_idx_id); 47029da225f5634046120475ca2af89d08b09e3747a8Jim Ingham return eExecutionSetupError; 47039da225f5634046120475ca2af89d08b09e3747a8Jim Ingham } 47049da225f5634046120475ca2af89d08b09e3747a8Jim Ingham } 47059da225f5634046120475ca2af89d08b09e3747a8Jim Ingham 47069da225f5634046120475ca2af89d08b09e3747a8Jim Ingham StackID ctx_frame_id = selected_frame_sp->GetStackID(); 4707360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4708360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // N.B. Running the target may unset the currently selected thread and frame. We don't want to do that either, 4709360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // so we should arrange to reset them as well. 4710360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4711567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::ThreadSP selected_thread_sp = GetThreadList().GetSelectedThread(); 4712360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 47137bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham uint32_t selected_tid; 47147bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham StackID selected_stack_id; 4715e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (selected_thread_sp) 4716360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4717360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_tid = selected_thread_sp->GetIndexID(); 47187bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham selected_stack_id = selected_thread_sp->GetSelectedFrame()->GetStackID(); 4719360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4720360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 4721360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4722360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_tid = LLDB_INVALID_THREAD_ID; 4723360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4724360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 47251831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham lldb::thread_t backup_private_state_thread = LLDB_INVALID_HOST_THREAD; 4726d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham lldb::StateType old_state; 4727d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham lldb::ThreadPlanSP stopper_base_plan_sp; 47281831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 4729952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 47301831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham if (Host::GetCurrentThread() == m_private_state_thread) 47311831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham { 4732d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // Yikes, we are running on the private state thread! So we can't wait for public events on this thread, since 4733d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // we are the thread that is generating public events. 47341831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham // The simplest thing to do is to spin up a temporary thread to handle private state thread events while 4735d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // we are fielding public events here. 4736d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham if (log) 4737559cf6e8b52b940f5f4362b32d628838d6301e2eJason Molenda log->Printf ("Running thread plan on private state thread, spinning up another state thread to handle the events."); 4738d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 4739d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 47401831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham backup_private_state_thread = m_private_state_thread; 4741d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 4742d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // One other bit of business: we want to run just this thread plan and anything it pushes, and then stop, 4743d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // returning control here. 4744d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // But in the normal course of things, the plan above us on the stack would be given a shot at the stop 4745d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // event before deciding to stop, and we don't want that. So we insert a "stopper" base plan on the stack 4746d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // before the plan we want to run. Since base plans always stop and return control to the user, that will 4747d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // do just what we want. 4748d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham stopper_base_plan_sp.reset(new ThreadPlanBase (*thread)); 4749d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham thread->QueueThreadPlan (stopper_base_plan_sp, false); 4750d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // Have to make sure our public state is stopped, since otherwise the reporting logic below doesn't work correctly. 4751d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham old_state = m_public_state.GetValue(); 4752d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham m_public_state.SetValueNoLock(eStateStopped); 4753d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 4754d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // Now spin up the private state thread: 47551831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham StartPrivateStateThread(true); 47561831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham } 47571831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 47581831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham thread->QueueThreadPlan(thread_plan_sp, false); // This used to pass "true" does that make sense? 4759360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 47606ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham Listener listener("lldb.process.listener.run-thread-plan"); 4761f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 47625b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan lldb::EventSP event_to_broadcast_sp; 4763f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4764360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 47655b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // This process event hijacker Hijacks the Public events and its destructor makes sure that the process events get 47665b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // restored on exit to the function. 47675b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // 47685b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // If the event needs to propagate beyond the hijacker (e.g., the process exits during execution), then the event 47695b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // is put into event_to_broadcast_sp for rebroadcasting. 4770f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 47715b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan ProcessEventHijacker run_thread_plan_hijacker (*this, &listener); 47725b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 47735b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) 4774f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 47755b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan StreamString s; 47765b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose); 47775f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Process::RunThreadPlan(): Resuming thread %u - 0x%4.4" PRIx64 " to run thread plan \"%s\".", 47785b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan thread->GetIndexID(), 47795b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan thread->GetID(), 47805b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan s.GetData()); 47815b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 47825b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 47835b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan bool got_event; 47845b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan lldb::EventSP event_sp; 47855b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan lldb::StateType stop_state = lldb::eStateInvalid; 47865b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 47875b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan TimeValue* timeout_ptr = NULL; 47885b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan TimeValue real_timeout; 47895b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 479089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham bool before_first_timeout = true; // This is set to false the first time that we have to halt the target. 47915b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan bool do_resume = true; 4792b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool handle_running_event = true; 479347beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham const uint64_t default_one_thread_timeout_usec = 250000; 47945b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 479589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // This is just for accounting: 479689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham uint32_t num_resumes = 0; 479789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 479889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham TimeValue one_thread_timeout = TimeValue::Now(); 479989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham TimeValue final_timeout = one_thread_timeout; 480089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 480189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (run_others) 480289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 480389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // If we are running all threads then we take half the time to run all threads, bounded by 480489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // .25 sec. 480589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (timeout_usec == 0) 480689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham one_thread_timeout.OffsetWithMicroSeconds(default_one_thread_timeout_usec); 480789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham else 480889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 4809d387b462eecb908af265ecc7006781b4532073adGreg Clayton uint64_t computed_timeout = timeout_usec / 2; 481089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (computed_timeout > default_one_thread_timeout_usec) 481189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham computed_timeout = default_one_thread_timeout_usec; 481289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham one_thread_timeout.OffsetWithMicroSeconds(computed_timeout); 481389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 481489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham final_timeout.OffsetWithMicroSeconds (timeout_usec); 481589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 481689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham else 481789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 481889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (timeout_usec != 0) 481989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham final_timeout.OffsetWithMicroSeconds(timeout_usec); 482089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 482189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 482276b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham // This while loop must exit out the bottom, there's cleanup that we need to do when we are done. 482376b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham // So don't call return anywhere within it. 482476b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham 48255b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan while (1) 48265b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 48275b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // We usually want to resume the process if we get to the top of the loop. 48285b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // The only exception is if we get two running events with no intervening 48295b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // stop, which can happen, we will just wait for then next stop event. 483089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 483189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Top of while loop: do_resume: %i handle_running_event: %i before_first_timeout: %i.", 483289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham do_resume, 483389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham handle_running_event, 483489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham before_first_timeout); 4835f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4836b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham if (do_resume || handle_running_event) 4837f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 48385b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // Do the initial resume and wait for the running event before going further. 48395b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 4840b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham if (do_resume) 48415b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 484289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham num_resumes++; 4843b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham Error resume_error = PrivateResume (); 4844b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham if (!resume_error.Success()) 4845b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham { 484689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham errors.Printf("Error resuming inferior the %d time: \"%s\".\n", 484789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham num_resumes, 484889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham resume_error.AsCString()); 4849b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham return_value = eExecutionSetupError; 4850b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham break; 4851b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham } 48525b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 48535b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 485489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham TimeValue resume_timeout = TimeValue::Now(); 485589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham resume_timeout.OffsetWithMicroSeconds(500000); 485689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 485789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham got_event = listener.WaitForEvent(&resume_timeout, event_sp); 48585b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (!got_event) 48595b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 48605b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) 486189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Process::RunThreadPlan(): didn't get any event after resume %d, exiting.", 486289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham num_resumes); 4863f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 486489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham errors.Printf("Didn't get any event after resume %d, exiting.", num_resumes); 48655b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan return_value = eExecutionSetupError; 48665b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan break; 48675b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 48685b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 48695b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 487089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 48715b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (stop_state != eStateRunning) 48725b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 487389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham bool restarted = false; 487489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 487589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (stop_state == eStateStopped) 487689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 487789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham restarted = Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()); 487889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 487989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf("Process::RunThreadPlan(): didn't get running event after " 488089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham "resume %d, got %s instead (restarted: %i, do_resume: %i, handle_running_event: %i).", 488189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham num_resumes, 488289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham StateAsCString(stop_state), 488389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham restarted, 488489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham do_resume, 488589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham handle_running_event); 488689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 488789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 488889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (restarted) 488989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 489089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // This is probably an overabundance of caution, I don't think I should ever get a stopped & restarted 489189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // event here. But if I do, the best thing is to Halt and then get out of here. 489289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham Halt(); 489389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 489489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 489547beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham errors.Printf("Didn't get running event after initial resume, got %s instead.", 489647beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham StateAsCString(stop_state)); 48975b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan return_value = eExecutionSetupError; 48985b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan break; 48995b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 4900f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4901f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 49025b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan log->PutCString ("Process::RunThreadPlan(): resuming succeeded."); 49035b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // We need to call the function synchronously, so spin waiting for it to return. 49045b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // If we get interrupted while executing, we're going to lose our context, and 49055b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // won't be able to gather the result at this point. 49065b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // We set the timeout AFTER the resume, since the resume takes some time and we 49075b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // don't want to charge that to the timeout. 490889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 490989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham else 491089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 491189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 491289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->PutCString ("Process::RunThreadPlan(): waiting for next event."); 491389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 491447beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham 491589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (before_first_timeout) 491689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 491789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (run_others) 491889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham timeout_ptr = &one_thread_timeout; 49196cca9695637b27bd583eaae310d5c09dede7cc49Enrico Granata else 49206cca9695637b27bd583eaae310d5c09dede7cc49Enrico Granata { 492189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (timeout_usec == 0) 492289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham timeout_ptr = NULL; 492389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham else 492489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham timeout_ptr = &final_timeout; 49256cca9695637b27bd583eaae310d5c09dede7cc49Enrico Granata } 4926f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 49275b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan else 4928f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 492989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (timeout_usec == 0) 493089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham timeout_ptr = NULL; 493189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham else 493289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham timeout_ptr = &final_timeout; 4933f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 493489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 493589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham do_resume = true; 493689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham handle_running_event = true; 49375b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 49385b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // Now wait for the process to stop again: 49395b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan event_sp.reset(); 4940f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham 49415b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) 4942f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham { 49435b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (timeout_ptr) 49445b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 4945fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec log->Printf ("Process::RunThreadPlan(): about to wait - now is %" PRIu64 " - endpoint is %" PRIu64, 494689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham TimeValue::Now().GetAsMicroSecondsSinceJan1_1970(), 494789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham timeout_ptr->GetAsMicroSecondsSinceJan1_1970()); 49485b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 49495b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan else 49505b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 49515b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan log->Printf ("Process::RunThreadPlan(): about to wait forever."); 49525b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 4953f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham } 49545b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 49555b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan got_event = listener.WaitForEvent (timeout_ptr, event_sp); 49565b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 49575b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (got_event) 4958f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 49595b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (event_sp.get()) 4960f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 49615b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan bool keep_going = false; 49625d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (event_sp->GetType() == eBroadcastBitInterrupt) 49632370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 49645d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham Halt(); 49655d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham return_value = eExecutionInterrupted; 49665d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham errors.Printf ("Execution halted by user interrupt."); 49675d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (log) 49685d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham log->Printf ("Process::RunThreadPlan(): Got interrupted by eBroadcastBitInterrupted, exiting."); 496989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham break; 49705d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 49715d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham else 49725d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham { 49735d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 49745d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (log) 49755d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham log->Printf("Process::RunThreadPlan(): in while loop, got event: %s.", StateAsCString(stop_state)); 49765d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 49775d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham switch (stop_state) 49782370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 49795d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham case lldb::eStateStopped: 4980439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton { 498189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // We stopped, figure out what we are going to do now. 49825d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham ThreadSP thread_sp = GetThreadList().FindThreadByIndexID (thread_idx_id); 49835d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (!thread_sp) 49845b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 49855d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham // Ooh, our thread has vanished. Unlikely that this was successful execution... 49865b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) 49875d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham log->Printf ("Process::RunThreadPlan(): execution completed but our thread (index-id=%u) has vanished.", thread_idx_id); 49885d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham return_value = eExecutionInterrupted; 49895b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 49905b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan else 49915b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 499289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // If we were restarted, we just need to go back up to fetch another event. 499389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get())) 49945d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham { 49955d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (log) 499689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 499789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Process::RunThreadPlan(): Got a stop and restart, so we'll continue waiting."); 499889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 499989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham keep_going = true; 500089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham do_resume = false; 500189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham handle_running_event = true; 500289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 50035d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 50045d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham else 50055d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham { 500689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 500789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham StopInfoSP stop_info_sp (thread_sp->GetStopInfo ()); 500889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham StopReason stop_reason = eStopReasonInvalid; 500989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (stop_info_sp) 501089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham stop_reason = stop_info_sp->GetStopReason(); 501189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 501289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 501389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // FIXME: We only check if the stop reason is plan complete, should we make sure that 501489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // it is OUR plan that is complete? 501589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (stop_reason == eStopReasonPlanComplete) 5016b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham { 5017b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham if (log) 501889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->PutCString ("Process::RunThreadPlan(): execution completed successfully."); 501989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // Now mark this plan as private so it doesn't get reported as the stop reason 502089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // after this point. 502189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (thread_plan_sp) 502289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 502389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return_value = eExecutionCompleted; 5024b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham } 5025b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham else 5026b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham { 502789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // Something restarted the target, so just wait for it to stop for real. 5028b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham if (stop_reason == eStopReasonBreakpoint) 502989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 503089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 503189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Process::RunThreadPlan() stopped for breakpoint: %s.", stop_info_sp->GetDescription()); 5032b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham return_value = eExecutionHitBreakpoint; 503301711aa1b451159a31d6423ee8919a3a426b4984Sean Callanan if (!ignore_breakpoints) 503401711aa1b451159a31d6423ee8919a3a426b4984Sean Callanan { 503501711aa1b451159a31d6423ee8919a3a426b4984Sean Callanan event_to_broadcast_sp = event_sp; 503601711aa1b451159a31d6423ee8919a3a426b4984Sean Callanan } 503789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 5038b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham else 503989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 504089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 504189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->PutCString ("Process::RunThreadPlan(): thread plan didn't successfully complete."); 504201711aa1b451159a31d6423ee8919a3a426b4984Sean Callanan if (!unwind_on_error) 504301711aa1b451159a31d6423ee8919a3a426b4984Sean Callanan event_to_broadcast_sp = event_sp; 5044b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham return_value = eExecutionInterrupted; 504589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 5046b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham } 50475d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 50485b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 50495d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 50505d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham break; 5051439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 50525d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham case lldb::eStateRunning: 505389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // This shouldn't really happen, but sometimes we do get two running events without an 505489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // intervening stop, and in that case we should just go back to waiting for the stop. 50555d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham do_resume = false; 50565d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham keep_going = true; 5057b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham handle_running_event = false; 50585d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham break; 5059439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 50605d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham default: 50615d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (log) 50625d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham log->Printf("Process::RunThreadPlan(): execution stopped with unexpected state: %s.", StateAsCString(stop_state)); 50635d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 50645d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (stop_state == eStateExited) 50655d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham event_to_broadcast_sp = event_sp; 50665d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 506796abc62dcb25159dbb532e477ba2cf6d85b81700Sean Callanan errors.Printf ("Execution stopped with unexpected state.\n"); 50685d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham return_value = eExecutionInterrupted; 50695d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham break; 50705d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 50715b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 50725d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 50735b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (keep_going) 50745b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan continue; 50755b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan else 50765b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan break; 50775b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 50785b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan else 50795b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 5080f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 50815b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan log->PutCString ("Process::RunThreadPlan(): got_event was true, but the event pointer was null. How odd..."); 5082b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 5083f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 5084f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 50855b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 5086f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 5087f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 50885b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // If we didn't get an event that means we've timed out... 50895b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // We will interrupt the process here. Depending on what we were asked to do we will 50905b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // either exit, or try with all threads running for the same timeout. 50915b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 50925b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) { 509347beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham if (run_others) 50945b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 509589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham uint64_t remaining_time = final_timeout - TimeValue::Now(); 509689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (before_first_timeout) 509789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Process::RunThreadPlan(): Running function with one thread timeout timed out, " 509889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham "running till for %" PRId64 " usec with all threads enabled.", 509989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham remaining_time); 51005b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan else 51015b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan log->Printf ("Process::RunThreadPlan(): Restarting function with all threads enabled " 510247beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham "and timeout: %d timed out, abandoning execution.", 510347beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham timeout_usec); 51045b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 5105f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 51065b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, " 510747beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham "abandoning execution.", 510847beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham timeout_usec); 5109f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 5110f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 511189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // It is possible that between the time we issued the Halt, and we get around to calling Halt the target 511289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // could have stopped. That's fine, Halt will figure that out and send the appropriate Stopped event. 511389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // BUT it is also possible that we stopped & restarted (e.g. hit a signal with "stop" set to false.) In 511489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // that case, we'll get the stopped & restarted event, and we should go back to waiting for the Halt's 511589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // stopped event. That's what this while loop does. 511689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 511789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham bool back_to_top = true; 511889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham uint32_t try_halt_again = 0; 511989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham bool do_halt = true; 512089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham const uint32_t num_retries = 5; 512189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham while (try_halt_again < num_retries) 5122f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 512389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham Error halt_error; 512489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (do_halt) 5125f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 51265b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) 512789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Process::RunThreadPlan(): Running Halt."); 512889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham halt_error = Halt(); 51295b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 513089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (halt_error.Success()) 51315b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 51325b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) 513389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->PutCString ("Process::RunThreadPlan(): Halt succeeded."); 51345b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 513589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham real_timeout = TimeValue::Now(); 513689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham real_timeout.OffsetWithMicroSeconds(500000); 5137f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 513889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham got_event = listener.WaitForEvent(&real_timeout, event_sp); 513989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 514089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (got_event) 514189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 514289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 514389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 51445b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 514589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->Printf ("Process::RunThreadPlan(): Stopped with event: %s", StateAsCString(stop_state)); 514689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (stop_state == lldb::eStateStopped 514789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get())) 514889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->PutCString (" Event was the Halt interruption event."); 51495b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 515089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 515189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (stop_state == lldb::eStateStopped) 51525b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 515389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // Between the time we initiated the Halt and the time we delivered it, the process could have 515489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // already finished its job. Check that here: 515589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 515689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (thread->IsThreadPlanDone (thread_plan_sp.get())) 515789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 515889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 515989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done. " 516089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham "Exiting wait loop."); 516189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return_value = eExecutionCompleted; 516289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham back_to_top = false; 516389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham break; 516489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 516589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 516689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get())) 516789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 516889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 516989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->PutCString ("Process::RunThreadPlan(): Went to halt but got a restarted event, there must be an un-restarted stopped event so try again... " 517089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham "Exiting wait loop."); 517189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham try_halt_again++; 517289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham do_halt = false; 517389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham continue; 517489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 517589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 517689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (!run_others) 517789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 517889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 517989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->PutCString ("Process::RunThreadPlan(): try_all_threads was false, we stopped so now we're quitting."); 518089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return_value = eExecutionInterrupted; 518189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham back_to_top = false; 518289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham break; 518389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 518489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 518589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (before_first_timeout) 518689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 518789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // Set all the other threads to run, and return to the top of the loop, which will continue; 518889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham before_first_timeout = false; 518989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham thread_plan_sp->SetStopOthers (false); 519089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 519189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->PutCString ("Process::RunThreadPlan(): about to resume."); 519289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 519389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham back_to_top = true; 519489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham break; 519589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 519689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham else 519789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 519889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham // Running all threads failed, so return Interrupted. 519989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (log) 520089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->PutCString("Process::RunThreadPlan(): running all threads timed out."); 520189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return_value = eExecutionInterrupted; 520289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham back_to_top = false; 520389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham break; 520489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 52055b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 5206f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 5207f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 520889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { if (log) 520989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham log->PutCString("Process::RunThreadPlan(): halt said it succeeded, but I got no event. " 521089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham "I'm getting out of here passing Interrupted."); 5211b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 521289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham back_to_top = false; 521389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham break; 5214f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 5215f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 521689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham else 521789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 521889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham try_halt_again++; 521989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham continue; 522089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 52216ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham } 522289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 522389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (!back_to_top || try_halt_again > num_retries) 522489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham break; 522589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham else 522689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham continue; 52275b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 52285b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } // END WAIT LOOP 5229360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 52305b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // If we had to start up a temporary private state thread to run this thread plan, shut it down now. 52315b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (IS_VALID_LLDB_HOST_THREAD(backup_private_state_thread)) 5232d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham { 52335b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan StopPrivateStateThread(); 52345b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan Error error; 52355b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan m_private_state_thread = backup_private_state_thread; 5236b386d82334b65fb984348f2027b1cb7714de993fSean Callanan if (stopper_base_plan_sp) 5237360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 52385b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan thread->DiscardThreadPlansUpToPlan(stopper_base_plan_sp); 5239f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 52405b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan m_public_state.SetValueNoLock(old_state); 5241f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 52425b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 52435b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 5244b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham // Restore the thread state if we are going to discard the plan execution. There are three cases where this 5245b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham // could happen: 5246b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham // 1) The execution successfully completed 5247b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham // 2) We hit a breakpoint, and ignore_breakpoints was true 5248b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham // 3) We got some other error, and discard_on_error was true 5249b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool should_unwind = (return_value == eExecutionInterrupted && unwind_on_error) 5250b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham || (return_value == eExecutionHitBreakpoint && ignore_breakpoints); 525176b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham 5252b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham if (return_value == eExecutionCompleted 5253b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham || should_unwind) 525476b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham { 525576b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham thread_plan_sp->RestoreThreadState(); 525676b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham } 52575b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 52585b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // Now do some processing on the results of the run: 5259b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham if (return_value == eExecutionInterrupted || return_value == eExecutionHitBreakpoint) 52605b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 52615b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) 5262f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 52635b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan StreamString s; 52645b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (event_sp) 52655b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan event_sp->Dump (&s); 52665b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan else 5267c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham { 52685b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan log->PutCString ("Process::RunThreadPlan(): Stop event that interrupted us is NULL."); 5269c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 5270c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham 52715b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan StreamString ts; 52725b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 52735b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan const char *event_explanation = NULL; 5274360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 52755b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan do 5276360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 52775d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (!event_sp) 52785b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 52795d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham event_explanation = "<no event>"; 52805b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan break; 52815b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 52825d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham else if (event_sp->GetType() == eBroadcastBitInterrupt) 5283360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 52845d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham event_explanation = "<user interrupt>"; 52855b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan break; 5286360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 52875d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham else 5288c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham { 52895d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get()); 52905d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 52915d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (!event_data) 52925d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham { 52935d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham event_explanation = "<no event data>"; 52945d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham break; 52955d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 52965b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 52975d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham Process *process = event_data->GetProcessSP().get(); 52985d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 52995d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (!process) 53005b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 53015d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham event_explanation = "<no process>"; 53025d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham break; 53035b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 53045b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 53055d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham ThreadList &thread_list = process->GetThreadList(); 53065b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 53075d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham uint32_t num_threads = thread_list.GetSize(); 53085d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham uint32_t thread_index; 53095d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 53105d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham ts.Printf("<%u threads> ", num_threads); 53115b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 53125d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham for (thread_index = 0; 53135d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham thread_index < num_threads; 53145d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham ++thread_index) 53155b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 53165d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham Thread *thread = thread_list.GetThreadAtIndex(thread_index).get(); 53175d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 53185d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (!thread) 53195d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham { 53205d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham ts.Printf("<?> "); 53215d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham continue; 53225d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 53235d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 53245f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea ts.Printf("<0x%4.4" PRIx64 " ", thread->GetID()); 53255d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham RegisterContext *register_context = thread->GetRegisterContext().get(); 53265d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 53275d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (register_context) 53285f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea ts.Printf("[ip 0x%" PRIx64 "] ", register_context->GetPC()); 53295d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham else 53305d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham ts.Printf("[ip unknown] "); 53315d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 53325d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham lldb::StopInfoSP stop_info_sp = thread->GetStopInfo(); 53335d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (stop_info_sp) 53345d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham { 53355d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham const char *stop_desc = stop_info_sp->GetDescription(); 53365d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (stop_desc) 53375d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham ts.PutCString (stop_desc); 53385d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 53395d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham ts.Printf(">"); 53405b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 53415d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 53425d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham event_explanation = ts.GetData(); 5343c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 53445b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } while (0); 5345f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 53465d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (event_explanation) 53475d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham log->Printf("Process::RunThreadPlan(): execution interrupted: %s %s", s.GetData(), event_explanation); 5348f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham else 53495d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham log->Printf("Process::RunThreadPlan(): execution interrupted: %s", s.GetData()); 53505d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 53515d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham 5352b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham if (should_unwind && thread_plan_sp) 53535d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham { 53545d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (log) 53555d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham log->Printf ("Process::RunThreadPlan: ExecutionInterrupted - discarding thread plans up to %p.", thread_plan_sp.get()); 53565d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 53575d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 53585d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham } 53595d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham else 53605d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham { 53615d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham if (log) 53625d90ade8e8e0d776fe8e1b9e88fc1c86d02e8e4eJim Ingham log->Printf ("Process::RunThreadPlan: ExecutionInterrupted - for plan: %p not discarding.", thread_plan_sp.get()); 53635b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 53645b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 53655b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan else if (return_value == eExecutionSetupError) 53665b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 53675b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) 53685b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan log->PutCString("Process::RunThreadPlan(): execution set up error."); 5369f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 5370b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham if (unwind_on_error && thread_plan_sp) 5371360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 5372567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 537321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 5374360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 53755b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 53765b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan else 53775b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 53785b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (thread->IsThreadPlanDone (thread_plan_sp.get())) 53795b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 53805b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) 53815b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan log->PutCString("Process::RunThreadPlan(): thread plan is done"); 53825b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan return_value = eExecutionCompleted; 53835b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 53845b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan else if (thread->WasThreadPlanDiscarded (thread_plan_sp.get())) 53855b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 53865b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) 53875b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan log->PutCString("Process::RunThreadPlan(): thread plan was discarded"); 53885b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan return_value = eExecutionDiscarded; 53895b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 5390f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham else 5391f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham { 5392f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham if (log) 53935b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan log->PutCString("Process::RunThreadPlan(): thread plan stopped in mid course"); 5394b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham if (unwind_on_error && thread_plan_sp) 53955b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan { 53965b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) 5397b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham log->PutCString("Process::RunThreadPlan(): discarding thread plan 'cause unwind_on_error is set."); 53985b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 53995b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan thread_plan_sp->SetPrivate (orig_plan_private); 54005b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan } 5401f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham } 5402360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 54035b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 54045b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // Thread we ran the function in may have gone away because we ran the target 54055b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // Check that it's still there, and if it is put it back in the context. Also restore the 54065b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // frame in the context if it is still present. 54075b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan thread = GetThreadList().FindThreadByIndexID(thread_idx_id, true).get(); 54085b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (thread) 5409f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 54105b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan exe_ctx.SetFrameSP (thread->GetFrameWithStackID (ctx_frame_id)); 5411f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 54125b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 54135b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // Also restore the current process'es selected frame & thread, since this function calling may 54145b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // be done behind the user's back. 54155b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan 54165b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (selected_tid != LLDB_INVALID_THREAD_ID) 5417f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 54185b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (GetThreadList().SetSelectedThreadByIndexID (selected_tid) && selected_stack_id.IsValid()) 5419f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 54205b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // We were able to restore the selected thread, now restore the frame: 5421666a1f8a7b5caa18abdee9503bc20c49b0542e59Daniel Malea Mutex::Locker lock(GetThreadList().GetMutex()); 54225b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan StackFrameSP old_frame_sp = GetThreadList().GetSelectedThread()->GetFrameWithStackID(selected_stack_id); 54235b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (old_frame_sp) 54245b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan GetThreadList().GetSelectedThread()->SetSelectedFrame(old_frame_sp.get()); 5425f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 5426f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 5427f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 5428360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 54295b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan // If the process exited during the run of the thread plan, notify everyone. 5430360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 54315b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (event_to_broadcast_sp) 5432360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 54335b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan if (log) 54345b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan log->PutCString("Process::RunThreadPlan(): rebroadcasting event."); 54355b0a5ac06d3be8ca483ac214930126234ad3f99fSean Callanan BroadcastEvent(event_to_broadcast_sp); 5436360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 5437360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 5438360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return return_value; 5439360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 5440360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 5441360f53f3c216ee4fb433da0a367168785328a856Jim Inghamconst char * 5442360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::ExecutionResultAsCString (ExecutionResults result) 5443360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 5444360f53f3c216ee4fb433da0a367168785328a856Jim Ingham const char *result_name; 5445360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 5446360f53f3c216ee4fb433da0a367168785328a856Jim Ingham switch (result) 5447360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 5448b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionCompleted: 5449360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionCompleted"; 5450360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 5451b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionDiscarded: 5452360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionDiscarded"; 5453360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 5454b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionInterrupted: 5455360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionInterrupted"; 5456360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 5457b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham case eExecutionHitBreakpoint: 5458b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham result_name = "eExecutionHitBreakpoint"; 5459b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham break; 5460b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionSetupError: 5461360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionSetupError"; 5462360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 5463b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionTimedOut: 5464360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionTimedOut"; 5465360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 5466360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 5467360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return result_name; 5468360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 5469360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 5470abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonvoid 5471abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::GetStatus (Stream &strm) 5472abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 5473abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const StateType state = GetState(); 5474202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton if (StateIsStoppedState(state, false)) 5475abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 5476abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (state == eStateExited) 5477abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 5478abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton int exit_status = GetExitStatus(); 5479abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const char *exit_description = GetExitDescription(); 54805f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea strm.Printf ("Process %" PRIu64 " exited with status = %i (0x%8.8x) %s\n", 5481abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton GetID(), 5482abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton exit_status, 5483abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton exit_status, 5484abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton exit_description ? exit_description : ""); 5485abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 5486abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 5487abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 5488abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (state == eStateConnected) 5489abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.Printf ("Connected to remote target.\n"); 5490abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 54915f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea strm.Printf ("Process %" PRIu64 " %s\n", GetID(), StateAsCString (state)); 5492abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 5493abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 5494abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 5495abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 54965f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea strm.Printf ("Process %" PRIu64 " is running.\n", GetID()); 5497abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 5498abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 5499abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 5500abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonsize_t 5501abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::GetThreadStatus (Stream &strm, 5502abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool only_threads_with_stop_reason, 5503abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t start_frame, 5504abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames, 5505abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames_with_source) 5506abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 5507abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton size_t num_thread_infos_dumped = 0; 5508abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 5509b9950593807dad072c9cab77f2b84cb0e8004ffeJim Ingham Mutex::Locker locker (GetThreadList().GetMutex()); 5510abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const size_t num_threads = GetThreadList().GetSize(); 5511abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton for (uint32_t i = 0; i < num_threads; i++) 5512abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 5513abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton Thread *thread = GetThreadList().GetThreadAtIndex(i).get(); 5514abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (thread) 5515abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 5516abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (only_threads_with_stop_reason) 5517abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 55186bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham StopInfoSP stop_info_sp = thread->GetStopInfo(); 55196bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham if (stop_info_sp.get() == NULL || !stop_info_sp->IsValid()) 5520abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton continue; 5521abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 5522abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton thread->GetStatus (strm, 5523abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton start_frame, 5524abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_frames, 5525abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_frames_with_source); 5526abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton ++num_thread_infos_dumped; 5527abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 5528abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 5529abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton return num_thread_infos_dumped; 5530abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 5531abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 5532761133029ba2d5bb0c21c3a871dede340b2775fcGreg Claytonvoid 5533761133029ba2d5bb0c21c3a871dede340b2775fcGreg ClaytonProcess::AddInvalidMemoryRegion (const LoadRange ®ion) 5534761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton{ 5535761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton m_memory_cache.AddInvalidRange(region.GetRangeBase(), region.GetByteSize()); 5536761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton} 5537761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton 5538761133029ba2d5bb0c21c3a871dede340b2775fcGreg Claytonbool 5539761133029ba2d5bb0c21c3a871dede340b2775fcGreg ClaytonProcess::RemoveInvalidMemoryRange (const LoadRange ®ion) 5540761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton{ 5541761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton return m_memory_cache.RemoveInvalidRange(region.GetRangeBase(), region.GetByteSize()); 5542761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton} 5543761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton 55441831e78a6253392fca1c99e555e7adaa3f372647Jim Inghamvoid 55451831e78a6253392fca1c99e555e7adaa3f372647Jim InghamProcess::AddPreResumeAction (PreResumeActionCallback callback, void *baton) 55461831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham{ 55471831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham m_pre_resume_actions.push_back(PreResumeCallbackAndBaton (callback, baton)); 55481831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham} 55491831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 55501831e78a6253392fca1c99e555e7adaa3f372647Jim Inghambool 55511831e78a6253392fca1c99e555e7adaa3f372647Jim InghamProcess::RunPreResumeActions () 55521831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham{ 55531831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham bool result = true; 55541831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham while (!m_pre_resume_actions.empty()) 55551831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham { 55561831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham struct PreResumeCallbackAndBaton action = m_pre_resume_actions.back(); 55571831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham m_pre_resume_actions.pop_back(); 55581831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham bool this_result = action.callback (action.baton); 55591831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham if (result == true) result = this_result; 55601831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham } 55611831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham return result; 55621831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham} 55631831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 55641831e78a6253392fca1c99e555e7adaa3f372647Jim Inghamvoid 55651831e78a6253392fca1c99e555e7adaa3f372647Jim InghamProcess::ClearPreResumeActions () 55661831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham{ 55671831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham m_pre_resume_actions.clear(); 55681831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham} 5569761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton 5570cf5927ee246f5e431162f2753ed9e040dd060fe5Greg Claytonvoid 5571cf5927ee246f5e431162f2753ed9e040dd060fe5Greg ClaytonProcess::Flush () 5572cf5927ee246f5e431162f2753ed9e040dd060fe5Greg Clayton{ 5573cf5927ee246f5e431162f2753ed9e040dd060fe5Greg Clayton m_thread_list.Flush(); 5574cf5927ee246f5e431162f2753ed9e040dd060fe5Greg Clayton} 55750bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton 55760bce9a22354df3f00e68ffd912119a0741753b7fGreg Claytonvoid 55770bce9a22354df3f00e68ffd912119a0741753b7fGreg ClaytonProcess::DidExec () 55780bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton{ 55790bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton Target &target = GetTarget(); 55800bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton target.CleanupProcess (); 55810bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton ModuleList unloaded_modules (target.GetImages()); 55820bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton target.ModulesDidUnload (unloaded_modules); 55830bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton target.GetSectionLoadList().Clear(); 55840bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton m_dynamic_checkers_ap.reset(); 55850bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton m_abi_sp.reset(); 55860bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton m_os_ap.reset(); 55874d4ff9e8f7746ba1b1d597512b7cb711350c0206Greg Clayton m_dyld_ap.reset(); 55880bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton m_image_tokens.clear(); 55890bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton m_allocated_memory_cache.Clear(); 55900bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton m_language_runtimes.clear(); 55914d4ff9e8f7746ba1b1d597512b7cb711350c0206Greg Clayton m_thread_list.DiscardThreadPlans(); 55924d4ff9e8f7746ba1b1d597512b7cb711350c0206Greg Clayton m_memory_cache.Clear(true); 55930bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton DoDidExec(); 55940bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton CompleteAttach (); 55950bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton} 5596