Debugger.cpp revision 53d68e749f0715691a95f23e9490d97e484b15da
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Debugger.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/lldb-private.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConnectionFileDescriptor.h" 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/InputReader.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 1663094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2563094e0bb161580564954dee512955c1c79d3476Greg Claytonstatic uint32_t g_shared_debugger_refcount = 0; 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Ticestatic lldb::user_id_t g_unique_id = 1; 28558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Initialize () 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3263094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount == 0) 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::Initialize(); 3463094e0bb161580564954dee512955c1c79d3476Greg Clayton g_shared_debugger_refcount++; 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Terminate () 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4063094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount > 0) 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4263094e0bb161580564954dee512955c1c79d3476Greg Clayton g_shared_debugger_refcount--; 4363094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount == 0) 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4563094e0bb161580564954dee512955c1c79d3476Greg Clayton lldb_private::WillTerminate(); 4663094e0bb161580564954dee512955c1c79d3476Greg Clayton lldb_private::Terminate(); 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5163094e0bb161580564954dee512955c1c79d3476Greg Claytontypedef std::vector<DebuggerSP> DebuggerList; 5263094e0bb161580564954dee512955c1c79d3476Greg Clayton 5363094e0bb161580564954dee512955c1c79d3476Greg Claytonstatic Mutex & 5463094e0bb161580564954dee512955c1c79d3476Greg ClaytonGetDebuggerListMutex () 5563094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 5663094e0bb161580564954dee512955c1c79d3476Greg Clayton static Mutex g_mutex(Mutex::eMutexTypeRecursive); 5763094e0bb161580564954dee512955c1c79d3476Greg Clayton return g_mutex; 5863094e0bb161580564954dee512955c1c79d3476Greg Clayton} 5963094e0bb161580564954dee512955c1c79d3476Greg Clayton 6063094e0bb161580564954dee512955c1c79d3476Greg Claytonstatic DebuggerList & 6163094e0bb161580564954dee512955c1c79d3476Greg ClaytonGetDebuggerList() 6263094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 6363094e0bb161580564954dee512955c1c79d3476Greg Clayton // hide the static debugger list inside a singleton accessor to avoid 6463094e0bb161580564954dee512955c1c79d3476Greg Clayton // global init contructors 6563094e0bb161580564954dee512955c1c79d3476Greg Clayton static DebuggerList g_list; 6663094e0bb161580564954dee512955c1c79d3476Greg Clayton return g_list; 6763094e0bb161580564954dee512955c1c79d3476Greg Clayton} 6863094e0bb161580564954dee512955c1c79d3476Greg Clayton 6963094e0bb161580564954dee512955c1c79d3476Greg Clayton 7063094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebuggerSP 7163094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::CreateInstance () 7263094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 7363094e0bb161580564954dee512955c1c79d3476Greg Clayton DebuggerSP debugger_sp (new Debugger); 7463094e0bb161580564954dee512955c1c79d3476Greg Clayton // Scope for locker 7563094e0bb161580564954dee512955c1c79d3476Greg Clayton { 7663094e0bb161580564954dee512955c1c79d3476Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 7763094e0bb161580564954dee512955c1c79d3476Greg Clayton GetDebuggerList().push_back(debugger_sp); 7863094e0bb161580564954dee512955c1c79d3476Greg Clayton } 7963094e0bb161580564954dee512955c1c79d3476Greg Clayton return debugger_sp; 8063094e0bb161580564954dee512955c1c79d3476Greg Clayton} 8163094e0bb161580564954dee512955c1c79d3476Greg Clayton 8263094e0bb161580564954dee512955c1c79d3476Greg Claytonlldb::DebuggerSP 8363094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::GetSP () 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8563094e0bb161580564954dee512955c1c79d3476Greg Clayton lldb::DebuggerSP debugger_sp; 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8763094e0bb161580564954dee512955c1c79d3476Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 8863094e0bb161580564954dee512955c1c79d3476Greg Clayton DebuggerList &debugger_list = GetDebuggerList(); 8963094e0bb161580564954dee512955c1c79d3476Greg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 9063094e0bb161580564954dee512955c1c79d3476Greg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 9163094e0bb161580564954dee512955c1c79d3476Greg Clayton { 9263094e0bb161580564954dee512955c1c79d3476Greg Clayton if ((*pos).get() == this) 9363094e0bb161580564954dee512955c1c79d3476Greg Clayton { 9463094e0bb161580564954dee512955c1c79d3476Greg Clayton debugger_sp = *pos; 9563094e0bb161580564954dee512955c1c79d3476Greg Clayton break; 9663094e0bb161580564954dee512955c1c79d3476Greg Clayton } 9763094e0bb161580564954dee512955c1c79d3476Greg Clayton } 9863094e0bb161580564954dee512955c1c79d3476Greg Clayton return debugger_sp; 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10163094e0bb161580564954dee512955c1c79d3476Greg Clayton 10263094e0bb161580564954dee512955c1c79d3476Greg ClaytonTargetSP 10363094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::FindTargetWithProcessID (lldb::pid_t pid) 10463094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 10563094e0bb161580564954dee512955c1c79d3476Greg Clayton lldb::TargetSP target_sp; 10663094e0bb161580564954dee512955c1c79d3476Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 10763094e0bb161580564954dee512955c1c79d3476Greg Clayton DebuggerList &debugger_list = GetDebuggerList(); 10863094e0bb161580564954dee512955c1c79d3476Greg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 10963094e0bb161580564954dee512955c1c79d3476Greg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 11063094e0bb161580564954dee512955c1c79d3476Greg Clayton { 11163094e0bb161580564954dee512955c1c79d3476Greg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid); 11263094e0bb161580564954dee512955c1c79d3476Greg Clayton if (target_sp) 11363094e0bb161580564954dee512955c1c79d3476Greg Clayton break; 11463094e0bb161580564954dee512955c1c79d3476Greg Clayton } 11563094e0bb161580564954dee512955c1c79d3476Greg Clayton return target_sp; 11663094e0bb161580564954dee512955c1c79d3476Greg Clayton} 11763094e0bb161580564954dee512955c1c79d3476Greg Clayton 11863094e0bb161580564954dee512955c1c79d3476Greg Clayton 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Debugger () : 120558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice UserID (g_unique_id++), 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm("debugger.input"), 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_file (), 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_output_file (), 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error_file (), 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_list (), 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_listener ("lldb.Debugger"), 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager (), 12863094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)), 12963094e0bb161580564954dee512955c1c79d3476Greg Clayton m_exe_ctx (), 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_readers (), 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data () 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13363094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap->Initialize (); 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::~Debugger () 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13863094e0bb161580564954dee512955c1c79d3476Greg Clayton int num_targets = m_target_list.GetNumTargets(); 13963094e0bb161580564954dee512955c1c79d3476Greg Clayton for (int i = 0; i < num_targets; i++) 14063094e0bb161580564954dee512955c1c79d3476Greg Clayton { 14163094e0bb161580564954dee512955c1c79d3476Greg Clayton ProcessSP process_sp (m_target_list.GetTargetAtIndex (i)->GetProcessSP()); 14263094e0bb161580564954dee512955c1c79d3476Greg Clayton if (process_sp) 14363094e0bb161580564954dee512955c1c79d3476Greg Clayton process_sp->Destroy(); 14463094e0bb161580564954dee512955c1c79d3476Greg Clayton } 14563094e0bb161580564954dee512955c1c79d3476Greg Clayton DisconnectInput(); 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetAsyncExecution () 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15263094e0bb161580564954dee512955c1c79d3476Greg Clayton return !m_command_interpreter_ap->GetSynchronous(); 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetAsyncExecution (bool async_execution) 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15863094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap->SetSynchronous (!async_execution); 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DisconnectInput() 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.Clear (); 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership) 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_file.SetFileHandle (fh, tranfer_ownership); 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_file.GetFileHandle() == NULL) 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_file.SetFileHandle (stdin, false); 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Disconnect from any old connection if we had one 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.Disconnect (); 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.SetConnection (new ConnectionFileDescriptor (::fileno (GetInputFileHandle()), true)); 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.SetReadThreadBytesReceivedCallback (Debugger::DispatchInputCallback, this); 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_comm.StartReadThread (&error) == false) 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FILE *err_fh = GetErrorFileHandle(); 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (err_fh) 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::fprintf (err_fh, "error: failed to main input read thread: %s", error.AsCString() ? error.AsCString() : "unkown error"); 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exit(1); 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFILE * 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetInputFileHandle () 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_input_file.GetFileHandle(); 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership) 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_output_file.SetFileHandle (fh, tranfer_ownership); 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_output_file.GetFileHandle() == NULL) 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_output_file.SetFileHandle (stdin, false); 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFILE * 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetOutputFileHandle () 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_output_file.GetFileHandle(); 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership) 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error_file.SetFileHandle (fh, tranfer_ownership); 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_error_file.GetFileHandle() == NULL) 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error_file.SetFileHandle (stdin, false); 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFILE * 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetErrorFileHandle () 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_error_file.GetFileHandle(); 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter & 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetCommandInterpreter () 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 23163094e0bb161580564954dee512955c1c79d3476Greg Clayton assert (m_command_interpreter_ap.get()); 23263094e0bb161580564954dee512955c1c79d3476Greg Clayton return *m_command_interpreter_ap; 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerListener & 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetListener () 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_listener; 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetSP 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetCurrentTarget () 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_list.GetCurrentTarget (); 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerExecutionContext 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetCurrentExecutionContext () 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ExecutionContext exe_ctx; 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.Clear(); 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::TargetSP target_sp = GetCurrentTarget(); 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.target = target_sp.get(); 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_sp) 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.process = target_sp->GetProcessSP().get(); 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_ctx.process && exe_ctx.process->IsRunning() == false) 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.thread = exe_ctx.process->GetThreadList().GetCurrentThread().get(); 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_ctx.thread == NULL) 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.thread = exe_ctx.process->GetThreadList().GetThreadAtIndex(0).get(); 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_ctx.thread) 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.frame = exe_ctx.thread->GetCurrentFrame().get(); 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_ctx.frame == NULL) 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.frame = exe_ctx.thread->GetStackFrameAtIndex (0).get(); 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return exe_ctx; 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSourceManager & 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetSourceManager () 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_source_manager; 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetList& 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetTargetList () 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_list; 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInputCallback (void *baton, const void *bytes, size_t bytes_len) 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ((Debugger *)baton)->DispatchInput ((char *)bytes, bytes_len); 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInput (const char *bytes, size_t bytes_len) 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes == NULL || bytes_len == 0) 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: implement the STDIO to the process as an input reader... 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TargetSP target = GetCurrentTarget(); 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target.get() != NULL) 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp = target->GetProcessSP(); 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process_sp.get() != NULL 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && StateIsRunningState (process_sp->GetState())) 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process_sp->PutSTDIN (bytes, bytes_len, error) == bytes_len) 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WriteToDefaultReader (bytes, bytes_len); 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::WriteToDefaultReader (const char *bytes, size_t bytes_len) 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes && bytes_len) 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.append (bytes, bytes_len); 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_reader_data.empty()) 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (!m_input_readers.empty() && !m_input_reader_data.empty()) 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (CheckIfTopInputReaderIsDone ()) 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /* Do nothing. */; 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the input reader from the top of the stack 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner InputReaderSP reader_sp(m_input_readers.top()); 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!reader_sp) 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34053d68e749f0715691a95f23e9490d97e484b15daGreg Clayton size_t bytes_handled = reader_sp->HandleRawBytes (m_input_reader_data.c_str(), 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.size()); 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_handled) 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.erase (0, bytes_handled); 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No bytes were handled, we might not have reached our 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // granularity, just return and wait for more data 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Flush out any input readers that are donesvn 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (CheckIfTopInputReaderIsDone ()) 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /* Do nothing. */; 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::PushInputReader (const InputReaderSP& reader_sp) 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!reader_sp) 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_input_readers.empty()) 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Deactivate the old top reader 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner InputReaderSP top_reader_sp (m_input_readers.top()); 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (top_reader_sp) 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner top_reader_sp->Notify (eInputReaderDeactivate); 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_readers.push (reader_sp); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderActivate); 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ActivateInputReader (reader_sp); 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::PopInputReader (const lldb::InputReaderSP& pop_reader_sp) 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool result = false; 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The reader on the stop of the stack is done, so let the next 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // read on the stack referesh its prompt and if there is one... 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_input_readers.empty()) 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner InputReaderSP reader_sp(m_input_readers.top()); 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get()) 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_readers.pop (); 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderDeactivate); 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderDone); 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result = true; 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_input_readers.empty()) 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp = m_input_readers.top(); 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp) 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ActivateInputReader (reader_sp); 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderReactivate); 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::CheckIfTopInputReaderIsDone () 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool result = false; 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_input_readers.empty()) 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner InputReaderSP reader_sp(m_input_readers.top()); 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp && reader_sp->IsDone()) 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result = true; 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PopInputReader (reader_sp); 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::ActivateInputReader (const InputReaderSP &reader_sp) 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FILE *in_fh = GetInputFileHandle(); 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (in_fh) 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct termios in_fh_termios; 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int in_fd = fileno (in_fh); 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::tcgetattr(in_fd, &in_fh_termios) == 0) 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp->GetEcho()) 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner in_fh_termios.c_lflag |= ECHO; // Turn on echoing 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner in_fh_termios.c_lflag &= ~ECHO; // Turn off echoing 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (reader_sp->GetGranularity()) 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eInputReaderGranularityByte: 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eInputReaderGranularityWord: 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner in_fh_termios.c_lflag &= ~ICANON; // Get one char at a time 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eInputReaderGranularityLine: 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eInputReaderGranularityAll: 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner in_fh_termios.c_lflag |= ICANON; // Get lines at a time 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::tcsetattr (in_fd, TCSANOW, &in_fh_termios); 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46163094e0bb161580564954dee512955c1c79d3476Greg Clayton 46263094e0bb161580564954dee512955c1c79d3476Greg Claytonvoid 46363094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::UpdateExecutionContext (ExecutionContext *override_context) 46463094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 46563094e0bb161580564954dee512955c1c79d3476Greg Clayton m_exe_ctx.Clear(); 46663094e0bb161580564954dee512955c1c79d3476Greg Clayton 46763094e0bb161580564954dee512955c1c79d3476Greg Clayton if (override_context != NULL) 46863094e0bb161580564954dee512955c1c79d3476Greg Clayton { 46963094e0bb161580564954dee512955c1c79d3476Greg Clayton m_exe_ctx.target = override_context->target; 47063094e0bb161580564954dee512955c1c79d3476Greg Clayton m_exe_ctx.process = override_context->process; 47163094e0bb161580564954dee512955c1c79d3476Greg Clayton m_exe_ctx.thread = override_context->thread; 47263094e0bb161580564954dee512955c1c79d3476Greg Clayton m_exe_ctx.frame = override_context->frame; 47363094e0bb161580564954dee512955c1c79d3476Greg Clayton } 47463094e0bb161580564954dee512955c1c79d3476Greg Clayton else 47563094e0bb161580564954dee512955c1c79d3476Greg Clayton { 47663094e0bb161580564954dee512955c1c79d3476Greg Clayton TargetSP target_sp (GetCurrentTarget()); 47763094e0bb161580564954dee512955c1c79d3476Greg Clayton if (target_sp) 47863094e0bb161580564954dee512955c1c79d3476Greg Clayton { 47963094e0bb161580564954dee512955c1c79d3476Greg Clayton m_exe_ctx.target = target_sp.get(); 48063094e0bb161580564954dee512955c1c79d3476Greg Clayton m_exe_ctx.process = target_sp->GetProcessSP().get(); 48163094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_exe_ctx.process && m_exe_ctx.process->IsRunning() == false) 48263094e0bb161580564954dee512955c1c79d3476Greg Clayton { 48363094e0bb161580564954dee512955c1c79d3476Greg Clayton m_exe_ctx.thread = m_exe_ctx.process->GetThreadList().GetCurrentThread().get(); 48463094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_exe_ctx.thread == NULL) 48563094e0bb161580564954dee512955c1c79d3476Greg Clayton m_exe_ctx.thread = m_exe_ctx.process->GetThreadList().GetThreadAtIndex(0).get(); 48663094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_exe_ctx.thread) 48763094e0bb161580564954dee512955c1c79d3476Greg Clayton { 48863094e0bb161580564954dee512955c1c79d3476Greg Clayton m_exe_ctx.frame = m_exe_ctx.thread->GetCurrentFrame().get(); 48963094e0bb161580564954dee512955c1c79d3476Greg Clayton if (m_exe_ctx.frame == NULL) 49063094e0bb161580564954dee512955c1c79d3476Greg Clayton m_exe_ctx.frame = m_exe_ctx.thread->GetStackFrameAtIndex (0).get(); 49163094e0bb161580564954dee512955c1c79d3476Greg Clayton } 49263094e0bb161580564954dee512955c1c79d3476Greg Clayton } 49363094e0bb161580564954dee512955c1c79d3476Greg Clayton } 49463094e0bb161580564954dee512955c1c79d3476Greg Clayton } 49563094e0bb161580564954dee512955c1c79d3476Greg Clayton} 49663094e0bb161580564954dee512955c1c79d3476Greg Clayton 497558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebuggerSP 498558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebugger::FindDebuggerWithID (lldb::user_id_t id) 499558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice{ 500558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice lldb::DebuggerSP debugger_sp; 501558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice 502558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 503558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice DebuggerList &debugger_list = GetDebuggerList(); 504558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice DebuggerList::iterator pos, end = debugger_list.end(); 505558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice for (pos = debugger_list.begin(); pos != end; ++pos) 506558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice { 507558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice if ((*pos).get()->GetID() == id) 508558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice { 509558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice debugger_sp = *pos; 510558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice break; 511558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice } 512558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice } 513558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice return debugger_sp; 514558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice} 515