Process.cpp revision b14ec34165772877c8242f5b15acb116b0d9a9b5
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" 23f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton#include "lldb/Expression/ClangUserExpression.h" 246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice#include "lldb/Interpreter/CommandInterpreter.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Host.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ABI.h" 270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton#include "lldb/Target/DynamicLoader.h" 2837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton#include "lldb/Target/OperatingSystem.h" 29642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/LanguageRuntime.h" 30642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/CPPLanguageRuntime.h" 31642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/ObjCLanguageRuntime.h" 32e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Platform.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 34643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/StopInfo.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 44b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::Dump (Stream &s, Platform *platform) const 4524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 4624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *cstr; 47ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_pid != LLDB_INVALID_PROCESS_ID) 48ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" pid = %i\n", m_pid); 49ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 50ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_parent_pid != LLDB_INVALID_PROCESS_ID) 51ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" parent = %i\n", m_parent_pid); 52ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 53ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_executable) 54ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 55ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" name = %s\n", m_executable.GetFilename().GetCString()); 56ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString (" file = "); 57ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton m_executable.Dump(&s); 58ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.EOL(); 59ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 60b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t argc = m_arguments.GetArgumentCount(); 61ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (argc > 0) 62ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 63ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton for (uint32_t i=0; i<argc; i++) 64ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 65b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *arg = m_arguments.GetArgumentAtIndex(i); 66ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (i < 10) 67b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" arg[%u] = %s\n", i, arg); 68ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 69b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("arg[%u] = %s\n", i, arg); 70ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 71ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 72b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 73b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t envc = m_environment.GetArgumentCount(); 74b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (envc > 0) 75b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 76b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton for (uint32_t i=0; i<envc; i++) 77b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 78b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *env = m_environment.GetArgumentAtIndex(i); 79b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (i < 10) 80b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" env[%u] = %s\n", i, env); 81b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 82b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("env[%u] = %s\n", i, env); 83b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 84b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 85b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 86ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_arch.IsValid()) 87ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" arch = %s\n", m_arch.GetTriple().str().c_str()); 88ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 89b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_uid != UINT32_MAX) 9024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 91b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_uid); 92b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" uid = %-5u (%s)\n", m_uid, cstr ? cstr : ""); 9324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 94b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_gid != UINT32_MAX) 9524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 96b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_gid); 97b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" gid = %-5u (%s)\n", m_gid, cstr ? cstr : ""); 9824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 99b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_euid != UINT32_MAX) 10024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 101b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_euid); 102b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" euid = %-5u (%s)\n", m_euid, cstr ? cstr : ""); 10324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 104b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_egid != UINT32_MAX) 10524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 106b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_egid); 107b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" egid = %-5u (%s)\n", m_egid, cstr ? cstr : ""); 10824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 10924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 11024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 11124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 112b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose) 11324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 114b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *label; 115b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (show_args || verbose) 116b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton label = "ARGUMENTS"; 117b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 118b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton label = "NAME"; 119b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 120ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (verbose) 121ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 122b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE %s\n", label); 123ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString ("====== ====== ========== ========== ========== ========== ======================== ============================\n"); 124ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 125ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 126ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 127b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("PID PARENT USER ARCH %s\n", label); 128ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString ("====== ====== ========== ======= ============================\n"); 129ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 13024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 13124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 13224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 133b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const 13424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 13524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_pid != LLDB_INVALID_PROCESS_ID) 13624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 13724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *cstr; 13824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton s.Printf ("%-6u %-6u ", m_pid, m_parent_pid); 13924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 14024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 141ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (verbose) 142ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 143b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_uid); 144ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 145ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 146ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 147b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_uid); 14824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 149b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_gid); 150ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 151ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 152ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 153b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_gid); 154ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 155b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_euid); 156ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 157ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 158ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 159b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_euid); 160ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 161b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_egid); 162ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 163ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 164ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 165b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_egid); 166ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-24s ", m_arch.IsValid() ? m_arch.GetTriple().str().c_str() : ""); 167ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 16824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 169ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 170ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s %.*-7s ", 171b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton platform->GetUserName (m_euid), 172ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton (int)m_arch.GetTriple().getArchName().size(), 173ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton m_arch.GetTriple().getArchName().data()); 174ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 175ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 176b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (verbose || show_args) 177ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 178b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t argc = m_arguments.GetArgumentCount(); 179ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (argc > 0) 180ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 181ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton for (uint32_t i=0; i<argc; i++) 182ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 183ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (i > 0) 184ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutChar (' '); 185b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.PutCString (m_arguments.GetArgumentAtIndex(i)); 186ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 187ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 188ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 18924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 190ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 191ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString (GetName()); 192ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 19324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 194ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.EOL(); 19524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 19624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 19724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 198b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 199b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonvoid 200b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInfo::SetArgumentsFromArgs (const Args& args, 201b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton bool first_arg_is_executable, 202b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton bool first_arg_is_executable_and_argument) 203b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 204b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Copy all arguments 205b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arguments = args; 206b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 207b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Is the first argument the executable? 208b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (first_arg_is_executable) 209b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 210b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *first_arg = args.GetArgumentAtIndex (0); 211b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (first_arg) 212b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 213b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Yes the first argument is an executable, set it as the executable 214b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // in the launch options. Don't resolve the file path as the path 215b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // could be a remote platform path 216b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const bool resolve = false; 217b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_executable.SetFile(first_arg, resolve); 218b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 219b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // If argument zero is an executable and shouldn't be included 220b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // in the arguments, remove it from the front of the arguments 221b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (first_arg_is_executable_and_argument == false) 222b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arguments.DeleteArgumentAtIndex (0); 223b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 224b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 225b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 226b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 227b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 228b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Open (int fd, const char *path, bool read, bool write) 229b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 230b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if ((read || write) && fd >= 0 && path && path[0]) 231b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 232b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionOpen; 233b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 234b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (read && write) 235b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arg = O_RDWR; 236b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else if (read) 237b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arg = O_RDONLY; 238b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 239b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arg = O_WRONLY; 240b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_path.assign (path); 241b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return true; 242b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 243b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 244b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 245b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 246b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 247b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return false; 248b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 249b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 25024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 251b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Close (int fd) 252b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 253b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 254b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (fd >= 0) 255b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 256b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionClose; 257b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 258b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 259b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return m_fd >= 0; 260b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 261b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 262b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 263b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 264b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Duplicate (int fd, int dup_fd) 265b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 266b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 267b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (fd >= 0 && dup_fd >= 0) 268b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 269b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionDuplicate; 270b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 271b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arg = dup_fd; 272b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 273b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return m_fd >= 0; 274b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 275b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 276b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 277b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 278b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 279b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::AddPosixSpawnFileAction (posix_spawn_file_actions_t *file_actions, 280b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const FileAction *info, 281b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Log *log, 282b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error& error) 283b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 284b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info == NULL) 285b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return false; 286b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 287b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton switch (info->m_action) 288b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 289b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionNone: 290b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.Clear(); 291b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 292b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 293b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionClose: 294b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 295b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd for posix_spawn_file_actions_addclose(...)"); 296b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 297b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 298b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_addclose (file_actions, info->m_fd), 299b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 300b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log && (error.Fail() || log)) 301b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, "posix_spawn_file_actions_addclose (action=%p, fd=%i)", 302b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd); 303b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 304b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 305b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 306b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionDuplicate: 307b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 308b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd for posix_spawn_file_actions_adddup2(...)"); 309b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else if (info->m_arg == -1) 310b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid duplicate fd for posix_spawn_file_actions_adddup2(...)"); 311b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 312b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 313b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_adddup2 (file_actions, info->m_fd, info->m_arg), 314b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 315b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log && (error.Fail() || log)) 316b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, "posix_spawn_file_actions_adddup2 (action=%p, fd=%i, dup_fd=%i)", 317b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd, info->m_arg); 318b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 319b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 320b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 321b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionOpen: 322b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 323b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd in posix_spawn_file_actions_addopen(...)"); 324b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 325b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 326b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton int oflag = info->m_arg; 327b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton mode_t mode = 0; 328b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 329b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_addopen (file_actions, 330b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton info->m_fd, 331b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton info->m_path.c_str(), 332b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton oflag, 333b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton mode), 334b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 335b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (error.Fail() || log) 336b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, 337b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton "posix_spawn_file_actions_addopen (action=%p, fd=%i, path='%s', oflag=%i, mode=%i)", 338b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd, info->m_path.c_str(), oflag, mode); 339b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 340b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 341b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 342b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton default: 343b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorStringWithFormat ("invalid file action: %i", info->m_action); 344b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 345b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 346b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error.Success(); 347b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 348b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 349b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError 350143fcc3a15425659b381502ed4e1e50a3e726f36Greg ClaytonProcessLaunchCommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg) 351b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 352b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 353b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton char short_option = (char) m_getopt_table[option_idx].val; 354b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 355b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton switch (short_option) 356b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 357b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 's': // Stop at program entry point 358b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagStopAtEntry); 359b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 360b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 361b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'e': // STDERR for read + write 362b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 363b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 364b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDERR_FILENO, option_arg, true, true)) 365b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 366b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 367b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 368b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 369b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'i': // STDIN for read only 370b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 371b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 372b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDIN_FILENO, option_arg, true, false)) 373b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 374b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 375b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 376b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 377b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'o': // Open STDOUT for write only 378b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 379b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 380b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDOUT_FILENO, option_arg, false, true)) 381b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 382b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 383b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 384b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 385b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'p': // Process plug-in name 386b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.SetProcessPluginName (option_arg); 387b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 388b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 389b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'n': // Disable STDIO 390b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 391b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 392b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDERR_FILENO, "/dev/null", true, true)) 393b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 394b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDOUT_FILENO, "/dev/null", false, true)) 395b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 396b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDIN_FILENO, "/dev/null", true, false)) 397b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 398b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 399b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 400b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 401b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'w': 402b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.SetWorkingDirectory (option_arg); 403b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 404b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 405b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 't': // Open process in new terminal window 406b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY); 407b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 408b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 409b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'a': 410b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetArchitecture().SetTriple (option_arg, 411b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_interpreter.GetPlatform(true).get()); 412b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 413b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 414b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'A': 415b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagDisableASLR); 416b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 417b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 418b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'v': 419b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetEnvironmentEntries().AppendArgument(option_arg); 420b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 421b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 422b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton default: 423b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorStringWithFormat("Invalid short option character '%c'.\n", short_option); 424b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 425b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 426b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 427b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error; 428b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 429b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 430b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonOptionDefinition 431b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchCommandOptions::g_option_table[] = 432b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 433b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "stop-at-entry", 's', no_argument, NULL, 0, eArgTypeNone, "Stop at the entry point of the program when launching a process."}, 434b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "disable-aslr", 'A', no_argument, NULL, 0, eArgTypeNone, "Disable address space layout randomization when launching a process."}, 435b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "plugin", 'p', required_argument, NULL, 0, eArgTypePlugin, "Name of the process plugin you want to use."}, 436b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "working-dir", 'w', required_argument, NULL, 0, eArgTypePath, "Set the current working directory to <path> when running the inferior."}, 437b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "arch", 'a', required_argument, NULL, 0, eArgTypeArchitecture, "Set the architecture for the process to launch when ambiguous."}, 438b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "environment", 'v', required_argument, NULL, 0, eArgTypeNone, "Specify an environment variable name/value stirng (--environement NAME=VALUE). Can be specified multiple times for subsequent environment entries."}, 439b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 440b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1 , false, "stdin", 'i', required_argument, NULL, 0, eArgTypePath, "Redirect stdin for the process to <path>."}, 441b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1 , false, "stdout", 'o', required_argument, NULL, 0, eArgTypePath, "Redirect stdout for the process to <path>."}, 442b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1 , false, "stderr", 'e', required_argument, NULL, 0, eArgTypePath, "Redirect stderr for the process to <path>."}, 443b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 444b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_2 , false, "tty", 't', no_argument, NULL, 0, eArgTypeNone, "Start the process in a terminal (not supported on all platforms)."}, 445b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 446b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_3 , false, "no-stdio", 'n', no_argument, NULL, 0, eArgTypeNone, "Do not set up for terminal I/O to go to running process."}, 447b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 448b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 0 , false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 449b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}; 450b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 451b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 452b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 453b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 454b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::NameMatches (const char *process_name) const 45524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 45624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name_match_type == eNameMatchIgnore || process_name == NULL) 45724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 45824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *match_name = m_match_info.GetName(); 45924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (!match_name) 46024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 46124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 46224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return lldb_private::NameMatches (process_name, m_name_match_type, match_name); 46324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 46424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 46524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 466b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::Matches (const ProcessInstanceInfo &proc_info) const 46724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 46824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (!NameMatches (proc_info.GetName())) 46924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 47024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 47124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ProcessIDIsValid() && 47224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetProcessID() != proc_info.GetProcessID()) 47324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 47424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 47524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ParentProcessIDIsValid() && 47624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetParentProcessID() != proc_info.GetParentProcessID()) 47724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 47824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 479b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.UserIDIsValid () && 480b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_match_info.GetUserID() != proc_info.GetUserID()) 48124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 48224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 483b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.GroupIDIsValid () && 484b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_match_info.GetGroupID() != proc_info.GetGroupID()) 48524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 48624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 48724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveUserIDIsValid () && 48824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID()) 48924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 49024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 49124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveGroupIDIsValid () && 49224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID()) 49324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 49424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 49524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.GetArchitecture().IsValid() && 49624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetArchitecture() != proc_info.GetArchitecture()) 49724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 49824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 49924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 50024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 50124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 502b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::MatchAllProcesses () const 50324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 50424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name_match_type != eNameMatchIgnore) 50524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 50624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 50724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ProcessIDIsValid()) 50824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 50924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 51024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ParentProcessIDIsValid()) 51124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 51224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 513b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.UserIDIsValid ()) 51424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 51524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 516b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.GroupIDIsValid ()) 51724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 51824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 51924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveUserIDIsValid ()) 52024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 52124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 52224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveGroupIDIsValid ()) 52324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 52424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 52524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.GetArchitecture().IsValid()) 52624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 52724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 52824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_all_users) 52924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 53024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 53124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 53224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 53324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 53424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 53524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 536b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::Clear() 53724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 53824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.Clear(); 53924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_name_match_type = eNameMatchIgnore; 54024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_all_users = false; 54124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 542fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess* 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::FindPlugin (Target &target, const char *plugin_name, Listener &listener) 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessCreateInstance create_callback = NULL; 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (plugin_name) 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner create_callback = PluginManager::GetProcessCreateCallbackForPluginName (plugin_name); 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (create_callback) 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Process> debugger_ap(create_callback(target, listener)); 5538d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (debugger_ap->CanDebug(target, true)) 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return debugger_ap.release(); 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx) 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 56154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton std::auto_ptr<Process> debugger_ap(create_callback(target, listener)); 5628d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (debugger_ap->CanDebug(target, false)) 56354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton return debugger_ap.release(); 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process constructor 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Process(Target &target, Listener &listener) : 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UserID (LLDB_INVALID_PROCESS_ID), 57549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton Broadcaster ("lldb.process"), 576c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton ProcessInstanceSettings (*GetSettingsController()), 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target (target), 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_public_state (eStateUnloaded), 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state (eStateUnloaded), 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_broadcaster ("lldb.process.internal_state_broadcaster"), 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_broadcaster ("lldb.process.internal_state_control_broadcaster"), 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener ("lldb.process.internal_state_listener"), 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait(), 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_thread (LLDB_INVALID_HOST_THREAD), 58521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id (), 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_index_id (0), 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_status (-1), 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_string (), 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_list (this), 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications (), 59120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_image_tokens (), 59220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_listener (listener), 59320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_breakpoint_site_list (), 59420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_dynamic_checkers_ap (), 595861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_unix_signals (), 59620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_abi_sp (), 597861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader (), 598a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_stdio_communication ("process.stdio"), 59920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_stdio_communication_mutex (Mutex::eMutexTypeRecursive), 600fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton m_stdout_data (), 601613b8739a4d489b7f1c571288d5786768c024205Greg Clayton m_memory_cache (*this), 602613b8739a4d489b7f1c571288d5786768c024205Greg Clayton m_allocated_memory_cache (*this), 6037e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton m_next_event_action_ap() 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6051ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice UpdateInstanceName(); 6061ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 607e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Process::Process()", this); 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitStateChanged, "state-changed"); 61249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitInterrupt, "interrupt"); 61349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitSTDOUT, "stdout-available"); 61449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitSTDERR, "stderr-available"); 61549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner listener.StartListeningForEvents (this, 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitStateChanged | 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitInterrupt | 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitSTDOUT | 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitSTDERR); 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster, 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitStateChanged); 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster, 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlStop | 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlPause | 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlResume); 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::~Process() 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 636e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Process::~Process()", this); 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Finalize() 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Do any cleanup needed prior to being destructed... Subclasses 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // that override this method should call this superclass method as well. 64788fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham 64888fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham // We need to destroy the loader before the derived Process class gets destroyed 64988fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham // since it is very likely that undoing the loader will require access to the real process. 65037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_dyld_ap.reset(); 65137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RegisterNotificationCallbacks (const Notifications& callbacks) 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications.push_back(callbacks); 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (callbacks.initialize != NULL) 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner callbacks.initialize (callbacks.baton, this); 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::UnregisterNotificationCallbacks(const Notifications& callbacks) 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<Notifications>::iterator pos, end = m_notifications.end(); 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_notifications.begin(); pos != end; ++pos) 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->baton == callbacks.baton && 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->initialize == callbacks.initialize && 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->process_state_changed == callbacks.process_state_changed) 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications.erase(pos); 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SynchronouslyNotifyStateChanged (StateType state) 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end(); 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos) 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (notification_pos->process_state_changed) 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner notification_pos->process_state_changed (notification_pos->baton, this, state); 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: We need to do some work on events before the general Listener sees them. 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// For instance if we are continuing from a breakpoint, we need to ensure that we do 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the little "insert real insn, step & stop" trick. But we can't do that when the 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// event is delivered by the broadcaster - since that is done on the thread that is 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// waiting for new events, so if we needed more than one event for our handling, we would 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// stall. So instead we do it when we fetch the event off of the queue. 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextEvent (EventSP &event_sp) 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp) 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent (event_sp.get()); 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessToStop (const TimeValue *timeout) 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 71321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We can't just wait for a "stopped" event, because the stopped event may have restarted the target. 71421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We have to actually check each event, and in the case of a stopped event check the restarted flag 71521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // on the event. 71621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham EventSP event_sp; 71721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham StateType state = GetState(); 71821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // If we are exited or detached, we won't ever get back to any 71921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // other valid state... 72021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (state == eStateDetached || state == eStateExited) 72121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 72221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 72321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham while (state != eStateInvalid) 72421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 72521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham state = WaitForStateChangedEvents (timeout, event_sp); 72621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham switch (state) 72721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 72821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateCrashed: 72921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateDetached: 73021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateExited: 73121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateUnloaded: 73221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 73321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateStopped: 73421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get())) 73521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham continue; 73621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else 73721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 73821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham default: 73921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham continue; 74021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 74121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 74221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForState 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const TimeValue *timeout, 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType *match_states, const uint32_t num_match_states 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 755d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton StateType state = GetState(); 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (state != eStateInvalid) 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 758d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton // If we are exited or detached, we won't ever get back to any 759d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton // other valid state... 760d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton if (state == eStateDetached || state == eStateExited) 761d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton return state; 762d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = WaitForStateChangedEvents (timeout, event_sp); 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_match_states; ++i) 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_states[i] == state) 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghambool 77563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::HijackProcessEvents (Listener *listener) 77663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 77763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham if (listener != NULL) 77863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham { 77963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return HijackBroadcaster(listener, eBroadcastBitStateChanged); 78063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham } 78163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham else 78263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return false; 78363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 78463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 78563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghamvoid 78663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::RestoreProcessEvents () 78763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 78863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham RestoreBroadcaster(); 78963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 79063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 791f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghambool 792f9f40c20b210eea72ab042c63178ca000f005ed9Jim InghamProcess::HijackPrivateProcessEvents (Listener *listener) 793f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham{ 794f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (listener != NULL) 795f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 796f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return m_private_state_broadcaster.HijackBroadcaster(listener, eBroadcastBitStateChanged); 797f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 798f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 799f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return false; 800f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham} 801f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 802f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghamvoid 803f9f40c20b210eea72ab042c63178ca000f005ed9Jim InghamProcess::RestorePrivateProcessEvents () 804f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham{ 805f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham m_private_state_broadcaster.RestoreBroadcaster(); 806f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham} 807f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp) 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 811e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 81736f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton if (m_listener.WaitForEventForBroadcasterWithType (timeout, 81836f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton this, 81936f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton eBroadcastBitStateChanged, 82036f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton event_sp)) 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp) => %s", 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__, 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout, 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(state)); 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent * 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PeekAtStateChangedEvents () 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 834e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s...", __FUNCTION__); 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Event *event_ptr; 84036f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this, 84136f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton eBroadcastBitStateChanged); 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_ptr) 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (event_ptr) => %s", 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__, 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr))); 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s no events found", 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__); 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return event_ptr; 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp) 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 862e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 86872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (m_private_state_listener.WaitForEventForBroadcasterWithType (timeout, 86972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton &m_private_state_broadcaster, 87072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton eBroadcastBitStateChanged, 87172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton event_sp)) 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a bit of a hack, but when we wait here we could very well return 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to the command-line, and that could disable the log, which would render the 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // log we got above invalid. 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 87872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton { 87972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (state == eStateInvalid) 88072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton log->Printf ("Process::%s (timeout = %p, event_sp) => TIMEOUT", __FUNCTION__, timeout); 88172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton else 88272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state)); 88372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton } 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only) 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 890e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (control_only) 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp); 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_listener.WaitForEvent(timeout, event_sp); 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::IsRunning () const 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return StateIsRunningState (m_public_state.GetValue()); 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitStatus () 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateExited) 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_exit_status; 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 915638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 916638351aee118e89c658ca295cb4e9d1db7849befGreg Claytonvoid 917638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcess::ProcessInstanceSettings::GetHostEnvironmentIfNeeded () 918638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton{ 919638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton if (m_inherit_host_env && !m_got_host_env) 920638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 921638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_got_host_env = true; 922638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton StringList host_env; 923638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton const size_t host_env_count = Host::GetEnvironment (host_env); 924638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton for (size_t idx=0; idx<host_env_count; idx++) 925638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 926638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton const char *env_entry = host_env.GetStringAtIndex (idx); 927638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton if (env_entry) 928638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 9291f3dd643e10552de04644986a603f7ff02ed4bebGreg Clayton const char *equal_pos = ::strchr(env_entry, '='); 930638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton if (equal_pos) 931638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 932638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton std::string key (env_entry, equal_pos - env_entry); 933638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton std::string value (equal_pos + 1); 934638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton if (m_env_vars.find (key) == m_env_vars.end()) 935638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_env_vars[key] = value; 936638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton } 937638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton } 938638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton } 939638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton } 940638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton} 941638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 942638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 943638351aee118e89c658ca295cb4e9d1db7849befGreg Claytonsize_t 944638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcess::ProcessInstanceSettings::GetEnvironmentAsArgs (Args &env) 945638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton{ 946638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton GetHostEnvironmentIfNeeded (); 947638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 948638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton dictionary::const_iterator pos, end = m_env_vars.end(); 949638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton for (pos = m_env_vars.begin(); pos != end; ++pos) 950638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 951638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton std::string env_var_equal_value (pos->first); 952638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton env_var_equal_value.append(1, '='); 953638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton env_var_equal_value.append (pos->second); 954638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton env.AppendArgument (env_var_equal_value.c_str()); 955638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton } 956638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton return env.GetArgumentCount(); 957638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton} 958638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 959638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitDescription () 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty()) 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_exit_string.c_str(); 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96872e1c782ba1e4226da37af4722af608de9f39408Greg Claytonbool 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetExitStatus (int status, const char *cstr) 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 97168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 97268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton if (log) 97368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton log->Printf("Process::SetExitStatus (status=%i (0x%8.8x), description=%s%s%s)", 97468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton status, status, 97568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton cstr ? "\"" : "", 97668ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton cstr ? cstr : "NULL", 97768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton cstr ? "\"" : ""); 97868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton 97972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton // We were already in the exited state 98072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (m_private_state.GetValue() == eStateExited) 98168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton { 982644ddfbc1b36eabdb93c5acb150f9a77a92ee1fdGreg Clayton if (log) 983644ddfbc1b36eabdb93c5acb150f9a77a92ee1fdGreg Clayton log->Printf("Process::SetExitStatus () ignoring exit status because state was already set to eStateExited"); 98472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton return false; 98568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton } 98672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 98772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_exit_status = status; 98872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (cstr) 98972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_exit_string = cstr; 99072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton else 99172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_exit_string.clear(); 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton DidExit (); 99458e844b3561848e73e69d6d98746d4851e78306eGreg Clayton 99572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton SetPrivateState (eStateExited); 99672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton return true; 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This static callback can be used to watch for local child processes on 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the current host. The the child process exits, the process will be 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// found in the global target list (we want to be completely sure that the 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// lldb_private::Process doesn't go away before we can deliver the signal. 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetProcessExitStatus 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *callback_baton, 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::pid_t pid, 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int signo, // Zero for no signal 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int exit_status // Exit value of process if signal is zero 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signo == 0 || exit_status) 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 101463094e0bb161580564954dee512955c1c79d3476Greg Clayton TargetSP target_sp(Debugger::FindTargetWithProcessID (pid)); 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_sp) 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp (target_sp->GetProcessSP()); 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process_sp) 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *signal_cstr = NULL; 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signo) 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo); 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process_sp->SetExitStatus (exit_status, signal_cstr); 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonvoid 103437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg ClaytonProcess::UpdateThreadListIfNeeded () 103537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{ 103637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton const uint32_t stop_id = GetStopID(); 103737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID()) 103837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton { 103937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton Mutex::Locker locker (m_thread_list.GetMutex ()); 104037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton ThreadList new_thread_list(this); 104137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton // Always update the thread list with the protocol specific 104237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton // thread list 104337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton UpdateThreadList (m_thread_list, new_thread_list); 104437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton OperatingSystem *os = GetOperatingSystem (); 104537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (os) 104637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton os->UpdateThreadList (m_thread_list, new_thread_list); 104737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_thread_list.Update (new_thread_list); 104837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_thread_list.SetStopID (stop_id); 104937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 105037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton} 105137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextThreadIndexID () 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ++m_thread_index_id; 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetState() 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If any other threads access this we will need a mutex for it 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_public_state.GetValue (); 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetPublicState (StateType new_state) 106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 106868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPublicState (%s)", StateAsCString(new_state)); 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_public_state.SetValue (new_state); 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetPrivateState () 107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state.GetValue(); 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetPrivateState (StateType new_state) 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 108368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool state_changed = false; 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state)); 108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker(m_private_state.GetMutex()); 109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType old_state = m_private_state.GetValueNoLock (); 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state_changed = old_state != new_state; 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state_changed) 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state.SetValueNoLock (new_state); 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (StateIsStoppedState(new_state)) 109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 109821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.BumpStopID(); 1099fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton m_memory_cache.Clear(); 110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 110121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_mod_id.GetStopID()); 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Use our target to get a shared pointer to ourselves... 110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (GetTarget().GetProcessSP(), new_state)); 110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state), StateAsCString(old_state)); 111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetImageInfoAddress() 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_ADDRESS; 111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 11200baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// LoadImage 11210baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// 11220baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most 11230baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library 11240baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// loading differently should override LoadImage and UnloadImage and 11250baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed. 11260baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 11270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonuint32_t 11280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::LoadImage (const FileSpec &image_spec, Error &error) 11290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 11300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton DynamicLoader *loader = GetDynamicLoader(); 11310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (loader) 11320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = loader->CanLoadImage(); 11340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Fail()) 11350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 11370baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 11380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Success()) 11390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 11410baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 11420baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp) 11430baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11440baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 11450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 11460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (frame_sp) 11470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11480baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 11490baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton frame_sp->CalculateExecutionContext (exe_ctx); 1150ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham bool unwind_on_error = true; 11510baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StreamString expr; 11520baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton char path[PATH_MAX]; 11530baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton image_spec.GetPath(path, sizeof(path)); 11540baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton expr.Printf("dlopen (\"%s\", 2)", path); 11550baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n"; 1156360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ValueObjectSP result_valobj_sp; 1157696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangUserExpression::Evaluate (exe_ctx, unwind_on_error, expr.GetData(), prefix, result_valobj_sp); 1158b14ec34165772877c8242f5b15acb116b0d9a9b5Johnny Chen error = result_valobj_sp->GetError(); 1159b14ec34165772877c8242f5b15acb116b0d9a9b5Johnny Chen if (error.Success()) 11600baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11610baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Scalar scalar; 1162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (result_valobj_sp->ResolveValue (scalar)) 11630baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11640baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS); 11650baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS) 11660baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11670baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton uint32_t image_token = m_image_tokens.size(); 11680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_image_tokens.push_back (image_ptr); 11690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return image_token; 11700baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 11710baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 11720baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 11730baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 11740baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 11750baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 11760baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11770baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 11780baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 11790baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 11800baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// UnloadImage 11810baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// 11820baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most 11830baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library 11840baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// loading differently should override LoadImage and UnloadImage and 11850baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed. 11860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 11870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonError 11880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::UnloadImage (uint32_t image_token) 11890baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 11900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Error error; 11910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_token < m_image_tokens.size()) 11920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const addr_t image_addr = m_image_tokens[image_token]; 11940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_addr == LLDB_INVALID_ADDRESS) 11950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11960baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorString("image already unloaded"); 11970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 11980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 11990baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12000baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton DynamicLoader *loader = GetDynamicLoader(); 12010baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (loader) 12020baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = loader->CanLoadImage(); 12030baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 12040baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Success()) 12050baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12060baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 12070baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 12080baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp) 12090baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12100baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 12110baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 12120baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (frame_sp) 12130baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12140baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 12150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton frame_sp->CalculateExecutionContext (exe_ctx); 1216ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham bool unwind_on_error = true; 12170baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StreamString expr; 12180baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton expr.Printf("dlclose ((void *)0x%llx)", image_addr); 12190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const char *prefix = "extern \"C\" int dlclose(void* handle);\n"; 1220360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ValueObjectSP result_valobj_sp; 1221696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangUserExpression::Evaluate (exe_ctx, unwind_on_error, expr.GetData(), prefix, result_valobj_sp); 12220baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (result_valobj_sp->GetError().Success()) 12230baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12240baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Scalar scalar; 1225fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (result_valobj_sp->ResolveValue (scalar)) 12260baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (scalar.UInt(1)) 12280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData()); 12300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 12320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_image_tokens[image_token] = LLDB_INVALID_ADDRESS; 12340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12370baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 12380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = result_valobj_sp->GetError(); 12400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12410baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12420baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12430baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12440baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 12470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12480baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorString("invalid image token"); 12490baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12500baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return error; 12510baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 12520baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 125375906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonconst lldb::ABISP & 125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetABI() 125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 125675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton if (!m_abi_sp) 125775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton m_abi_sp = ABI::FindPlugin(m_target.GetArchitecture()); 125875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return m_abi_sp; 125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1261642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamLanguageRuntime * 1262642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetLanguageRuntime(lldb::LanguageType language) 1263642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1264642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntimeCollection::iterator pos; 1265642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham pos = m_language_runtimes.find (language); 1266642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (pos == m_language_runtimes.end()) 1267642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham { 1268642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham lldb::LanguageRuntimeSP runtime(LanguageRuntime::FindPlugin(this, language)); 1269642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1270642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham m_language_runtimes[language] 1271642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham = runtime; 1272642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return runtime.get(); 1273642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham } 1274642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham else 1275642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return (*pos).second.get(); 1276642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1277642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1278642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamCPPLanguageRuntime * 1279642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetCPPLanguageRuntime () 1280642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1281642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus); 1282642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus) 1283642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return static_cast<CPPLanguageRuntime *> (runtime); 1284642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return NULL; 1285642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1286642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1287642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamObjCLanguageRuntime * 1288642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetObjCLanguageRuntime () 1289642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1290642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC); 1291642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC) 1292642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return static_cast<ObjCLanguageRuntime *> (runtime); 1293642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return NULL; 1294642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1295642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointSiteList & 129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetBreakpointSiteList() 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list; 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst BreakpointSiteList & 130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetBreakpointSiteList() const 130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list; 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableAllBreakpointSites () 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.SetEnabledForAll (false); 131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ClearBreakpointSiteByID (lldb::user_id_t break_id) 131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (DisableBreakpointSiteByID (break_id)); 131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.Remove(break_id); 132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableBreakpointSiteByID (lldb::user_id_t break_id) 132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp->IsEnabled()) 133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DisableBreakpoint (bp_site_sp.get()); 133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("invalid breakpoint site ID: %i", break_id); 133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableBreakpointSiteByID (lldb::user_id_t break_id) 134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!bp_site_sp->IsEnabled()) 135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = EnableBreakpoint (bp_site_sp.get()); 135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("invalid breakpoint site ID: %i", break_id); 135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13613fd1f36c937575dbf57bae04c7ebaef78d8ecc1dStephen Wilsonlldb::break_id_t 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CreateBreakpointSite (BreakpointLocationSP &owner, bool use_hardware) 136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1364265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target); 136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (load_addr != LLDB_INVALID_ADDRESS) 136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp; 136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Look up this breakpoint site. If it exists, then add this new owner, otherwise 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // create a new breakpoint site and add it. 137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr); 137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp->AddOwner (owner); 137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner owner->SetBreakpointSite (bp_site_sp); 137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bp_site_sp->GetID(); 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, LLDB_INVALID_THREAD_ID, use_hardware)); 138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 138424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 138524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (EnableBreakpoint (bp_site_sp.get()).Success()) 138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner owner->SetBreakpointSite (bp_site_sp); 138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list.Add (bp_site_sp); 138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We failed to enable the breakpoint 139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_BREAK_ID; 139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp) 140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id); 140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_owners == 0) 140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableBreakpoint(bp_site_sp.get()); 140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress()); 140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const 141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_removed = 0; 141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t intersect_addr; 141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t intersect_size; 141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t opcode_offset; 141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t idx; 141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp; 141982820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham BreakpointSiteList bp_sites_in_range; 142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 142182820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham if (m_breakpoint_site_list.FindInRange (bp_addr, bp_addr + size, bp_sites_in_range)) 142224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 142382820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham for (idx = 0; (bp = bp_sites_in_range.GetByIndex(idx)) != NULL; ++idx) 142424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 142582820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham if (bp->GetType() == BreakpointSite::eSoftware) 142624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 142782820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham if (bp->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset)) 142882820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham { 142982820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size); 143082820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size); 143182820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham assert(opcode_offset + intersect_size <= bp->GetByteSize()); 143282820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham size_t buf_offset = intersect_addr - bp_addr; 143382820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham ::memcpy(buf + buf_offset, bp->GetSavedOpcodeBytes() + opcode_offset, intersect_size); 143482820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham } 143524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 143624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 143824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_removed; 143924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1442b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 1443b1888f24fa181489840b9acf193e224d125d0776Greg Claytonsize_t 1444b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonProcess::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site) 1445b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 1446b1888f24fa181489840b9acf193e224d125d0776Greg Clayton PlatformSP platform_sp (m_target.GetPlatform()); 1447b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (platform_sp) 1448b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return platform_sp->GetSoftwareBreakpointTrapOpcode (m_target, bp_site); 1449b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return 0; 1450b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 1451b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 145224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableSoftwareBreakpoint (BreakpointSite *bp_site) 145424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 145624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bp_site != NULL); 1457e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t bp_addr = bp_site->GetLoadAddress(); 145924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 146024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx", bp_site->GetID(), (uint64_t)bp_addr); 146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site->IsEnabled()) 146224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 146324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 146424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already enabled", bp_site->GetID(), (uint64_t)bp_addr); 146524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 146624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 146724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 146824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_addr == LLDB_INVALID_ADDRESS) 146924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 147024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("BreakpointSite contains an invalid load address."); 147124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 147324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Ask the lldb::Process subclass to fill in the correct software breakpoint 147424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // trap for the breakpoint site 147524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site); 147624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 147724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_opcode_size == 0) 147824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 147924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%llx.\n", bp_addr); 148024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 148324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes(); 148424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 148524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_opcode_bytes == NULL) 148624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 148724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode."); 148824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Save the original opcode by reading it 149224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size) 149324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 149424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Write a software breakpoint in place of the original opcode 149524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 149724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t verify_bp_opcode_bytes[64]; 149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 149924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 150024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0) 150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 150224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetEnabled(true); 150324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetType (BreakpointSite::eSoftware); 150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 150524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", 150624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 150724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr); 150824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 150924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 151024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to verify the breakpoint trap in memory."); 151124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 151224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 151324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory to verify breakpoint trap."); 151424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 151524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 151624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to write breakpoint trap to memory."); 151724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 151824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 151924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory at breakpoint address."); 152024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1521c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson if (log && error.Fail()) 152224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s", 152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr, 152524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.AsCString()); 152624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 152724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 152824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 152924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 153024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableSoftwareBreakpoint (BreakpointSite *bp_site) 153124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 153224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 153324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bp_site != NULL); 1534e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 153524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t bp_addr = bp_site->GetLoadAddress(); 153624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t breakID = bp_site->GetID(); 153724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 15389ff73eded653eaff1d98c5ae585044cae8e9bb71Stephen Wilson log->Printf ("Process::DisableBreakpoint (breakID = %d) addr = 0x%llx", breakID, (uint64_t)bp_addr); 153924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 154024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site->IsHardware()) 154124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 154224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Breakpoint site is a hardware breakpoint."); 154324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 154424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bp_site->IsEnabled()) 154524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 154624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t break_op_size = bp_site->GetByteSize(); 154724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes(); 154824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (break_op_size > 0) 154924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear a software breakoint instruction 155154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t curr_break_op[8]; 1552141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson assert (break_op_size <= sizeof(curr_break_op)); 155324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool break_op_found = false; 155424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 155524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Read the breakpoint opcode 155624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size) 155724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool verify = false; 155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure we have the a breakpoint opcode exists at this address 156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp (curr_break_op, break_op, break_op_size) == 0) 156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break_op_found = true; 156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We found a valid breakpoint opcode at this address, now restore 156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the saved opcode. 156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size) 156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner verify = true; 156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Memory write failed when restoring original opcode."); 157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Original breakpoint trap is no longer in memory."); 157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set verify to true and so we can check if the original opcode has already been restored 157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner verify = true; 157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (verify) 158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 158154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t verify_opcode[8]; 1582141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson assert (break_op_size < sizeof(verify_opcode)); 158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Verify that our original opcode made it back to the inferior 158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size) 158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // compare the memory we just read with the original opcode 158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0) 158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // SUCCESS 159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetEnabled(false); 159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr); 159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (break_op_found) 159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to restore original opcode."); 159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored."); 160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory that should contain the breakpoint trap."); 160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already disabled", bp_site->GetID(), (uint64_t)bp_addr); 161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s", 161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr, 162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.AsCString()); 162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1625fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton// Comment out line below to disable memory caching 1626fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#define ENABLE_MEMORY_CACHING 1627fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton// Uncomment to verify memory caching works after making changes to caching code 1628fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton//#define VERIFY_MEMORY_READS 1629fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1630fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#if defined (ENABLE_MEMORY_CACHING) 1631fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1632fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#if defined (VERIFY_MEMORY_READS) 1633fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1634fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 1635fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 1636fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 1637fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Memory caching is enabled, with debug verification 1638fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton if (buf && size) 1639fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton { 1640fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Uncomment the line below to make sure memory caching is working. 1641fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // I ran this through the test suite and got no assertions, so I am 1642fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // pretty confident this is working well. If any changes are made to 1643fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // memory caching, uncomment the line below and test your changes! 1644fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1645fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Verify all memory reads by using the cache first, then redundantly 1646fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // reading the same memory from the inferior and comparing to make sure 1647fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // everything is exactly the same. 1648fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton std::string verify_buf (size, '\0'); 1649fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (verify_buf.size() == size); 1650fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton const size_t cache_bytes_read = m_memory_cache.Read (this, addr, buf, size, error); 1651fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton Error verify_error; 1652fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton const size_t verify_bytes_read = ReadMemoryFromInferior (addr, const_cast<char *>(verify_buf.data()), verify_buf.size(), verify_error); 1653fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (cache_bytes_read == verify_bytes_read); 1654fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (memcmp(buf, verify_buf.data(), verify_buf.size()) == 0); 1655fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (verify_error.Success() == error.Success()); 1656fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return cache_bytes_read; 1657fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton } 1658fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return 0; 1659fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 1660fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1661fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#else // #if defined (VERIFY_MEMORY_READS) 1662fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1663fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 1664fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 1665fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 1666fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Memory caching enabled, no verification 1667613b8739a4d489b7f1c571288d5786768c024205Greg Clayton return m_memory_cache.Read (addr, buf, size, error); 1668fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 1669fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1670fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif // #else for #if defined (VERIFY_MEMORY_READS) 1671fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1672fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#else // #if defined (ENABLE_MEMORY_CACHING) 167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1677fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Memory caching is disabled 1678fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return ReadMemoryFromInferior (addr, buf, size, error); 1679fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 1680fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1681fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif // #else for #if defined (ENABLE_MEMORY_CACHING) 1682fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1683fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1684fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 1685b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcess::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len) 1686b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 1687b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t total_cstr_len = 0; 1688b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (dst && dst_max_len) 1689b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 1690b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // NULL out everything just to be safe 1691b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton memset (dst, 0, dst_max_len); 1692b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 1693b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton addr_t curr_addr = addr; 1694b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize(); 1695b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t bytes_left = dst_max_len - 1; 1696b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton char *curr_dst = dst; 1697b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1698b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton while (bytes_left > 0) 1699b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 1700b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size); 1701b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); 1702b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error); 1703b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1704b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (bytes_read == 0) 1705b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 1706b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton dst[total_cstr_len] = '\0'; 1707b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 1708b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 1709b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const size_t len = strlen(curr_dst); 1710b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1711b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton total_cstr_len += len; 1712b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1713b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (len < bytes_to_read) 1714b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 1715b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1716b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton curr_dst += bytes_read; 1717b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton curr_addr += bytes_read; 1718b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton bytes_left -= bytes_read; 1719b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 1720b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 1721b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return total_cstr_len; 1722b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 1723b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1724b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonsize_t 1725fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemoryFromInferior (addr_t addr, void *buf, size_t size, Error &error) 1726fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (buf == NULL || size == 0) 172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_read = 0; 173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t *bytes = (uint8_t *)buf; 173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (bytes_read < size) 173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_size = size - bytes_read; 173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_bytes_read = DoReadMemory (addr + bytes_read, 173724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes + bytes_read, 173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_read += curr_bytes_read; 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_read == curr_size || curr_bytes_read == 0) 174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Replace any software breakpoint opcodes that fall into this range back 174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // into "buf" before we return 174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_read > 0) 174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf); 174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_read; 175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1752f72fdeee129bbd7195f3db888b561ede689886aaGreg Claytonuint64_t 1753c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadUnsignedIntegerFromMemory (lldb::addr_t vm_addr, size_t integer_byte_size, uint64_t fail_value, Error &error) 1754f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton{ 1755c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar scalar; 1756c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar, error)) 1757c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return scalar.ULongLong(fail_value); 1758c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return fail_value; 1759c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 1760c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1761c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonaddr_t 1762c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadPointerFromMemory (lldb::addr_t vm_addr, Error &error) 1763c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 1764c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar scalar; 1765c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar, error)) 1766c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return scalar.ULongLong(LLDB_INVALID_ADDRESS); 1767c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return LLDB_INVALID_ADDRESS; 1768c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 1769c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1770c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1771c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonbool 1772c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::WritePointerToMemory (lldb::addr_t vm_addr, 1773c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::addr_t ptr_value, 1774c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error &error) 1775c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 1776c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar scalar; 1777c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton const uint32_t addr_byte_size = GetAddressByteSize(); 1778c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (addr_byte_size <= 4) 1779c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = (uint32_t)ptr_value; 1780f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton else 1781c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = ptr_value; 1782c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) == addr_byte_size; 1783f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton} 1784f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton 178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error) 178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_written = 0; 178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t *bytes = (const uint8_t *)buf; 179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (bytes_written < size) 179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_size = size - bytes_written; 179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written, 179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes + bytes_written, 179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += curr_bytes_written; 179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_written == curr_size || curr_bytes_written == 0) 180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error) 180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1808fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#if defined (ENABLE_MEMORY_CACHING) 1809fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton m_memory_cache.Flush (addr, size); 1810fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif 1811fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 181224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (buf == NULL || size == 0) 181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 1814e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 181521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.BumpMemoryID(); 1816e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We need to write any data that would go where any current software traps 181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // (enabled software breakpoints) any software traps (breakpoints) that we 181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // may have placed in our tasks memory. 182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator iter = m_breakpoint_site_list.GetMap()->lower_bound (addr); 182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator end = m_breakpoint_site_list.GetMap()->end(); 182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (iter == end || iter->second->GetLoadAddress() > addr + size) 1825c8bc1c318cfed0e3fe22731d808ddac1b32bb26eGreg Clayton return WriteMemoryPrivate (addr, buf, size, error); 182624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator pos; 182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_written = 0; 182954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton addr_t intersect_addr = 0; 183054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton size_t intersect_size = 0; 183154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton size_t opcode_offset = 0; 183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t *ubuf = (const uint8_t *)buf; 183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = iter; pos != end; ++pos) 183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 183624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp; 183724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp = pos->second; 183824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 183924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset)); 184024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(addr <= intersect_addr && intersect_addr < addr + size); 184124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size); 184224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(opcode_offset + intersect_size <= bp->GetByteSize()); 184324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 184424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check for bytes before this breakpoint 184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t curr_addr = addr + bytes_written; 184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (intersect_addr > curr_addr) 184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // There are some bytes before this breakpoint that we need to 184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // just write to memory 185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t curr_size = intersect_addr - curr_addr; 185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t curr_bytes_written = WriteMemoryPrivate (curr_addr, 185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ubuf + bytes_written, 185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += curr_bytes_written; 185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_written != curr_size) 185724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to write all of the requested bytes, we 185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // are done looping and will return the number of bytes that 186024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we have written so far. 186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now write any bytes that would cover up any software breakpoints 186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // directly into the breakpoint opcode buffer 186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size); 186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += intersect_size; 186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Write any remaining bytes after the last breakpoint if we have any left 187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_written < size) 187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += WriteMemoryPrivate (addr + bytes_written, 187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ubuf + bytes_written, 187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size - bytes_written, 187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 1877e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1880c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1881c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonsize_t 1882c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::WriteScalarToMemory (addr_t addr, const Scalar &scalar, uint32_t byte_size, Error &error) 1883c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 1884c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size == UINT32_MAX) 1885c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton byte_size = scalar.GetByteSize(); 1886c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size > 0) 1887c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 1888c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint8_t buf[32]; 1889c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton const size_t mem_size = scalar.GetAsMemoryData (buf, byte_size, GetByteOrder(), error); 1890c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (mem_size > 0) 1891c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return WriteMemory(addr, buf, mem_size, error); 1892c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 1893c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorString ("failed to get scalar as memory data"); 1894c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 1895c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 1896c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 1897c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorString ("invalid scalar value"); 1898c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 1899c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return 0; 1900c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 1901c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1902c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonsize_t 1903c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadScalarIntegerFromMemory (addr_t addr, 1904c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint32_t byte_size, 1905c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton bool is_signed, 1906c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar &scalar, 1907c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error &error) 1908c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 1909c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint64_t uval; 1910c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1911c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size <= sizeof(uval)) 1912c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 1913c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton size_t bytes_read = ReadMemory (addr, &uval, byte_size, error); 1914c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (bytes_read == byte_size) 1915c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 1916c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton DataExtractor data (&uval, sizeof(uval), GetByteOrder(), GetAddressByteSize()); 1917c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint32_t offset = 0; 1918c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size <= 4) 1919c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = data.GetMaxU32 (&offset, byte_size); 1920c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 1921c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = data.GetMaxU64 (&offset, byte_size); 1922c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1923c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (is_signed) 1924c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar.SignExtend(byte_size * 8); 1925c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return bytes_read; 1926c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 1927c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 1928c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 1929c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 1930c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size); 1931c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 1932c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return 0; 1933c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 1934c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1935613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#define USE_ALLOCATE_MEMORY_CACHE 1 193624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t 193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::AllocateMemory(size_t size, uint32_t permissions, Error &error) 193824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1939e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham if (GetPrivateState() != eStateStopped) 1940e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham return LLDB_INVALID_ADDRESS; 1941e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham 1942613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#if defined (USE_ALLOCATE_MEMORY_CACHE) 1943613b8739a4d489b7f1c571288d5786768c024205Greg Clayton return m_allocated_memory_cache.AllocateMemory(size, permissions, error); 1944613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#else 19452860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton addr_t allocated_addr = DoAllocateMemory (size, permissions, error); 19462860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 19472860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton if (log) 194821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham log->Printf("Process::AllocateMemory(size=%4zu, permissions=%s) => 0x%16.16llx (m_stop_id = %u m_memory_id = %u)", 19492860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton size, 1950613b8739a4d489b7f1c571288d5786768c024205Greg Clayton GetPermissionsAsCString (permissions), 19512860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton (uint64_t)allocated_addr, 195221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetStopID(), 195321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetMemoryID()); 19542860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton return allocated_addr; 1955613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#endif 195624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 195824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 195924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DeallocateMemory (addr_t ptr) 196024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1961613b8739a4d489b7f1c571288d5786768c024205Greg Clayton Error error; 1962613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#if defined (USE_ALLOCATE_MEMORY_CACHE) 1963613b8739a4d489b7f1c571288d5786768c024205Greg Clayton if (!m_allocated_memory_cache.DeallocateMemory(ptr)) 1964613b8739a4d489b7f1c571288d5786768c024205Greg Clayton { 1965613b8739a4d489b7f1c571288d5786768c024205Greg Clayton error.SetErrorStringWithFormat ("deallocation of memory at 0x%llx failed.", (uint64_t)ptr); 1966613b8739a4d489b7f1c571288d5786768c024205Greg Clayton } 1967613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#else 1968613b8739a4d489b7f1c571288d5786768c024205Greg Clayton error = DoDeallocateMemory (ptr); 19692860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton 19702860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 19712860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton if (log) 197221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham log->Printf("Process::DeallocateMemory(addr=0x%16.16llx) => err = %s (m_stop_id = %u, m_memory_id = %u)", 19732860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton ptr, 19742860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton error.AsCString("SUCCESS"), 197521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetStopID(), 197621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetMemoryID()); 1977613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#endif 19782860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton return error; 197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 198024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableWatchpoint (WatchpointLocation *watchpoint) 198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("watchpoints are not supported"); 198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 198824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 198924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 199024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 199124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableWatchpoint (WatchpointLocation *watchpoint) 199224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 199324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 199424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("watchpoints are not supported"); 199524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 199624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 199724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 199824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 199924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp) 200024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 200124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state; 200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now wait for the process to launch and return control to us, and then 200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // call DidLaunch: 200424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (1) 200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 200672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton event_sp.reset(); 200772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton state = WaitForStateChangedEventsPrivate (timeout, event_sp); 200872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 200972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (StateIsStoppedState(state)) 201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 201172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 201272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton // If state is invalid, then we timed out 201372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (state == eStateInvalid) 201472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton break; 201572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 201672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (event_sp) 201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 202124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Launch 202424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 202524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char const *argv[], 202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char const *envp[], 2027452bf613496c7290c6b7a1a1eb28efbce63fd3b9Greg Clayton uint32_t launch_flags, 202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *stdin_path, 202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *stdout_path, 2030de915beb5febe597505ba33fdc2c39eea2abdbd4Greg Clayton const char *stderr_path, 2031de915beb5febe597505ba33fdc2c39eea2abdbd4Greg Clayton const char *working_directory 203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 203675c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap.reset(); 203737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 2038861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 203924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20405beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module *exe_module = m_target.GetExecutableModulePointer(); 204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_module) 204224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2043180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton char local_exec_file_path[PATH_MAX]; 2044180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton char platform_exec_file_path[PATH_MAX]; 2045180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path)); 2046180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path)); 204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_module->GetFileSpec().Exists()) 204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2049a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton if (PrivateStateThreadIsValid ()) 2050a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton PausePrivateStateThread (); 2051a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton 205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = WillLaunch (exe_module); 205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 205424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2055d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton SetPublicState (eStateLaunching); 205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The args coming in should not contain the application name, the 205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lldb_private::Process class will add this in case the executable 205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // gets resolved to a different file than was given on the command 205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // line (like when an applicaiton bundle is specified and will 206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // resolve to the contained exectuable file, or the file given was 206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a symlink or other file system link that resolves to a different 206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // file). 206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the resolved exectuable path 206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make a new argument vector 206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<const char *> exec_path_plus_argv; 206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Append the resolved executable path 2069180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton exec_path_plus_argv.push_back (platform_exec_file_path); 207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Push all args if there are any 207224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argv) 207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (int i = 0; argv[i]; ++i) 207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exec_path_plus_argv.push_back(argv[i]); 207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Push a NULL to terminate the args. 207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exec_path_plus_argv.push_back(NULL); 208024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 208124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now launch using these arguments. 208253d68e749f0715691a95f23e9490d97e484b15daGreg Clayton error = DoLaunch (exe_module, 208353d68e749f0715691a95f23e9490d97e484b15daGreg Clayton exec_path_plus_argv.empty() ? NULL : &exec_path_plus_argv.front(), 208453d68e749f0715691a95f23e9490d97e484b15daGreg Clayton envp, 2085452bf613496c7290c6b7a1a1eb28efbce63fd3b9Greg Clayton launch_flags, 208653d68e749f0715691a95f23e9490d97e484b15daGreg Clayton stdin_path, 208753d68e749f0715691a95f23e9490d97e484b15daGreg Clayton stdout_path, 2088de915beb5febe597505ba33fdc2c39eea2abdbd4Greg Clayton stderr_path, 2089de915beb5febe597505ba33fdc2c39eea2abdbd4Greg Clayton working_directory); 209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 209124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Fail()) 209224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetID() != LLDB_INVALID_PROCESS_ID) 209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetID (LLDB_INVALID_PROCESS_ID); 209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *error_string = error.AsCString(); 209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error_string == NULL) 209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_string = "launch failed"; 209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetExitStatus (-1, error_string); 210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 21054985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton TimeValue timeout_time; 21064985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton timeout_time = TimeValue::Now(); 21074985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton timeout_time.OffsetWithSeconds(10); 21084985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton StateType state = WaitForProcessStopPrivate(&timeout_time, event_sp); 210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21104985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton if (state == eStateInvalid || event_sp.get() == NULL) 21114985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton { 21124985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton // We were able to launch the process, but we failed to 21134985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton // catch the initial stop. 21144985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton SetExitStatus (0, "failed to catch stop after launch"); 21154985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton Destroy(); 21164985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton } 21174985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton else if (state == eStateStopped || state == eStateCrashed) 211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 211975c703dd8b492bad25a987b96853626641ae7246Greg Clayton 212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidLaunch (); 212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 212237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_dyld_ap.reset (DynamicLoader::FindPlugin (this, NULL)); 212375c703dd8b492bad25a987b96853626641ae7246Greg Clayton if (m_dyld_ap.get()) 212475c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap->DidLaunch(); 212575c703dd8b492bad25a987b96853626641ae7246Greg Clayton 212637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This delays passing the stopped event to listeners till DidLaunch gets 212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a chance to complete... 212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 2130a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton 2131a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton if (PrivateStateThreadIsValid ()) 2132a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton ResumePrivateStateThread (); 2133a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton else 2134a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton StartPrivateStateThread (); 213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (state == eStateExited) 213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We exited while trying to launch somehow. Don't call DidLaunch as that's 213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // not likely to work, and return an invalid pid. 214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2147180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton error.SetErrorStringWithFormat("File doesn't exist: '%s'.\n", local_exec_file_path); 214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2153c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::NextEventAction::EventActionResult 2154c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp) 215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2156c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham StateType state = ProcessEventData::GetStateFromEvent (event_sp.get()); 2157c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham switch (state) 215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21597e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateRunning: 2160a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton case eStateConnected: 21617e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton return eEventActionRetry; 21627e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 21637e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateStopped: 21647e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateCrashed: 21657508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 21667e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // During attach, prior to sending the eStateStopped event, 21677e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // lldb_private::Process subclasses must set the process must set 21687e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // the new process ID. 21697e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID); 217075c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_process->CompleteAttach (); 21717e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton return eEventActionSuccess; 21727508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 21737e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 21747e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 21757e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton break; 21767e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton default: 21777e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateExited: 21787e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateInvalid: 21797e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton m_exit_string.assign ("No valid Process"); 21807e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton return eEventActionExit; 21817e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton break; 218224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2183c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham} 2184c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2185c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::NextEventAction::EventActionResult 2186c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::AttachCompletionHandler::HandleBeingInterrupted() 2187c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham{ 2188c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham return eEventActionSuccess; 2189c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham} 2190c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2191c2dc7c88cebe05cce059970cc907768256b28a42Jim Inghamconst char * 2192c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::AttachCompletionHandler::GetExitString () 2193c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham{ 2194c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham return m_exit_string.c_str(); 219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Attach (lldb::pid_t attach_pid) 219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 2202861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 220324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22047508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham // Find the process and its architecture. Make sure it matches the architecture 22057508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham // of the current Target, and if not adjust it. 22067508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 2207b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfo process_info; 2208b1888f24fa181489840b9acf193e224d125d0776Greg Clayton PlatformSP platform_sp (m_target.GetDebugger().GetPlatformList().GetSelectedPlatform ()); 2209e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (platform_sp) 22107508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 2211e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (platform_sp->GetProcessInfo (attach_pid, process_info)) 2212e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2213e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton const ArchSpec &process_arch = process_info.GetArchitecture(); 2214e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (process_arch.IsValid()) 2215e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton GetTarget().SetArchitecture(process_arch); 2216e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 22177508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 22187508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 221975c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap.reset(); 222037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 222175c703dd8b492bad25a987b96853626641ae7246Greg Clayton 222254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton Error error (WillAttachToProcessWithID(attach_pid)); 222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2225d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton SetPublicState (eStateAttaching); 2226d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton 222754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton error = DoAttachToProcessWithID (attach_pid); 222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2230c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham SetNextEventAction(new Process::AttachCompletionHandler(this)); 2231c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham StartPrivateStateThread(); 223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetID() != LLDB_INVALID_PROCESS_ID) 223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetID (LLDB_INVALID_PROCESS_ID); 223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *error_string = error.AsCString(); 223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error_string == NULL) 224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_string = "attach failed"; 224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetExitStatus(-1, error_string); 224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Attach (const char *process_name, bool wait_for_launch) 225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 2253861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 22547508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 22557508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham // Find the process and its architecture. Make sure it matches the architecture 22567508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham // of the current Target, and if not adjust it. 2257e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 22587508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 2259ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham if (!wait_for_launch) 22607508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 2261b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoList process_infos; 2262b1888f24fa181489840b9acf193e224d125d0776Greg Clayton PlatformSP platform_sp (m_target.GetDebugger().GetPlatformList().GetSelectedPlatform ()); 2263e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (platform_sp) 2264ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham { 2265b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoMatch match_info; 226624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_info.GetProcessInfo().SetName(process_name); 226724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_info.SetNameMatchType (eNameMatchEquals); 226824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton platform_sp->FindProcesses (match_info, process_infos); 2269e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (process_infos.GetSize() > 1) 2270e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2271e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error.SetErrorStringWithFormat ("More than one process named %s\n", process_name); 2272e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2273e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else if (process_infos.GetSize() == 0) 2274e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2275e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error.SetErrorStringWithFormat ("Could not find a process named %s\n", process_name); 2276e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2277e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 2278e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2279b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfo process_info; 2280e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (process_infos.GetInfoAtIndex (0, process_info)) 2281e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2282e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton const ArchSpec &process_arch = process_info.GetArchitecture(); 2283e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (process_arch.IsValid() && process_arch != GetTarget().GetArchitecture()) 2284e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2285e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // Set the architecture on the target. 2286e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton GetTarget().SetArchitecture (process_arch); 2287e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2288e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2289e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2290e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2291e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 2292e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2293e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error.SetErrorString ("Invalid platform"); 2294ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham } 22957508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 229675c703dd8b492bad25a987b96853626641ae7246Greg Clayton 229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2299e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton m_dyld_ap.reset(); 230037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 2301e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 2302e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error = WillAttachToProcessWithName(process_name, wait_for_launch); 2303e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error.Success()) 230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2305e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetPublicState (eStateAttaching); 2306e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error = DoAttachToProcessWithName (process_name, wait_for_launch); 2307e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error.Fail()) 230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2309e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 2310e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2311e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetID (LLDB_INVALID_PROCESS_ID); 2312e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton const char *error_string = error.AsCString(); 2313e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error_string == NULL) 2314e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error_string = "attach failed"; 231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2316e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetExitStatus(-1, error_string); 2317e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2318e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2319e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 2320e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2321e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetNextEventAction(new Process::AttachCompletionHandler(this)); 2322e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton StartPrivateStateThread(); 232324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 232524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 232624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 232724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 232824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 232975c703dd8b492bad25a987b96853626641ae7246Greg Claytonvoid 233075c703dd8b492bad25a987b96853626641ae7246Greg ClaytonProcess::CompleteAttach () 233175c703dd8b492bad25a987b96853626641ae7246Greg Clayton{ 233275c703dd8b492bad25a987b96853626641ae7246Greg Clayton // Let the process subclass figure out at much as it can about the process 233375c703dd8b492bad25a987b96853626641ae7246Greg Clayton // before we go looking for a dynamic loader plug-in. 233475c703dd8b492bad25a987b96853626641ae7246Greg Clayton DidAttach(); 233575c703dd8b492bad25a987b96853626641ae7246Greg Clayton 233675c703dd8b492bad25a987b96853626641ae7246Greg Clayton // We have complete the attach, now it is time to find the dynamic loader 233775c703dd8b492bad25a987b96853626641ae7246Greg Clayton // plug-in 23384fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL)); 233975c703dd8b492bad25a987b96853626641ae7246Greg Clayton if (m_dyld_ap.get()) 234075c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap->DidAttach(); 234175c703dd8b492bad25a987b96853626641ae7246Greg Clayton 234237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 234375c703dd8b492bad25a987b96853626641ae7246Greg Clayton // Figure out which one is the executable, and set that in our target: 234475c703dd8b492bad25a987b96853626641ae7246Greg Clayton ModuleList &modules = m_target.GetImages(); 234575c703dd8b492bad25a987b96853626641ae7246Greg Clayton 234675c703dd8b492bad25a987b96853626641ae7246Greg Clayton size_t num_modules = modules.GetSize(); 234775c703dd8b492bad25a987b96853626641ae7246Greg Clayton for (int i = 0; i < num_modules; i++) 234875c703dd8b492bad25a987b96853626641ae7246Greg Clayton { 234975c703dd8b492bad25a987b96853626641ae7246Greg Clayton ModuleSP module_sp (modules.GetModuleAtIndex(i)); 2350b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (module_sp && module_sp->IsExecutable()) 235175c703dd8b492bad25a987b96853626641ae7246Greg Clayton { 23525beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton if (m_target.GetExecutableModulePointer() != module_sp.get()) 235375c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_target.SetExecutableModule (module_sp, false); 235475c703dd8b492bad25a987b96853626641ae7246Greg Clayton break; 235575c703dd8b492bad25a987b96853626641ae7246Greg Clayton } 235675c703dd8b492bad25a987b96853626641ae7246Greg Clayton } 235775c703dd8b492bad25a987b96853626641ae7246Greg Clayton} 235875c703dd8b492bad25a987b96853626641ae7246Greg Clayton 235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 2360e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg ClaytonProcess::ConnectRemote (const char *remote_url) 2361e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton{ 2362e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton m_abi_sp.reset(); 2363e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton m_process_input_reader.reset(); 2364e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2365e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // Find the process and its architecture. Make sure it matches the architecture 2366e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // of the current Target, and if not adjust it. 2367e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2368e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton Error error (DoConnectRemote (remote_url)); 2369e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton if (error.Success()) 2370e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton { 2371a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 2372a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton { 237324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton EventSP event_sp; 237424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton StateType state = WaitForProcessStopPrivate(NULL, event_sp); 237524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 237624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (state == eStateStopped || state == eStateCrashed) 237724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 237824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // If we attached and actually have a process on the other end, then 237924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // this ended up being the equivalent of an attach. 238024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton CompleteAttach (); 238124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 238224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // This delays passing the stopped event to listeners till 238324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // CompleteAttach gets a chance to complete... 238424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton HandlePrivateEvent (event_sp); 238524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 238624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 2387a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton } 238824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 238924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (PrivateStateThreadIsValid ()) 239024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ResumePrivateStateThread (); 239124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 239224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton StartPrivateStateThread (); 2393e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton } 2394e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton return error; 2395e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton} 2396e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2397e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2398e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg ClaytonError 239924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Resume () 240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2401e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 2403ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham log->Printf("Process::Resume() m_stop_id = %u, public state: %s private state: %s", 240421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetStopID(), 2405ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham StateAsCString(m_public_state.GetValue()), 2406ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham StateAsCString(m_private_state.GetValue())); 240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillResume()); 240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Tell the process it is about to resume before the thread list 241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 241124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24129c11d478f7c2a1611b591cd599782b7a0a8c5c37Johnny Chen // Now let the thread list know we are about to resume so it 241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // can let all of our threads know that they are about to be 241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // resumed. Threads will each be called with 241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Thread::WillResume(StateType) where StateType contains the state 241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // that they are supposed to have when the process is resumed 241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // (suspended/running/stepping). Threads should also check 241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // their resume signal in lldb::Thread::GetResumeSignal() 241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to see if they are suppoed to start back up with a signal. 242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_list.WillResume()) 242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoResume(); 242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidResume(); 242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_list.DidResume(); 2427ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham if (log) 2428ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham log->Printf ("Process thinks the process has resumed."); 242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2433ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham error.SetErrorStringWithFormat("Process::WillResume() thread list returned false after WillResume"); 243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2436ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham else if (log) 2437ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham log->Printf ("Process::WillResume() got an error \"%s\".", error.AsCString("<unknown error>")); 243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 244224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Halt () 244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2444c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Pause our private state thread so we can ensure no one else eats 2445c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // the stop event out from under us. 2446f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Listener halt_listener ("lldb.process.halt_listener"); 2447f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham HijackPrivateProcessEvents(&halt_listener); 2448c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2449c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham EventSP event_sp; 24507e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton Error error (WillHalt()); 245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24527e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton if (error.Success()) 2453c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 245420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 24557e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton bool caused_stop = false; 24567e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 24577e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // Ask the process subclass to actually halt our process 24587e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton error = DoHalt(caused_stop); 245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 24603ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 24617e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton if (m_public_state.GetValue() == eStateAttaching) 24627e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton { 24637e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton SetExitStatus(SIGKILL, "Cancelled async attach."); 24647e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton Destroy (); 24657e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton } 24667e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton else 24673ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 2468c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // If "caused_stop" is true, then DoHalt stopped the process. If 2469c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // "caused_stop" is false, the process was already stopped. 2470c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // If the DoHalt caused the process to stop, then we want to catch 2471c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // this event and set the interrupted bool to true before we pass 2472c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // this along so clients know that the process was interrupted by 2473c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // a halt command. 2474c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (caused_stop) 247520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 2476f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Wait for 1 second for the process to stop. 2477c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham TimeValue timeout_time; 2478c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham timeout_time = TimeValue::Now(); 2479c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham timeout_time.OffsetWithSeconds(1); 2480f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool got_event = halt_listener.WaitForEvent (&timeout_time, event_sp); 2481f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StateType state = ProcessEventData::GetStateFromEvent(event_sp.get()); 2482c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2483f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!got_event || state == eStateInvalid) 248420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 2485c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // We timeout out and didn't get a stop event... 2486f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham error.SetErrorStringWithFormat ("Halt timed out. State = %s", StateAsCString(GetState())); 248720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 248820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton else 248920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 2490c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (StateIsStoppedState (state)) 2491c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2492c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // We caused the process to interrupt itself, so mark this 2493c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // as such in the stop event so clients can tell an interrupted 2494c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // process from a natural stop 2495c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham ProcessEventData::SetInterruptedInEvent (event_sp.get(), true); 2496c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2497c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham else 2498c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2499c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2500c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (log) 2501c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state)); 2502c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham error.SetErrorString ("Did not get stopped event after halt."); 2503c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 250420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 250520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 2506c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham DidHalt(); 2507c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 25083ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 2509c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2510c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Resume our private state thread before we post the event (if any) 2511f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham RestorePrivateProcessEvents(); 251220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 2513c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Post any event we might have consumed. If all goes well, we will have 2514c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // stopped the process, intercepted the event and set the interrupted 2515c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // bool in the event. Post it to the private event queue and that will end up 2516c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // correctly setting the state. 2517c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (event_sp) 2518c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham m_private_state_broadcaster.BroadcastEvent(event_sp); 251920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 252224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 252324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Detach () 252524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillDetach()); 252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 252824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableAllBreakpointSites(); 253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoDetach(); 253224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 253324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidDetach(); 253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 253724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 253824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Destroy () 254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillDestroy()); 254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableAllBreakpointSites(); 254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoDestroy(); 254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidDestroy(); 255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2554861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.StopReadThread(); 2555861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.Disconnect(); 2556861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && m_process_input_reader->IsActive()) 2557861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PopInputReader (m_process_input_reader); 2558861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader) 2559861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 256224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Signal (int signal) 256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillSignal()); 256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoSignal(signal); 257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidSignal(); 257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2577395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Claytonlldb::ByteOrder 2578395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonProcess::GetByteOrder () const 257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2580395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return m_target.GetArchitecture().GetByteOrder(); 258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 2584395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonProcess::GetAddressByteSize () const 258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2586395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return m_target.GetArchitecture().GetAddressByteSize(); 258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2589395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ShouldBroadcastEvent (Event *event_ptr) 259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr); 259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool return_value = true; 2595e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (state) 259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2599e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton case eStateConnected: 260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateAttaching: 260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateLaunching: 260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateDetached: 260324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateExited: 260424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateUnloaded: 260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // These events indicate changes in the state of the debugging session, always report them. 260624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateInvalid: 260924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We stopped for no apparent reason, don't report it. 261024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 261124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 261224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we've started the target running, we handle the cases where we 261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // are already running and where there is a transition from stopped to 261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // running differently. 261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // running -> running: Automatically suppress extra running events 261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // stopped -> running: Report except when there is one or more no votes 261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and no yes votes. 262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SynchronouslyNotifyStateChanged (state); 262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_public_state.GetValue()) 262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We always suppress multiple runnings with no PUBLIC stop in between. 262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 262824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: make this work correctly. For now always report 263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // run if we aren't running so we don't miss any runnning 263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // events. If I run the lldb/test/thread/a.out file and 263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // break at main.cpp:58, run and hit the breakpoints on 263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // multiple threads, then somehow during the stepping over 263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // of all breakpoints no run gets reported. 263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 263724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a transition from stop to run. 263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_thread_list.ShouldReportRun (event_ptr)) 263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteYes: 264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNoOpinion: 264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNo: 264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStopped: 265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateCrashed: 265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateSuspended: 265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We've stopped. First see if we're going to restart the target. 265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we are going to stop, then we always broadcast the event. 265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't going to stop, let the thread plans decide if we're going to report this event. 26585a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham // If no thread has an opinion, we don't report it. 26593ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (ProcessEventData::GetInterruptedFromEvent (event_ptr)) 26603ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 266120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (log) 266220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s", event_ptr, StateAsCString(state)); 26633ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return true; 26643ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 26653ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham else 266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RefreshStateAfterStop (); 266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_list.ShouldStop (event_ptr) == false) 267024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 267124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_thread_list.ShouldReportStop (event_ptr)) 267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteYes: 267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process::ProcessEventData::SetRestartedInEvent (event_ptr, true); 2675028784b321087f1547df8f02f01631c59e5a9859Johnny Chen // Intentional fall-through here. 267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNoOpinion: 267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNo: 267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 26833ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state)); 268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Resume (); 268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SynchronouslyNotifyStateChanged (state); 269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::ShouldBroadcastEvent (%p) => %s", event_ptr, StateAsCString(state), return_value ? "YES" : "NO"); 269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_value; 269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 270224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StartPrivateStateThread () 270324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2704e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2706b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton bool already_running = PrivateStateThreadIsValid (); 270724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 2708b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton log->Printf ("Process::%s()%s ", __FUNCTION__, already_running ? " already running" : " starting private state thread"); 2709b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 2710b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (already_running) 2711b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return true; 271224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Create a thread that watches our internal state and controls which 271424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // events make it to clients (into the DCProcess event queue). 2715a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton char thread_name[1024]; 2716a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state(pid=%i)>", GetID()); 2717a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_private_state_thread = Host::ThreadCreate (thread_name, Process::PrivateStateThread, this, NULL); 271809c81efd010d1c9ac8821bad00cdfc9747fcae79Greg Clayton return IS_VALID_LLDB_HOST_THREAD(m_private_state_thread); 271924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 272224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PausePrivateStateThread () 272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ControlPrivateStateThread (eBroadcastInternalStateControlPause); 272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ResumePrivateStateThread () 272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 273024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ControlPrivateStateThread (eBroadcastInternalStateControlResume); 273124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 273224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StopPrivateStateThread () 273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2736b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (PrivateStateThreadIsValid ()) 2737b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ControlPrivateStateThread (eBroadcastInternalStateControlStop); 273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 273924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 274024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 274124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ControlPrivateStateThread (uint32_t signal) 274224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2743e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 274424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 274524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (signal == eBroadcastInternalStateControlStop || 274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal == eBroadcastInternalStateControlPause || 274724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal == eBroadcastInternalStateControlResume); 274824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 274924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 2750f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal); 275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2752f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // Signal the private state thread. First we should copy this is case the 2753f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // thread starts exiting since the private state thread will NULL this out 2754f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // when it exits 2755f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton const lldb::thread_t private_state_thread = m_private_state_thread; 275609c81efd010d1c9ac8821bad00cdfc9747fcae79Greg Clayton if (IS_VALID_LLDB_HOST_THREAD(private_state_thread)) 275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 275824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TimeValue timeout_time; 275924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool timed_out; 276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_broadcaster.BroadcastEvent (signal, NULL); 276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout_time = TimeValue::Now(); 276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout_time.OffsetWithSeconds(2); 276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out); 276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (false, eBroadcastNever); 276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signal == eBroadcastInternalStateControlStop) 276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (timed_out) 2771f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton Host::ThreadCancel (private_state_thread, NULL); 277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread_result_t result = NULL; 2774f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton Host::ThreadJoin (private_state_thread, &result, NULL); 2775c607d8681f443d03806f105ceceb11dcadd16184Greg Clayton m_private_state_thread = LLDB_INVALID_HOST_THREAD; 277624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::HandlePrivateEvent (EventSP &event_sp) 278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2783e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2784c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 278568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton const StateType new_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 2786c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2787c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // First check to see if anybody wants a shot at this event: 278868bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham if (m_next_event_action_ap.get() != NULL) 2789c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 279068bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham NextEventAction::EventActionResult action_result = m_next_event_action_ap->PerformAction(event_sp); 2791c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham switch (action_result) 2792c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2793c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham case NextEventAction::eEventActionSuccess: 2794c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham SetNextEventAction(NULL); 2795c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham break; 2796c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham case NextEventAction::eEventActionRetry: 2797c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham break; 2798c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham case NextEventAction::eEventActionExit: 279984c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // Handle Exiting Here. If we already got an exited event, 280084c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // we should just propagate it. Otherwise, swallow this event, 280184c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // and set our state to exit so the next event will kill us. 280284c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham if (new_state != eStateExited) 280384c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham { 280484c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // FIXME: should cons up an exited event, and discard this one. 280568bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham SetExitStatus(0, m_next_event_action_ap->GetExitString()); 280684c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham SetNextEventAction(NULL); 280784c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham return; 280884c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham } 280984c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham SetNextEventAction(NULL); 2810c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham break; 2811c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2812c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2813c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if we should broadcast this state to external clients? 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const bool should_broadcast = ShouldBroadcastEvent (event_sp.get()); 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (should_broadcast) 281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 282168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton log->Printf ("Process::%s (pid = %i) broadcasting new state %s (old state %s) to %s", 282268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton __FUNCTION__, 282368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton GetID(), 282468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString(new_state), 282568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString (GetState ()), 282668ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public"); 282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2828d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get()); 282968ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton if (StateIsRunningState (new_state)) 2830861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice PushProcessInputReader (); 2831861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice else 2832861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice PopProcessInputReader (); 2833d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BroadcastEvent (event_sp); 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 284068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton log->Printf ("Process::%s (pid = %i) suppressing state %s (old state %s): should_broadcast == false", 284168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton __FUNCTION__, 284268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton GetID(), 284368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString(new_state), 284468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString (GetState ()), 284568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public"); 284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PrivateStateThread (void *arg) 285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process *proc = static_cast<Process*> (arg); 285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *result = proc->RunPrivateStateThread (); 285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RunPrivateStateThread () 286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool control_only = false; 286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (false, eBroadcastNever); 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2864e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (arg = %p, pid = %i) thread starting...", __FUNCTION__, this, GetID()); 286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool exit_now = false; 286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (!exit_now) 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WaitForEventsPrivate (NULL, event_sp, control_only); 287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster)) 287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (event_sp->GetType()) 287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlStop: 287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exit_now = true; 287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; // Go to next loop iteration so we exit without 288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; // doing any internal state managment below 288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlPause: 288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner control_only = true; 288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlResume: 288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner control_only = false; 288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 28903ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 28913ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (log) 28923ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham log->Printf ("Process::%s (arg = %p, pid = %i) got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType()); 28933ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (true, eBroadcastAlways); 28953ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham continue; 289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 289724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 289824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (internal_state != eStateInvalid) 290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29063b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton if (internal_state == eStateInvalid || 29073b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton internal_state == eStateExited || 29083b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton internal_state == eStateDetached ) 29093ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 29103ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (log) 29113ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham log->Printf ("Process::%s (arg = %p, pid = %i) about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state)); 29123ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 29143ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2917926060e198137f8a64face70455324a8cd4362a5Caroline Tice // Verify log is still enabled before attempting to write to it... 291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (arg = %p, pid = %i) thread exiting...", __FUNCTION__, this, GetID()); 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2921a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton m_private_state_control_wait.SetValue (true, eBroadcastAlways); 2922a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton m_private_state_thread = LLDB_INVALID_HOST_THREAD; 292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process Event Data 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData () : 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventData (), 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp (), 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_state (eStateInvalid), 293454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton m_restarted (false), 29356cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham m_update_state (0), 29363ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_interrupted (false) 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) : 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventData (), 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp (process_sp), 294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_state (state), 294454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton m_restarted (false), 29456cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham m_update_state (0), 29463ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_interrupted (false) 294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::~ProcessEventData() 295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetFlavorString () 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString g_flavor ("Process::ProcessEventData"); 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_flavor; 295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetFlavor () const 296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ProcessEventData::GetFlavorString (); 296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::DoOnRemoval (Event *event_ptr) 296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This function gets called twice for each event, once when the event gets pulled 29716cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // off of the private process event queue, and then any number of times, first when it gets pulled off of 29726cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // the public event queue, then other times when we're pretending that this is where we stopped at the 29736cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // end of expression evaluation. m_update_state is used to distinguish these 29746cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // three cases; it is 0 when we're just pulling it off for private handling, 29756cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // and > 1 for expression evaluation, and we don't want to do the breakpoint command handling then. 297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29776cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham if (m_update_state != 1) 297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp->SetPublicState (m_state); 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we're stopped and haven't restarted, then do the breakpoint commands here: 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_state == eStateStopped && ! m_restarted) 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int num_threads = m_process_sp->GetThreadList().GetSize(); 298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int idx; 2987643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 298821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // The actions might change one of the thread's stop_info's opinions about whether we should 298921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // stop the process, so we need to query that as we go. 299021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham bool still_should_stop = true; 299121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; idx < num_threads; ++idx) 299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ThreadSP thread_sp = m_process_sp->GetThreadList().GetThreadAtIndex(idx); 299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29966297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham StopInfoSP stop_info_sp = thread_sp->GetStopInfo (); 29976297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham if (stop_info_sp) 299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29996297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham stop_info_sp->PerformAction(event_ptr); 300021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // The stop action might restart the target. If it does, then we want to mark that in the 300121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // event so that whoever is receiving it will know to wait for the running event and reflect 300221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // that state appropriately. 300321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We also need to stop processing actions, since they aren't expecting the target to be running. 300421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (m_process_sp->GetPrivateState() == eStateRunning) 300521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 300621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham SetRestarted (true); 300721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham break; 300821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 300921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else if (!stop_info_sp->ShouldStop(event_ptr)) 301021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 301121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham still_should_stop = false; 301221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30156fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham 301621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 301721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (m_process_sp->GetPrivateState() != eStateRunning) 3018d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 301921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (!still_should_stop) 302021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 302121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We've been asked to continue, so do that here. 3022d60d94a5126b93fda98678a68322abc2164073dbJim Ingham SetRestarted(true); 302321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_process_sp->Resume(); 302421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 302521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else 302621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 302721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // If we didn't restart, run the Stop Hooks here: 302821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // They might also restart the target, so watch for that. 302921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_process_sp->GetTarget().RunStopHooks(); 303021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (m_process_sp->GetPrivateState() == eStateRunning) 303121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham SetRestarted(true); 303221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 3033d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 3034d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::Dump (Stream *s) const 304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_process_sp) 304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(" process = %p (pid = %u), ", m_process_sp.get(), m_process_sp->GetID()); 304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3044b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s->Printf("state = %s", StateAsCString(GetState())); 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Process::ProcessEventData * 304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr) 304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_ptr) 305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EventData *event_data = event_ptr->GetData(); 305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString()) 305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast <const ProcessEventData *> (event_ptr->GetData()); 305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcessSP 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetProcessFromEvent (const Event *event_ptr) 306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp; 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data) 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process_sp = data->GetProcessSP(); 306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return process_sp; 306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetStateFromEvent (const Event *event_ptr) 307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data == NULL) 307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eStateInvalid; 307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data->GetState(); 307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr) 308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data == NULL) 308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 308624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data->GetRestarted(); 308724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value) 309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data != NULL) 309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetRestarted(new_value); 309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 30983ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr) 30993ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{ 31003ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 31013ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (data == NULL) 31023ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return false; 31033ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham else 31043ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return data->GetInterrupted (); 31053ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham} 31063ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 31073ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghamvoid 31083ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value) 31093ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{ 31103ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 31113ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (data != NULL) 31123ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham data->SetInterrupted(new_value); 31133ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham} 31143ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 31153ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghambool 311624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr) 311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 311824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 311924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data) 312024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetUpdateStateOnRemoval(); 312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 312324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 312724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3128a830adbcd63d1995a01e6e18da79893c1426ca43Greg ClaytonProcess::CalculateExecutionContext (ExecutionContext &exe_ctx) 312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.target = &m_target; 313124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.process = this; 313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.thread = NULL; 313324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.frame = NULL; 313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 313524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 313624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::ProcessSP 313724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetSP () 313824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 313924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetTarget().GetProcessSP(); 314024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 314124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3142e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//uint32_t 3143e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids) 3144e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//{ 3145e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// return 0; 3146e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//} 3147e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 3148e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//ArchSpec 3149e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//Process::GetArchSpecForExistingProcess (lldb::pid_t pid) 3150e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//{ 3151e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// return Host::GetArchSpecForExistingProcess (pid); 3152e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//} 3153e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 3154e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//ArchSpec 3155e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//Process::GetArchSpecForExistingProcess (const char *process_name) 3156e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//{ 3157e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// return Host::GetArchSpecForExistingProcess (process_name); 3158e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//} 3159e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 3160861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3161861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::AppendSTDOUT (const char * s, size_t len) 3162861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 316320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton Mutex::Locker locker (m_stdio_communication_mutex); 3164861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdout_data.append (s, len); 3165861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3166b37813353540bcabee7af5f096515a8180be0426Greg Clayton BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (GetTarget().GetProcessSP(), GetState())); 3167861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3168861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3169861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3170861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len) 3171861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3172861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Process *process = (Process *) baton; 3173861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice process->AppendSTDOUT (static_cast<const char *>(src), src_len); 3174861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3175861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3176861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticesize_t 3177861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ProcessInputReaderCallback (void *baton, 3178861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice InputReader &reader, 3179861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice lldb::InputReaderAction notification, 3180861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice const char *bytes, 3181861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice size_t bytes_len) 3182861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3183861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Process *process = (Process *) baton; 3184861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3185861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice switch (notification) 3186861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3187861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderActivate: 3188861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3189861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3190861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderDeactivate: 3191861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3192861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3193861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderReactivate: 3194861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3195861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 31964a348081030cdd2af758fddc869518357d9befd3Caroline Tice case eInputReaderAsynchronousOutputWritten: 31974a348081030cdd2af758fddc869518357d9befd3Caroline Tice break; 31984a348081030cdd2af758fddc869518357d9befd3Caroline Tice 3199861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderGotToken: 3200861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3201861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Error error; 3202861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice process->PutSTDIN (bytes, bytes_len, error); 3203861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3204861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3205861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3206c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice case eInputReaderInterrupt: 3207c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice process->Halt (); 3208c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice break; 3209c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 3210c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice case eInputReaderEndOfFile: 3211c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice process->AppendSTDOUT ("^D", 2); 3212c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice break; 3213c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 3214861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderDone: 3215861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3216861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3217861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3218861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3219861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice return bytes_len; 3220861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3221861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3222861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3223861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ResetProcessInputReader () 3224861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3225861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 3226861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3227861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3228861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3229861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::SetUpProcessInputReader (int file_descriptor) 3230861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3231861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // First set up the Read Thread for reading/handling process I/O 3232861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3233861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice std::auto_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true)); 3234861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3235861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (conn_ap.get()) 3236861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3237861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.SetConnection (conn_ap.release()); 3238861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_stdio_communication.IsConnected()) 3239861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3240861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this); 3241861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.StartReadThread(); 3242861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3243861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // Now read thread is set up, set up input reader. 3244861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3245861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (!m_process_input_reader.get()) 3246861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3247861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset (new InputReader(m_target.GetDebugger())); 3248861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback, 3249861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice this, 3250861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice eInputReaderGranularityByte, 3251861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice NULL, 3252861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice NULL, 3253861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice false)); 3254861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3255861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (err.Fail()) 3256861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 3257861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3258861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3259861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3260861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3261861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3262861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3263861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PushProcessInputReader () 3264861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3265861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && !m_process_input_reader->IsActive()) 3266861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PushInputReader (m_process_input_reader); 3267861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3268861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3269861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3270861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PopProcessInputReader () 3271861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3272861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && m_process_input_reader->IsActive()) 3273861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PopInputReader (m_process_input_reader); 3274861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3275861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3276d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton// The process needs to know about installed plug-ins 3277990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 32782a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceProcess::SettingsInitialize () 3279990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 3280b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static std::vector<OptionEnumValueElement> g_plugins; 3281d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton 3282d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton int i=0; 3283d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton const char *name; 3284d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton OptionEnumValueElement option_enum; 3285d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton while ((name = PluginManager::GetProcessPluginNameAtIndex (i)) != NULL) 3286d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3287d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton if (name) 3288d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3289d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.value = i; 3290d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.string_value = name; 3291d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.usage = PluginManager::GetProcessPluginDescriptionAtIndex (i); 3292d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton g_plugins.push_back (option_enum); 3293d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3294d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton ++i; 3295d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3296d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.value = 0; 3297d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.string_value = NULL; 3298d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.usage = NULL; 3299d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton g_plugins.push_back (option_enum); 3300d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton 3301d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton for (i=0; (name = SettingsController::instance_settings_table[i].var_name); ++i) 3302d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3303d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton if (::strcmp (name, "plugin") == 0) 3304d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3305d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton SettingsController::instance_settings_table[i].enum_values = &g_plugins[0]; 3306d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton break; 3307d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3308d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3309990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsControllerSP &usc = GetSettingsController(); 3310990de7bb41d3afec6b789155408ff322187d8682Greg Clayton usc.reset (new SettingsController); 3311990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsController::InitializeSettingsController (usc, 3312990de7bb41d3afec6b789155408ff322187d8682Greg Clayton SettingsController::global_settings_table, 3313990de7bb41d3afec6b789155408ff322187d8682Greg Clayton SettingsController::instance_settings_table); 33142a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 33152a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Now call SettingsInitialize() for each 'child' of Process settings 33162a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice Thread::SettingsInitialize (); 3317990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 33186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 3319990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 33202a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceProcess::SettingsTerminate () 3321990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 33222a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Must call SettingsTerminate() on each 'child' of Process settings before terminating Process settings. 33232a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 33242a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice Thread::SettingsTerminate (); 33252a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 33262a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Now terminate Process Settings. 33272a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 3328990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsControllerSP &usc = GetSettingsController(); 3329990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsController::FinalizeSettingsController (usc); 3330990de7bb41d3afec6b789155408ff322187d8682Greg Clayton usc.reset(); 3331990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 33326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 3333990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonUserSettingsControllerSP & 3334990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonProcess::GetSettingsController () 3335990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 3336990de7bb41d3afec6b789155408ff322187d8682Greg Clayton static UserSettingsControllerSP g_settings_controller; 33376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return g_settings_controller; 33386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 33396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 33401ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Ticevoid 33411ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline TiceProcess::UpdateInstanceName () 33421ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice{ 33435beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module *module = GetTarget().GetExecutableModulePointer(); 33445beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton if (module) 33451ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice { 33461ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice StreamString sstr; 33475beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton sstr.Printf ("%s", module->GetFileSpec().GetFilename().AsCString()); 33481ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 3349c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(), 3350b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton sstr.GetData()); 33511ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice } 33521ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice} 33531ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 3354427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonExecutionResults 3355360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::RunThreadPlan (ExecutionContext &exe_ctx, 3356360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ThreadPlanSP &thread_plan_sp, 3357360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool stop_others, 3358360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool try_all_threads, 3359360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool discard_on_error, 3360360f53f3c216ee4fb433da0a367168785328a856Jim Ingham uint32_t single_thread_timeout_usec, 3361360f53f3c216ee4fb433da0a367168785328a856Jim Ingham Stream &errors) 3362360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 3363360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ExecutionResults return_value = eExecutionSetupError; 3364360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 336515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham if (thread_plan_sp.get() == NULL) 336615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 336715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham errors.Printf("RunThreadPlan called with empty thread plan."); 3368b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return eExecutionSetupError; 336915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 337015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 33715ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // We rely on the thread plan we are running returning "PlanCompleted" if when it successfully completes. 33725ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // For that to be true the plan can't be private - since private plans suppress themselves in the 33735ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // GetCompletedPlan call. 33745ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham 33755ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham bool orig_plan_private = thread_plan_sp->GetPrivate(); 33765ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham thread_plan_sp->SetPrivate(false); 33775ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham 3378ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham if (m_private_state.GetValue() != eStateStopped) 3379ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham { 3380ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham errors.Printf ("RunThreadPlan called while the private state was not stopped."); 3381b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return eExecutionSetupError; 3382ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham } 3383ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham 33847bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham // Save the thread & frame from the exe_ctx for restoration after we run 3385265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton const uint32_t thread_idx_id = exe_ctx.thread->GetIndexID(); 33867bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham StackID ctx_frame_id = exe_ctx.thread->GetSelectedFrame()->GetStackID(); 3387360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3388360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // N.B. Running the target may unset the currently selected thread and frame. We don't want to do that either, 3389360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // so we should arrange to reset them as well. 3390360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3391360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ThreadSP selected_thread_sp = exe_ctx.process->GetThreadList().GetSelectedThread(); 3392360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 33937bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham uint32_t selected_tid; 33947bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham StackID selected_stack_id; 3395360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (selected_thread_sp != NULL) 3396360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3397360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_tid = selected_thread_sp->GetIndexID(); 33987bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham selected_stack_id = selected_thread_sp->GetSelectedFrame()->GetStackID(); 3399360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3400360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 3401360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3402360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_tid = LLDB_INVALID_THREAD_ID; 3403360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3404360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3405360f53f3c216ee4fb433da0a367168785328a856Jim Ingham exe_ctx.thread->QueueThreadPlan(thread_plan_sp, true); 3406360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 34076ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham Listener listener("lldb.process.listener.run-thread-plan"); 3408f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3409f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // This process event hijacker Hijacks the Public events and its destructor makes sure that the process events get 3410f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // restored on exit to the function. 3411f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3412f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ProcessEventHijacker run_thread_plan_hijacker (*this, &listener); 3413ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham 34146ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 341515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham if (log) 341615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 341715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham StreamString s; 341815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose); 3419f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): Resuming thread %u - 0x%4.4x to run thread plan \"%s\".", 3420f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham exe_ctx.thread->GetIndexID(), 3421f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham exe_ctx.thread->GetID(), 3422f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham s.GetData()); 342315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 342415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 3425f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool got_event; 3426f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham lldb::EventSP event_sp; 3427f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham lldb::StateType stop_state = lldb::eStateInvalid; 3428360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3429360f53f3c216ee4fb433da0a367168785328a856Jim Ingham TimeValue* timeout_ptr = NULL; 3430360f53f3c216ee4fb433da0a367168785328a856Jim Ingham TimeValue real_timeout; 3431360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3432f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool first_timeout = true; 3433f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool do_resume = true; 3434360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3435360f53f3c216ee4fb433da0a367168785328a856Jim Ingham while (1) 3436360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3437f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We usually want to resume the process if we get to the top of the loop. 3438f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // The only exception is if we get two running events with no intervening 3439f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // stop, which can happen, we will just wait for then next stop event. 3440f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3441f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (do_resume) 3442f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3443f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Do the initial resume and wait for the running event before going further. 3444f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3445f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Error resume_error = exe_ctx.process->Resume (); 3446f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!resume_error.Success()) 3447f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3448f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham errors.Printf("Error resuming inferior: \"%s\".\n", resume_error.AsCString()); 3449b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionSetupError; 3450f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3451f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3452f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3453f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 3454f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(500000); 3455f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham timeout_ptr = &real_timeout; 3456f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3457f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent(NULL, event_sp); 3458f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!got_event) 3459f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3460f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3461f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Didn't get any event after initial resume, exiting."); 3462f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3463f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham errors.Printf("Didn't get any event after initial resume, exiting."); 3464b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionSetupError; 3465f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3466f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3467f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3468f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3469f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state != eStateRunning) 3470f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3471f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3472f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state)); 3473f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3474f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham errors.Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state)); 3475b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionSetupError; 3476f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3477f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3478f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3479f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3480f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Resuming succeeded."); 3481f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We need to call the function synchronously, so spin waiting for it to return. 3482f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // If we get interrupted while executing, we're going to lose our context, and 3483f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // won't be able to gather the result at this point. 3484f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We set the timeout AFTER the resume, since the resume takes some time and we 3485f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // don't want to charge that to the timeout. 3486f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3487f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (single_thread_timeout_usec != 0) 3488f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3489f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 3490f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 3491f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(single_thread_timeout_usec); 3492f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3493f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithSeconds(10); 3494f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3495f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham timeout_ptr = &real_timeout; 3496f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3497f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3498f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3499f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3500f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3501f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Handled an extra running event."); 3502f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham do_resume = true; 3503f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3504f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3505360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Now wait for the process to stop again: 3506f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = lldb::eStateInvalid; 3507f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_sp.reset(); 3508f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent (timeout_ptr, event_sp); 3509360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3510f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (got_event) 3511360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3512f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (event_sp.get()) 3513f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3514f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool keep_going = false; 3515f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3516f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3517f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf("In while loop, got event: %s.", StateAsCString(stop_state)); 3518f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3519f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham switch (stop_state) 3520f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3521f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham case lldb::eStateStopped: 35222370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 3523439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // Yay, we're done. Now make sure that our thread plan actually completed. 3524439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton ThreadSP thread_sp = exe_ctx.process->GetThreadList().FindThreadByIndexID (thread_idx_id); 3525439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (!thread_sp) 35262370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 3527439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // Ooh, our thread has vanished. Unlikely that this was successful execution... 35282370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham if (log) 3529439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton log->Printf ("Execution completed but our thread (index-id=%u) has vanished.", thread_idx_id); 3530439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton return_value = eExecutionInterrupted; 35312370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham } 35322370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham else 35332370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 3534439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton StopInfoSP stop_info_sp (thread_sp->GetStopInfo ()); 3535439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton StopReason stop_reason = eStopReasonInvalid; 3536439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (stop_info_sp) 3537439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton stop_reason = stop_info_sp->GetStopReason(); 3538439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (stop_reason == eStopReasonPlanComplete) 3539439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton { 3540439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (log) 3541f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Execution completed successfully."); 3542439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // Now mark this plan as private so it doesn't get reported as the stop reason 3543439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // after this point. 3544439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (thread_plan_sp) 3545439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton thread_plan_sp->SetPrivate (orig_plan_private); 3546439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton return_value = eExecutionCompleted; 3547439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton } 3548439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton else 3549439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton { 3550439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (log) 3551f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Thread plan didn't successfully complete."); 3552439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 3553439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton return_value = eExecutionInterrupted; 3554439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton } 35552370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham } 3556439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton } 3557439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton break; 3558439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 3559f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham case lldb::eStateCrashed: 3560f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3561f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Execution crashed."); 3562b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3563f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3564439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 3565f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham case lldb::eStateRunning: 3566f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham do_resume = false; 3567f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham keep_going = true; 3568f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3569439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 3570f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham default: 3571f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3572f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf("Execution stopped with unexpected state: %s.", StateAsCString(stop_state)); 35732370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham 35742370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham errors.Printf ("Execution stopped with unexpected state."); 3575b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3576f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3577f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3578f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (keep_going) 3579f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 3580f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3581f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3582f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3583f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3584f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3585f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3586f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("got_event was true, but the event pointer was null. How odd..."); 3587b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3588f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3589f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3590f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3591f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3592f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3593f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // If we didn't get an event that means we've timed out... 3594f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We will interrupt the process here. Depending on what we were asked to do we will 3595f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // either exit, or try with all threads running for the same timeout. 3596360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Not really sure what to do if Halt fails here... 3597f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3598c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson if (log) { 3599360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (try_all_threads) 3600f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3601f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 3602f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, " 3603f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "trying with all threads enabled.", 3604f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham single_thread_timeout_usec); 3605f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3606f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): Restarting function with all threads enabled " 3607f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "and timeout: %d timed out.", 3608f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham single_thread_timeout_usec); 3609f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3610360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 3611f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, " 3612f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "halt and abandoning execution.", 3613360f53f3c216ee4fb433da0a367168785328a856Jim Ingham single_thread_timeout_usec); 3614c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson } 3615360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3616c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham Error halt_error = exe_ctx.process->Halt(); 3617c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham if (halt_error.Success()) 3618360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3619360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 3620f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): Halt succeeded."); 3621360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3622f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // If halt succeeds, it always produces a stopped event. Wait for that: 3623f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3624f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 3625f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(500000); 3626f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3627f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent(&real_timeout, event_sp); 3628360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3629360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (got_event) 3630360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3631360f53f3c216ee4fb433da0a367168785328a856Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3632360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 3633360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 363468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton log->Printf ("Process::RunThreadPlan(): Stopped with event: %s", StateAsCString(stop_state)); 3635f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state == lldb::eStateStopped 3636f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get())) 3637f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString (" Event was the Halt interruption event."); 3638360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3639360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3640f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state == lldb::eStateStopped) 3641360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3642f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Between the time we initiated the Halt and the time we delivered it, the process could have 3643f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // already finished its job. Check that here: 3644f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3645f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (exe_ctx.thread->IsThreadPlanDone (thread_plan_sp.get())) 3646f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3647f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3648f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done. " 3649f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "Exiting wait loop."); 3650b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionCompleted; 3651f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3652f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3653360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3654f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!try_all_threads) 3655f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3656f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3657f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("try_all_threads was false, we stopped so now we're quitting."); 3658b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3659f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3660f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3661360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3662f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 3663f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3664f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Set all the other threads to run, and return to the top of the loop, which will continue; 3665f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham first_timeout = false; 3666f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_plan_sp->SetStopOthers (false); 3667f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3668f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): About to resume."); 3669360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3670f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 3671f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3672f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3673f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3674f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Running all threads failed, so return Interrupted. 3675f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3676f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): running all threads timed out."); 3677b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3678f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3679f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3680360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3681360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3682f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3683f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { if (log) 3684f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): halt said it succeeded, but I got no event. " 3685f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "I'm getting out of here passing Interrupted."); 3686b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3687f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3688f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3689360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3690c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham else 3691c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham { 3692f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // This branch is to work around some problems with gdb-remote's Halt. It is a little racy, and can return 3693f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // an error from halt, but if you wait a bit you'll get a stopped event anyway. 3694c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham if (log) 3695f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): halt failed: error = \"%s\", I'm just going to wait a little longer and see if I get a stopped event.", 3696f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham halt_error.AsCString()); 3697f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 3698f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(500000); 3699f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham timeout_ptr = &real_timeout; 3700f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent(&real_timeout, event_sp); 3701f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!got_event || event_sp.get() == NULL) 37026ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham { 3703f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // This is not going anywhere, bag out. 3704f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3705f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): halt failed: and waiting for the stopped event failed."); 3706b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3707f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3708f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3709f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3710f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3711f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3712f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3713f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): halt failed: but then I got a stopped event. Whatever..."); 3714f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state == lldb::eStateStopped) 3715f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3716f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Between the time we initiated the Halt and the time we delivered it, the process could have 3717f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // already finished its job. Check that here: 3718f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3719f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (exe_ctx.thread->IsThreadPlanDone (thread_plan_sp.get())) 3720f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3721f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3722f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done. " 3723f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "Exiting wait loop."); 3724b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionCompleted; 3725f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3726f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3727f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3728f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 3729f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3730f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Set all the other threads to run, and return to the top of the loop, which will continue; 3731f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham first_timeout = false; 3732f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_plan_sp->SetStopOthers (false); 3733f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3734f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): About to resume."); 3735f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3736f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 3737f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3738f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3739f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3740f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Running all threads failed, so return Interrupted. 3741f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3742f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): running all threads timed out."); 3743b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3744f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3745f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3746f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3747f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3748f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3749ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan if (log) 3750ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan log->Printf ("Process::RunThreadPlan(): halt failed, I waited and didn't get" 3751ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan " a stopped event, instead got %s.", StateAsCString(stop_state)); 3752b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3753f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3754f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 37556ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham } 3756c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 3757c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham 3758360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3759360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3760f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } // END WAIT LOOP 3761f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3762f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Now do some processing on the results of the run: 3763f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (return_value == eExecutionInterrupted) 3764f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3765360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 3766360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3767f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StreamString s; 3768f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (event_sp) 3769f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_sp->Dump (&s); 3770f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3771360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3772f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): Stop event that interrupted us is NULL."); 3773f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3774f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3775f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StreamString ts; 3776f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3777f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham const char *event_explanation = NULL; 3778f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3779f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham do 3780f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3781f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get()); 3782f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3783f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!event_data) 3784c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham { 3785f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_explanation = "<no event data>"; 3786f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3787c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 3788f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3789f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Process *process = event_data->GetProcessSP().get(); 3790c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham 3791f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!process) 3792f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3793f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_explanation = "<no process>"; 3794f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3795f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3796f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3797f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ThreadList &thread_list = process->GetThreadList(); 3798f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3799f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham uint32_t num_threads = thread_list.GetSize(); 3800f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham uint32_t thread_index; 3801f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3802f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("<%u threads> ", num_threads); 3803360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3804f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham for (thread_index = 0; 3805f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_index < num_threads; 3806f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ++thread_index) 3807360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3808f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Thread *thread = thread_list.GetThreadAtIndex(thread_index).get(); 3809360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3810f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!thread) 3811360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3812f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("<?> "); 3813f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 3814360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3815360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3816f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("<0x%4.4x ", thread->GetID()); 3817f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham RegisterContext *register_context = thread->GetRegisterContext().get(); 3818360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3819f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (register_context) 3820f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("[ip 0x%llx] ", register_context->GetPC()); 3821f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3822f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("[ip unknown] "); 3823360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3824f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham lldb::StopInfoSP stop_info_sp = thread->GetStopInfo(); 3825f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_info_sp) 3826c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham { 3827f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham const char *stop_desc = stop_info_sp->GetDescription(); 3828f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_desc) 3829f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.PutCString (stop_desc); 3830c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 3831f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf(">"); 3832c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 3833f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3834f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_explanation = ts.GetData(); 3835f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } while (0); 3836360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3837f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3838f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham { 3839f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham if (event_explanation) 3840f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->Printf("Process::RunThreadPlan(): execution interrupted: %s %s", s.GetData(), event_explanation); 3841f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham else 3842f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->Printf("Process::RunThreadPlan(): execution interrupted: %s", s.GetData()); 3843f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham } 3844f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3845360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (discard_on_error && thread_plan_sp) 3846360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3847360f53f3c216ee4fb433da0a367168785328a856Jim Ingham exe_ctx.thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 384821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 3849360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3850360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3851360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3852f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else if (return_value == eExecutionSetupError) 3853f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3854f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3855f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): execution set up error."); 3856360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3857f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (discard_on_error && thread_plan_sp) 3858f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3859f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham exe_ctx.thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 386021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 3861f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3862f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3863f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3864f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3865f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (exe_ctx.thread->IsThreadPlanDone (thread_plan_sp.get())) 3866f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3867f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3868f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): thread plan is done"); 3869b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionCompleted; 3870f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3871f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else if (exe_ctx.thread->WasThreadPlanDiscarded (thread_plan_sp.get())) 3872f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3873f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3874f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): thread plan was discarded"); 3875b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionDiscarded; 3876f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3877f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3878f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3879f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3880f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): thread plan stopped in mid course"); 3881f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (discard_on_error && thread_plan_sp) 3882f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3883f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3884f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): discarding thread plan 'cause discard_on_error is set."); 3885f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham exe_ctx.thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 388621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 3887f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3888f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3889f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3890f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3891360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Thread we ran the function in may have gone away because we ran the target 38927bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham // Check that it's still there, and if it is put it back in the context. Also restore the 38937bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham // frame in the context if it is still present. 3894265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton exe_ctx.thread = exe_ctx.process->GetThreadList().FindThreadByIndexID(thread_idx_id, true).get(); 3895360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (exe_ctx.thread) 38967bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham { 38977bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham exe_ctx.frame = exe_ctx.thread->GetFrameWithStackID (ctx_frame_id).get(); 38987bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham } 3899360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3900360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Also restore the current process'es selected frame & thread, since this function calling may 3901360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // be done behind the user's back. 3902360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3903360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (selected_tid != LLDB_INVALID_THREAD_ID) 3904360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 39057bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham if (exe_ctx.process->GetThreadList().SetSelectedThreadByIndexID (selected_tid) && selected_stack_id.IsValid()) 3906360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3907360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // We were able to restore the selected thread, now restore the frame: 39087bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham StackFrameSP old_frame_sp = exe_ctx.process->GetThreadList().GetSelectedThread()->GetFrameWithStackID(selected_stack_id); 39097bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham if (old_frame_sp) 39107bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham exe_ctx.process->GetThreadList().GetSelectedThread()->SetSelectedFrame(old_frame_sp.get()); 3911360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3912360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3913360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3914360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return return_value; 3915360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 3916360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3917360f53f3c216ee4fb433da0a367168785328a856Jim Inghamconst char * 3918360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::ExecutionResultAsCString (ExecutionResults result) 3919360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 3920360f53f3c216ee4fb433da0a367168785328a856Jim Ingham const char *result_name; 3921360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3922360f53f3c216ee4fb433da0a367168785328a856Jim Ingham switch (result) 3923360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3924b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionCompleted: 3925360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionCompleted"; 3926360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 3927b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionDiscarded: 3928360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionDiscarded"; 3929360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 3930b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionInterrupted: 3931360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionInterrupted"; 3932360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 3933b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionSetupError: 3934360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionSetupError"; 3935360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 3936b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionTimedOut: 3937360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionTimedOut"; 3938360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 3939360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3940360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return result_name; 3941360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 3942360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3943abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonvoid 3944abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::GetStatus (Stream &strm) 3945abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 3946abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const StateType state = GetState(); 3947abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (StateIsStoppedState(state)) 3948abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 3949abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (state == eStateExited) 3950abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 3951abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton int exit_status = GetExitStatus(); 3952abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const char *exit_description = GetExitDescription(); 3953abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.Printf ("Process %d exited with status = %i (0x%8.8x) %s\n", 3954abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton GetID(), 3955abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton exit_status, 3956abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton exit_status, 3957abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton exit_description ? exit_description : ""); 3958abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 3959abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 3960abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 3961abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (state == eStateConnected) 3962abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.Printf ("Connected to remote target.\n"); 3963abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 3964abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.Printf ("Process %d %s\n", GetID(), StateAsCString (state)); 3965abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 3966abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 3967abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 3968abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 3969abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.Printf ("Process %d is running.\n", GetID()); 3970abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 3971abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 3972abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 3973abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonsize_t 3974abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::GetThreadStatus (Stream &strm, 3975abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool only_threads_with_stop_reason, 3976abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t start_frame, 3977abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames, 3978abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames_with_source) 3979abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 3980abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton size_t num_thread_infos_dumped = 0; 3981abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 3982abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const size_t num_threads = GetThreadList().GetSize(); 3983abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton for (uint32_t i = 0; i < num_threads; i++) 3984abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 3985abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton Thread *thread = GetThreadList().GetThreadAtIndex(i).get(); 3986abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (thread) 3987abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 3988abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (only_threads_with_stop_reason) 3989abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 3990abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (thread->GetStopInfo().get() == NULL) 3991abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton continue; 3992abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 3993abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton thread->GetStatus (strm, 3994abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton start_frame, 3995abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_frames, 3996abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_frames_with_source); 3997abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton ++num_thread_infos_dumped; 3998abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 3999abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 4000abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton return num_thread_infos_dumped; 4001abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 4002abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 40036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 4004d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// class Process::SettingsController 40056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 40066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4007d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::SettingsController () : 40085bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice UserSettingsController ("process", Target::GetSettingsController()) 40096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4010638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_default_settings.reset (new ProcessInstanceSettings (*this, 4011638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton false, 4012004afcb95736e97d071b1dd9b5254800e11e581cCaroline Tice InstanceSettings::GetDefaultName().AsCString())); 40136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 40146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4015d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::~SettingsController () 40166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 40176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 40186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 40196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticelldb::InstanceSettingsSP 4020d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::CreateInstanceSettings (const char *instance_name) 40216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4022c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton ProcessInstanceSettings *new_settings = new ProcessInstanceSettings (*GetSettingsController(), 4023c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton false, 4024c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton instance_name); 40256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice lldb::InstanceSettingsSP new_settings_sp (new_settings); 40266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return new_settings_sp; 40276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 40286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 40296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 40306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice// class ProcessInstanceSettings 40316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 40326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4033638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcessInstanceSettings::ProcessInstanceSettings 4034638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton( 4035638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton UserSettingsController &owner, 4036638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton bool live_instance, 4037638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton const char *name 4038638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton) : 4039638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton InstanceSettings (owner, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance), 40406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_run_args (), 40416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_env_vars (), 40426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_input_path (), 40436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_output_path (), 40446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_error_path (), 4045bd666017403e102e0ca435d6da585ff979f83598Caroline Tice m_disable_aslr (true), 4046638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_disable_stdio (false), 4047638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_inherit_host_env (true), 4048638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_got_host_env (false) 40496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4050396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called 4051396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // until the vtables for ProcessInstanceSettings are properly set up, i.e. AFTER all the initializers. 4052396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // For this reason it has to be called here, rather than in the initializer or in the parent constructor. 405375b11a343a035ab426473a785a045f0614af9984Caroline Tice // This is true for CreateInstanceName() too. 405475b11a343a035ab426473a785a045f0614af9984Caroline Tice 405575b11a343a035ab426473a785a045f0614af9984Caroline Tice if (GetInstanceName () == InstanceSettings::InvalidName()) 405675b11a343a035ab426473a785a045f0614af9984Caroline Tice { 405775b11a343a035ab426473a785a045f0614af9984Caroline Tice ChangeInstanceName (std::string (CreateInstanceName().AsCString())); 405875b11a343a035ab426473a785a045f0614af9984Caroline Tice m_owner.RegisterInstanceSettings (this); 405975b11a343a035ab426473a785a045f0614af9984Caroline Tice } 4060396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice 4061396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice if (live_instance) 40626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 40636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); 40646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice CopyInstanceSettings (pending_settings,false); 4065396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice //m_owner.RemovePendingSettings (m_instance_name); 40666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 40676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 40686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 40696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::ProcessInstanceSettings (const ProcessInstanceSettings &rhs) : 4070c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton InstanceSettings (*Process::GetSettingsController(), CreateInstanceName().AsCString()), 40716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_run_args (rhs.m_run_args), 40726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_env_vars (rhs.m_env_vars), 40736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_input_path (rhs.m_input_path), 40746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_output_path (rhs.m_output_path), 40756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_error_path (rhs.m_error_path), 4076bd666017403e102e0ca435d6da585ff979f83598Caroline Tice m_disable_aslr (rhs.m_disable_aslr), 4077bd666017403e102e0ca435d6da585ff979f83598Caroline Tice m_disable_stdio (rhs.m_disable_stdio) 40786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 40796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (m_instance_name != InstanceSettings::GetDefaultName()) 40806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 40816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); 40826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice CopyInstanceSettings (pending_settings,false); 40836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_owner.RemovePendingSettings (m_instance_name); 40846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 40856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 40866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 40876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::~ProcessInstanceSettings () 40886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 40896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 40906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 40916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings& 40926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::operator= (const ProcessInstanceSettings &rhs) 40936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 40946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (this != &rhs) 40956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 40966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_run_args = rhs.m_run_args; 40976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_env_vars = rhs.m_env_vars; 40986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_input_path = rhs.m_input_path; 40996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_output_path = rhs.m_output_path; 41006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_error_path = rhs.m_error_path; 41016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_disable_aslr = rhs.m_disable_aslr; 4102bd666017403e102e0ca435d6da585ff979f83598Caroline Tice m_disable_stdio = rhs.m_disable_stdio; 4103638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_inherit_host_env = rhs.m_inherit_host_env; 41046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 41056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return *this; 41076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 41086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid 41116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name, 41126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const char *index_value, 41136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const char *value, 41146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString &instance_name, 41156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const SettingEntry &entry, 4116b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton VarSetOperationType op, 41176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice Error &err, 41186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice bool pending) 41196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 41206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (var_name == RunArgsVarName()) 41216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice UserSettingsController::UpdateStringArrayVariable (op, index_value, m_run_args, value, err); 41226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == EnvVarsVarName()) 4123638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 4124b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // This is nice for local debugging, but it is isn't correct for 4125b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // remote debugging. We need to stop process.env-vars from being 4126b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // populated with the host environment and add this as a launch option 4127b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // and get the correct environment from the Target's platform. 4128b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // GetHostEnvironmentIfNeeded (); 41296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice UserSettingsController::UpdateDictionaryVariable (op, index_value, m_env_vars, value, err); 4130638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton } 41316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == InputPathVarName()) 41326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice UserSettingsController::UpdateStringVariable (op, m_input_path, value, err); 41336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == OutputPathVarName()) 41346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice UserSettingsController::UpdateStringVariable (op, m_output_path, value, err); 41356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == ErrorPathVarName()) 41366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice UserSettingsController::UpdateStringVariable (op, m_error_path, value, err); 41376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == DisableASLRVarName()) 413817cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton UserSettingsController::UpdateBooleanVariable (op, m_disable_aslr, value, true, err); 4139bd666017403e102e0ca435d6da585ff979f83598Caroline Tice else if (var_name == DisableSTDIOVarName ()) 414017cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton UserSettingsController::UpdateBooleanVariable (op, m_disable_stdio, value, false, err); 41416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 41426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid 41446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings, 41456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice bool pending) 41466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 41476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (new_settings.get() == NULL) 41486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return; 41496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice ProcessInstanceSettings *new_process_settings = (ProcessInstanceSettings *) new_settings.get(); 41516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_run_args = new_process_settings->m_run_args; 41536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_env_vars = new_process_settings->m_env_vars; 41546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_input_path = new_process_settings->m_input_path; 41556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_output_path = new_process_settings->m_output_path; 41566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_error_path = new_process_settings->m_error_path; 41576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_disable_aslr = new_process_settings->m_disable_aslr; 4158bd666017403e102e0ca435d6da585ff979f83598Caroline Tice m_disable_stdio = new_process_settings->m_disable_stdio; 41596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 41606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4161bcb5b454767121980d937d2610ba762fdb575c45Caroline Ticebool 41626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry, 41636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString &var_name, 41645bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice StringList &value, 4165bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice Error *err) 41666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 41676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (var_name == RunArgsVarName()) 41686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 41696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (m_run_args.GetArgumentCount() > 0) 4170c14069e2764a57c55e60ea9406842858a509223cGreg Clayton { 41716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice for (int i = 0; i < m_run_args.GetArgumentCount(); ++i) 41726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString (m_run_args.GetArgumentAtIndex (i)); 4173c14069e2764a57c55e60ea9406842858a509223cGreg Clayton } 41746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 41756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == EnvVarsVarName()) 41766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 4177638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton GetHostEnvironmentIfNeeded (); 4178638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 41796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (m_env_vars.size() > 0) 41806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 41816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice std::map<std::string, std::string>::iterator pos; 41826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice for (pos = m_env_vars.begin(); pos != m_env_vars.end(); ++pos) 41836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 41846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice StreamString value_str; 41856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value_str.Printf ("%s=%s", pos->first.c_str(), pos->second.c_str()); 41866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString (value_str.GetData()); 41876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 41886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 41896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 41906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == InputPathVarName()) 41916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 41926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString (m_input_path.c_str()); 41936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 41946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == OutputPathVarName()) 41956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 41966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString (m_output_path.c_str()); 41976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 41986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == ErrorPathVarName()) 41996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 42006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString (m_error_path.c_str()); 42016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 4202a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton else if (var_name == InheritHostEnvVarName()) 4203a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton { 4204a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton if (m_inherit_host_env) 4205a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton value.AppendString ("true"); 4206a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton else 4207a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton value.AppendString ("false"); 4208a99b0bf8bd41541cc29eab76d23f90976ba0736aGreg Clayton } 42096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == DisableASLRVarName()) 42106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 42116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (m_disable_aslr) 42126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString ("true"); 42136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else 42146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString ("false"); 42156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 4216bd666017403e102e0ca435d6da585ff979f83598Caroline Tice else if (var_name == DisableSTDIOVarName()) 4217bd666017403e102e0ca435d6da585ff979f83598Caroline Tice { 4218bd666017403e102e0ca435d6da585ff979f83598Caroline Tice if (m_disable_stdio) 4219bd666017403e102e0ca435d6da585ff979f83598Caroline Tice value.AppendString ("true"); 4220bd666017403e102e0ca435d6da585ff979f83598Caroline Tice else 4221bd666017403e102e0ca435d6da585ff979f83598Caroline Tice value.AppendString ("false"); 4222bd666017403e102e0ca435d6da585ff979f83598Caroline Tice } 42236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else 4224bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice { 4225bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice if (err) 4226bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString()); 4227bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice return false; 4228bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice } 4229bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice return true; 42306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 42316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString 42336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::CreateInstanceName () 42346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 42356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static int instance_count = 1; 42366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice StreamString sstr; 42376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice sstr.Printf ("process_%d", instance_count); 42396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice ++instance_count; 42406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString ret_val (sstr.GetData()); 42426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return ret_val; 42436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 42446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 42466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::RunArgsVarName () 42476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 42486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static ConstString run_args_var_name ("run-args"); 42496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return run_args_var_name; 42516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 42526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 42546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::EnvVarsVarName () 42556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 42566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static ConstString env_vars_var_name ("env-vars"); 42576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return env_vars_var_name; 42596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 42606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 4262638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcessInstanceSettings::InheritHostEnvVarName () 4263638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton{ 4264638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton static ConstString g_name ("inherit-env"); 4265638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 4266638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton return g_name; 4267638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton} 4268638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 4269638351aee118e89c658ca295cb4e9d1db7849befGreg Claytonconst ConstString & 42706e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::InputPathVarName () 42716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 42726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static ConstString input_path_var_name ("input-path"); 42736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return input_path_var_name; 42756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 42766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 42786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::OutputPathVarName () 42796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 428087097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice static ConstString output_path_var_name ("output-path"); 42816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return output_path_var_name; 42836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 42846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 42866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::ErrorPathVarName () 42876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 428887097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice static ConstString error_path_var_name ("error-path"); 42896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return error_path_var_name; 42916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 42926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString & 42946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::DisableASLRVarName () 42956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 42966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static ConstString disable_aslr_var_name ("disable-aslr"); 42976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 42986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return disable_aslr_var_name; 42996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 43006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4301bd666017403e102e0ca435d6da585ff979f83598Caroline Ticeconst ConstString & 4302bd666017403e102e0ca435d6da585ff979f83598Caroline TiceProcessInstanceSettings::DisableSTDIOVarName () 4303bd666017403e102e0ca435d6da585ff979f83598Caroline Tice{ 4304bd666017403e102e0ca435d6da585ff979f83598Caroline Tice static ConstString disable_stdio_var_name ("disable-stdio"); 4305bd666017403e102e0ca435d6da585ff979f83598Caroline Tice 4306bd666017403e102e0ca435d6da585ff979f83598Caroline Tice return disable_stdio_var_name; 4307bd666017403e102e0ca435d6da585ff979f83598Caroline Tice} 43086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 43096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 4310d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// SettingsController Variable Tables 43116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 43126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 43136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry 4314d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::global_settings_table[] = 43156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 43166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice //{ "var-name", var-type , "default", enum-table, init'd, hidden, "help-text"}, 43176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } 43186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 43196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 43206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 43216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry 4322d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::instance_settings_table[] = 43236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4324638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton //{ "var-name", var-type, "default", enum-table, init'd, hidden, "help-text"}, 4325638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "run-args", eSetVarTypeArray, NULL, NULL, false, false, "A list containing all the arguments to be passed to the executable when it is run." }, 4326638351aee118e89c658ca295cb4e9d1db7849befGreg 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." }, 4327638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "inherit-env", eSetVarTypeBoolean, "true", NULL, false, false, "Inherit the environment from the process that is running LLDB." }, 4328de915beb5febe597505ba33fdc2c39eea2abdbd4Greg Clayton { "input-path", eSetVarTypeString, NULL, NULL, false, false, "The file/path to be used by the executable program for reading its input." }, 4329de915beb5febe597505ba33fdc2c39eea2abdbd4Greg Clayton { "output-path", eSetVarTypeString, NULL, NULL, false, false, "The file/path to be used by the executable program for writing its output." }, 4330de915beb5febe597505ba33fdc2c39eea2abdbd4Greg Clayton { "error-path", eSetVarTypeString, NULL, NULL, false, false, "The file/path to be used by the executable program for writings its error messages." }, 4331d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { "plugin", eSetVarTypeEnum, NULL, NULL, false, false, "The plugin to be used to run the process." }, 4332638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "disable-aslr", eSetVarTypeBoolean, "true", NULL, false, false, "Disable Address Space Layout Randomization (ASLR)" }, 4333638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { "disable-stdio", eSetVarTypeBoolean, "false", NULL, false, false, "Disable stdin/stdout for process (e.g. for a GUI application)" }, 4334638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { NULL, eSetVarTypeNone, NULL, NULL, false, false, NULL } 43356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 43366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 43376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 43387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 4339