Process.cpp revision 1f3dd643e10552de04644986a603f7ff02ed4beb
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 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/StoppointCallbackContext.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointLocation.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Event.h" 17861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice#include "lldb/Core/ConnectionFileDescriptor.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h" 19861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice#include "lldb/Core/InputReader.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice#include "lldb/Interpreter/CommandInterpreter.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Host.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ABI.h" 260baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton#include "lldb/Target/DynamicLoader.h" 27642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/LanguageRuntime.h" 28642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/CPPLanguageRuntime.h" 29642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/ObjCLanguageRuntime.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 31643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/StopInfo.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess* 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::FindPlugin (Target &target, const char *plugin_name, Listener &listener) 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessCreateInstance create_callback = NULL; 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (plugin_name) 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner create_callback = PluginManager::GetProcessCreateCallbackForPluginName (plugin_name); 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (create_callback) 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Process> debugger_ap(create_callback(target, listener)); 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (debugger_ap->CanDebug(target)) 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return debugger_ap.release(); 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx) 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton std::auto_ptr<Process> debugger_ap(create_callback(target, listener)); 5954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton if (debugger_ap->CanDebug(target)) 6054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton return debugger_ap.release(); 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process constructor 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Process(Target &target, Listener &listener) : 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UserID (LLDB_INVALID_PROCESS_ID), 7249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton Broadcaster ("lldb.process"), 73c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton ProcessInstanceSettings (*GetSettingsController()), 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target (target), 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_public_state (eStateUnloaded), 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state (eStateUnloaded), 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_broadcaster ("lldb.process.internal_state_broadcaster"), 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_broadcaster ("lldb.process.internal_state_control_broadcaster"), 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener ("lldb.process.internal_state_listener"), 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait(), 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_thread (LLDB_INVALID_HOST_THREAD), 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stop_id (0), 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_index_id (0), 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_status (-1), 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_string (), 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_list (this), 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications (), 8820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_image_tokens (), 8920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_listener (listener), 9020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_breakpoint_site_list (), 9120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_dynamic_checkers_ap (), 92861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_unix_signals (), 9320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_target_triple (), 9420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_byte_order (eByteOrderHost), 9520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_addr_byte_size (0), 9620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_abi_sp (), 97861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader (), 98eecb0f3b5021e37311f9588f14bcab38a35b8e9aGreg Clayton m_stdio_communication ("lldb.process.stdio"), 9920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_stdio_communication_mutex (Mutex::eMutexTypeRecursive), 100861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdout_data () 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1021ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice UpdateInstanceName(); 1031ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 104e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Process::Process()", this); 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitStateChanged, "state-changed"); 10949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitInterrupt, "interrupt"); 11049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitSTDOUT, "stdout-available"); 11149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitSTDERR, "stderr-available"); 11249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner listener.StartListeningForEvents (this, 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitStateChanged | 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitInterrupt | 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitSTDOUT | 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitSTDERR); 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster, 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitStateChanged); 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster, 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlStop | 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlPause | 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlResume); 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::~Process() 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 133e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Process::~Process()", this); 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Finalize() 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Do any cleanup needed prior to being destructed... Subclasses 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // that override this method should call this superclass method as well. 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RegisterNotificationCallbacks (const Notifications& callbacks) 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications.push_back(callbacks); 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (callbacks.initialize != NULL) 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner callbacks.initialize (callbacks.baton, this); 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::UnregisterNotificationCallbacks(const Notifications& callbacks) 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<Notifications>::iterator pos, end = m_notifications.end(); 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_notifications.begin(); pos != end; ++pos) 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->baton == callbacks.baton && 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->initialize == callbacks.initialize && 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->process_state_changed == callbacks.process_state_changed) 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications.erase(pos); 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SynchronouslyNotifyStateChanged (StateType state) 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end(); 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos) 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (notification_pos->process_state_changed) 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner notification_pos->process_state_changed (notification_pos->baton, this, state); 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: We need to do some work on events before the general Listener sees them. 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// For instance if we are continuing from a breakpoint, we need to ensure that we do 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the little "insert real insn, step & stop" trick. But we can't do that when the 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// event is delivered by the broadcaster - since that is done on the thread that is 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// waiting for new events, so if we needed more than one event for our handling, we would 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// stall. So instead we do it when we fetch the event off of the queue. 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextEvent (EventSP &event_sp) 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp) 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent (event_sp.get()); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessToStop (const TimeValue *timeout) 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType match_states[] = { eStateStopped, eStateCrashed, eStateDetached, eStateExited, eStateUnloaded }; 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return WaitForState (timeout, match_states, sizeof(match_states) / sizeof(StateType)); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForState 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const TimeValue *timeout, 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType *match_states, const uint32_t num_match_states 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 219d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton StateType state = GetState(); 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (state != eStateInvalid) 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 222d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton // If we are exited or detached, we won't ever get back to any 223d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton // other valid state... 224d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton if (state == eStateDetached || state == eStateExited) 225d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton return state; 226d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = WaitForStateChangedEvents (timeout, event_sp); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_match_states; ++i) 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_states[i] == state) 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghambool 23963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::HijackProcessEvents (Listener *listener) 24063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 24163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham if (listener != NULL) 24263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham { 24363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return HijackBroadcaster(listener, eBroadcastBitStateChanged); 24463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham } 24563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham else 24663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return false; 24763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 24863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 24963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghamvoid 25063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::RestoreProcessEvents () 25163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 25263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham RestoreBroadcaster(); 25363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 25463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp) 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 258e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 26436f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton if (m_listener.WaitForEventForBroadcasterWithType (timeout, 26536f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton this, 26636f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton eBroadcastBitStateChanged, 26736f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton event_sp)) 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270926060e198137f8a64face70455324a8cd4362a5Caroline Tice log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp) => %s", 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__, 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout, 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(state)); 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent * 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PeekAtStateChangedEvents () 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 282e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s...", __FUNCTION__); 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Event *event_ptr; 28836f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this, 28936f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton eBroadcastBitStateChanged); 290926060e198137f8a64face70455324a8cd4362a5Caroline Tice log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_ptr) 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (event_ptr) => %s", 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__, 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr))); 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s no events found", 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__); 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return event_ptr; 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp) 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 311e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_private_state_listener.WaitForEventForBroadcasterWithType(timeout, 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner &m_private_state_broadcaster, 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitStateChanged, 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner event_sp)) 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a bit of a hack, but when we wait here we could very well return 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to the command-line, and that could disable the log, which would render the 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // log we got above invalid. 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state)); 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only) 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 335e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (control_only) 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp); 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_listener.WaitForEvent(timeout, event_sp); 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::IsRunning () const 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return StateIsRunningState (m_public_state.GetValue()); 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitStatus () 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateExited) 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_exit_status; 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 360638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 361638351aee118e89c658ca295cb4e9d1db7849befGreg Claytonvoid 362638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcess::ProcessInstanceSettings::GetHostEnvironmentIfNeeded () 363638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton{ 364638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton if (m_inherit_host_env && !m_got_host_env) 365638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 366638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_got_host_env = true; 367638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton StringList host_env; 368638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton const size_t host_env_count = Host::GetEnvironment (host_env); 369638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton for (size_t idx=0; idx<host_env_count; idx++) 370638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 371638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton const char *env_entry = host_env.GetStringAtIndex (idx); 372638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton if (env_entry) 373638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 3741f3dd643e10552de04644986a603f7ff02ed4bebGreg Clayton const char *equal_pos = ::strchr(env_entry, '='); 375638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton if (equal_pos) 376638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 377638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton std::string key (env_entry, equal_pos - env_entry); 378638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton std::string value (equal_pos + 1); 379638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton if (m_env_vars.find (key) == m_env_vars.end()) 380638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_env_vars[key] = value; 381638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton } 382638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton } 383638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton } 384638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton } 385638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton} 386638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 387638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 388638351aee118e89c658ca295cb4e9d1db7849befGreg Claytonsize_t 389638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcess::ProcessInstanceSettings::GetEnvironmentAsArgs (Args &env) 390638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton{ 391638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton GetHostEnvironmentIfNeeded (); 392638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 393638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton dictionary::const_iterator pos, end = m_env_vars.end(); 394638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton for (pos = m_env_vars.begin(); pos != end; ++pos) 395638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 396638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton std::string env_var_equal_value (pos->first); 397638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton env_var_equal_value.append(1, '='); 398638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton env_var_equal_value.append (pos->second); 399638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton env.AppendArgument (env_var_equal_value.c_str()); 400638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton } 401638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton return env.GetArgumentCount(); 402638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton} 403638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 404638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitDescription () 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty()) 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_exit_string.c_str(); 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetExitStatus (int status, const char *cstr) 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41658e844b3561848e73e69d6d98746d4851e78306eGreg Clayton if (m_private_state.GetValue() != eStateExited) 41758e844b3561848e73e69d6d98746d4851e78306eGreg Clayton { 41858e844b3561848e73e69d6d98746d4851e78306eGreg Clayton m_exit_status = status; 41958e844b3561848e73e69d6d98746d4851e78306eGreg Clayton if (cstr) 42058e844b3561848e73e69d6d98746d4851e78306eGreg Clayton m_exit_string = cstr; 42158e844b3561848e73e69d6d98746d4851e78306eGreg Clayton else 42258e844b3561848e73e69d6d98746d4851e78306eGreg Clayton m_exit_string.clear(); 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42458e844b3561848e73e69d6d98746d4851e78306eGreg Clayton DidExit (); 42558e844b3561848e73e69d6d98746d4851e78306eGreg Clayton 42658e844b3561848e73e69d6d98746d4851e78306eGreg Clayton SetPrivateState (eStateExited); 42758e844b3561848e73e69d6d98746d4851e78306eGreg Clayton } 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This static callback can be used to watch for local child processes on 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the current host. The the child process exits, the process will be 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// found in the global target list (we want to be completely sure that the 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// lldb_private::Process doesn't go away before we can deliver the signal. 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetProcessExitStatus 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *callback_baton, 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::pid_t pid, 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int signo, // Zero for no signal 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int exit_status // Exit value of process if signal is zero 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signo == 0 || exit_status) 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44563094e0bb161580564954dee512955c1c79d3476Greg Clayton TargetSP target_sp(Debugger::FindTargetWithProcessID (pid)); 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_sp) 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp (target_sp->GetProcessSP()); 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process_sp) 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *signal_cstr = NULL; 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signo) 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo); 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process_sp->SetExitStatus (exit_status, signal_cstr); 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextThreadIndexID () 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ++m_thread_index_id; 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetState() 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If any other threads access this we will need a mutex for it 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_public_state.GetValue (); 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetPublicState (StateType new_state) 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 480e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE)); 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPublicState (%s)", StateAsCString(new_state)); 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_public_state.SetValue (new_state); 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetPrivateState () 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state.GetValue(); 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetPrivateState (StateType new_state) 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 495e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE)); 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool state_changed = false; 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state)); 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker(m_private_state.GetMutex()); 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType old_state = m_private_state.GetValueNoLock (); 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state_changed = old_state != new_state; 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state_changed) 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state.SetValueNoLock (new_state); 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (StateIsStoppedState(new_state)) 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stop_id++; 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_stop_id); 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Use our target to get a shared pointer to ourselves... 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (GetTarget().GetProcessSP(), new_state)); 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state), StateAsCString(old_state)); 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetStopID() const 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_stop_id; 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetImageInfoAddress() 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_ADDRESS; 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5370baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 5380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// LoadImage 5390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// 5400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most 5410baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library 5420baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// loading differently should override LoadImage and UnloadImage and 5430baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed. 5440baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 5450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonuint32_t 5460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::LoadImage (const FileSpec &image_spec, Error &error) 5470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 5480baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton DynamicLoader *loader = GetDynamicLoader(); 5490baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (loader) 5500baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 5510baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = loader->CanLoadImage(); 5520baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Fail()) 5530baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 5540baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 5550baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 5560baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Success()) 5570baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 5580baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 5590baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp == NULL) 5600baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton thread_sp = GetThreadList ().GetThreadAtIndex(0, true); 5610baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 5620baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp) 5630baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 5640baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 5650baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 5660baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (frame_sp) 5670baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 5680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 5690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton frame_sp->CalculateExecutionContext (exe_ctx); 570ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham bool unwind_on_error = true; 5710baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StreamString expr; 5720baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton char path[PATH_MAX]; 5730baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton image_spec.GetPath(path, sizeof(path)); 5740baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton expr.Printf("dlopen (\"%s\", 2)", path); 5750baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n"; 576360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ValueObjectSP result_valobj_sp; 577360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ClangUserExpression::Evaluate (exe_ctx, unwind_on_error, expr.GetData(), prefix, result_valobj_sp); 5780baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (result_valobj_sp->GetError().Success()) 5790baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 5800baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Scalar scalar; 5810baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (result_valobj_sp->ResolveValue (frame_sp.get(), scalar)) 5820baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 5830baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS); 5840baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS) 5850baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 5860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton uint32_t image_token = m_image_tokens.size(); 5870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_image_tokens.push_back (image_ptr); 5880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return image_token; 5890baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 5900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 5910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 5920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 5930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 5940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 5950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 5960baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 5970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 5980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 5990baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// UnloadImage 6000baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// 6010baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most 6020baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library 6030baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// loading differently should override LoadImage and UnloadImage and 6040baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed. 6050baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 6060baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonError 6070baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::UnloadImage (uint32_t image_token) 6080baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 6090baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Error error; 6100baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_token < m_image_tokens.size()) 6110baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 6120baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const addr_t image_addr = m_image_tokens[image_token]; 6130baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_addr == LLDB_INVALID_ADDRESS) 6140baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 6150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorString("image already unloaded"); 6160baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 6170baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 6180baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 6190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton DynamicLoader *loader = GetDynamicLoader(); 6200baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (loader) 6210baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = loader->CanLoadImage(); 6220baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 6230baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Success()) 6240baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 6250baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 6260baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp == NULL) 6270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton thread_sp = GetThreadList ().GetThreadAtIndex(0, true); 6280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 6290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp) 6300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 6310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 6320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 6330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (frame_sp) 6340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 6350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 6360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton frame_sp->CalculateExecutionContext (exe_ctx); 637ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham bool unwind_on_error = true; 6380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StreamString expr; 6390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton expr.Printf("dlclose ((void *)0x%llx)", image_addr); 6400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const char *prefix = "extern \"C\" int dlclose(void* handle);\n"; 641360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ValueObjectSP result_valobj_sp; 642360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ClangUserExpression::Evaluate (exe_ctx, unwind_on_error, expr.GetData(), prefix, result_valobj_sp); 6430baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (result_valobj_sp->GetError().Success()) 6440baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 6450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Scalar scalar; 6460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (result_valobj_sp->ResolveValue (frame_sp.get(), scalar)) 6470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 6480baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (scalar.UInt(1)) 6490baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 6500baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData()); 6510baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 6520baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 6530baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 6540baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_image_tokens[image_token] = LLDB_INVALID_ADDRESS; 6550baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 6560baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 6570baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 6580baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 6590baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 6600baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = result_valobj_sp->GetError(); 6610baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 6620baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 6630baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 6640baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 6650baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 6660baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 6670baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 6680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 6690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorString("invalid image token"); 6700baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 6710baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return error; 6720baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 6730baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoader * 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetDynamicLoader() 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ABI * 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetABI() 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString& triple = m_target_triple; 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (triple.IsEmpty()) 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_abi_sp.get() == NULL) 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(ABI::FindPlugin(triple)); 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_abi_sp.get(); 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 696642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamLanguageRuntime * 697642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetLanguageRuntime(lldb::LanguageType language) 698642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 699642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntimeCollection::iterator pos; 700642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham pos = m_language_runtimes.find (language); 701642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (pos == m_language_runtimes.end()) 702642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham { 703642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham lldb::LanguageRuntimeSP runtime(LanguageRuntime::FindPlugin(this, language)); 704642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 705642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham m_language_runtimes[language] 706642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham = runtime; 707642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return runtime.get(); 708642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham } 709642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham else 710642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return (*pos).second.get(); 711642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 712642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 713642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamCPPLanguageRuntime * 714642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetCPPLanguageRuntime () 715642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 716642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus); 717642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus) 718642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return static_cast<CPPLanguageRuntime *> (runtime); 719642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return NULL; 720642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 721642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 722642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamObjCLanguageRuntime * 723642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetObjCLanguageRuntime () 724642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 725642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC); 726642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC) 727642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return static_cast<ObjCLanguageRuntime *> (runtime); 728642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return NULL; 729642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 730642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointSiteList & 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetBreakpointSiteList() 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list; 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst BreakpointSiteList & 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetBreakpointSiteList() const 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list; 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableAllBreakpointSites () 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.SetEnabledForAll (false); 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ClearBreakpointSiteByID (lldb::user_id_t break_id) 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (DisableBreakpointSiteByID (break_id)); 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.Remove(break_id); 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableBreakpointSiteByID (lldb::user_id_t break_id) 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp->IsEnabled()) 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DisableBreakpoint (bp_site_sp.get()); 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("invalid breakpoint site ID: %i", break_id); 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableBreakpointSiteByID (lldb::user_id_t break_id) 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!bp_site_sp->IsEnabled()) 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = EnableBreakpoint (bp_site_sp.get()); 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("invalid breakpoint site ID: %i", break_id); 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7963fd1f36c937575dbf57bae04c7ebaef78d8ecc1dStephen Wilsonlldb::break_id_t 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CreateBreakpointSite (BreakpointLocationSP &owner, bool use_hardware) 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 799eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton const addr_t load_addr = owner->GetAddress().GetLoadAddress (&m_target); 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (load_addr != LLDB_INVALID_ADDRESS) 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp; 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Look up this breakpoint site. If it exists, then add this new owner, otherwise 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // create a new breakpoint site and add it. 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr); 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp->AddOwner (owner); 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner owner->SetBreakpointSite (bp_site_sp); 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bp_site_sp->GetID(); 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, LLDB_INVALID_THREAD_ID, use_hardware)); 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (EnableBreakpoint (bp_site_sp.get()).Success()) 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner owner->SetBreakpointSite (bp_site_sp); 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list.Add (bp_site_sp); 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We failed to enable the breakpoint 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_BREAK_ID; 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp) 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id); 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_owners == 0) 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableBreakpoint(bp_site_sp.get()); 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress()); 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_removed = 0; 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t intersect_addr; 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t intersect_size; 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t opcode_offset; 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t idx; 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp; 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; (bp = m_breakpoint_site_list.GetByIndex(idx)) != NULL; ++idx) 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp->GetType() == BreakpointSite::eSoftware) 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset)) 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size); 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size); 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(opcode_offset + intersect_size <= bp->GetByteSize()); 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t buf_offset = intersect_addr - bp_addr; 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy(buf + buf_offset, bp->GetSavedOpcodeBytes() + opcode_offset, intersect_size); 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_removed; 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableSoftwareBreakpoint (BreakpointSite *bp_site) 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bp_site != NULL); 878e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t bp_addr = bp_site->GetLoadAddress(); 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx", bp_site->GetID(), (uint64_t)bp_addr); 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site->IsEnabled()) 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already enabled", bp_site->GetID(), (uint64_t)bp_addr); 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_addr == LLDB_INVALID_ADDRESS) 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("BreakpointSite contains an invalid load address."); 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Ask the lldb::Process subclass to fill in the correct software breakpoint 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // trap for the breakpoint site 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site); 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_opcode_size == 0) 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%llx.\n", bp_addr); 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes(); 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_opcode_bytes == NULL) 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode."); 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Save the original opcode by reading it 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size) 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Write a software breakpoint in place of the original opcode 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t verify_bp_opcode_bytes[64]; 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0) 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetEnabled(true); 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetType (BreakpointSite::eSoftware); 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr); 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to verify the breakpoint trap in memory."); 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory to verify breakpoint trap."); 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to write breakpoint trap to memory."); 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory at breakpoint address."); 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s", 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr, 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.AsCString()); 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableSoftwareBreakpoint (BreakpointSite *bp_site) 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bp_site != NULL); 955e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t bp_addr = bp_site->GetLoadAddress(); 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t breakID = bp_site->GetID(); 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("ProcessMacOSX::DisableBreakpoint (breakID = %d) addr = 0x%llx", breakID, (uint64_t)bp_addr); 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site->IsHardware()) 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Breakpoint site is a hardware breakpoint."); 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bp_site->IsEnabled()) 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t break_op_size = bp_site->GetByteSize(); 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes(); 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (break_op_size > 0) 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear a software breakoint instruction 97254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t curr_break_op[8]; 973141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson assert (break_op_size <= sizeof(curr_break_op)); 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool break_op_found = false; 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Read the breakpoint opcode 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size) 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool verify = false; 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure we have the a breakpoint opcode exists at this address 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp (curr_break_op, break_op, break_op_size) == 0) 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break_op_found = true; 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We found a valid breakpoint opcode at this address, now restore 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the saved opcode. 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size) 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner verify = true; 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Memory write failed when restoring original opcode."); 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Original breakpoint trap is no longer in memory."); 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set verify to true and so we can check if the original opcode has already been restored 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner verify = true; 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (verify) 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 100254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t verify_opcode[8]; 1003141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson assert (break_op_size < sizeof(verify_opcode)); 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Verify that our original opcode made it back to the inferior 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size) 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // compare the memory we just read with the original opcode 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0) 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // SUCCESS 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetEnabled(false); 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr); 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (break_op_found) 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to restore original opcode."); 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored."); 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory that should contain the breakpoint trap."); 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already disabled", bp_site->GetID(), (uint64_t)bp_addr); 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s", 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr, 104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.AsCString()); 104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (buf == NULL || size == 0) 105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_read = 0; 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t *bytes = (uint8_t *)buf; 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (bytes_read < size) 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_size = size - bytes_read; 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_bytes_read = DoReadMemory (addr + bytes_read, 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes + bytes_read, 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_read += curr_bytes_read; 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_read == curr_size || curr_bytes_read == 0) 106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Replace any software breakpoint opcodes that fall into this range back 106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // into "buf" before we return 107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_read > 0) 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf); 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_read; 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error) 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_written = 0; 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t *bytes = (const uint8_t *)buf; 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (bytes_written < size) 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_size = size - bytes_written; 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written, 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes + bytes_written, 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += curr_bytes_written; 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_written == curr_size || curr_bytes_written == 0) 109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error) 109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (buf == NULL || size == 0) 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We need to write any data that would go where any current software traps 110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // (enabled software breakpoints) any software traps (breakpoints) that we 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // may have placed in our tasks memory. 110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator iter = m_breakpoint_site_list.GetMap()->lower_bound (addr); 110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator end = m_breakpoint_site_list.GetMap()->end(); 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (iter == end || iter->second->GetLoadAddress() > addr + size) 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return DoWriteMemory(addr, buf, size, error); 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator pos; 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_written = 0; 111254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton addr_t intersect_addr = 0; 111354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton size_t intersect_size = 0; 111454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton size_t opcode_offset = 0; 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t *ubuf = (const uint8_t *)buf; 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = iter; pos != end; ++pos) 111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp; 112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp = pos->second; 112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset)); 112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(addr <= intersect_addr && intersect_addr < addr + size); 112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size); 112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(opcode_offset + intersect_size <= bp->GetByteSize()); 112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check for bytes before this breakpoint 112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t curr_addr = addr + bytes_written; 112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (intersect_addr > curr_addr) 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // There are some bytes before this breakpoint that we need to 113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // just write to memory 113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t curr_size = intersect_addr - curr_addr; 113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t curr_bytes_written = WriteMemoryPrivate (curr_addr, 113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ubuf + bytes_written, 113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += curr_bytes_written; 113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_written != curr_size) 114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to write all of the requested bytes, we 114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // are done looping and will return the number of bytes that 114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we have written so far. 114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now write any bytes that would cover up any software breakpoints 114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // directly into the breakpoint opcode buffer 115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size); 115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += intersect_size; 115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Write any remaining bytes after the last breakpoint if we have any left 115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_written < size) 115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += WriteMemoryPrivate (addr + bytes_written, 115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ubuf + bytes_written, 115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size - bytes_written, 115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::AllocateMemory(size_t size, uint32_t permissions, Error &error) 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Fixme: we should track the blocks we've allocated, and clean them up... 116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We could even do our own allocator here if that ends up being more efficient. 116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return DoAllocateMemory (size, permissions, error); 117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DeallocateMemory (addr_t ptr) 117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return DoDeallocateMemory (ptr); 117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableWatchpoint (WatchpointLocation *watchpoint) 118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("watchpoints are not supported"); 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableWatchpoint (WatchpointLocation *watchpoint) 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("watchpoints are not supported"); 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp) 119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state; 119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now wait for the process to launch and return control to us, and then 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // call DidLaunch: 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (1) 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Might want to put a timeout in here: 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = WaitForStateChangedEventsPrivate (NULL, event_sp); 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state == eStateStopped || state == eStateCrashed || state == eStateExited) 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Launch 121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char const *argv[], 121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char const *envp[], 1218452bf613496c7290c6b7a1a1eb28efbce63fd3b9Greg Clayton uint32_t launch_flags, 121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *stdin_path, 122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *stdout_path, 122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *stderr_path 122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.Clear(); 122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 1227861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Module *exe_module = m_target.GetExecutableModule().get(); 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_module) 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char exec_file_path[PATH_MAX]; 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_module->GetFileSpec().GetPath(exec_file_path, sizeof(exec_file_path)); 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_module->GetFileSpec().Exists()) 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = WillLaunch (exe_module); 123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1239d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton SetPublicState (eStateLaunching); 124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The args coming in should not contain the application name, the 124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lldb_private::Process class will add this in case the executable 124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // gets resolved to a different file than was given on the command 124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // line (like when an applicaiton bundle is specified and will 124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // resolve to the contained exectuable file, or the file given was 124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a symlink or other file system link that resolves to a different 124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // file). 124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the resolved exectuable path 124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make a new argument vector 125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<const char *> exec_path_plus_argv; 125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Append the resolved executable path 125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exec_path_plus_argv.push_back (exec_file_path); 125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Push all args if there are any 125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argv) 125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (int i = 0; argv[i]; ++i) 125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exec_path_plus_argv.push_back(argv[i]); 126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Push a NULL to terminate the args. 126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exec_path_plus_argv.push_back(NULL); 126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now launch using these arguments. 126653d68e749f0715691a95f23e9490d97e484b15daGreg Clayton error = DoLaunch (exe_module, 126753d68e749f0715691a95f23e9490d97e484b15daGreg Clayton exec_path_plus_argv.empty() ? NULL : &exec_path_plus_argv.front(), 126853d68e749f0715691a95f23e9490d97e484b15daGreg Clayton envp, 1269452bf613496c7290c6b7a1a1eb28efbce63fd3b9Greg Clayton launch_flags, 127053d68e749f0715691a95f23e9490d97e484b15daGreg Clayton stdin_path, 127153d68e749f0715691a95f23e9490d97e484b15daGreg Clayton stdout_path, 127253d68e749f0715691a95f23e9490d97e484b15daGreg Clayton stderr_path); 127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Fail()) 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetID() != LLDB_INVALID_PROCESS_ID) 127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetID (LLDB_INVALID_PROCESS_ID); 127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *error_string = error.AsCString(); 128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error_string == NULL) 128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_string = "launch failed"; 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetExitStatus (-1, error_string); 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = WaitForProcessStopPrivate(NULL, event_sp); 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state == eStateStopped || state == eStateCrashed) 129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidLaunch (); 129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This delays passing the stopped event to listeners till DidLaunch gets 129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a chance to complete... 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StartPrivateStateThread (); 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (state == eStateExited) 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We exited while trying to launch somehow. Don't call DidLaunch as that's 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // not likely to work, and return an invalid pid. 130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("File doesn't exist: '%s'.\n", exec_file_path); 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CompleteAttach () 131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 1320c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton 1321c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton if (GetID() == LLDB_INVALID_PROCESS_ID) 1322c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton { 1323c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton error.SetErrorString("no process"); 1324c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton } 1325c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton 132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = WaitForProcessStopPrivate(NULL, event_sp); 132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state == eStateStopped || state == eStateCrashed) 132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidAttach (); 13317508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham // Figure out which one is the executable, and set that in our target: 13327508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham ModuleList &modules = GetTarget().GetImages(); 13337508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 13347508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham size_t num_modules = modules.GetSize(); 13357508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham for (int i = 0; i < num_modules; i++) 13367508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 13377508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham ModuleSP module_sp = modules.GetModuleAtIndex(i); 13387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (module_sp->IsExecutable()) 13397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 13407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham ModuleSP exec_module = GetTarget().GetExecutableModule(); 13417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (!exec_module || exec_module != module_sp) 13427508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 13437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 13447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham GetTarget().SetExecutableModule (module_sp, false); 13457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 13467508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham break; 13477508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 13487508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This delays passing the stopped event to listeners till DidLaunch gets 135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a chance to complete... 135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent(event_sp); 135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StartPrivateStateThread(); 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We exited while trying to launch somehow. Don't call DidLaunch as that's 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // not likely to work, and return an invalid pid. 135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state == eStateExited) 136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("invalid state after attach: %s", 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::StateAsCString(state)); 136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Attach (lldb::pid_t attach_pid) 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.Clear(); 137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 1373861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13757508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham // Find the process and its architecture. Make sure it matches the architecture 13767508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham // of the current Target, and if not adjust it. 13777508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 13787508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham ArchSpec attach_spec = GetArchSpecForExistingProcess (attach_pid); 13797508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (attach_spec != GetTarget().GetArchitecture()) 13807508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 13817508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham // Set the architecture on the target. 13827508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham GetTarget().SetArchitecture(attach_spec); 13837508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 13847508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 138554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton Error error (WillAttachToProcessWithID(attach_pid)); 138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1388d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton SetPublicState (eStateAttaching); 1389d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton 139054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton error = DoAttachToProcessWithID (attach_pid); 139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = CompleteAttach(); 139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetID() != LLDB_INVALID_PROCESS_ID) 139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetID (LLDB_INVALID_PROCESS_ID); 140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *error_string = error.AsCString(); 140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error_string == NULL) 140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_string = "attach failed"; 140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetExitStatus(-1, error_string); 140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Attach (const char *process_name, bool wait_for_launch) 141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.Clear(); 141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 1416861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 14177508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 14187508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham // Find the process and its architecture. Make sure it matches the architecture 14197508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham // of the current Target, and if not adjust it. 14207508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 1421ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham if (!wait_for_launch) 14227508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 1423ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham ArchSpec attach_spec = GetArchSpecForExistingProcess (process_name); 1424c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton if (attach_spec.IsValid() && attach_spec != GetTarget().GetArchitecture()) 1425ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham { 1426ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham // Set the architecture on the target. 1427ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham GetTarget().SetArchitecture(attach_spec); 1428ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham } 14297508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 1430ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham 143154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton Error error (WillAttachToProcessWithName(process_name, wait_for_launch)); 143224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 143324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1434d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton SetPublicState (eStateAttaching); 143554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton error = DoAttachToProcessWithName (process_name, wait_for_launch); 143624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Fail()) 143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 143824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetID() != LLDB_INVALID_PROCESS_ID) 143924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetID (LLDB_INVALID_PROCESS_ID); 144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *error_string = error.AsCString(); 144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error_string == NULL) 144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_string = "attach failed"; 144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetExitStatus(-1, error_string); 144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 144924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = CompleteAttach(); 145124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 145224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 145424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 145624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 145724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Resume () 145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1459e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 146024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::Resume() m_stop_id = %u", m_stop_id); 146224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 146324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillResume()); 146424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Tell the process it is about to resume before the thread list 146524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 146624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14679c11d478f7c2a1611b591cd599782b7a0a8c5c37Johnny Chen // Now let the thread list know we are about to resume so it 146824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // can let all of our threads know that they are about to be 146924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // resumed. Threads will each be called with 147024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Thread::WillResume(StateType) where StateType contains the state 147124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // that they are supposed to have when the process is resumed 147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // (suspended/running/stepping). Threads should also check 147324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // their resume signal in lldb::Thread::GetResumeSignal() 147424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to see if they are suppoed to start back up with a signal. 147524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_list.WillResume()) 147624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 147724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoResume(); 147824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 147924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 148024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidResume(); 148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_list.DidResume(); 148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 148324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 148424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 148524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 148624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("thread list returned flase after WillResume"); 148724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 148824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 149124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 149324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Halt () 149424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 149524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillHalt()); 149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 149920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 150020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton bool caused_stop = false; 150120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton EventSP event_sp; 150220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 150320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // Pause our private state thread so we can ensure no one else eats 150420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // the stop event out from under us. 150520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton PausePrivateStateThread(); 150620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 150720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // Ask the process subclass to actually halt our process 15083ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham error = DoHalt(caused_stop); 150924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 15103ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 151120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // If "caused_stop" is true, then DoHalt stopped the process. If 151220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // "caused_stop" is false, the process was already stopped. 151320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // If the DoHalt caused the process to stop, then we want to catch 151420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // this event and set the interrupted bool to true before we pass 151520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // this along so clients know that the process was interrupted by 151620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // a halt command. 15173ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (caused_stop) 15183ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 151920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // Wait for 2 seconds for the process to stop. 152020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton TimeValue timeout_time; 152120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton timeout_time = TimeValue::Now(); 152220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton timeout_time.OffsetWithSeconds(2); 152320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton StateType state = WaitForStateChangedEventsPrivate (&timeout_time, event_sp); 152420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 152520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (state == eStateInvalid) 152620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 152720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // We timeout out and didn't get a stop event... 152820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton error.SetErrorString ("Halt timed out."); 152920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 153020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton else 153120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 153220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (StateIsStoppedState (state)) 153320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 153420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // We caused the process to interrupt itself, so mark this 153520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // as such in the stop event so clients can tell an interrupted 153620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // process from a natural stop 153720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton ProcessEventData::SetInterruptedInEvent (event_sp.get(), true); 153820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 153920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton else 154020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 154120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 154220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (log) 154320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state)); 154420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton error.SetErrorString ("Did not get stopped event after halt."); 154520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 154620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 15473ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 154820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton DidHalt(); 154920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 15503ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 155120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // Resume our private state thread before we post the event (if any) 155220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton ResumePrivateStateThread(); 155320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 155420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // Post any event we might have consumed. If all goes well, we will have 155520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // stopped the process, intercepted the event and set the interrupted 1556360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // bool in the event. Post it to the private event queue and that will end up 1557360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // correctly setting the state. 155820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (event_sp) 1559c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice m_private_state_broadcaster.BroadcastEvent(event_sp); 156020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Detach () 156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillDetach()); 156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableAllBreakpointSites(); 157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoDetach(); 157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidDetach(); 157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Destroy () 158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillDestroy()); 158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableAllBreakpointSites(); 159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoDestroy(); 159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidDestroy(); 159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1596861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.StopReadThread(); 1597861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.Disconnect(); 1598861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && m_process_input_reader->IsActive()) 1599861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PopInputReader (m_process_input_reader); 1600861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader) 1601861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Signal (int signal) 160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillSignal()); 161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoSignal(signal); 161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidSignal(); 161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerUnixSignals & 162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetUnixSignals () 162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_unix_signals; 162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTarget & 162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetTarget () 162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target; 162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Target & 163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetTarget () const 163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target; 163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetAddressByteSize() 163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 164020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (m_addr_byte_size == 0) 164120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton return m_target.GetArchitecture().GetAddressByteSize(); 164220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton return m_addr_byte_size; 164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ShouldBroadcastEvent (Event *event_ptr) 164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr); 164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool return_value = true; 1650e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (state) 165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateAttaching: 165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateLaunching: 165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateDetached: 165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateExited: 165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateUnloaded: 165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // These events indicate changes in the state of the debugging session, always report them. 166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateInvalid: 166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We stopped for no apparent reason, don't report it. 166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we've started the target running, we handle the cases where we 166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // are already running and where there is a transition from stopped to 167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // running differently. 167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // running -> running: Automatically suppress extra running events 167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // stopped -> running: Report except when there is one or more no votes 167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and no yes votes. 167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SynchronouslyNotifyStateChanged (state); 167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_public_state.GetValue()) 167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We always suppress multiple runnings with no PUBLIC stop in between. 168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: make this work correctly. For now always report 168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // run if we aren't running so we don't miss any runnning 168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // events. If I run the lldb/test/thread/a.out file and 168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // break at main.cpp:58, run and hit the breakpoints on 168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // multiple threads, then somehow during the stepping over 168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // of all breakpoints no run gets reported. 168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a transition from stop to run. 169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_thread_list.ShouldReportRun (event_ptr)) 169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteYes: 169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNoOpinion: 169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNo: 169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStopped: 170624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateCrashed: 170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateSuspended: 170824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 170924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We've stopped. First see if we're going to restart the target. 171024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we are going to stop, then we always broadcast the event. 171124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't going to stop, let the thread plans decide if we're going to report this event. 17125a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham // If no thread has an opinion, we don't report it. 17133ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (ProcessEventData::GetInterruptedFromEvent (event_ptr)) 17143ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 171520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (log) 171620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s", event_ptr, StateAsCString(state)); 17173ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return true; 17183ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 17193ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham else 172024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RefreshStateAfterStop (); 172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_list.ShouldStop (event_ptr) == false) 172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_thread_list.ShouldReportStop (event_ptr)) 172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteYes: 172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process::ProcessEventData::SetRestartedInEvent (event_ptr, true); 1729028784b321087f1547df8f02f01631c59e5a9859Johnny Chen // Intentional fall-through here. 173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNoOpinion: 173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNo: 173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 17373ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state)); 173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Resume (); 173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SynchronouslyNotifyStateChanged (state); 174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::ShouldBroadcastEvent (%p) => %s", event_ptr, StateAsCString(state), return_value ? "YES" : "NO"); 175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_value; 175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Thread Queries 175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadList & 175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetThreadList () 176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_thread_list; 176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ThreadList & 176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetThreadList () const 176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_thread_list; 176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 176924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StartPrivateStateThread () 177324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1774e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s ( )", __FUNCTION__); 177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Create a thread that watches our internal state and controls which 178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // events make it to clients (into the DCProcess event queue). 178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_thread = Host::ThreadCreate ("<lldb.process.internal-state>", Process::PrivateStateThread, this, NULL); 178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_thread != LLDB_INVALID_HOST_THREAD; 178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 178424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PausePrivateStateThread () 178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ControlPrivateStateThread (eBroadcastInternalStateControlPause); 178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ResumePrivateStateThread () 179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ControlPrivateStateThread (eBroadcastInternalStateControlResume); 179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StopPrivateStateThread () 179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ControlPrivateStateThread (eBroadcastInternalStateControlStop); 180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ControlPrivateStateThread (uint32_t signal) 180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1806e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (signal == eBroadcastInternalStateControlStop || 180924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal == eBroadcastInternalStateControlPause || 181024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal == eBroadcastInternalStateControlResume); 181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 181224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s ( ) - signal: %d", __FUNCTION__, signal); 181424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 181524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Signal the private state thread 181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_private_state_thread != LLDB_INVALID_HOST_THREAD) 181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TimeValue timeout_time; 181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool timed_out; 182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_broadcaster.BroadcastEvent (signal, NULL); 182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout_time = TimeValue::Now(); 182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout_time.OffsetWithSeconds(2); 182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out); 182624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (false, eBroadcastNever); 182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signal == eBroadcastInternalStateControlStop) 182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (timed_out) 183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Host::ThreadCancel (m_private_state_thread, NULL); 183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread_result_t result = NULL; 183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Host::ThreadJoin (m_private_state_thread, &result, NULL); 1835c607d8681f443d03806f105ceceb11dcadd16184Greg Clayton m_private_state_thread = LLDB_INVALID_HOST_THREAD; 183624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 183724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 183824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 183924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 184024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 184124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::HandlePrivateEvent (EventSP &event_sp) 184224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1843e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 184424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if we should broadcast this state to external clients? 184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const bool should_broadcast = ShouldBroadcastEvent (event_sp.get()); 184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (arg = %p, pid = %i) got event '%s' broadcast = %s", __FUNCTION__, this, GetID(), StateAsCString(internal_state), should_broadcast ? "yes" : "no"); 184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (should_broadcast) 185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("\tChanging public state from: %s to %s", StateAsCString(GetState ()), StateAsCString (internal_state)); 185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1856861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (StateIsRunningState (internal_state)) 1857861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice PushProcessInputReader (); 1858861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice else 1859861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice PopProcessInputReader (); 186024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get()); 186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BroadcastEvent (event_sp); 186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("\tNot changing public state with event: %s", StateAsCString (internal_state)); 186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PrivateStateThread (void *arg) 187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process *proc = static_cast<Process*> (arg); 187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *result = proc->RunPrivateStateThread (); 187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RunPrivateStateThread () 188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool control_only = false; 188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (false, eBroadcastNever); 188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1886e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (arg = %p, pid = %i) thread starting...", __FUNCTION__, this, GetID()); 188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool exit_now = false; 189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (!exit_now) 189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WaitForEventsPrivate (NULL, event_sp, control_only); 189524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster)) 189624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (event_sp->GetType()) 189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 189924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlStop: 190024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exit_now = true; 190124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; // Go to next loop iteration so we exit without 190224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; // doing any internal state managment below 190324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 190424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlPause: 190524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner control_only = true; 190624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 190724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 190824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlResume: 190924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner control_only = false; 191024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 191124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19123ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 19133ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); 19143ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (log) 19153ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham log->Printf ("Process::%s (arg = %p, pid = %i) got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType()); 19163ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 191724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (true, eBroadcastAlways); 19183ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham continue; 191924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 192224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 192424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (internal_state != eStateInvalid) 192524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 192624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 192824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19293b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton if (internal_state == eStateInvalid || 19303b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton internal_state == eStateExited || 19313b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton internal_state == eStateDetached ) 19323ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 19333ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); 19343ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (log) 19353ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham log->Printf ("Process::%s (arg = %p, pid = %i) about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state)); 19363ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 19383ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 194024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1941926060e198137f8a64face70455324a8cd4362a5Caroline Tice // Verify log is still enabled before attempting to write to it... 1942926060e198137f8a64face70455324a8cd4362a5Caroline Tice log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); 194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (arg = %p, pid = %i) thread exiting...", __FUNCTION__, this, GetID()); 194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19468b4c16e6ca818961ce6229e419dc960e07737c91Greg Clayton m_private_state_thread = LLDB_INVALID_HOST_THREAD; 194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 195024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process Event Data 195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData () : 195524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventData (), 195624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp (), 195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_state (eStateInvalid), 195854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton m_restarted (false), 19593ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_update_state (false), 19603ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_interrupted (false) 196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 196324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 196424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) : 196524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventData (), 196624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp (process_sp), 196724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_state (state), 196854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton m_restarted (false), 19693ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_update_state (false), 19703ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_interrupted (false) 197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 197424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::~ProcessEventData() 197524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 197724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetFlavorString () 198024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString g_flavor ("Process::ProcessEventData"); 198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_flavor; 198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetFlavor () const 198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 198824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ProcessEventData::GetFlavorString (); 198924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 199024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 199124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 199224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::DoOnRemoval (Event *event_ptr) 199324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 199424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This function gets called twice for each event, once when the event gets pulled 199524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // off of the private process event queue, and once when it gets pulled off of 199624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the public event queue. m_update_state is used to distinguish these 199724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // two cases; it is false when we're just pulling it off for private handling, 199824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and we don't want to do the breakpoint command handling then. 199924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 200024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_update_state) 200124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp->SetPublicState (m_state); 200424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we're stopped and haven't restarted, then do the breakpoint commands here: 200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_state == eStateStopped && ! m_restarted) 200724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int num_threads = m_process_sp->GetThreadList().GetSize(); 200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int idx; 2010643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 201124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; idx < num_threads; ++idx) 201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ThreadSP thread_sp = m_process_sp->GetThreadList().GetThreadAtIndex(idx); 201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20156297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham StopInfoSP stop_info_sp = thread_sp->GetStopInfo (); 20166297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham if (stop_info_sp) 201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20186297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham stop_info_sp->PerformAction(event_ptr); 201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2021643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 20226fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham // The stop action might restart the target. If it does, then we want to mark that in the 20236fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham // event so that whoever is receiving it will know to wait for the running event and reflect 20246fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham // that state appropriately. 20256fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham 202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_process_sp->GetPrivateState() == eStateRunning) 202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetRestarted(true); 202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::Dump (Stream *s) const 203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_process_sp) 203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(" process = %p (pid = %u), ", m_process_sp.get(), m_process_sp->GetID()); 203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("state = %s", StateAsCString(GetState()));; 203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 203924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 204024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Process::ProcessEventData * 204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr) 204224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_ptr) 204424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 204524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EventData *event_data = event_ptr->GetData(); 204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString()) 204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast <const ProcessEventData *> (event_ptr->GetData()); 204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 204924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcessSP 205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetProcessFromEvent (const Event *event_ptr) 205424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 205524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp; 205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data) 205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process_sp = data->GetProcessSP(); 205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return process_sp; 206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetStateFromEvent (const Event *event_ptr) 206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data == NULL) 206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eStateInvalid; 206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 206924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data->GetState(); 207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 207224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr) 207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data == NULL) 207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data->GetRestarted(); 208024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 208124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 208224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 208324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value) 208424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 208624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data != NULL) 208724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetRestarted(new_value); 208824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 208924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 20913ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr) 20923ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{ 20933ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 20943ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (data == NULL) 20953ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return false; 20963ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham else 20973ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return data->GetInterrupted (); 20983ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham} 20993ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 21003ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghamvoid 21013ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value) 21023ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{ 21033ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 21043ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (data != NULL) 21053ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham data->SetInterrupted(new_value); 21063ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham} 21073ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 21083ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghambool 210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr) 211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data) 211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetUpdateStateOnRemoval(); 211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTarget * 212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CalculateTarget () 212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_target; 212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess * 212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CalculateProcess () 212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return this; 213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThread * 213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CalculateThread () 213424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStackFrame * 213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CalculateStackFrame () 214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 2145a830adbcd63d1995a01e6e18da79893c1426ca43Greg ClaytonProcess::CalculateExecutionContext (ExecutionContext &exe_ctx) 214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.target = &m_target; 214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.process = this; 214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.thread = NULL; 215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.frame = NULL; 215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::ProcessSP 215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetSP () 215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetTarget().GetProcessSP(); 215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21597508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghamuint32_t 21607508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamProcess::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids) 21617508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 21627508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return 0; 21637508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 21647508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 21657508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamArchSpec 21667508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamProcess::GetArchSpecForExistingProcess (lldb::pid_t pid) 21677508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 21687508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return Host::GetArchSpecForExistingProcess (pid); 21697508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 21707508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 21717508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamArchSpec 21727508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamProcess::GetArchSpecForExistingProcess (const char *process_name) 21737508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 21747508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return Host::GetArchSpecForExistingProcess (process_name); 21757508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 21767508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 2177861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 2178861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::AppendSTDOUT (const char * s, size_t len) 2179861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 218020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton Mutex::Locker locker (m_stdio_communication_mutex); 2181861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdout_data.append (s, len); 2182861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2183b37813353540bcabee7af5f096515a8180be0426Greg Clayton BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (GetTarget().GetProcessSP(), GetState())); 2184861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 2185861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2186861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 2187861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len) 2188861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 2189861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Process *process = (Process *) baton; 2190861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice process->AppendSTDOUT (static_cast<const char *>(src), src_len); 2191861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 2192861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2193861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticesize_t 2194861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ProcessInputReaderCallback (void *baton, 2195861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice InputReader &reader, 2196861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice lldb::InputReaderAction notification, 2197861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice const char *bytes, 2198861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice size_t bytes_len) 2199861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 2200861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Process *process = (Process *) baton; 2201861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2202861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice switch (notification) 2203861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 2204861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderActivate: 2205861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 2206861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2207861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderDeactivate: 2208861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 2209861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2210861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderReactivate: 2211861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 2212861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2213861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderGotToken: 2214861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 2215861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Error error; 2216861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice process->PutSTDIN (bytes, bytes_len, error); 2217861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 2218861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 2219861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2220c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice case eInputReaderInterrupt: 2221c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice process->Halt (); 2222c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice break; 2223c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 2224c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice case eInputReaderEndOfFile: 2225c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice process->AppendSTDOUT ("^D", 2); 2226c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice break; 2227c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 2228861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderDone: 2229861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 2230861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2231861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 2232861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2233861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice return bytes_len; 2234861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 2235861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2236861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 2237861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ResetProcessInputReader () 2238861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 2239861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 2240861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 2241861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2242861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 2243861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::SetUpProcessInputReader (int file_descriptor) 2244861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 2245861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // First set up the Read Thread for reading/handling process I/O 2246861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2247861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice std::auto_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true)); 2248861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2249861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (conn_ap.get()) 2250861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 2251861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.SetConnection (conn_ap.release()); 2252861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_stdio_communication.IsConnected()) 2253861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 2254861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this); 2255861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.StartReadThread(); 2256861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2257861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // Now read thread is set up, set up input reader. 2258861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2259861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (!m_process_input_reader.get()) 2260861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 2261861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset (new InputReader(m_target.GetDebugger())); 2262861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback, 2263861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice this, 2264861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice eInputReaderGranularityByte, 2265861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice NULL, 2266861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice NULL, 2267861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice false)); 2268861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2269861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (err.Fail()) 2270861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 2271861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 2272861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 2273861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 2274861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 2275861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2276861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 2277861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PushProcessInputReader () 2278861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 2279861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && !m_process_input_reader->IsActive()) 2280861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PushInputReader (m_process_input_reader); 2281861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 2282861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2283861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 2284861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PopProcessInputReader () 2285861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 2286861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && m_process_input_reader->IsActive()) 2287861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PopInputReader (m_process_input_reader); 2288861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 2289861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 22906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2291990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 2292990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonProcess::Initialize () 2293990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 2294990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsControllerSP &usc = GetSettingsController(); 2295990de7bb41d3afec6b789155408ff322187d8682Greg Clayton usc.reset (new SettingsController); 2296990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsController::InitializeSettingsController (usc, 2297990de7bb41d3afec6b789155408ff322187d8682Greg Clayton SettingsController::global_settings_table, 2298990de7bb41d3afec6b789155408ff322187d8682Greg Clayton SettingsController::instance_settings_table); 2299990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 23006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2301990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 2302990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonProcess::Terminate () 2303990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 2304990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsControllerSP &usc = GetSettingsController(); 2305990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsController::FinalizeSettingsController (usc); 2306990de7bb41d3afec6b789155408ff322187d8682Greg Clayton usc.reset(); 2307990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 23086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2309990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonUserSettingsControllerSP & 2310990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonProcess::GetSettingsController () 2311990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 2312990de7bb41d3afec6b789155408ff322187d8682Greg Clayton static UserSettingsControllerSP g_settings_controller; 23136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return g_settings_controller; 23146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 23156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 23161ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Ticevoid 23171ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline TiceProcess::UpdateInstanceName () 23181ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice{ 23191ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice ModuleSP module_sp = GetTarget().GetExecutableModule(); 23201ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice if (module_sp) 23211ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice { 23221ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice StreamString sstr; 23231ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice sstr.Printf ("%s", module_sp->GetFileSpec().GetFilename().AsCString()); 23241ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 2325c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(), 23261ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice sstr.GetData()); 23271ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice } 23281ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice} 23291ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 2330427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonExecutionResults 2331360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::RunThreadPlan (ExecutionContext &exe_ctx, 2332360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ThreadPlanSP &thread_plan_sp, 2333360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool stop_others, 2334360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool try_all_threads, 2335360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool discard_on_error, 2336360f53f3c216ee4fb433da0a367168785328a856Jim Ingham uint32_t single_thread_timeout_usec, 2337360f53f3c216ee4fb433da0a367168785328a856Jim Ingham Stream &errors) 2338360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 2339360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ExecutionResults return_value = eExecutionSetupError; 2340360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2341360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Save this value for restoration of the execution context after we run 2342360f53f3c216ee4fb433da0a367168785328a856Jim Ingham uint32_t tid = exe_ctx.thread->GetIndexID(); 2343360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2344360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // N.B. Running the target may unset the currently selected thread and frame. We don't want to do that either, 2345360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // so we should arrange to reset them as well. 2346360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2347360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ThreadSP selected_thread_sp = exe_ctx.process->GetThreadList().GetSelectedThread(); 2348360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::StackFrameSP selected_frame_sp; 2349360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2350360f53f3c216ee4fb433da0a367168785328a856Jim Ingham uint32_t selected_tid; 2351360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (selected_thread_sp != NULL) 2352360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2353360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_tid = selected_thread_sp->GetIndexID(); 2354360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_frame_sp = selected_thread_sp->GetSelectedFrame(); 2355360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2356360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 2357360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2358360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_tid = LLDB_INVALID_THREAD_ID; 2359360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2360360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2361360f53f3c216ee4fb433da0a367168785328a856Jim Ingham exe_ctx.thread->QueueThreadPlan(thread_plan_sp, true); 2362360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2363360f53f3c216ee4fb433da0a367168785328a856Jim Ingham Listener listener("ClangFunction temporary listener"); 2364360f53f3c216ee4fb433da0a367168785328a856Jim Ingham exe_ctx.process->HijackProcessEvents(&listener); 2365360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2366360f53f3c216ee4fb433da0a367168785328a856Jim Ingham Error resume_error = exe_ctx.process->Resume (); 2367360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (!resume_error.Success()) 2368360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2369360f53f3c216ee4fb433da0a367168785328a856Jim Ingham errors.Printf("Error resuming inferior: \"%s\".\n", resume_error.AsCString()); 2370360f53f3c216ee4fb433da0a367168785328a856Jim Ingham exe_ctx.process->RestoreProcessEvents(); 2371427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return lldb::eExecutionSetupError; 2372360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2373360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2374360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // We need to call the function synchronously, so spin waiting for it to return. 2375360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // If we get interrupted while executing, we're going to lose our context, and 2376360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // won't be able to gather the result at this point. 2377360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // We set the timeout AFTER the resume, since the resume takes some time and we 2378360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // don't want to charge that to the timeout. 2379360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2380360f53f3c216ee4fb433da0a367168785328a856Jim Ingham TimeValue* timeout_ptr = NULL; 2381360f53f3c216ee4fb433da0a367168785328a856Jim Ingham TimeValue real_timeout; 2382360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2383360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (single_thread_timeout_usec != 0) 2384360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2385360f53f3c216ee4fb433da0a367168785328a856Jim Ingham real_timeout = TimeValue::Now(); 2386360f53f3c216ee4fb433da0a367168785328a856Jim Ingham real_timeout.OffsetWithMicroSeconds(single_thread_timeout_usec); 2387360f53f3c216ee4fb433da0a367168785328a856Jim Ingham timeout_ptr = &real_timeout; 2388360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2389360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2390360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 2391360f53f3c216ee4fb433da0a367168785328a856Jim Ingham while (1) 2392360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2393360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::EventSP event_sp; 2394360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::StateType stop_state = lldb::eStateInvalid; 2395360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Now wait for the process to stop again: 2396360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool got_event = listener.WaitForEvent (timeout_ptr, event_sp); 2397360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2398360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (!got_event) 2399360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2400360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Right now this is the only way to tell we've timed out... 2401360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // We should interrupt the process here... 2402360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Not really sure what to do if Halt fails here... 2403360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 2404360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (try_all_threads) 2405360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->Printf ("Running function with timeout: %d timed out, trying with all threads enabled.", 2406360f53f3c216ee4fb433da0a367168785328a856Jim Ingham single_thread_timeout_usec); 2407360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 2408360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->Printf ("Running function with timeout: %d timed out, abandoning execution.", 2409360f53f3c216ee4fb433da0a367168785328a856Jim Ingham single_thread_timeout_usec); 2410360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2411360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (exe_ctx.process->Halt().Success()) 2412360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2413360f53f3c216ee4fb433da0a367168785328a856Jim Ingham timeout_ptr = NULL; 2414360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 2415360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->Printf ("Halt succeeded."); 2416360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2417360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Between the time that we got the timeout and the time we halted, but target 2418360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // might have actually completed the plan. If so, we're done. Note, I call WFE here with a short 2419360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // timeout to 2420360f53f3c216ee4fb433da0a367168785328a856Jim Ingham got_event = listener.WaitForEvent(NULL, event_sp); 2421360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2422360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (got_event) 2423360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2424360f53f3c216ee4fb433da0a367168785328a856Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 2425360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 2426360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2427360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->Printf ("Stopped with event: %s", StateAsCString(stop_state)); 2428360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (stop_state == lldb::eStateStopped && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get())) 2429360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->Printf (" Event was the Halt interruption event."); 2430360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2431360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2432360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (exe_ctx.thread->IsThreadPlanDone (thread_plan_sp.get())) 2433360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2434360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 2435360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->Printf ("Even though we timed out, the call plan was done. Exiting wait loop."); 2436427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return_value = lldb::eExecutionCompleted; 2437360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 2438360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2439360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2440360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (try_all_threads 2441360f53f3c216ee4fb433da0a367168785328a856Jim Ingham && (stop_state == lldb::eStateStopped && Process::ProcessEventData::GetInterruptedFromEvent (event_sp.get()))) 2442360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2443360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2444360f53f3c216ee4fb433da0a367168785328a856Jim Ingham thread_plan_sp->SetStopOthers (false); 2445360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 2446360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->Printf ("About to resume."); 2447360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2448360f53f3c216ee4fb433da0a367168785328a856Jim Ingham exe_ctx.process->Resume(); 2449360f53f3c216ee4fb433da0a367168785328a856Jim Ingham continue; 2450360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2451360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 2452360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2453360f53f3c216ee4fb433da0a367168785328a856Jim Ingham exe_ctx.process->RestoreProcessEvents (); 2454427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return lldb::eExecutionInterrupted; 2455360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2456360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2457360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2458360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2459360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2460360f53f3c216ee4fb433da0a367168785328a856Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 2461360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 2462360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->Printf("Got event: %s.", StateAsCString(stop_state)); 2463360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2464360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (stop_state == lldb::eStateRunning || stop_state == lldb::eStateStepping) 2465360f53f3c216ee4fb433da0a367168785328a856Jim Ingham continue; 2466360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2467360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (exe_ctx.thread->IsThreadPlanDone (thread_plan_sp.get())) 2468360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2469427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return_value = lldb::eExecutionCompleted; 2470360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 2471360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2472360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else if (exe_ctx.thread->WasThreadPlanDiscarded (thread_plan_sp.get())) 2473360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2474427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return_value = lldb::eExecutionDiscarded; 2475360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 2476360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2477360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 2478360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2479360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 2480360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2481360f53f3c216ee4fb433da0a367168785328a856Jim Ingham StreamString s; 2482360f53f3c216ee4fb433da0a367168785328a856Jim Ingham event_sp->Dump (&s); 2483360f53f3c216ee4fb433da0a367168785328a856Jim Ingham StreamString ts; 2484360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2485360f53f3c216ee4fb433da0a367168785328a856Jim Ingham const char *event_explanation; 2486360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2487360f53f3c216ee4fb433da0a367168785328a856Jim Ingham do 2488360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2489360f53f3c216ee4fb433da0a367168785328a856Jim Ingham const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get()); 2490360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2491360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (!event_data) 2492360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2493360f53f3c216ee4fb433da0a367168785328a856Jim Ingham event_explanation = "<no event data>"; 2494360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 2495360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2496360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2497360f53f3c216ee4fb433da0a367168785328a856Jim Ingham Process *process = event_data->GetProcessSP().get(); 2498360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2499360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (!process) 2500360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2501360f53f3c216ee4fb433da0a367168785328a856Jim Ingham event_explanation = "<no process>"; 2502360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 2503360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2504360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2505360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ThreadList &thread_list = process->GetThreadList(); 2506360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2507360f53f3c216ee4fb433da0a367168785328a856Jim Ingham uint32_t num_threads = thread_list.GetSize(); 2508360f53f3c216ee4fb433da0a367168785328a856Jim Ingham uint32_t thread_index; 2509360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2510360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ts.Printf("<%u threads> ", num_threads); 2511360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2512360f53f3c216ee4fb433da0a367168785328a856Jim Ingham for (thread_index = 0; 2513360f53f3c216ee4fb433da0a367168785328a856Jim Ingham thread_index < num_threads; 2514360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ++thread_index) 2515360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2516360f53f3c216ee4fb433da0a367168785328a856Jim Ingham Thread *thread = thread_list.GetThreadAtIndex(thread_index).get(); 2517360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2518360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (!thread) 2519360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2520360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ts.Printf("<?> "); 2521360f53f3c216ee4fb433da0a367168785328a856Jim Ingham continue; 2522360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2523360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2524360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ts.Printf("<"); 2525360f53f3c216ee4fb433da0a367168785328a856Jim Ingham RegisterContext *register_context = thread->GetRegisterContext(); 2526360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2527360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (register_context) 2528360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ts.Printf("[ip 0x%llx] ", register_context->GetPC()); 2529360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 2530360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ts.Printf("[ip unknown] "); 2531360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2532360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::StopInfoSP stop_info_sp = thread->GetStopInfo(); 2533360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (stop_info_sp) 2534360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2535360f53f3c216ee4fb433da0a367168785328a856Jim Ingham const char *stop_desc = stop_info_sp->GetDescription(); 2536360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (stop_desc) 2537360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ts.PutCString (stop_desc); 2538360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2539360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ts.Printf(">"); 2540360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2541360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2542360f53f3c216ee4fb433da0a367168785328a856Jim Ingham event_explanation = ts.GetData(); 2543360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } while (0); 2544360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2545360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 2546360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->Printf("Execution interrupted: %s %s", s.GetData(), event_explanation); 2547360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2548360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2549360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (discard_on_error && thread_plan_sp) 2550360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2551360f53f3c216ee4fb433da0a367168785328a856Jim Ingham exe_ctx.thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 2552360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2553427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return_value = lldb::eExecutionInterrupted; 2554360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 2555360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2556360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2557360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2558360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (exe_ctx.process) 2559360f53f3c216ee4fb433da0a367168785328a856Jim Ingham exe_ctx.process->RestoreProcessEvents (); 2560360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2561360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Thread we ran the function in may have gone away because we ran the target 2562360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Check that it's still there. 2563360f53f3c216ee4fb433da0a367168785328a856Jim Ingham exe_ctx.thread = exe_ctx.process->GetThreadList().FindThreadByIndexID(tid, true).get(); 2564360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (exe_ctx.thread) 2565360f53f3c216ee4fb433da0a367168785328a856Jim Ingham exe_ctx.frame = exe_ctx.thread->GetStackFrameAtIndex(0).get(); 2566360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2567360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Also restore the current process'es selected frame & thread, since this function calling may 2568360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // be done behind the user's back. 2569360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2570360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (selected_tid != LLDB_INVALID_THREAD_ID) 2571360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2572360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (exe_ctx.process->GetThreadList().SetSelectedThreadByIndexID (selected_tid)) 2573360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2574360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // We were able to restore the selected thread, now restore the frame: 2575360f53f3c216ee4fb433da0a367168785328a856Jim Ingham exe_ctx.process->GetThreadList().GetSelectedThread()->SetSelectedFrame(selected_frame_sp.get()); 2576360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2577360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2578360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2579360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return return_value; 2580360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 2581360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2582360f53f3c216ee4fb433da0a367168785328a856Jim Inghamconst char * 2583360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::ExecutionResultAsCString (ExecutionResults result) 2584360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 2585360f53f3c216ee4fb433da0a367168785328a856Jim Ingham const char *result_name; 2586360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 2587360f53f3c216ee4fb433da0a367168785328a856Jim Ingham switch (result) 2588360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 2589427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case lldb::eExecutionCompleted: 2590360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionCompleted"; 2591360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 2592427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case lldb::eExecutionDiscarded: 2593360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionDiscarded"; 2594360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 2595427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case lldb::eExecutionInterrupted: 2596360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionInterrupted"; 2597360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 2598427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case lldb::eExecutionSetupError: 2599360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionSetupError"; 2600360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 2601427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton case lldb::eExecutionTimedOut: 2602360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionTimedOut"; 2603360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 2604360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 2605360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return result_name; 2606360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 2607360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 26086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 2609d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// class Process::SettingsController 26106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 26116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2612d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::SettingsController () : 26135bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice UserSettingsController ("process", Target::GetSettingsController()) 26146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 2615638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_default_settings.reset (new ProcessInstanceSettings (*this, 2616638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton false, 2617004afcb95736e97d071b1dd9b5254800e11e581cCaroline Tice InstanceSettings::GetDefaultName().AsCString())); 26186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 26196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2620d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::~SettingsController () 26216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 26226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 26236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 26246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticelldb::InstanceSettingsSP 2625d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::CreateInstanceSettings (const char *instance_name) 26266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 2627c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton ProcessInstanceSettings *new_settings = new ProcessInstanceSettings (*GetSettingsController(), 2628c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton false, 2629c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton instance_name); 26306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice lldb::InstanceSettingsSP new_settings_sp (new_settings); 26316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return new_settings_sp; 26326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 26336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 26346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 26356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice// class ProcessInstanceSettings 26366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 26376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2638638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcessInstanceSettings::ProcessInstanceSettings 2639638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton( 2640638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton UserSettingsController &owner, 2641638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton bool live_instance, 2642638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton const char *name 2643638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton) : 2644638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton InstanceSettings (owner, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance), 26456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_run_args (), 26466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_env_vars (), 26476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_input_path (), 26486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_output_path (), 26496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_error_path (), 26506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_plugin (), 2651bd666017403e102e0ca435d6da585ff979f83598Caroline Tice m_disable_aslr (true), 2652638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_disable_stdio (false), 2653638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_inherit_host_env (true), 2654638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_got_host_env (false) 26556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 2656396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called 2657396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // until the vtables for ProcessInstanceSettings are properly set up, i.e. AFTER all the initializers. 2658396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // For this reason it has to be called here, rather than in the initializer or in the parent constructor. 265975b11a343a035ab426473a785a045f0614af9984Caroline Tice // This is true for CreateInstanceName() too. 266075b11a343a035ab426473a785a045f0614af9984Caroline Tice 266175b11a343a035ab426473a785a045f0614af9984Caroline Tice if (GetInstanceName () == InstanceSettings::InvalidName()) 266275b11a343a035ab426473a785a045f0614af9984Caroline Tice { 266375b11a343a035ab426473a785a045f0614af9984Caroline Tice ChangeInstanceName (std::string (CreateInstanceName().AsCString())); 266475b11a343a035ab426473a785a045f0614af9984Caroline Tice m_owner.RegisterInstanceSettings (this); 266575b11a343a035ab426473a785a045f0614af9984Caroline Tice } 2666396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice 2667396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice if (live_instance) 26686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 26696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); 26706e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice CopyInstanceSettings (pending_settings,false); 2671396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice //m_owner.RemovePendingSettings (m_instance_name); 26726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 26736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 26746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 26756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::ProcessInstanceSettings (const ProcessInstanceSettings &rhs) : 2676c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton InstanceSettings (*Process::GetSettingsController(), CreateInstanceName().AsCString()), 26776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_run_args (rhs.m_run_args), 26786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_env_vars (rhs.m_env_vars), 26796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_input_path (rhs.m_input_path), 26806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_output_path (rhs.m_output_path), 26816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_error_path (rhs.m_error_path), 26826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_plugin (rhs.m_plugin), 2683bd666017403e102e0ca435d6da585ff979f83598Caroline Tice m_disable_aslr (rhs.m_disable_aslr), 2684bd666017403e102e0ca435d6da585ff979f83598Caroline Tice m_disable_stdio (rhs.m_disable_stdio) 26856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 26866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (m_instance_name != InstanceSettings::GetDefaultName()) 26876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 26886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); 26896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice CopyInstanceSettings (pending_settings,false); 26906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_owner.RemovePendingSettings (m_instance_name); 26916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 26926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 26936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 26946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::~ProcessInstanceSettings () 26956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 26966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 26976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 26986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings& 26996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::operator= (const ProcessInstanceSettings &rhs) 27006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 27016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (this != &rhs) 27026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 27036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_run_args = rhs.m_run_args; 27046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_env_vars = rhs.m_env_vars; 27056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_input_path = rhs.m_input_path; 27066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_output_path = rhs.m_output_path; 27076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_error_path = rhs.m_error_path; 27086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_plugin = rhs.m_plugin; 27096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_disable_aslr = rhs.m_disable_aslr; 2710bd666017403e102e0ca435d6da585ff979f83598Caroline Tice m_disable_stdio = rhs.m_disable_stdio; 2711638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_inherit_host_env = rhs.m_inherit_host_env; 27126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 27136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return *this; 27156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 27166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid 27196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name, 27206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const char *index_value, 27216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const char *value, 27226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString &instance_name, 27236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const SettingEntry &entry, 27246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice lldb::VarSetOperationType op, 27256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice Error &err, 27266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice bool pending) 27276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 27286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (var_name == RunArgsVarName()) 27296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice UserSettingsController::UpdateStringArrayVariable (op, index_value, m_run_args, value, err); 27306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == EnvVarsVarName()) 2731638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 2732638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton GetHostEnvironmentIfNeeded (); 27336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice UserSettingsController::UpdateDictionaryVariable (op, index_value, m_env_vars, value, err); 2734638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton } 27356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == InputPathVarName()) 27366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice UserSettingsController::UpdateStringVariable (op, m_input_path, value, err); 27376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == OutputPathVarName()) 27386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice UserSettingsController::UpdateStringVariable (op, m_output_path, value, err); 27396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == ErrorPathVarName()) 27406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice UserSettingsController::UpdateStringVariable (op, m_error_path, value, err); 27416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == PluginVarName()) 27426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice UserSettingsController::UpdateEnumVariable (entry.enum_values, (int *) &m_plugin, value, err); 2743638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton else if (var_name == InheritHostEnvVarName()) 2744638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton UserSettingsController::UpdateBooleanVariable (op, m_inherit_host_env, value, err); 27456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == DisableASLRVarName()) 27466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice UserSettingsController::UpdateBooleanVariable (op, m_disable_aslr, value, err); 2747bd666017403e102e0ca435d6da585ff979f83598Caroline Tice else if (var_name == DisableSTDIOVarName ()) 2748bd666017403e102e0ca435d6da585ff979f83598Caroline Tice UserSettingsController::UpdateBooleanVariable (op, m_disable_stdio, value, err); 27496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 27506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid 27526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings, 27536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice bool pending) 27546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 27556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (new_settings.get() == NULL) 27566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return; 27576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice ProcessInstanceSettings *new_process_settings = (ProcessInstanceSettings *) new_settings.get(); 27596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_run_args = new_process_settings->m_run_args; 27616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_env_vars = new_process_settings->m_env_vars; 27626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_input_path = new_process_settings->m_input_path; 27636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_output_path = new_process_settings->m_output_path; 27646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_error_path = new_process_settings->m_error_path; 27656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_plugin = new_process_settings->m_plugin; 27666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_disable_aslr = new_process_settings->m_disable_aslr; 2767bd666017403e102e0ca435d6da585ff979f83598Caroline Tice m_disable_stdio = new_process_settings->m_disable_stdio; 27686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 27696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2770bcb5b454767121980d937d2610ba762fdb575c45Caroline Ticebool 27716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry, 27726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString &var_name, 27735bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice StringList &value, 2774bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice Error *err) 27756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 27766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (var_name == RunArgsVarName()) 27776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 27786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (m_run_args.GetArgumentCount() > 0) 2779c14069e2764a57c55e60ea9406842858a509223cGreg Clayton { 27806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice for (int i = 0; i < m_run_args.GetArgumentCount(); ++i) 27816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString (m_run_args.GetArgumentAtIndex (i)); 2782c14069e2764a57c55e60ea9406842858a509223cGreg Clayton } 27836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 27846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == EnvVarsVarName()) 27856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 2786638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton GetHostEnvironmentIfNeeded (); 2787638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 27886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (m_env_vars.size() > 0) 27896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 27906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice std::map<std::string, std::string>::iterator pos; 27916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice for (pos = m_env_vars.begin(); pos != m_env_vars.end(); ++pos) 27926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 27936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice StreamString value_str; 27946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value_str.Printf ("%s=%s", pos->first.c_str(), pos->second.c_str()); 27956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString (value_str.GetData()); 27966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 27976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 27986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 27996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == InputPathVarName()) 28006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 28016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString (m_input_path.c_str()); 28026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 28036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == OutputPathVarName()) 28046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 28056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString (m_output_path.c_str()); 28066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 28076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == ErrorPathVarName()) 28086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 28096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString (m_error_path.c_str()); 28106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 28116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == PluginVarName()) 28126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 28136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString (UserSettingsController::EnumToString (entry.enum_values, (int) m_plugin)); 28146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 2815a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton else if (var_name == InheritHostEnvVarName()) 2816a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton { 2817a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton if (m_inherit_host_env) 2818a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton value.AppendString ("true"); 2819a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton else 2820a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton value.AppendString ("false"); 2821a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton } 28226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == DisableASLRVarName()) 28236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 28246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (m_disable_aslr) 28256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString ("true"); 28266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else 28276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString ("false"); 28286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 2829bd666017403e102e0ca435d6da585ff979f83598Caroline Tice else if (var_name == DisableSTDIOVarName()) 2830bd666017403e102e0ca435d6da585ff979f83598Caroline Tice { 2831bd666017403e102e0ca435d6da585ff979f83598Caroline Tice if (m_disable_stdio) 2832bd666017403e102e0ca435d6da585ff979f83598Caroline Tice value.AppendString ("true"); 2833bd666017403e102e0ca435d6da585ff979f83598Caroline Tice else 2834bd666017403e102e0ca435d6da585ff979f83598Caroline Tice value.AppendString ("false"); 2835bd666017403e102e0ca435d6da585ff979f83598Caroline Tice } 28366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else 2837bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice { 2838bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice if (err) 2839bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString()); 2840bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice return false; 2841bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice } 2842bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice return true; 28436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 28446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString 28466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::CreateInstanceName () 28476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 28486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static int instance_count = 1; 28496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice StreamString sstr; 28506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice sstr.Printf ("process_%d", instance_count); 28526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice ++instance_count; 28536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString ret_val (sstr.GetData()); 28556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return ret_val; 28566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 28576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 28596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::RunArgsVarName () 28606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 28616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static ConstString run_args_var_name ("run-args"); 28626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return run_args_var_name; 28646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 28656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 28676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::EnvVarsVarName () 28686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 28696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static ConstString env_vars_var_name ("env-vars"); 28706e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return env_vars_var_name; 28726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 28736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 2875638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcessInstanceSettings::InheritHostEnvVarName () 2876638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton{ 2877638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton static ConstString g_name ("inherit-env"); 2878638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 2879638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton return g_name; 2880638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton} 2881638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 2882638351aee118e89c658ca295cb4e9d1db7849befGreg Claytonconst ConstString & 28836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::InputPathVarName () 28846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 28856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static ConstString input_path_var_name ("input-path"); 28866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return input_path_var_name; 28886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 28896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 28916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::OutputPathVarName () 28926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 289387097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice static ConstString output_path_var_name ("output-path"); 28946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return output_path_var_name; 28966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 28976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 28996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::ErrorPathVarName () 29006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 290187097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice static ConstString error_path_var_name ("error-path"); 29026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return error_path_var_name; 29046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 29056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 29076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::PluginVarName () 29086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 29096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static ConstString plugin_var_name ("plugin"); 29106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return plugin_var_name; 29126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 29136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 29166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::DisableASLRVarName () 29176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 29186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static ConstString disable_aslr_var_name ("disable-aslr"); 29196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return disable_aslr_var_name; 29216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 29226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2923bd666017403e102e0ca435d6da585ff979f83598Caroline Ticeconst ConstString & 2924bd666017403e102e0ca435d6da585ff979f83598Caroline TiceProcessInstanceSettings::DisableSTDIOVarName () 2925bd666017403e102e0ca435d6da585ff979f83598Caroline Tice{ 2926bd666017403e102e0ca435d6da585ff979f83598Caroline Tice static ConstString disable_stdio_var_name ("disable-stdio"); 2927bd666017403e102e0ca435d6da585ff979f83598Caroline Tice 2928bd666017403e102e0ca435d6da585ff979f83598Caroline Tice return disable_stdio_var_name; 2929bd666017403e102e0ca435d6da585ff979f83598Caroline Tice} 29306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 2932d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// SettingsController Variable Tables 29336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 29346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry 2936d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::global_settings_table[] = 29376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 29386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice //{ "var-name", var-type , "default", enum-table, init'd, hidden, "help-text"}, 29396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } 29406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 29416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticelldb::OptionEnumValueElement 2944d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::g_plugins[] = 29456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 2946f2c330df115cfdaedbf9d359b00f3ebb3cab9887Caroline Tice { eMacosx, "process.macosx", "Use the native MacOSX debugger plugin" }, 2947f2c330df115cfdaedbf9d359b00f3ebb3cab9887Caroline Tice { eRemoteDebugger, "process.gdb-remote" , "Use the GDB Remote protocol based debugger plugin" }, 2948f2c330df115cfdaedbf9d359b00f3ebb3cab9887Caroline Tice { 0, NULL, NULL } 29496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 29506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry 2952d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::instance_settings_table[] = 29536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 2954638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton //{ "var-name", var-type, "default", enum-table, init'd, hidden, "help-text"}, 2955638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "run-args", eSetVarTypeArray, NULL, NULL, false, false, "A list containing all the arguments to be passed to the executable when it is run." }, 2956638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "env-vars", eSetVarTypeDictionary, NULL, NULL, false, false, "A list of all the environment variables to be passed to the executable's environment, and their values." }, 2957638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "inherit-env", eSetVarTypeBoolean, "true", NULL, false, false, "Inherit the environment from the process that is running LLDB." }, 2958638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "input-path", eSetVarTypeString, "/dev/stdin", NULL, false, false, "The file/path to be used by the executable program for reading its input." }, 2959638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "output-path", eSetVarTypeString, "/dev/stdout", NULL, false, false, "The file/path to be used by the executable program for writing its output." }, 2960638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "error-path", eSetVarTypeString, "/dev/stderr", NULL, false, false, "The file/path to be used by the executable program for writings its error messages." }, 2961638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "plugin", eSetVarTypeEnum, NULL , g_plugins, false, false, "The plugin to be used to run the process." }, 2962638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "disable-aslr", eSetVarTypeBoolean, "true", NULL, false, false, "Disable Address Space Layout Randomization (ASLR)" }, 2963638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "disable-stdio", eSetVarTypeBoolean, "false", NULL, false, false, "Disable stdin/stdout for process (e.g. for a GUI application)" }, 2964638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { NULL, eSetVarTypeNone, NULL, NULL, false, false, NULL } 29656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 29666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 29687508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 2969