Process.cpp revision d21d98b3cd51d9109631ad1605ee7f7dbac3cfbb
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" 39d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham#include "lldb/Target/ThreadPlanBase.h" 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 45b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::Dump (Stream &s, Platform *platform) const 4624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 4724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *cstr; 48ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_pid != LLDB_INVALID_PROCESS_ID) 49d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton s.Printf (" pid = %llu\n", m_pid); 50ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 51ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_parent_pid != LLDB_INVALID_PROCESS_ID) 52d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton s.Printf (" parent = %llu\n", m_parent_pid); 53ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 54ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_executable) 55ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 56ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" name = %s\n", m_executable.GetFilename().GetCString()); 57ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString (" file = "); 58ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton m_executable.Dump(&s); 59ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.EOL(); 60ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 61b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t argc = m_arguments.GetArgumentCount(); 62ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (argc > 0) 63ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 64ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton for (uint32_t i=0; i<argc; i++) 65ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 66b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *arg = m_arguments.GetArgumentAtIndex(i); 67ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (i < 10) 68b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" arg[%u] = %s\n", i, arg); 69ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 70b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("arg[%u] = %s\n", i, arg); 71ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 72ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 73b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 74b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t envc = m_environment.GetArgumentCount(); 75b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (envc > 0) 76b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 77b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton for (uint32_t i=0; i<envc; i++) 78b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 79b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *env = m_environment.GetArgumentAtIndex(i); 80b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (i < 10) 81b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" env[%u] = %s\n", i, env); 82b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 83b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("env[%u] = %s\n", i, env); 84b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 85b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 86b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 87ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_arch.IsValid()) 88ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" arch = %s\n", m_arch.GetTriple().str().c_str()); 89ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 90b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_uid != UINT32_MAX) 9124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 92b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_uid); 93b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" uid = %-5u (%s)\n", m_uid, cstr ? cstr : ""); 9424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 95b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_gid != UINT32_MAX) 9624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 97b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_gid); 98b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" gid = %-5u (%s)\n", m_gid, cstr ? cstr : ""); 9924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 100b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_euid != UINT32_MAX) 10124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 102b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_euid); 103b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" euid = %-5u (%s)\n", m_euid, cstr ? cstr : ""); 10424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 105b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_egid != UINT32_MAX) 10624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 107b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_egid); 108b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" egid = %-5u (%s)\n", m_egid, cstr ? cstr : ""); 10924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 11024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 11124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 11224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 113b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose) 11424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 115b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *label; 116b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (show_args || verbose) 117b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton label = "ARGUMENTS"; 118b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 119b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton label = "NAME"; 120b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 121ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (verbose) 122ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 123b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE %s\n", label); 124ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString ("====== ====== ========== ========== ========== ========== ======================== ============================\n"); 125ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 126ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 127ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 128b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("PID PARENT USER ARCH %s\n", label); 129ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString ("====== ====== ========== ======= ============================\n"); 130ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 13124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 13224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 13324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 134b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const 13524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 13624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_pid != LLDB_INVALID_PROCESS_ID) 13724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 13824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *cstr; 139d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton s.Printf ("%-6llu %-6llu ", m_pid, m_parent_pid); 14024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 14124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 142ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (verbose) 143ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 144b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_uid); 145ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 146ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 147ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 148b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_uid); 14924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 150b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_gid); 151ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 152ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 153ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 154b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_gid); 155ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 156b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_euid); 157ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 158ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 159ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 160b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_euid); 161ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 162b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_egid); 163ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 164ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 165ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 166b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_egid); 167ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-24s ", m_arch.IsValid() ? m_arch.GetTriple().str().c_str() : ""); 168ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 16924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 170ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 1717e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda s.Printf ("%-10s %-7d %s ", 172b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton platform->GetUserName (m_euid), 173ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton (int)m_arch.GetTriple().getArchName().size(), 174ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton m_arch.GetTriple().getArchName().data()); 175ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 176ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 177b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (verbose || show_args) 178ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 179b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t argc = m_arguments.GetArgumentCount(); 180ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (argc > 0) 181ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 182ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton for (uint32_t i=0; i<argc; i++) 183ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 184ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (i > 0) 185ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutChar (' '); 186b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.PutCString (m_arguments.GetArgumentAtIndex(i)); 187ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 188ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 189ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 19024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 191ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 192ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString (GetName()); 193ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 19424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 195ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.EOL(); 19624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 19724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 19824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 199b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 200b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonvoid 20136bc5ea5a48c19421d44f559e2165c105657b809Greg ClaytonProcessInfo::SetArguments (char const **argv, 20236bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton bool first_arg_is_executable, 20336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton bool first_arg_is_executable_and_argument) 20436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton{ 20536bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton m_arguments.SetArguments (argv); 20636bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton 20736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // Is the first argument the executable? 20836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton if (first_arg_is_executable) 20936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton { 21036bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton const char *first_arg = m_arguments.GetArgumentAtIndex (0); 21136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton if (first_arg) 21236bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton { 21336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // Yes the first argument is an executable, set it as the executable 21436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // in the launch options. Don't resolve the file path as the path 21536bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // could be a remote platform path 21636bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton const bool resolve = false; 21736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton m_executable.SetFile(first_arg, resolve); 21836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton 21936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // If argument zero is an executable and shouldn't be included 22036bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // in the arguments, remove it from the front of the arguments 22136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton if (first_arg_is_executable_and_argument == false) 22236bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton m_arguments.DeleteArgumentAtIndex (0); 22336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton } 22436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton } 22536bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton} 22636bc5ea5a48c19421d44f559e2165c105657b809Greg Claytonvoid 22736bc5ea5a48c19421d44f559e2165c105657b809Greg ClaytonProcessInfo::SetArguments (const Args& args, 22836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton bool first_arg_is_executable, 22936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton bool first_arg_is_executable_and_argument) 230b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 231b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Copy all arguments 232b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arguments = args; 233b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 234b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Is the first argument the executable? 235b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (first_arg_is_executable) 236b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 23736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton const char *first_arg = m_arguments.GetArgumentAtIndex (0); 238b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (first_arg) 239b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 240b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Yes the first argument is an executable, set it as the executable 241b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // in the launch options. Don't resolve the file path as the path 242b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // could be a remote platform path 243b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const bool resolve = false; 244b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_executable.SetFile(first_arg, resolve); 245b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 246b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // If argument zero is an executable and shouldn't be included 247b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // in the arguments, remove it from the front of the arguments 248b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (first_arg_is_executable_and_argument == false) 249b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arguments.DeleteArgumentAtIndex (0); 250b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 251b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 252b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 253b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 254abb3302051246273eb92cca203c9a1b9d9736e05Greg Claytonvoid 255464c6161464694412b7472129e789248f1cf21b9Greg ClaytonProcessLaunchInfo::FinalizeFileActions (Target *target, bool default_to_use_pty) 256abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton{ 257abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // If notthing was specified, then check the process for any default 258abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // settings that were set with "settings set" 259abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (m_file_actions.empty()) 260abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 261abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (m_flags.Test(eLaunchFlagDisableSTDIO)) 262abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 26395ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton AppendSuppressFileAction (STDIN_FILENO , true, false); 26495ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton AppendSuppressFileAction (STDOUT_FILENO, false, true); 26595ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton AppendSuppressFileAction (STDERR_FILENO, false, true); 266abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 267abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton else 268abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 269abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // Check for any values that might have gotten set with any of: 270abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // (lldb) settings set target.input-path 271abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // (lldb) settings set target.output-path 272abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // (lldb) settings set target.error-path 273464c6161464694412b7472129e789248f1cf21b9Greg Clayton const char *in_path = NULL; 274464c6161464694412b7472129e789248f1cf21b9Greg Clayton const char *out_path = NULL; 275464c6161464694412b7472129e789248f1cf21b9Greg Clayton const char *err_path = NULL; 276abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (target) 277abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 27895ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton in_path = target->GetStandardInputPath(); 27995ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton out_path = target->GetStandardOutputPath(); 28095ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton err_path = target->GetStandardErrorPath(); 281464c6161464694412b7472129e789248f1cf21b9Greg Clayton } 282464c6161464694412b7472129e789248f1cf21b9Greg Clayton 283464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (default_to_use_pty && (!in_path && !out_path && !err_path)) 284464c6161464694412b7472129e789248f1cf21b9Greg Clayton { 285464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (m_pty.OpenFirstAvailableMaster (O_RDWR|O_NOCTTY, NULL, 0)) 286abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 287464c6161464694412b7472129e789248f1cf21b9Greg Clayton in_path = out_path = err_path = m_pty.GetSlaveName (NULL, 0); 288abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 289abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 290abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 291464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (in_path) 29295ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton AppendOpenFileAction(STDIN_FILENO, in_path, true, false); 29395ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton 294464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (out_path) 29595ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton AppendOpenFileAction(STDOUT_FILENO, out_path, false, true); 296464c6161464694412b7472129e789248f1cf21b9Greg Clayton 297464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (err_path) 29895ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton AppendOpenFileAction(STDERR_FILENO, err_path, false, true); 29995ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton 300abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 301abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 302abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton} 303abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 304527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 305527154d8e532f27f25af226c9e1dac607c48b5d1Greg Claytonbool 30697471184b8823c949bc68bbf54ea3edf3845a750Greg ClaytonProcessLaunchInfo::ConvertArgumentsForLaunchingInShell (Error &error, bool localhost) 30797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton{ 30897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton error.Clear(); 30997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 310527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (GetFlags().Test (eLaunchFlagLaunchInShell)) 311527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 312527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const char *shell_executable = GetShell(); 313527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (shell_executable) 314527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 315527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton char shell_resolved_path[PATH_MAX]; 316527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 317527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (localhost) 318527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 319527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton FileSpec shell_filespec (shell_executable, true); 320527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 321527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (!shell_filespec.Exists()) 322527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 323527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // Resolve the path in case we just got "bash", "sh" or "tcsh" 324527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (!shell_filespec.ResolveExecutableLocation ()) 325527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 326527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorStringWithFormat("invalid shell path '%s'", shell_executable); 327527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return false; 328527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 329527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 330527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_filespec.GetPath (shell_resolved_path, sizeof(shell_resolved_path)); 331527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_executable = shell_resolved_path; 332527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 333527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 334527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton Args shell_arguments; 335527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton std::string safe_arg; 336527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_arguments.AppendArgument (shell_executable); 337527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton StreamString shell_command; 338527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_arguments.AppendArgument ("-c"); 339527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_command.PutCString ("exec"); 340527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (GetArchitecture().IsValid()) 34197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 34297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton shell_command.Printf(" /usr/bin/arch -arch %s", GetArchitecture().GetArchitectureName()); 34397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // Set the resume count to 2: 344527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // 1 - stop in shell 34597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // 2 - stop in /usr/bin/arch 34697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // 3 - then we will stop in our program 34797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton SetResumeCount(2); 34897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 34997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton else 35097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 35197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // Set the resume count to 1: 35297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // 1 - stop in shell 35397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // 2 - then we will stop in our program 35497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton SetResumeCount(1); 35597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 35697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 35797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const char **argv = GetArguments().GetConstArgumentVector (); 35897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (argv) 35997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 36097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton for (size_t i=0; argv[i] != NULL; ++i) 36197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 362527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const char *arg = Args::GetShellSafeArgument (argv[i], safe_arg); 363527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_command.Printf(" %s", arg); 364527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 365527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 366527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_arguments.AppendArgument (shell_command.GetString().c_str()); 36797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 368527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_executable.SetFile(shell_executable, false); 36997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton m_arguments = shell_arguments; 37097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton return true; 37197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 37297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton else 37397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 37497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton error.SetErrorString ("invalid shell path"); 37597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 37697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 37797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton else 37897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 37997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton error.SetErrorString ("not launching in shell"); 38097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 38197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton return false; 382527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton} 38397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 384527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 38597471184b8823c949bc68bbf54ea3edf3845a750Greg Claytonbool 38697471184b8823c949bc68bbf54ea3edf3845a750Greg ClaytonProcessLaunchInfo::FileAction::Open (int fd, const char *path, bool read, bool write) 38797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton{ 38897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if ((read || write) && fd >= 0 && path && path[0]) 38997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 390527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_action = eFileActionOpen; 391527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_fd = fd; 392527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (read && write) 393527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_arg = O_NOCTTY | O_CREAT | O_RDWR; 394527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else if (read) 395527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_arg = O_NOCTTY | O_RDONLY; 396527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 397527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_arg = O_NOCTTY | O_CREAT | O_WRONLY; 398527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_path.assign (path); 399527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return true; 400527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 401527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 402527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 403527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton Clear(); 404527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 405527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return false; 406527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton} 407b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 408b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 409b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Close (int fd) 410b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 411b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 412b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (fd >= 0) 413b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 414b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionClose; 415527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_fd = fd; 416b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 417527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return m_fd >= 0; 418b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 419527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 420b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 421b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 422b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Duplicate (int fd, int dup_fd) 423b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 424b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 425b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (fd >= 0 && dup_fd >= 0) 426b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 427b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionDuplicate; 428b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 429b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arg = dup_fd; 43024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 431b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return m_fd >= 0; 432b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 433b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 434b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 435b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 436b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 437b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::AddPosixSpawnFileAction (posix_spawn_file_actions_t *file_actions, 438b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const FileAction *info, 439b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Log *log, 440b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error& error) 441b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 442b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info == NULL) 443b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return false; 444b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 445b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton switch (info->m_action) 446b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 447b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionNone: 448b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.Clear(); 449b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 450b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 451b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionClose: 452b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 453b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd for posix_spawn_file_actions_addclose(...)"); 454b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 455b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 456b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_addclose (file_actions, info->m_fd), 457b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 458b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log && (error.Fail() || log)) 459b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, "posix_spawn_file_actions_addclose (action=%p, fd=%i)", 460b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd); 461b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 462b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 463b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 464b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionDuplicate: 465b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 466b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd for posix_spawn_file_actions_adddup2(...)"); 467b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else if (info->m_arg == -1) 468b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid duplicate fd for posix_spawn_file_actions_adddup2(...)"); 469b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 470b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 471b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_adddup2 (file_actions, info->m_fd, info->m_arg), 472b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 473b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log && (error.Fail() || log)) 474b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, "posix_spawn_file_actions_adddup2 (action=%p, fd=%i, dup_fd=%i)", 475b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd, info->m_arg); 476b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 477b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 478b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 479b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionOpen: 480b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 481b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd in posix_spawn_file_actions_addopen(...)"); 482b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 483b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 484b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton int oflag = info->m_arg; 485b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 486b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton mode_t mode = 0; 487b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 488b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (oflag & O_CREAT) 489b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton mode = 0640; 490b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 491b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_addopen (file_actions, 492b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton info->m_fd, 493b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton info->m_path.c_str(), 494b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton oflag, 495b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton mode), 496b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 497b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (error.Fail() || log) 498b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, 499b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton "posix_spawn_file_actions_addopen (action=%p, fd=%i, path='%s', oflag=%i, mode=%i)", 500b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd, info->m_path.c_str(), oflag, mode); 501b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 502b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 503b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 504b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton default: 505b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorStringWithFormat ("invalid file action: %i", info->m_action); 506b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 507527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 508b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error.Success(); 509b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 510527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 511527154d8e532f27f25af226c9e1dac607c48b5d1Greg ClaytonError 512527154d8e532f27f25af226c9e1dac607c48b5d1Greg ClaytonProcessLaunchCommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg) 513b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 514b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 515b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton char short_option = (char) m_getopt_table[option_idx].val; 516b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 517b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton switch (short_option) 518b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 519b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 's': // Stop at program entry point 520b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagStopAtEntry); 521b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 522b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 523b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'i': // STDIN for read only 524b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 525b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 526b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open (STDIN_FILENO, option_arg, true, false)) 527b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 528b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 529b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 530b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 531b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'o': // Open STDOUT for write only 532b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 533b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 534143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton if (action.Open (STDOUT_FILENO, option_arg, false, true)) 535b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 536b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 537b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 538b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 539b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'e': // STDERR for write only 540b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 541b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 542b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open (STDERR_FILENO, option_arg, false, true)) 543b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 544b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 54595ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton break; 546b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 547b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 54895ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton case 'p': // Process plug-in name 549b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.SetProcessPluginName (option_arg); 550b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 551b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 552b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'n': // Disable STDIO 55395ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton { 554b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 555b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open (STDIN_FILENO, "/dev/null", true, false)) 55695ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton launch_info.AppendFileAction (action); 557b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open (STDOUT_FILENO, "/dev/null", false, true)) 558b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 559b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open (STDERR_FILENO, "/dev/null", false, true)) 56095ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton launch_info.AppendFileAction (action); 56195ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton } 562b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 563b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 56495ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton case 'w': 565b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.SetWorkingDirectory (option_arg); 566b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 567b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 568b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 't': // Open process in new terminal window 56995ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY); 570b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 571b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 572b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'a': 573b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetArchitecture().SetTriple (option_arg, 574b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_interpreter.GetPlatform(true).get()); 575b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 576b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 57795ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton case 'A': 578b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagDisableASLR); 57995ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton break; 580b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 58195ec1688db0efe51509ad9356052f5004d8856e0Greg Clayton case 'c': 582b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (option_arg && option_arg[0]) 583b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.SetShell (option_arg); 584b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 585b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.SetShell ("/bin/bash"); 586b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 587b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 588b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'v': 589b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetEnvironmentEntries().AppendArgument(option_arg); 590b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 591b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 592b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton default: 593b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorStringWithFormat("unrecognized short option character '%c'", short_option); 594b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 595b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 596b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 597b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error; 598b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 599b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 600b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonOptionDefinition 601b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchCommandOptions::g_option_table[] = 602b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 60336bc5ea5a48c19421d44f559e2165c105657b809Greg 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."}, 604527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton{ LLDB_OPT_SET_ALL, false, "disable-aslr", 'A', no_argument, NULL, 0, eArgTypeNone, "Disable address space layout randomization when launching a process."}, 605527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton{ LLDB_OPT_SET_ALL, false, "plugin", 'p', required_argument, NULL, 0, eArgTypePlugin, "Name of the process plugin you want to use."}, 606527154d8e532f27f25af226c9e1dac607c48b5d1Greg 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."}, 607527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton{ LLDB_OPT_SET_ALL, false, "arch", 'a', required_argument, NULL, 0, eArgTypeArchitecture, "Set the architecture for the process to launch when ambiguous."}, 60836bc5ea5a48c19421d44f559e2165c105657b809Greg 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."}, 60936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton{ LLDB_OPT_SET_ALL, false, "shell", 'c', optional_argument, NULL, 0, eArgTypePath, "Run the process in a shell (not supported on all platforms)."}, 610b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 611b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1 , false, "stdin", 'i', required_argument, NULL, 0, eArgTypePath, "Redirect stdin for the process to <path>."}, 612b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1 , false, "stdout", 'o', required_argument, NULL, 0, eArgTypePath, "Redirect stdout for the process to <path>."}, 613b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1 , false, "stderr", 'e', required_argument, NULL, 0, eArgTypePath, "Redirect stderr for the process to <path>."}, 614b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 6159c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton{ LLDB_OPT_SET_2 , false, "tty", 't', no_argument, NULL, 0, eArgTypeNone, "Start the process in a terminal (not supported on all platforms)."}, 616b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 617b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg 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."}, 618b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 619b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 0 , false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 620b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}; 621b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 622b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 623b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 624b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 625b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::NameMatches (const char *process_name) const 626b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 627b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_name_match_type == eNameMatchIgnore || process_name == NULL) 628b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return true; 629b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *match_name = m_match_info.GetName(); 630b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (!match_name) 631527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return true; 632b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 633b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return lldb_private::NameMatches (process_name, m_name_match_type, match_name); 634b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 635b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 636b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 637b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::Matches (const ProcessInstanceInfo &proc_info) const 638b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 639b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (!NameMatches (proc_info.GetName())) 640b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return false; 641b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 642b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.ProcessIDIsValid() && 643b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_match_info.GetProcessID() != proc_info.GetProcessID()) 644b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return false; 645b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 646b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.ParentProcessIDIsValid() && 647b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_match_info.GetParentProcessID() != proc_info.GetParentProcessID()) 64824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 64924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 65024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.UserIDIsValid () && 65124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetUserID() != proc_info.GetUserID()) 65224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 65324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 65424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.GroupIDIsValid () && 65524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetGroupID() != proc_info.GetGroupID()) 65624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 65724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 65824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveUserIDIsValid () && 659b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID()) 66024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 66124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 66224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveGroupIDIsValid () && 66324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID()) 66424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 66524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 66624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.GetArchitecture().IsValid() && 66724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetArchitecture() != proc_info.GetArchitecture()) 66824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 66924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 67024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 67124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 672b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 673b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::MatchAllProcesses () const 67424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 67524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name_match_type != eNameMatchIgnore) 676b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return false; 677b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 67824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ProcessIDIsValid()) 67924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 68024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 68124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ParentProcessIDIsValid()) 68224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 68324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 68424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.UserIDIsValid ()) 68524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 68624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 68724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.GroupIDIsValid ()) 68824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 68924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 69024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveUserIDIsValid ()) 69124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 69224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 69324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveGroupIDIsValid ()) 69424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 695b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 69624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.GetArchitecture().IsValid()) 69724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 69824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 69924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_all_users) 70024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 70124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 70224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 70324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 70424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 70524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 706b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonvoid 70724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonProcessInstanceInfoMatch::Clear() 70824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 709b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_match_info.Clear(); 71024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_name_match_type = eNameMatchIgnore; 71124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_all_users = false; 71224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 71324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 71424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonProcessSP 71524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonProcess::FindPlugin (Target &target, const char *plugin_name, Listener &listener, const FileSpec *crash_file_path) 71624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 71724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ProcessSP process_sp; 71824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ProcessCreateInstance create_callback = NULL; 71924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (plugin_name) 72024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 72124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton create_callback = PluginManager::GetProcessCreateCallbackForPluginName (plugin_name); 72224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (create_callback) 72324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 72424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton process_sp = create_callback(target, listener, crash_file_path); 72524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (process_sp) 72624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 72724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (!process_sp->CanDebug(target, true)) 72824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton process_sp.reset(); 729b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 73024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 73124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 73224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 73324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 73424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx) 735fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton { 73646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton process_sp = create_callback(target, listener, crash_file_path); 73746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (process_sp) 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 73946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (!process_sp->CanDebug(target, false)) 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process_sp.reset(); 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return process_sp; 74746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 74846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 74946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonConstString & 75046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcess::GetStaticBroadcasterClass () 75146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString class_name ("lldb.process"); 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return class_name; 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton//---------------------------------------------------------------------- 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process constructor 75846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 75946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcess::Process(Target &target, Listener &listener) : 76046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton UserID (LLDB_INVALID_PROCESS_ID), 76146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Broadcaster (&(target.GetDebugger()), "lldb.process"), 76246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ProcessInstanceSettings (GetSettingsController()), 76346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_target (target), 76446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_public_state (eStateUnloaded), 76546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_private_state (eStateUnloaded), 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_broadcaster (NULL, "lldb.process.internal_state_broadcaster"), 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_broadcaster (NULL, "lldb.process.internal_state_control_broadcaster"), 76846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_private_state_listener ("lldb.process.internal_state_listener"), 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait(), 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_thread (LLDB_INVALID_HOST_THREAD), 7715a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_mod_id (), 7725a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_thread_index_id (0), 7735a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_exit_status (-1), 7745a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_exit_string (), 7755a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_thread_list (this), 7765a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_notifications (), 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_image_tokens (), 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_listener (listener), 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list (), 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_dynamic_checkers_ap (), 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_unix_signals (), 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp (), 7835a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_process_input_reader (), 784334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton m_stdio_communication ("process.stdio"), 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stdio_communication_mutex (Mutex::eMutexTypeRecursive), 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stdout_data (), 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stderr_data (), 7885a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_memory_cache (*this), 7895a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_allocated_memory_cache (*this), 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_should_detach (false), 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_next_event_action_ap(), 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_run_lock (), 79321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_can_jit(eCanJITDontKnow) 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UpdateInstanceName(); 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CheckInWithManager (); 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 80020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (log) 80120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton log->Printf ("%p Process::Process()", this); 80220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 803861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice SetEventName (eBroadcastBitStateChanged, "state-changed"); 80420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton SetEventName (eBroadcastBitInterrupt, "interrupt"); 805861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice SetEventName (eBroadcastBitSTDOUT, "stdout-available"); 806a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton SetEventName (eBroadcastBitSTDERR, "stderr-available"); 80720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 808fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton listener.StartListeningForEvents (this, 809bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton eBroadcastBitStateChanged | 810613b8739a4d489b7f1c571288d5786768c024205Greg Clayton eBroadcastBitInterrupt | 811613b8739a4d489b7f1c571288d5786768c024205Greg Clayton eBroadcastBitSTDOUT | 812ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton eBroadcastBitSTDERR); 8136cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan 814ce96dad5ccafe2cb3899c4dd2d724ccacb4c2e46Bill Wendling m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster, 815ce96dad5ccafe2cb3899c4dd2d724ccacb4c2e46Bill Wendling eBroadcastBitStateChanged); 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8171ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster, 8185a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham eBroadcastInternalStateControlStop | 8195a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham eBroadcastInternalStateControlPause | 8201ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice eBroadcastInternalStateControlResume); 821e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton} 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 82549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton//---------------------------------------------------------------------- 82649ce682dfa7993d31206cea19ce7006cd3f3077eGreg ClaytonProcess::~Process() 82749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton{ 82849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 82949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton if (log) 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Process::~Process()", this); 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Finalize() 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (GetPrivateState()) 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateConnected: 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateAttaching: 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateLaunching: 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStopped: 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateCrashed: 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateSuspended: 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetShouldDetach()) 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Detach(); 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 850e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton Destroy(); 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateInvalid: 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateUnloaded: 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateDetached: 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateExited: 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 859ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton 860ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // Clear our broadcaster before we proceed with destroying 861ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton Broadcaster::Clear(); 862ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton 863ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // Do any cleanup needed prior to being destructed... Subclasses 864ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // that override this method should call this superclass method as well. 865ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton 866ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // We need to destroy the loader before the derived Process class gets destroyed 867ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // since it is very likely that undoing the loader will require access to the real process. 868ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_dynamic_checkers_ap.reset(); 869ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_abi_sp.reset(); 870ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_os_ap.reset(); 871ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_dyld_ap.reset(); 872ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_thread_list.Destroy(); 873ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton std::vector<Notifications> empty_notifications; 874ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_notifications.swap(empty_notifications); 875ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_image_tokens.clear(); 876ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_memory_cache.Clear(); 877ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_allocated_memory_cache.Clear(); 878ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_language_runtimes.clear(); 879ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_next_event_action_ap.reset(); 880ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton} 881ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton 8822f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Claytonvoid 8832f57db09a49f2a05a620b8163bbe1e748a46ec73Greg ClaytonProcess::RegisterNotificationCallbacks (const Notifications& callbacks) 8842f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton{ 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications.push_back(callbacks); 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (callbacks.initialize != NULL) 88788fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham callbacks.initialize (callbacks.baton, this); 88888fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham} 88988fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham 890182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Claytonbool 891182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg ClaytonProcess::UnregisterNotificationCallbacks(const Notifications& callbacks) 89237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{ 893182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton std::vector<Notifications>::iterator pos, end = m_notifications.end(); 89413d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton for (pos = m_notifications.begin(); pos != end; ++pos) 895182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton { 896182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton if (pos->baton == callbacks.baton && 897182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton pos->initialize == callbacks.initialize && 898182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton pos->process_state_changed == callbacks.process_state_changed) 899182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton { 900182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_notifications.erase(pos); 901182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton return true; 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SynchronouslyNotifyStateChanged (StateType state) 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end(); 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos) 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (notification_pos->process_state_changed) 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner notification_pos->process_state_changed (notification_pos->baton, this, state); 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: We need to do some work on events before the general Listener sees them. 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// For instance if we are continuing from a breakpoint, we need to ensure that we do 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the little "insert real insn, step & stop" trick. But we can't do that when the 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// event is delivered by the broadcaster - since that is done on the thread that is 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// waiting for new events, so if we needed more than one event for our handling, we would 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// stall. So instead we do it when we fetch the event off of the queue. 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextEvent (EventSP &event_sp) 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp) 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent (event_sp.get()); 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessToStop (const TimeValue *timeout) 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We can't just wait for a "stopped" event, because the stopped event may have restarted the target. 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have to actually check each event, and in the case of a stopped event check the restarted flag 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // on the event. 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = GetState(); 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we are exited or detached, we won't ever get back to any 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // other valid state... 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state == eStateDetached || state == eStateExited) 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (state != eStateInvalid) 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = WaitForStateChangedEvents (timeout, event_sp); 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (state) 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateCrashed: 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateDetached: 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateExited: 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateUnloaded: 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStopped: 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get())) 96321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham continue; 96421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else 96521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 96621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham default: 96721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham continue; 96821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 96921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 97021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 97121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham} 97221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 97321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 97421f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamStateType 97521f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamProcess::WaitForState 97621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham( 97721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham const TimeValue *timeout, 97821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham const StateType *match_states, const uint32_t num_match_states 97921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham) 98021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham{ 98121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham EventSP event_sp; 98221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham uint32_t i; 98321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham StateType state = GetState(); 98421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham while (state != eStateInvalid) 98521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 98621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // If we are exited or detached, we won't ever get back to any 98721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // other valid state... 98821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (state == eStateDetached || state == eStateExited) 98921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 99021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 99121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham state = WaitForStateChangedEvents (timeout, event_sp); 99221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_match_states; ++i) 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_states[i] == state) 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::HijackProcessEvents (Listener *listener) 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1005d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton if (listener != NULL) 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return HijackBroadcaster(listener, eBroadcastBitStateChanged); 1008d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton } 1009d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton else 1010d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton return false; 1011d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton} 1012d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RestoreProcessEvents () 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RestoreBroadcaster(); 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::HijackPrivateProcessEvents (Listener *listener) 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (listener != NULL) 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 102463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return m_private_state_broadcaster.HijackBroadcaster(listener, eBroadcastBitStateChanged); 102563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham } 102663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham else 102763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return false; 102863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 102963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 103063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghamvoid 103163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::RestorePrivateProcessEvents () 103263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 103363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham m_private_state_broadcaster.RestoreBroadcaster(); 103463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 103563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 103663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamStateType 103763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp) 103863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 103963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 104063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 1041f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 1042f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 1043f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 1044f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StateType state = eStateInvalid; 1045f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (m_listener.WaitForEventForBroadcasterWithType (timeout, 1046f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham this, 1047f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham eBroadcastBitStateChanged, 1048f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_sp)) 1049f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 1050f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 1051f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 1052f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::%s (timeout = %p, event_sp) => %s", 1053f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham __FUNCTION__, 1054f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham timeout, 1055f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StateAsCString(state)); 1056f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return state; 1057f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham} 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent * 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PeekAtStateChangedEvents () 1061e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton{ 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s...", __FUNCTION__); 106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106736f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton Event *event_ptr; 106836f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this, 106936f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton eBroadcastBitStateChanged); 107036f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton if (log) 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_ptr) 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (event_ptr) => %s", 107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__, 107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr))); 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s no events found", 108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__); 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1084e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton return event_ptr; 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp) 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 109036f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 109136f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_private_state_listener.WaitForEventForBroadcasterWithType (timeout, 109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner &m_private_state_broadcaster, 109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitStateChanged, 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner event_sp)) 110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a bit of a hack, but when we wait here we could very well return 110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to the command-line, and that could disable the log, which would render the 110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // log we got above invalid. 110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state == eStateInvalid) 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp) => TIMEOUT", __FUNCTION__, timeout); 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state)); 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1112e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton return state; 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only) 111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 111872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 111972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 112072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (log) 112172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (control_only) 112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp); 112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_listener.WaitForEvent(timeout, event_sp); 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 112872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 112972e1c782ba1e4226da37af4722af608de9f39408Greg Claytonbool 113072e1c782ba1e4226da37af4722af608de9f39408Greg ClaytonProcess::IsRunning () const 113172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton{ 113272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton return StateIsRunningState (m_public_state.GetValue()); 113372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton} 113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitStatus () 113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateExited) 113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_exit_status; 1140e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton return -1; 114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitDescription () 114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty()) 114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_exit_string.c_str(); 114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetExitStatus (int status, const char *cstr) 115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetExitStatus (status=%i (0x%8.8x), description=%s%s%s)", 115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner status, status, 115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cstr ? "\"" : "", 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cstr ? cstr : "NULL", 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cstr ? "\"" : ""); 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We were already in the exited state 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_private_state.GetValue() == eStateExited) 1165638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetExitStatus () ignoring exit status because state was already set to eStateExited"); 116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_status = status; 117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cstr) 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_string = cstr; 117472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton else 117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_string.clear(); 117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton DidExit (); 117868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton 117968ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton SetPrivateState (eStateExited); 118068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton return true; 118168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton} 118268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton 118368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton// This static callback can be used to watch for local child processes on 118468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton// the current host. The the child process exits, the process will be 118572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton// found in the global target list (we want to be completely sure that the 118672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton// lldb_private::Process doesn't go away before we can deliver the signal. 118768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Claytonbool 1188644ddfbc1b36eabdb93c5acb150f9a77a92ee1fdGreg ClaytonProcess::SetProcessExitStatus (void *callback_baton, 1189644ddfbc1b36eabdb93c5acb150f9a77a92ee1fdGreg Clayton lldb::pid_t pid, 119072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton bool exited, 119168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton int signo, // Zero for no signal 119272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton int exit_status // Exit value of process if signal is zero 119372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton) 119472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton{ 119572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS)); 119672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (log) 119772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton log->Printf ("Process::SetProcessExitStatus (baton=%p, pid=%llu, exited=%i, signal=%i, exit_status=%i)\n", 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner callback_baton, 119972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton pid, 120058e844b3561848e73e69d6d98746d4851e78306eGreg Clayton exited, 120172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton signo, 120272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton exit_status); 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exited) 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TargetSP target_sp(Debugger::FindTargetWithProcessID (pid)); 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_sp) 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp (target_sp->GetProcessSP()); 12101c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton if (process_sp) 12111c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton { 12121c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton const char *signal_cstr = NULL; 12131c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton if (signo) 12141c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo); 121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process_sp->SetExitStatus (exit_status, signal_cstr); 12171c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton } 12181c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton } 1219d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton return true; 12201c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton } 12211c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton return false; 12221c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton} 12231c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 12241c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 12251c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Claytonvoid 12261c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonProcess::UpdateThreadListIfNeeded () 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 122863094e0bb161580564954dee512955c1c79d3476Greg Clayton const uint32_t stop_id = GetStopID(); 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID()) 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType state = GetPrivateState(); 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (StateIsStoppedState (state, true)) 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_thread_list.GetMutex ()); 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // m_thread_list does have its own mutex, but we need to 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // hold onto the mutex between the call to UpdateThreadList(...) 123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and the os->UpdateThreadList(...) so it doesn't change on us 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadList new_thread_list(this); 123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Always update the thread list with the protocol specific 124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // thread list, but only update if "true" is returned 124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (UpdateThreadList (m_thread_list, new_thread_list)) 124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner OperatingSystem *os = GetOperatingSystem (); 124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (os) 124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner os->UpdateThreadList (m_thread_list, new_thread_list); 124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_list.Update (new_thread_list); 124737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_thread_list.SetStopID (stop_id); 124837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 124937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 125037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 125137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton} 125237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton 1253202060806d75f812b56a3cfa70d85fff536e5c2fGreg Claytonuint32_t 1254202060806d75f812b56a3cfa70d85fff536e5c2fGreg ClaytonProcess::GetNextThreadIndexID () 1255202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton{ 1256202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton return ++m_thread_index_id; 1257ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton} 1258ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton 1259ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg ClaytonStateType 1260202060806d75f812b56a3cfa70d85fff536e5c2fGreg ClaytonProcess::GetState() 1261202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton{ 1262ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton // If any other threads access this we will need a mutex for it 1263ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton return m_public_state.GetValue (); 1264ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton} 1265ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton 1266ae932359b80098532f3c3766fa9e6527352fbb67Greg Claytonvoid 1267ae932359b80098532f3c3766fa9e6527352fbb67Greg ClaytonProcess::SetPublicState (StateType new_state) 1268ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton{ 1269ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 1270ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton if (log) 1271202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton log->Printf("Process::SetPublicState (%s)", StateAsCString(new_state)); 127237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton const StateType old_state = m_public_state.GetValue(); 127337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_public_state.SetValue (new_state); 127437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (!IsHijackedForEvent(eBroadcastBitStateChanged)) 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const bool old_state_is_stopped = StateIsStoppedState(old_state, false); 127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const bool new_state_is_stopped = StateIsStoppedState(new_state, false); 127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (old_state_is_stopped != new_state_is_stopped) 127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (new_state_is_stopped) 128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPublicState (%s) -- unlocking run lock", StateAsCString(new_state)); 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_run_lock.WriteUnlock(); 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPublicState (%s) -- locking run lock", StateAsCString(new_state)); 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_run_lock.WriteLock(); 129168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton } 129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1294a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton} 129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1296a894fe78bc15344a0025c1154e414c554ab31dd9Greg ClaytonStateType 1297a894fe78bc15344a0025c1154e414c554ab31dd9Greg ClaytonProcess::GetPrivateState () 1298a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton{ 1299a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton return m_private_state.GetValue(); 1300a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton} 1301a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton 1302a894fe78bc15344a0025c1154e414c554ab31dd9Greg Claytonvoid 1303a894fe78bc15344a0025c1154e414c554ab31dd9Greg ClaytonProcess::SetPrivateState (StateType new_state) 1304a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton{ 1305a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 1306a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton bool state_changed = false; 1307a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton 1308a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton if (log) 1309a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state)); 1310a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton 1311a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton Mutex::Locker locker(m_private_state.GetMutex()); 1312a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton 1313a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton const StateType old_state = m_private_state.GetValueNoLock (); 1314a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton state_changed = old_state != new_state; 1315a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton // This code is left commented out in case we ever need to control 131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the private process state with another run lock. Right now it doesn't 131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // seem like we need to do this, but if we ever do, we can uncomment and 131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // use this code. 131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const bool old_state_is_stopped = StateIsStoppedState(old_state, false); 132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const bool new_state_is_stopped = StateIsStoppedState(new_state, false); 132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (old_state_is_stopped != new_state_is_stopped) 132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (new_state_is_stopped) 132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// m_private_run_lock.WriteUnlock(); 132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else 132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// m_private_run_lock.WriteLock(); 132768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton// } 132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state_changed) 133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state.SetValueNoLock (new_state); 133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (StateIsStoppedState(new_state, false)) 133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_id.BumpStopID(); 133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_memory_cache.Clear(); 133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 1337a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_mod_id.GetStopID()); 1338a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton } 1339a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton // Use our target to get a shared pointer to ourselves... 1340a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (GetTarget().GetProcessSP(), new_state)); 1341a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton } 1342a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton else 1343a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton { 1344a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton if (log) 1345a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state)); 1346a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton } 1347a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton} 1348a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton 1349a894fe78bc15344a0025c1154e414c554ab31dd9Greg Claytonvoid 1350a894fe78bc15344a0025c1154e414c554ab31dd9Greg ClaytonProcess::SetRunningUserExpression (bool on) 135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_id.SetRunningUserExpression (on); 135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1354202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t 135621f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamProcess::GetImageInfoAddress() 1357fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_ADDRESS; 135921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham} 136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// LoadImage 136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This function provides a default implementation that works for most 136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unix variants. Any Process subclasses that need to do shared library 136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// loading differently should override LoadImage and UnloadImage and 13677e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda// do what is needed. 136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::LoadImage (const FileSpec &image_spec, Error &error) 13710296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham{ 13720296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham DynamicLoader *loader = GetDynamicLoader(); 13730296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham if (loader) 13740296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 13750296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham error = loader->CanLoadImage(); 13760296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham if (error.Fail()) 137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_IMAGE_TOKEN; 137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 13830baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 13840baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp) 13850baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 13870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 13880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (frame_sp) 13890baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 13910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton frame_sp->CalculateExecutionContext (exe_ctx); 13920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton bool unwind_on_error = true; 13930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StreamString expr; 13940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton char path[PATH_MAX]; 13950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton image_spec.GetPath(path, sizeof(path)); 13960baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton expr.Printf("dlopen (\"%s\", 2)", path); 13970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n"; 13980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton lldb::ValueObjectSP result_valobj_sp; 13990baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ClangUserExpression::Evaluate (exe_ctx, eExecutionPolicyAlways, lldb::eLanguageTypeUnknown, ClangUserExpression::eResultTypeAny, unwind_on_error, expr.GetData(), prefix, result_valobj_sp); 14000baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = result_valobj_sp->GetError(); 14010baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Success()) 14020baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14030baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Scalar scalar; 14040baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (result_valobj_sp->ResolveValue (scalar)) 14050baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14060baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS); 14070baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS) 14080baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14090baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton uint32_t image_token = m_image_tokens.size(); 14100baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_image_tokens.push_back (image_ptr); 14110baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return image_token; 14120baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14130baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 1414ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham } 14150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14160baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14170baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14180baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 14190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 1420360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 1421daa6efe771f5f068e29328a774fa5bf2358ce14aSean Callanan//---------------------------------------------------------------------- 1422b14ec34165772877c8242f5b15acb116b0d9a9b5Johnny Chen// UnloadImage 1423b14ec34165772877c8242f5b15acb116b0d9a9b5Johnny Chen// 14240baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most 14250baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library 1426fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// loading differently should override LoadImage and UnloadImage and 14270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed. 14280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 14290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonError 14300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::UnloadImage (uint32_t image_token) 14310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 14320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Error error; 14330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_token < m_image_tokens.size()) 14340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const addr_t image_addr = m_image_tokens[image_token]; 14360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_addr == LLDB_INVALID_ADDRESS) 14370baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorString("image already unloaded"); 14390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 14410baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14420baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton DynamicLoader *loader = GetDynamicLoader(); 14430baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (loader) 14440baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = loader->CanLoadImage(); 14450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 14460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Success()) 14470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14480baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 14490baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 14500baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp) 14510baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14520baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 14530baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 14540baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (frame_sp) 14550baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14560baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 14570baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton frame_sp->CalculateExecutionContext (exe_ctx); 14580baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton bool unwind_on_error = true; 14590baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StreamString expr; 14600baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton expr.Printf("dlclose ((void *)0x%llx)", image_addr); 14610baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const char *prefix = "extern \"C\" int dlclose(void* handle);\n"; 14620baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton lldb::ValueObjectSP result_valobj_sp; 14630baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ClangUserExpression::Evaluate (exe_ctx, eExecutionPolicyAlways, lldb::eLanguageTypeUnknown, ClangUserExpression::eResultTypeAny, unwind_on_error, expr.GetData(), prefix, result_valobj_sp); 14640baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (result_valobj_sp->GetError().Success()) 14650baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14660baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Scalar scalar; 14670baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (result_valobj_sp->ResolveValue (scalar)) 14680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (scalar.UInt(1)) 14700baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14710baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData()); 14720baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14730baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 14740baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14750baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_image_tokens[image_token] = LLDB_INVALID_ADDRESS; 14760baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14770baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14780baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14790baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 1480ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham { 14810baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = result_valobj_sp->GetError(); 14820baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14830baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 1484360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 1485daa6efe771f5f068e29328a774fa5bf2358ce14aSean Callanan } 14860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 1489fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham { 14900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorString("invalid image token"); 14910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return error; 14930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 14940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 14950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonconst lldb::ABISP & 14960baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::GetABI() 14970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 14980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (!m_abi_sp) 14990baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_abi_sp = ABI::FindPlugin(m_target.GetArchitecture()); 15000baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return m_abi_sp; 15010baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 15020baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 15030baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonLanguageRuntime * 15040baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::GetLanguageRuntime(lldb::LanguageType language, bool retry_if_null) 15050baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 15060baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton LanguageRuntimeCollection::iterator pos; 15070baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton pos = m_language_runtimes.find (language); 15080baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (pos == m_language_runtimes.end() || (retry_if_null && !(*pos).second)) 15090baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 15100baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton lldb::LanguageRuntimeSP runtime_sp(LanguageRuntime::FindPlugin(this, language)); 15110baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 15120baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_language_runtimes[language] = runtime_sp; 15130baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return runtime_sp.get(); 15140baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 15150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 15160baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return (*pos).second.get(); 151775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 151824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 151924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCPPLanguageRuntime * 152075906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonProcess::GetCPPLanguageRuntime (bool retry_if_null) 152175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 152275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus, retry_if_null); 152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus) 152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast<CPPLanguageRuntime *> (runtime); 1525642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return NULL; 1526e31176627725f4236c9ca049edc027756709780bJim Ingham} 1527642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1528642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamObjCLanguageRuntime * 1529642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetObjCLanguageRuntime (bool retry_if_null) 1530e31176627725f4236c9ca049edc027756709780bJim Ingham{ 1531642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC, retry_if_null); 1532e31176627725f4236c9ca049edc027756709780bJim Ingham if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC) 1533642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return static_cast<ObjCLanguageRuntime *> (runtime); 1534e31176627725f4236c9ca049edc027756709780bJim Ingham return NULL; 1535e31176627725f4236c9ca049edc027756709780bJim Ingham} 1536642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1537642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamBreakpointSiteList & 1538642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetBreakpointSiteList() 1539642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1540642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return m_breakpoint_site_list; 1541642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1542e31176627725f4236c9ca049edc027756709780bJim Ingham 1543642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghamconst BreakpointSiteList & 1544e31176627725f4236c9ca049edc027756709780bJim InghamProcess::GetBreakpointSiteList() const 1545642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1546642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return m_breakpoint_site_list; 1547642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1548642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1549642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1550642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghamvoid 1551e31176627725f4236c9ca049edc027756709780bJim InghamProcess::DisableAllBreakpointSites () 1552642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1553e31176627725f4236c9ca049edc027756709780bJim Ingham m_breakpoint_site_list.SetEnabledForAll (false); 1554642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1555642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1556642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamError 1557642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::ClearBreakpointSiteByID (lldb::user_id_t break_id) 1558642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (DisableBreakpointSiteByID (break_id)); 156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.Remove(break_id); 156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableBreakpointSiteByID (lldb::user_id_t break_id) 156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp->IsEnabled()) 157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DisableBreakpoint (bp_site_sp.get()); 157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("invalid breakpoint site ID: %llu", break_id); 158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableBreakpointSiteByID (lldb::user_id_t break_id) 158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!bp_site_sp->IsEnabled()) 159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = EnableBreakpoint (bp_site_sp.get()); 159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("invalid breakpoint site ID: %llu", break_id); 159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1601444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::break_id_t 160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CreateBreakpointSite (const BreakpointLocationSP &owner, bool use_hardware) 160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target); 160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (load_addr != LLDB_INVALID_ADDRESS) 160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp; 160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Look up this breakpoint site. If it exists, then add this new owner, otherwise 161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // create a new breakpoint site and add it. 161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr); 161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp->AddOwner (owner); 161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner owner->SetBreakpointSite (bp_site_sp); 1619444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return bp_site_sp->GetID(); 162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, LLDB_INVALID_THREAD_ID, use_hardware)); 16243fd1f36c937575dbf57bae04c7ebaef78d8ecc1dStephen Wilson if (bp_site_sp) 162513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton { 162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (EnableBreakpoint (bp_site_sp.get()).Success()) 1627265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton { 162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner owner->SetBreakpointSite (bp_site_sp); 162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list.Add (bp_site_sp); 163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We failed to enable the breakpoint 163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_BREAK_ID; 163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp) 164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id); 164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_owners == 0) 164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableBreakpoint(bp_site_sp.get()); 164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress()); 164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const 165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_removed = 0; 165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t intersect_addr; 165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t intersect_size; 165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t opcode_offset; 165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t idx; 165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_sp; 166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList bp_sites_in_range; 166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_breakpoint_site_list.FindInRange (bp_addr, bp_addr + size, bp_sites_in_range)) 166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; (bp_sp = bp_sites_in_range.GetByIndex(idx)); ++idx) 166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_sp->GetType() == BreakpointSite::eSoftware) 166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_sp->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset)) 166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size); 167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size); 167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(opcode_offset + intersect_size <= bp_sp->GetByteSize()); 167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t buf_offset = intersect_addr - bp_addr; 167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy(buf + buf_offset, bp_sp->GetSavedOpcodeBytes() + opcode_offset, intersect_size); 167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_removed; 168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1681987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton 168282820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham 168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 168482820f9f021e289431ff3b79e56bd7d88097f327Jim Inghamsize_t 168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site) 1686987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton{ 168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PlatformSP platform_sp (m_target.GetPlatform()); 1688987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton if (platform_sp) 168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return platform_sp->GetSoftwareBreakpointTrapOpcode (m_target, bp_site); 1690987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton return 0; 169182820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham} 169282820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham 169382820f9f021e289431ff3b79e56bd7d88097f327Jim InghamError 1694987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonProcess::EnableSoftwareBreakpoint (BreakpointSite *bp_site) 169582820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham{ 1696987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton Error error; 169782820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham assert (bp_site != NULL); 169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t bp_addr = bp_site->GetLoadAddress(); 170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx", bp_site->GetID(), (uint64_t)bp_addr); 170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site->IsEnabled()) 170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 1705b1888f24fa181489840b9acf193e224d125d0776Greg Clayton log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already enabled", bp_site->GetID(), (uint64_t)bp_addr); 1706b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return error; 1707b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 1708b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 1709b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (bp_addr == LLDB_INVALID_ADDRESS) 1710b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 1711b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorString("BreakpointSite contains an invalid load address."); 1712b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return error; 1713b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 1714b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // Ask the lldb::Process subclass to fill in the correct software breakpoint 171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // trap for the breakpoint site 171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site); 171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_opcode_size == 0) 171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1720e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%llx", bp_addr); 172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes(); 172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_opcode_bytes == NULL) 172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode."); 172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Save the original opcode by reading it 173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size) 173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Write a software breakpoint in place of the original opcode 173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 173724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t verify_bp_opcode_bytes[64]; 173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0) 17429c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton { 174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetEnabled(true); 174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetType (BreakpointSite::eSoftware); 174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", 174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr); 174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("failed to verify the breakpoint trap in memory."); 175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory to verify breakpoint trap."); 175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to write breakpoint trap to memory."); 175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory at breakpoint address."); 176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log && error.Fail()) 176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s", 176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr, 176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.AsCString()); 176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 176924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableSoftwareBreakpoint (BreakpointSite *bp_site) 177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17739c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton Error error; 177424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bp_site != NULL); 177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t bp_addr = bp_site->GetLoadAddress(); 177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t breakID = bp_site->GetID(); 177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableBreakpoint (breakID = %llu) addr = 0x%llx", breakID, (uint64_t)bp_addr); 178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site->IsHardware()) 178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Breakpoint site is a hardware breakpoint."); 1784c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson } 178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bp_site->IsEnabled()) 178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t break_op_size = bp_site->GetByteSize(); 178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes(); 178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (break_op_size > 0) 179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear a software breakoint instruction 179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t curr_break_op[8]; 179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (break_op_size <= sizeof(curr_break_op)); 179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool break_op_found = false; 179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Read the breakpoint opcode 1797e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size) 179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool verify = false; 180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure we have the a breakpoint opcode exists at this address 1801444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (::memcmp (curr_break_op, break_op, break_op_size) == 0) 180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break_op_found = true; 180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We found a valid breakpoint opcode at this address, now restore 180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the saved opcode. 180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size) 180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner verify = true; 180924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 181024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Memory write failed when restoring original opcode."); 181224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 181454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton { 1815141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson error.SetErrorString("Original breakpoint trap is no longer in memory."); 181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set verify to true and so we can check if the original opcode has already been restored 181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner verify = true; 181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (verify) 182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t verify_opcode[8]; 182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (break_op_size < sizeof(verify_opcode)); 182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Verify that our original opcode made it back to the inferior 182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size) 182624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // compare the memory we just read with the original opcode 182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0) 182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // SUCCESS 183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetEnabled(false); 183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr); 183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 183624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 183724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 183824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (break_op_found) 183924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to restore original opcode."); 184024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 184124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 184224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 184324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored."); 184454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton } 1845141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson } 184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory that should contain the breakpoint trap."); 184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already disabled", bp_site->GetID(), (uint64_t)bp_addr); 185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 185724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s", 185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 186024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr, 186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.AsCString()); 186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Comment out line below to disable memory caching 186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define ENABLE_MEMORY_CACHING 186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Uncomment to verify memory caching works after making changes to caching code 186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//#define VERIFY_MEMORY_READS 187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined (ENABLE_MEMORY_CACHING) 187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined (VERIFY_MEMORY_READS) 187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Memory caching is enabled, with debug verification 187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (buf && size) 188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Uncomment the line below to make sure memory caching is working. 188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // I ran this through the test suite and got no assertions, so I am 188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // pretty confident this is working well. If any changes are made to 188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // memory caching, uncomment the line below and test your changes! 188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Verify all memory reads by using the cache first, then redundantly 188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // reading the same memory from the inferior and comparing to make sure 1888fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // everything is exactly the same. 1889fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton std::string verify_buf (size, '\0'); 1890fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (verify_buf.size() == size); 1891fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton const size_t cache_bytes_read = m_memory_cache.Read (this, addr, buf, size, error); 1892fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton Error verify_error; 1893fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton const size_t verify_bytes_read = ReadMemoryFromInferior (addr, const_cast<char *>(verify_buf.data()), verify_buf.size(), verify_error); 1894fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (cache_bytes_read == verify_bytes_read); 1895fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (memcmp(buf, verify_buf.data(), verify_buf.size()) == 0); 1896fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (verify_error.Success() == error.Success()); 1897fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return cache_bytes_read; 1898fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton } 1899fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return 0; 1900fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 1901fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1902fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#else // #if defined (VERIFY_MEMORY_READS) 1903fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1904fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 1905fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 1906fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 1907fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Memory caching enabled, no verification 1908fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return m_memory_cache.Read (addr, buf, size, error); 1909fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 1910fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1911fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif // #else for #if defined (VERIFY_MEMORY_READS) 1912fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1913fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#else // #if defined (ENABLE_MEMORY_CACHING) 1914fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1915fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 1916fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 1917fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 1918fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Memory caching is disabled 1919fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return ReadMemoryFromInferior (addr, buf, size, error); 1920fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 1921fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1922fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif // #else for #if defined (ENABLE_MEMORY_CACHING) 1923fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1924fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1925fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 1926fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len, Error &result_error) 1927fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 1928fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton size_t total_cstr_len = 0; 1929fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton if (dst && dst_max_len) 1930613b8739a4d489b7f1c571288d5786768c024205Greg Clayton { 1931fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton result_error.Clear(); 1932fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // NULL out everything just to be safe 1933fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton memset (dst, 0, dst_max_len); 1934fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton Error error; 1935fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton addr_t curr_addr = addr; 193624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize(); 193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_left = dst_max_len - 1; 193824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *curr_dst = dst; 193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1940fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton while (bytes_left > 0) 1941fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton { 1942fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size); 1943fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); 1944fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error); 1945fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1946fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton if (bytes_read == 0) 1947fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton { 19484a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton result_error = error; 1949b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton dst[total_cstr_len] = '\0'; 1950b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 1951b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 1952b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const size_t len = strlen(curr_dst); 19534a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton 1954b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton total_cstr_len += len; 1955b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1956b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (len < bytes_to_read) 1957b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 1958b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1959b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton curr_dst += bytes_read; 1960b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton curr_addr += bytes_read; 1961b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton bytes_left -= bytes_read; 1962b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 1963b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 1964b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 1965b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 1966b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (dst == NULL) 1967b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton result_error.SetErrorString("invalid arguments"); 1968b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 1969b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton result_error.Clear(); 19704a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton } 1971b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return total_cstr_len; 1972b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 1973b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1974b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonsize_t 1975b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcess::ReadMemoryFromInferior (addr_t addr, void *buf, size_t size, Error &error) 1976b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 1977b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (buf == NULL || size == 0) 1978b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return 0; 1979b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1980b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t bytes_read = 0; 1981b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton uint8_t *bytes = (uint8_t *)buf; 1982b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1983b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton while (bytes_read < size) 1984b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 1985b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const size_t curr_size = size - bytes_read; 19864a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton const size_t curr_bytes_read = DoReadMemory (addr + bytes_read, 19874a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton bytes + bytes_read, 19884a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton curr_size, 19894a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton error); 19904a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton bytes_read += curr_bytes_read; 19914a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton if (curr_bytes_read == curr_size || curr_bytes_read == 0) 19924a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton break; 1993b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 1994b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1995b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Replace any software breakpoint opcodes that fall into this range back 1996b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // into "buf" before we return 1997fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton if (bytes_read > 0) 1998fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf); 199924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_read; 200024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 200124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint64_t 200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadUnsignedIntegerFromMemory (lldb::addr_t vm_addr, size_t integer_byte_size, uint64_t fail_value, Error &error) 200424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Scalar scalar; 200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar, error)) 200724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return scalar.ULongLong(fail_value); 200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return fail_value; 200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t 201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadPointerFromMemory (lldb::addr_t vm_addr, Error &error) 201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Scalar scalar; 201524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar, error)) 201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return scalar.ULongLong(LLDB_INVALID_ADDRESS); 201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_ADDRESS; 201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 202124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WritePointerToMemory (lldb::addr_t vm_addr, 202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t ptr_value, 2024f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton Error &error) 2025c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 2026f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton Scalar scalar; 2027c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton const uint32_t addr_byte_size = GetAddressByteSize(); 2028c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (addr_byte_size <= 4) 2029c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = (uint32_t)ptr_value; 2030c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 2031c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = ptr_value; 2032c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) == addr_byte_size; 2033c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 2034c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2035c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonsize_t 2036c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error) 2037c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 2038c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton size_t bytes_written = 0; 2039c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton const uint8_t *bytes = (const uint8_t *)buf; 2040c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2041c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton while (bytes_written < size) 2042c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2043c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton const size_t curr_size = size - bytes_written; 2044c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written, 2045c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton bytes + bytes_written, 2046c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton curr_size, 2047c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error); 2048c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton bytes_written += curr_bytes_written; 2049c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (curr_bytes_written == curr_size || curr_bytes_written == 0) 2050c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton break; 2051c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2052f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton return bytes_written; 2053c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 2054c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2055f72fdeee129bbd7195f3db888b561ede689886aaGreg Claytonsize_t 2056f72fdeee129bbd7195f3db888b561ede689886aaGreg ClaytonProcess::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error) 205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined (ENABLE_MEMORY_CACHING) 205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_memory_cache.Flush (addr, size); 206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif 206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (buf == NULL || size == 0) 206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_id.BumpMemoryID(); 206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We need to write any data that would go where any current software traps 206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // (enabled software breakpoints) any software traps (breakpoints) that we 206924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // may have placed in our tasks memory. 207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator iter = m_breakpoint_site_list.GetMap()->lower_bound (addr); 207224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator end = m_breakpoint_site_list.GetMap()->end(); 207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (iter == end || iter->second->GetLoadAddress() > addr + size) 207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return WriteMemoryPrivate (addr, buf, size, error); 207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator pos; 207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_written = 0; 207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t intersect_addr = 0; 2080fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton size_t intersect_size = 0; 2081fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton size_t opcode_offset = 0; 2082fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton const uint8_t *ubuf = (const uint8_t *)buf; 2083fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 208424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = iter; pos != end; ++pos) 208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2086e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham BreakpointSiteSP bp; 208721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham bp = pos->second; 2088e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 208924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset)); 209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(addr <= intersect_addr && intersect_addr < addr + size); 209124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size); 209224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(opcode_offset + intersect_size <= bp->GetByteSize()); 209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check for bytes before this breakpoint 209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t curr_addr = addr + bytes_written; 209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (intersect_addr > curr_addr) 2097c8bc1c318cfed0e3fe22731d808ddac1b32bb26eGreg Clayton { 209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // There are some bytes before this breakpoint that we need to 209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // just write to memory 210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t curr_size = intersect_addr - curr_addr; 210154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton size_t curr_bytes_written = WriteMemoryPrivate (curr_addr, 210254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton ubuf + bytes_written, 210354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton curr_size, 210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += curr_bytes_written; 210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_written != curr_size) 210724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to write all of the requested bytes, we 210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // are done looping and will return the number of bytes that 211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we have written so far. 211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now write any bytes that would cover up any software breakpoints 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // directly into the breakpoint opcode buffer 211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size); 211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += intersect_size; 211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Write any remaining bytes after the last breakpoint if we have any left 212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_written < size) 212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += WriteMemoryPrivate (addr + bytes_written, 212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ubuf + bytes_written, 212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size - bytes_written, 212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteScalarToMemory (addr_t addr, const Scalar &scalar, uint32_t byte_size, Error &error) 213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 213424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size == UINT32_MAX) 213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_size = scalar.GetByteSize(); 213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_size > 0) 213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t buf[32]; 213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t mem_size = scalar.GetAsMemoryData (buf, byte_size, GetByteOrder(), error); 214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (mem_size > 0) 214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return WriteMemory(addr, buf, mem_size, error); 214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString ("failed to get scalar as memory data"); 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString ("invalid scalar value"); 214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2149e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham return 0; 215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2152c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonsize_t 2153c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadScalarIntegerFromMemory (addr_t addr, 2154c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint32_t byte_size, 2155c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton bool is_signed, 2156c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar &scalar, 2157c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error &error) 2158c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 2159c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint64_t uval; 2160c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2161c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size <= sizeof(uval)) 2162c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2163c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton size_t bytes_read = ReadMemory (addr, &uval, byte_size, error); 2164c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (bytes_read == byte_size) 2165c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2166c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton DataExtractor data (&uval, sizeof(uval), GetByteOrder(), GetAddressByteSize()); 2167c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint32_t offset = 0; 2168c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size <= 4) 2169c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = data.GetMaxU32 (&offset, byte_size); 2170c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 2171c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = data.GetMaxU64 (&offset, byte_size); 2172c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2173c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (is_signed) 2174c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar.SignExtend(byte_size * 8); 2175c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return bytes_read; 2176c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2177c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2178c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 2179c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2180c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size); 2181c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2182c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return 0; 2183c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 2184c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2185c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton#define USE_ALLOCATE_MEMORY_CACHE 1 2186c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonaddr_t 2187c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::AllocateMemory(size_t size, uint32_t permissions, Error &error) 2188c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 2189c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (GetPrivateState() != eStateStopped) 2190c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return LLDB_INVALID_ADDRESS; 2191c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2192c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton#if defined (USE_ALLOCATE_MEMORY_CACHE) 2193c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return m_allocated_memory_cache.AllocateMemory(size, permissions, error); 2194c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton#else 2195c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton addr_t allocated_addr = DoAllocateMemory (size, permissions, error); 2196c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2197c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (log) 2198c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf("Process::AllocateMemory(size=%4zu, permissions=%s) => 0x%16.16llx (m_stop_id = %u m_memory_id = %u)", 2199c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton size, 2200c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton GetPermissionsAsCString (permissions), 2201c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton (uint64_t)allocated_addr, 2202c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton m_mod_id.GetStopID(), 2203c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton m_mod_id.GetMemoryID()); 2204c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return allocated_addr; 2205c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton#endif 2206c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 2207613b8739a4d489b7f1c571288d5786768c024205Greg Clayton 220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CanJIT () 221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2211e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham if (m_can_jit == eCanJITDontKnow) 2212e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham { 2213e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham Error err; 2214613b8739a4d489b7f1c571288d5786768c024205Greg Clayton 2215613b8739a4d489b7f1c571288d5786768c024205Greg Clayton uint64_t allocated_memory = AllocateMemory(8, 2216613b8739a4d489b7f1c571288d5786768c024205Greg Clayton ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable, 22172860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton err); 22182860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton 22192860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton if (err.Success()) 222021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_can_jit = eCanJITYes; 22212860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton else 2222613b8739a4d489b7f1c571288d5786768c024205Greg Clayton m_can_jit = eCanJITNo; 22232860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton 222421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham DeallocateMemory (allocated_memory); 222521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 22262860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton 2227613b8739a4d489b7f1c571288d5786768c024205Greg Clayton return m_can_jit == eCanJITYes; 222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22306cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callananvoid 22316cf6c474742a23e7cb6b4f618bf1de711db90a85Sean CallananProcess::SetCanJIT (bool can_jit) 22326cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan{ 223304200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan m_can_jit = (can_jit ? eCanJITYes : eCanJITNo); 223404200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan} 223504200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan 223604200f6251401ccf3d07b09b5c4d29006cdf1cfaSean CallananError 223704200f6251401ccf3d07b09b5c4d29006cdf1cfaSean CallananProcess::DeallocateMemory (addr_t ptr) 223804200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan{ 223904200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan Error error; 224004200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan#if defined (USE_ALLOCATE_MEMORY_CACHE) 224104200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan if (!m_allocated_memory_cache.DeallocateMemory(ptr)) 224204200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan { 224304200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan error.SetErrorStringWithFormat ("deallocation of memory at 0x%llx failed.", (uint64_t)ptr); 224404200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan } 224504200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan#else 224604200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan error = DoDeallocateMemory (ptr); 224704200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan 224804200f6251401ccf3d07b09b5c4d29006cdf1cfaSean Callanan LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 22496cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan if (log) 22506cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan log->Printf("Process::DeallocateMemory(addr=0x%16.16llx) => err = %s (m_stop_id = %u, m_memory_id = %u)", 22516cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan ptr, 22526cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan error.AsCString("SUCCESS"), 22536cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan m_mod_id.GetStopID(), 22546cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan m_mod_id.GetMemoryID()); 22556cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan#endif 22566cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan return error; 22576cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan} 225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModuleSP 226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadModuleFromMemory (const FileSpec& file_spec, 2261613b8739a4d489b7f1c571288d5786768c024205Greg Clayton lldb::addr_t header_addr, 2262613b8739a4d489b7f1c571288d5786768c024205Greg Clayton bool add_image_to_target, 2263613b8739a4d489b7f1c571288d5786768c024205Greg Clayton bool load_sections_in_target) 2264613b8739a4d489b7f1c571288d5786768c024205Greg Clayton{ 2265613b8739a4d489b7f1c571288d5786768c024205Greg Clayton ModuleSP module_sp (new Module (file_spec, ArchSpec())); 2266613b8739a4d489b7f1c571288d5786768c024205Greg Clayton if (module_sp) 2267613b8739a4d489b7f1c571288d5786768c024205Greg Clayton { 2268613b8739a4d489b7f1c571288d5786768c024205Greg Clayton Error error; 22692860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton ObjectFile *objfile = module_sp->GetMemoryObjectFile (shared_from_this(), header_addr, error); 22702860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton if (objfile) 22712860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton { 227221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (add_image_to_target) 22732860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton { 22742860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton m_target.GetImages().Append(module_sp); 227521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (load_sections_in_target) 227621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 2277613b8739a4d489b7f1c571288d5786768c024205Greg Clayton bool changed = false; 22782860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton module_sp->SetLoadAddress (m_target, 0, changed); 227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2281b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return module_sp; 22829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 22839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 22849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return ModuleSP(); 22859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 2286b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 22876c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonError 2288b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonProcess::EnableWatchpoint (Watchpoint *watchpoint) 2289b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 22906c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton Error error; 22916c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorString("watchpoints are not supported"); 22926c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton return error; 22939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 22946c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton 22959ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonError 22966c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonProcess::DisableWatchpoint (Watchpoint *watchpoint) 22976c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton{ 22986c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton Error error; 22996c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton error.SetErrorString("watchpoints are not supported"); 23006c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton return error; 23016c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton} 23029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 23036c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonStateType 23049ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcess::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp) 2305b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 23066c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton StateType state; 2307b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton // Now wait for the process to launch and return control to us, and then 230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // call DidLaunch: 230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (1) 2310ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen { 231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner event_sp.reset(); 231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = WaitForStateChangedEventsPrivate (timeout, event_sp); 231324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 231424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (StateIsStoppedState(state, false)) 231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 231724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If state is invalid, then we timed out 2318ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen if (state == eStateInvalid) 231924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 232024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 232124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_sp) 232224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 232324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 232524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 232624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 232724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 232824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Launch (const ProcessLaunchInfo &launch_info) 232924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 233024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 233124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 233224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_dyld_ap.reset(); 233372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_os_ap.reset(); 233472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_process_input_reader.reset(); 233572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 2336202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton Module *exe_module = m_target.GetExecutableModulePointer(); 233724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_module) 233872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton { 233972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton char local_exec_file_path[PATH_MAX]; 234072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton char platform_exec_file_path[PATH_MAX]; 234172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path)); 234272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path)); 234372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (exe_module->GetFileSpec().Exists()) 234424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 234524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (PrivateStateThreadIsValid ()) 234624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PausePrivateStateThread (); 234724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 234824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = WillLaunch (exe_module); 234924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 235036bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton { 235124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetPublicState (eStateLaunching); 235224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_should_detach = false; 235324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 235475c703dd8b492bad25a987b96853626641ae7246Greg Clayton // Now launch using these arguments. 235537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton error = DoLaunch (exe_module, launch_info); 2356861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Fail()) 23585beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton { 235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetID() != LLDB_INVALID_PROCESS_ID) 236024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2361180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton SetID (LLDB_INVALID_PROCESS_ID); 2362180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton const char *error_string = error.AsCString(); 2363180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton if (error_string == NULL) 2364180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton error_string = "launch failed"; 236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetExitStatus (-1, error_string); 236624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2367a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton } 2368a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton else 2369a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton { 237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TimeValue timeout_time; 237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout_time = TimeValue::Now(); 2373d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton timeout_time.OffsetWithSeconds(10); 2374ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton StateType state = WaitForProcessStopPrivate(&timeout_time, event_sp); 237524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 237624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state == eStateInvalid || event_sp.get() == NULL) 237736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton { 237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We were able to launch the process, but we failed to 237924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // catch the initial stop. 238024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetExitStatus (0, "failed to catch stop after launch"); 238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Destroy(); 238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (state == eStateStopped || state == eStateCrashed) 238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidLaunch (); 238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DynamicLoader *dyld = GetDynamicLoader (); 238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dyld) 239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dyld->DidLaunch(); 239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 239224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 23934985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton // This delays passing the stopped event to listeners till DidLaunch gets 23944985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton // a chance to complete... 23954985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton HandlePrivateEvent (event_sp); 23964985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton 239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (PrivateStateThreadIsValid ()) 23984985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton ResumePrivateStateThread (); 23994985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton else 24004985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton StartPrivateStateThread (); 24014985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton } 24024985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton else if (state == eStateExited) 24034985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton { 24044985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton // We exited while trying to launch somehow. Don't call DidLaunch as that's 24054985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton // not likely to work, and return an invalid pid. 240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 240775c703dd8b492bad25a987b96853626641ae7246Greg Clayton } 240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 24119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton else 24129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 241375c703dd8b492bad25a987b96853626641ae7246Greg Clayton error.SetErrorStringWithFormat("file doesn't exist: '%s'", local_exec_file_path); 241437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2418a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton 2419a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton 2420a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg ClaytonError 2421a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg ClaytonProcess::LoadCore () 2422a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton{ 242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error = DoLoadCore(); 242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (PrivateStateThreadIsValid ()) 242724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ResumePrivateStateThread (); 242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StartPrivateStateThread (); 243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DynamicLoader *dyld = GetDynamicLoader (); 243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dyld) 243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dyld->DidAttach(); 243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24359c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We successfully loaded a core file, now pretend we stopped so we can 243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // show all of the threads in the core file and explore the crashed 243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // state. 243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetPrivateState (eStateStopped); 244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 244146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 244246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return error; 244346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 244446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 244546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonDynamicLoader * 244646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcess::GetDynamicLoader () 244746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 244846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (m_dyld_ap.get() == NULL) 244946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL)); 245046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return m_dyld_ap.get(); 245146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 245246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 24539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 24549ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcess::NextEventAction::EventActionResult 24559ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcess::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp) 24569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 24579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton StateType state = ProcessEventData::GetStateFromEvent (event_sp.get()); 245846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton switch (state) 245946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 246046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton case eStateRunning: 246146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton case eStateConnected: 246246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return eEventActionRetry; 246346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 246446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton case eStateStopped: 246546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton case eStateCrashed: 246646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 24679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // During attach, prior to sending the eStateStopped event, 24689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // lldb_private::Process subclasses must set the process must set 24699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // the new process ID. 24709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID); 24719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_exec_count > 0) 24729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 24739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton --m_exec_count; 247446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_process->Resume(); 247546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return eEventActionRetry; 2476c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2477c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham else 247824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2479c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham m_process->CompleteAttach (); 2480c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham return eEventActionSuccess; 248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24827e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton } 2483a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton break; 24847e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 24857e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton default: 24867e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateExited: 24877e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateInvalid: 24882d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton break; 24892d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton } 24907fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham 24912d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton m_exit_string.assign ("No valid Process"); 24922d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton return eEventActionExit; 24932d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton} 24942d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton 24952d9adb73af7520bec430e0585ca40467828e6ed1Greg ClaytonProcess::NextEventAction::EventActionResult 24962d9adb73af7520bec430e0585ca40467828e6ed1Greg ClaytonProcess::AttachCompletionHandler::HandleBeingInterrupted() 24972d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton{ 24982d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton return eEventActionSuccess; 24992d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton} 25002d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton 25012d9adb73af7520bec430e0585ca40467828e6ed1Greg Claytonconst char * 25022d9adb73af7520bec430e0585ca40467828e6ed1Greg ClaytonProcess::AttachCompletionHandler::GetExitString () 25032d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton{ 25047e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton return m_exit_string.c_str(); 25052d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton} 25067e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 25077e2f91cb958c8670774cb2190db7b858618b5b9bGreg ClaytonError 25087e2f91cb958c8670774cb2190db7b858618b5b9bGreg ClaytonProcess::Attach (ProcessAttachInfo &attach_info) 25097e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton{ 251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 25112d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton m_process_input_reader.reset(); 25122d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton m_dyld_ap.reset(); 25132d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton m_os_ap.reset(); 2514c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2515c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham lldb::pid_t attach_pid = attach_info.GetProcessID(); 2516c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham Error error; 2517c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (attach_pid == LLDB_INVALID_PROCESS_ID) 2518c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2519c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham char process_name[PATH_MAX]; 2520c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2521c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (attach_info.GetExecutableFile().GetPath (process_name, sizeof(process_name))) 2522c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2523c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham const bool wait_for_launch = attach_info.GetWaitForLaunch(); 2524c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2525c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (wait_for_launch) 252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = WillAttachToProcessWithName(process_name, wait_for_launch); 252824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 2529527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_should_detach = true; 253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2532861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice SetPublicState (eStateAttaching); 253375c703dd8b492bad25a987b96853626641ae7246Greg Clayton error = DoAttachToProcessWithName (process_name, wait_for_launch, attach_info); 253437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (error.Fail()) 25357508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 2536527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 2537e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2538527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetID (LLDB_INVALID_PROCESS_ID); 25397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (error.AsCString() == NULL) 2540527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString("attach failed"); 25410d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham 2542527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetExitStatus(-1, error.AsCString()); 2543ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham } 2544527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2545527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 2546527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2547e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount())); 2548527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton StartPrivateStateThread(); 2549527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2550527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return error; 2551ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton } 2552ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton } 2553527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 2554d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong { 2555527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton ProcessInstanceInfoList process_infos; 2556527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton PlatformSP platform_sp (m_target.GetPlatform ()); 2557527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2558527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (platform_sp) 2559527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2560527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton ProcessInstanceInfoMatch match_info; 2561527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton match_info.GetProcessInfo() = attach_info; 2562527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton match_info.SetNameMatchType (eNameMatchEquals); 2563527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton platform_sp->FindProcesses (match_info, process_infos); 2564527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const uint32_t num_matches = process_infos.GetSize(); 2565527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (num_matches == 1) 2566527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2567527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton attach_pid = process_infos.GetProcessIDAtIndex(0); 2568527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // Fall through and attach using the above process ID 2569527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2570527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 2571527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2572527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton match_info.GetProcessInfo().GetExecutableFile().GetPath (process_name, sizeof(process_name)); 2573e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (num_matches > 1) 2574527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorStringWithFormat ("more than one process named %s", process_name); 2575e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 2576527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorStringWithFormat ("could not find a process named %s", process_name); 2577527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2578527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2579527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 2580527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2581527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString ("invalid platform, can't find processes by name"); 2582527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return error; 2583527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2584527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2585527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2586527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 2587527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2588527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString ("invalid process name"); 2589527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2590527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2591527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2592527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (attach_pid != LLDB_INVALID_PROCESS_ID) 2593527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2594527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error = WillAttachToProcessWithID(attach_pid); 2595527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (error.Success()) 2596527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2597527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_should_detach = true; 2598527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetPublicState (eStateAttaching); 2599527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2600527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error = DoAttachToProcessWithID (attach_pid, attach_info); 2601527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (error.Success()) 2602527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2603527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2604527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount())); 2605e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton StartPrivateStateThread(); 2606e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2607e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 2608527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2609527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 2610ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham { 26117508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham SetID (LLDB_INVALID_PROCESS_ID); 2612527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const char *error_string = error.AsCString(); 2613527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (error_string == NULL) 261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_string = "attach failed"; 2615527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2616e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetExitStatus(-1, error_string); 261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2618ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton } 2619e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2620527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2621d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong return error; 2622527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton} 2623527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2624527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//Error 2625527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//Process::Attach (const char *process_name, bool wait_for_launch) 2626527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//{ 2627527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// m_abi_sp.reset(); 2628527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// m_process_input_reader.reset(); 262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 2630e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// // Find the process and its architecture. Make sure it matches the architecture 2631e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// // of the current Target, and if not adjust it. 2632e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Error error; 2633e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 2634e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// if (!wait_for_launch) 2635e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// { 263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ProcessInstanceInfoList process_infos; 2637e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// PlatformSP platform_sp (m_target.GetPlatform ()); 2638e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// assert (platform_sp.get()); 2639e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (platform_sp) 264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ProcessInstanceInfoMatch match_info; 264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// match_info.GetProcessInfo().SetName(process_name); 264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// match_info.SetNameMatchType (eNameMatchEquals); 2645527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// platform_sp->FindProcesses (match_info, process_infos); 2646527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (process_infos.GetSize() > 1) 2647527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2648527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// error.SetErrorStringWithFormat ("more than one process named %s", process_name); 2649527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2650527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// else if (process_infos.GetSize() == 0) 2651527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2652527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// error.SetErrorStringWithFormat ("could not find a process named %s", process_name); 2653527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2654527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2655527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// else 2656527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2657527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// error.SetErrorString ("invalid platform"); 2658527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2659527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2660527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// 2661527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (error.Success()) 2662527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2663527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// m_dyld_ap.reset(); 2664527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// m_os_ap.reset(); 2665527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// 2666527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// error = WillAttachToProcessWithName(process_name, wait_for_launch); 2667527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (error.Success()) 2668527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2669527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// SetPublicState (eStateAttaching); 2670527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// error = DoAttachToProcessWithName (process_name, wait_for_launch); 2671527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (error.Fail()) 2672527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2673527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (GetID() != LLDB_INVALID_PROCESS_ID) 2674527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2675527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// SetID (LLDB_INVALID_PROCESS_ID); 2676527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// const char *error_string = error.AsCString(); 2677527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (error_string == NULL) 2678527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// error_string = "attach failed"; 2679527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// 2680527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// SetExitStatus(-1, error_string); 2681527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2682527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2683527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// else 2684527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2685527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// SetNextEventAction(new Process::AttachCompletionHandler(this, 0)); 2686527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// StartPrivateStateThread(); 2687527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2688527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2689527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2690527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// return error; 2691527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//} 2692527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2693527154d8e532f27f25af226c9e1dac607c48b5d1Greg Claytonvoid 2694527154d8e532f27f25af226c9e1dac607c48b5d1Greg ClaytonProcess::CompleteAttach () 2695527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton{ 2696527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // Let the process subclass figure out at much as it can about the process 2697527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // before we go looking for a dynamic loader plug-in. 2698527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton DidAttach(); 2699527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2700527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // We just attached. If we have a platform, ask it for the process architecture, and if it isn't 2701527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // the same as the one we've already set, switch architectures. 2702527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton PlatformSP platform_sp (m_target.GetPlatform ()); 2703527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton assert (platform_sp.get()); 2704527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (platform_sp) 2705527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2706527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton ProcessInstanceInfo process_info; 2707527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton platform_sp->GetProcessInfo (GetID(), process_info); 2708527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const ArchSpec &process_arch = process_info.GetArchitecture(); 2709527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (process_arch.IsValid() && m_target.GetArchitecture() != process_arch) 2710527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_target.SetArchitecture (process_arch); 2711527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2712527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2713527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // We have completed the attach, now it is time to find the dynamic loader 271475c703dd8b492bad25a987b96853626641ae7246Greg Clayton // plug-in 271575c703dd8b492bad25a987b96853626641ae7246Greg Clayton DynamicLoader *dyld = GetDynamicLoader (); 271675c703dd8b492bad25a987b96853626641ae7246Greg Clayton if (dyld) 271775c703dd8b492bad25a987b96853626641ae7246Greg Clayton dyld->DidAttach(); 271875c703dd8b492bad25a987b96853626641ae7246Greg Clayton 271975c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 272075c703dd8b492bad25a987b96853626641ae7246Greg Clayton // Figure out which one is the executable, and set that in our target: 27210d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham ModuleList &modules = m_target.GetImages(); 27220d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham 27230d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham size_t num_modules = modules.GetSize(); 27240d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham for (int i = 0; i < num_modules; i++) 27250d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham { 27260d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham ModuleSP module_sp (modules.GetModuleAtIndex(i)); 27270d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham if (module_sp && module_sp->IsExecutable()) 27280d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham { 27290d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham if (m_target.GetExecutableModulePointer() != module_sp.get()) 27300d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham m_target.SetExecutableModule (module_sp, false); 27310d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham break; 27320d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham } 27330d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham } 27340d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham} 273575c703dd8b492bad25a987b96853626641ae7246Greg Clayton 27369ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonError 27379ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcess::ConnectRemote (const char *remote_url) 27389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 273975c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_abi_sp.reset(); 274037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_process_input_reader.reset(); 274175c703dd8b492bad25a987b96853626641ae7246Greg Clayton 274275c703dd8b492bad25a987b96853626641ae7246Greg Clayton // Find the process and its architecture. Make sure it matches the architecture 274375c703dd8b492bad25a987b96853626641ae7246Greg Clayton // of the current Target, and if not adjust it. 274475c703dd8b492bad25a987b96853626641ae7246Greg Clayton 274575c703dd8b492bad25a987b96853626641ae7246Greg Clayton Error error (DoConnectRemote (remote_url)); 274675c703dd8b492bad25a987b96853626641ae7246Greg Clayton if (error.Success()) 274775c703dd8b492bad25a987b96853626641ae7246Greg Clayton { 2748b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 274975c703dd8b492bad25a987b96853626641ae7246Greg Clayton { 27505beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton EventSP event_sp; 275175c703dd8b492bad25a987b96853626641ae7246Greg Clayton StateType state = WaitForProcessStopPrivate(NULL, event_sp); 275275c703dd8b492bad25a987b96853626641ae7246Greg Clayton 275375c703dd8b492bad25a987b96853626641ae7246Greg Clayton if (state == eStateStopped || state == eStateCrashed) 275475c703dd8b492bad25a987b96853626641ae7246Greg Clayton { 275575c703dd8b492bad25a987b96853626641ae7246Greg Clayton // If we attached and actually have a process on the other end, then 275675c703dd8b492bad25a987b96853626641ae7246Greg Clayton // this ended up being the equivalent of an attach. 275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompleteAttach (); 2758e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2759e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // This delays passing the stopped event to listeners till 2760e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // CompleteAttach gets a chance to complete... 2761e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton HandlePrivateEvent (event_sp); 2762e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2763e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton } 2764e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton } 2765e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2766e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton if (PrivateStateThreadIsValid ()) 2767e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton ResumePrivateStateThread (); 2768e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton else 2769a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton StartPrivateStateThread (); 2770a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton } 277124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return error; 277224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 277324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 277424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 277524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError 277624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonProcess::Resume () 277724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 277824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 277924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (log) 278024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton log->Printf("Process::Resume() m_stop_id = %u, public state: %s private state: %s", 278124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_mod_id.GetStopID(), 278224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton StateAsCString(m_public_state.GetValue()), 278324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton StateAsCString(m_private_state.GetValue())); 278424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 2785a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton Error error (WillResume()); 278624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Tell the process it is about to resume before the thread list 278724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (error.Success()) 278824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 278924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Now let the thread list know we are about to resume so it 279024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // can let all of our threads know that they are about to be 2791e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // resumed. Threads will each be called with 2792e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // Thread::WillResume(StateType) where StateType contains the state 2793e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // that they are supposed to have when the process is resumed 2794e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // (suspended/running/stepping). Threads should also check 2795e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // their resume signal in lldb::Thread::GetResumeSignal() 2796e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // to see if they are suppoed to start back up with a signal. 279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_list.WillResume()) 279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2799e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton // Last thing, do the PreResumeActions. 280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!RunPreResumeActions()) 2801ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham { 280221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham error.SetErrorStringWithFormat ("Process::Resume PreResumeActions failed, not resuming."); 2803ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham } 2804ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham else 280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_id.BumpResumeID(); 280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoResume(); 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28109c11d478f7c2a1611b591cd599782b7a0a8c5c37Johnny Chen DidResume(); 281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_list.DidResume(); 281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process thinks the process has resumed."); 281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("Process::WillResume() thread list returned false after WillResume"); 28201831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham } 28211831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham } 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (log) 28231831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham log->Printf ("Process::WillResume() got an error \"%s\".", error.AsCString("<unknown error>")); 28241831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham return error; 28251831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham} 28261831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 28271831e78a6253392fca1c99e555e7adaa3f372647Jim InghamError 28281831e78a6253392fca1c99e555e7adaa3f372647Jim InghamProcess::Halt () 28291831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham{ 28301831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham // Pause our private state thread so we can ensure no one else eats 28311831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham // the stop event out from under us. 28321831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham Listener halt_listener ("lldb.process.halt_listener"); 28331831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham HijackPrivateProcessEvents(&halt_listener); 28341831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 28351831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham EventSP event_sp; 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillHalt()); 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2840ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool caused_stop = false; 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2843ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham // Ask the process subclass to actually halt our process 2844ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham error = DoHalt(caused_stop); 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateAttaching) 284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetExitStatus(SIGKILL, "Cancelled async attach."); 285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Destroy (); 2851c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2852c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham else 2853f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 2854f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // If "caused_stop" is true, then DoHalt stopped the process. If 2855c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // "caused_stop" is false, the process was already stopped. 2856c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // If the DoHalt caused the process to stop, then we want to catch 28577e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // this event and set the interrupted bool to true before we pass 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // this along so clients know that the process was interrupted by 28597e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // a halt command. 2860c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (caused_stop) 286120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 28627e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // Wait for 1 second for the process to stop. 28637e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton TimeValue timeout_time; 28647e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton timeout_time = TimeValue::Now(); 28657e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton timeout_time.OffsetWithSeconds(1); 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool got_event = halt_listener.WaitForEvent (&timeout_time, event_sp); 28673ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham StateType state = ProcessEventData::GetStateFromEvent(event_sp.get()); 28687e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 28697e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton if (!got_event || state == eStateInvalid) 28707e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton { 28717e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // We timeout out and didn't get a stop event... 28727e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton error.SetErrorStringWithFormat ("Halt timed out. State = %s", StateAsCString(GetState())); 28737e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton } 28743ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham else 2875c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2876c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (StateIsStoppedState (state, false)) 2877c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2878c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // We caused the process to interrupt itself, so mark this 2879c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // as such in the stop event so clients can tell an interrupted 2880c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // process from a natural stop 2881c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham ProcessEventData::SetInterruptedInEvent (event_sp.get(), true); 288220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 2883f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 2884c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2885c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2886c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (log) 2887f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state)); 2888f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham error.SetErrorString ("Did not get stopped event after halt."); 2889c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2890f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 289120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 2892c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham DidHalt(); 2893f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 289420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 289520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 289620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton // Resume our private state thread before we post the event (if any) 2897202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton RestorePrivateProcessEvents(); 2898c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2899c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Post any event we might have consumed. If all goes well, we will have 2900c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // stopped the process, intercepted the event and set the interrupted 2901c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // bool in the event. Post it to the private event queue and that will end up 2902c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // correctly setting the state. 2903c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (event_sp) 2904c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham m_private_state_broadcaster.BroadcastEvent(event_sp); 2905c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2906c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham return error; 2907c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham} 2908c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2909c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamError 2910c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::Detach () 291120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton{ 291220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton Error error (WillDetach()); 2913c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2914c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (error.Success()) 29153ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 2916c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham DisableAllBreakpointSites(); 2917c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham error = DoDetach(); 2918f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (error.Success()) 291920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 2920c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham DidDetach(); 2921c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham StopPrivateStateThread(); 2922c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2923c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2924c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham return error; 2925c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham} 292620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Destroy () 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillDestroy()); 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableAllBreakpointSites(); 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoDestroy(); 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidDestroy(); 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stdio_communication.StopReadThread(); 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stdio_communication.Disconnect(); 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_process_input_reader && m_process_input_reader->IsActive()) 294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target.GetDebugger().PopInputReader (m_process_input_reader); 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_process_input_reader) 294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_input_reader.reset(); 294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Signal (int signal) 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillSignal()); 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoSignal(signal); 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidSignal(); 295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 2961861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 2962861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 2963861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticelldb::ByteOrder 2964861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::GetByteOrder () const 2965861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 2966861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice return m_target.GetArchitecture().GetByteOrder(); 29677fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham} 29687fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham 29697fa7b2f813120a78818246e2d185643a32fa9391Jim Inghamuint32_t 29707fa7b2f813120a78818246e2d185643a32fa9391Jim InghamProcess::GetAddressByteSize () const 29717fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham{ 297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target.GetArchitecture().GetAddressByteSize(); 297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ShouldBroadcastEvent (Event *event_ptr) 297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr); 298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool return_value = true; 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (state) 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateConnected: 298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateAttaching: 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateLaunching: 298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateDetached: 2989395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton case eStateExited: 2990395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton case eStateUnloaded: 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // These events indicate changes in the state of the debugging session, always report them. 2992395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return_value = true; 299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateInvalid: 299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We stopped for no apparent reason, don't report it. 2996395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return_value = false; 299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 2998395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton case eStateRunning: 299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we've started the target running, we handle the cases where we 3001395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton // are already running and where there is a transition from stopped to 300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // running differently. 300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // running -> running: Automatically suppress extra running events 300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // stopped -> running: Report except when there is one or more no votes 300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and no yes votes. 300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SynchronouslyNotifyStateChanged (state); 3007e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton switch (m_public_state.GetValue()) 300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 3011e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // We always suppress multiple runnings with no PUBLIC stop in between. 301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: make this work correctly. For now always report 301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // run if we aren't running so we don't miss any runnning 301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // events. If I run the lldb/test/thread/a.out file and 301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // break at main.cpp:58, run and hit the breakpoints on 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // multiple threads, then somehow during the stepping over 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // of all breakpoints no run gets reported. 302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a transition from stop to run. 302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_thread_list.ShouldReportRun (event_ptr)) 302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteYes: 302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNoOpinion: 302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNo: 303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStopped: 303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateCrashed: 303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateSuspended: 304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We've stopped. First see if we're going to restart the target. 304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we are going to stop, then we always broadcast the event. 304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't going to stop, let the thread plans decide if we're going to report this event. 304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If no thread has an opinion, we don't report it. 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ProcessEventData::GetInterruptedFromEvent (event_ptr)) 304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s", event_ptr, StateAsCString(state)); 304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RefreshStateAfterStop (); 305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_list.ShouldStop (event_ptr) == false) 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_thread_list.ShouldReportStop (event_ptr)) 305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteYes: 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process::ProcessEventData::SetRestartedInEvent (event_ptr, true); 306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Intentional fall-through here. 306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNoOpinion: 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNo: 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state)); 30705a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham Resume (); 30713ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 30723ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham else 307320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 307420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton return_value = true; 30753ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham SynchronouslyNotifyStateChanged (state); 30763ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 30773ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::ShouldBroadcastEvent (%p) => %s - %s", event_ptr, StateAsCString(state), return_value ? "YES" : "NO"); 308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_value; 308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3087028784b321087f1547df8f02f01631c59e5a9859Johnny Chenbool 308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StartPrivateStateThread (bool force) 308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool already_running = PrivateStateThreadIsValid (); 309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s()%s ", __FUNCTION__, already_running ? " already running" : " starting private state thread"); 30953ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!force && already_running) 309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 309924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Create a thread that watches our internal state and controls which 310024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // events make it to clients (into the DCProcess event queue). 310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char thread_name[1024]; 310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (already_running) 310324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state-override(pid=%llu)>", GetID()); 310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state(pid=%llu)>", GetID()); 310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Create the private state thread, and start it running. 31087e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda m_private_state_thread = Host::ThreadCreate (thread_name, Process::PrivateStateThread, this, NULL); 310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool success = IS_VALID_LLDB_HOST_THREAD(m_private_state_thread); 311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (success) 311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ResumePrivateStateThread(); 311324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 31141831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham } 311524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 3116e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton return false; 311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3118b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 311924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3120b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcess::PausePrivateStateThread () 3121b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 31221831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham ControlPrivateStateThread (eBroadcastInternalStateControlPause); 3123b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ResumePrivateStateThread () 3127a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton{ 31281831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham ControlPrivateStateThread (eBroadcastInternalStateControlResume); 31291831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham} 31301831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 31311831e78a6253392fca1c99e555e7adaa3f372647Jim Inghamvoid 3132d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim InghamProcess::StopPrivateStateThread () 3133d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham{ 3134a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (PrivateStateThreadIsValid ()) 3135d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham ControlPrivateStateThread (eBroadcastInternalStateControlStop); 3136d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham} 3137d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 3138d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Inghamvoid 3139d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim InghamProcess::ControlPrivateStateThread (uint32_t signal) 3140d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham{ 3141d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 3142d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (signal == eBroadcastInternalStateControlStop || 314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal == eBroadcastInternalStateControlPause || 314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal == eBroadcastInternalStateControlResume); 314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal); 314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Signal the private state thread. First we should copy this is case the 315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // thread starts exiting since the private state thread will NULL this out 315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // when it exits 315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb::thread_t private_state_thread = m_private_state_thread; 315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IS_VALID_LLDB_HOST_THREAD(private_state_thread)) 315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 315624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TimeValue timeout_time; 315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool timed_out; 315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_broadcaster.BroadcastEvent (signal, NULL); 3160b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 3161b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton timeout_time = TimeValue::Now(); 31627fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham timeout_time.OffsetWithSeconds(2); 31637fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out); 31647fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham m_private_state_control_wait.SetValue (false, eBroadcastNever); 31657fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham 31667fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham if (signal == eBroadcastInternalStateControlStop) 31677fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham { 316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (timed_out) 316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Host::ThreadCancel (private_state_thread, NULL); 317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread_result_t result = NULL; 317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Host::ThreadJoin (private_state_thread, &result, NULL); 31737fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham m_private_state_thread = LLDB_INVALID_HOST_THREAD; 317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::HandlePrivateEvent (EventSP &event_sp) 3180f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton{ 318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3182f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton 3183f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton const StateType new_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3184f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton 3185f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // First check to see if anybody wants a shot at this event: 318609c81efd010d1c9ac8821bad00cdfc9747fcae79Greg Clayton if (m_next_event_action_ap.get() != NULL) 318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NextEventAction::EventActionResult action_result = m_next_event_action_ap->PerformAction(event_sp); 318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (action_result) 319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case NextEventAction::eEventActionSuccess: 319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetNextEventAction(NULL); 319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31957fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham case NextEventAction::eEventActionRetry: 31967fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham break; 319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case NextEventAction::eEventActionExit: 319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Handle Exiting Here. If we already got an exited event, 320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we should just propagate it. Otherwise, swallow this event, 320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and set our state to exit so the next event will kill us. 320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (new_state != eStateExited) 32037fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham { 32047fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham // FIXME: should cons up an exited event, and discard this one. 32057fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham SetExitStatus(0, m_next_event_action_ap->GetExitString()); 32067fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham SetNextEventAction(NULL); 32077fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham return; 32087fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham } 32097fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham SetNextEventAction(NULL); 32107fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham break; 32117fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham } 32127fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham } 32137fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham 321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if we should broadcast this state to external clients? 321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const bool should_broadcast = ShouldBroadcastEvent (event_sp.get()); 3216f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton 3217c607d8681f443d03806f105ceceb11dcadd16184Greg Clayton if (should_broadcast) 321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 32207fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham { 32217fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham log->Printf ("Process::%s (pid = %llu) broadcasting new state %s (old state %s) to %s", 32227fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham __FUNCTION__, 32237fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham GetID(), 32247fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham StateAsCString(new_state), 322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString (GetState ()), 322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public"); 322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get()); 322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (StateIsRunningState (new_state)) 3230e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton PushProcessInputReader (); 3231c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham else 323268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton PopProcessInputReader (); 3233c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 3234c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham BroadcastEvent (event_sp); 323568bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham } 3236c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham else 323768bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham { 3238c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (log) 3239c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 3240c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham log->Printf ("Process::%s (pid = %llu) suppressing state %s (old state %s): should_broadcast == false", 3241c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham __FUNCTION__, 3242c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham GetID(), 32432d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton StateAsCString(new_state), 3244c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham StateAsCString (GetState ())); 3245c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 32462d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton } 3247c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham} 324884c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham 324984c8638c46e3325d73e614b4ce0ad383ff216488Jim Inghamvoid * 325084c8638c46e3325d73e614b4ce0ad383ff216488Jim InghamProcess::PrivateStateThread (void *arg) 325184c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham{ 325284c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham Process *proc = static_cast<Process*> (arg); 325384c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham void *result = proc->RunPrivateStateThread (); 325468bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham return result; 325584c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham} 325684c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham 325784c8638c46e3325d73e614b4ce0ad383ff216488Jim Inghamvoid * 325884c8638c46e3325d73e614b4ce0ad383ff216488Jim InghamProcess::RunPrivateStateThread () 3259c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham{ 3260c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham bool control_only = true; 3261c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham m_private_state_control_wait.SetValue (true, eBroadcastNever); 3262c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 326524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (arg = %p, pid = %llu) thread starting...", __FUNCTION__, this, GetID()); 326624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 326724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool exit_now = false; 326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (!exit_now) 326924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3270444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton EventSP event_sp; 327168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton WaitForEventsPrivate (NULL, event_sp, control_only); 327268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster)) 327368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton { 327468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton switch (event_sp->GetType()) 327568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton { 327624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlStop: 3277d60d94a5126b93fda98678a68322abc2164073dbJim Ingham exit_now = true; 327868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton continue; // Go to next loop iteration so we exit without 3279861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; // doing any internal state managment below 3280861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3281861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eBroadcastInternalStateControlPause: 3282d60d94a5126b93fda98678a68322abc2164073dbJim Ingham control_only = true; 328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlResume: 328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner control_only = false; 328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3289444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 329068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton if (log) 329168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton log->Printf ("Process::%s (arg = %p, pid = %llu) got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType()); 329268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton 32937e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda m_private_state_control_wait.SetValue (true, eBroadcastAlways); 329424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 329524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 329624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (internal_state != eStateInvalid) 330124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (internal_state == eStateInvalid || 330624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner internal_state == eStateExited || 330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner internal_state == eStateDetached ) 330824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3309d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham if (log) 33107fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham log->Printf ("Process::%s (arg = %p, pid = %llu) about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state)); 331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3312e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton break; 331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3314444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton } 331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Verify log is still enabled before attempting to write to it... 331724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (arg = %p, pid = %llu) thread exiting...", __FUNCTION__, this, GetID()); 331924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 332024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (true, eBroadcastAlways); 332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_thread = LLDB_INVALID_HOST_THREAD; 332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 33237fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham} 33247fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham 33257fa7b2f813120a78818246e2d185643a32fa9391Jim Ingham//------------------------------------------------------------------ 332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process Event Data 332724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData () : 333024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventData (), 333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp (), 333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_state (eStateInvalid), 333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_restarted (false), 333424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_update_state (0), 333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_interrupted (false) 333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) : 33403ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham EventData (), 334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp (process_sp), 33423ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_state (state), 334324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_restarted (false), 334424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_update_state (0), 334524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_interrupted (false) 334624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 334724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 334824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::~ProcessEventData() 335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 335124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 335224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33533b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Claytonconst ConstString & 33543b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg ClaytonProcess::ProcessEventData::GetFlavorString () 33553b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton{ 33563ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham static ConstString g_flavor ("Process::ProcessEventData"); 33573ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return g_flavor; 3358444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton} 33593ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 336024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 33613ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::GetFlavor () const 336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ProcessEventData::GetFlavorString (); 3364926060e198137f8a64face70455324a8cd4362a5Caroline Tice} 336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3366444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonvoid 336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::DoOnRemoval (Event *event_ptr) 3368a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton{ 3369a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton // This function gets called twice for each event, once when the event gets pulled 337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // off of the private process event queue, and then any number of times, first when it gets pulled off of 337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the public event queue, then other times when we're pretending that this is where we stopped at the 337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // end of expression evaluation. m_update_state is used to distinguish these 337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // three cases; it is 0 when we're just pulling it off for private handling, 337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and > 1 for expression evaluation, and we don't want to do the breakpoint command handling then. 337524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 337624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_update_state != 1) 337724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 337824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp->SetPublicState (m_state); 338024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 338154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton // If we're stopped and haven't restarted, then do the breakpoint commands here: 33826cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham if (m_state == eStateStopped && ! m_restarted) 33833ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadList &curr_thread_list = m_process_sp->GetThreadList(); 338524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_threads = curr_thread_list.GetSize(); 338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx; 338724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The actions might change one of the thread's stop_info's opinions about whether we should 338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // stop the process, so we need to query that as we go. 339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 339154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton // One other complication here, is that we try to catch any case where the target has run (except for expressions) 33926cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // and immediately exit, but if we get that wrong (which is possible) then the thread list might have changed, and 33933ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham // that would cause our iteration here to crash. We could make a copy of the thread list, but we'd really like 339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to also know if it has changed at all, so we make up a vector of the thread ID's and check what we get back 339524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // against this list & bag out if anything differs. 339624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> thread_index_array(num_threads); 339724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; idx < num_threads; ++idx) 339824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread_index_array[idx] = curr_thread_list.GetThreadAtIndex(idx)->GetIndexID(); 339924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool still_should_stop = true; 340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; idx < num_threads; ++idx) 340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_thread_list = m_process_sp->GetThreadList(); 340524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_thread_list.GetSize() != num_threads) 340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 340724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 340824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Number of threads changed from %u to %u while processing event.", num_threads, curr_thread_list.GetSize()); 341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 341324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ThreadSP thread_sp = curr_thread_list.GetThreadAtIndex(idx); 341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread_sp->GetIndexID() != thread_index_array[idx]) 341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 34186cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham if (log) 34196cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham log->Printf("The thread at position %u changed from %u to %u while processing event.", 34206cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham idx, 34216cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham thread_index_array[idx], 34226cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham thread_sp->GetIndexID()); 342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 34246cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham } 342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopInfoSP stop_info_sp = thread_sp->GetStopInfo (); 342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (stop_info_sp) 342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner stop_info_sp->PerformAction(event_ptr); 343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The stop action might restart the target. If it does, then we want to mark that in the 34310296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // event so that whoever is receiving it will know to wait for the running event and reflect 34320296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // that state appropriately. 3433d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton // We also need to stop processing actions, since they aren't expecting the target to be running. 3434d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton 3435643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton // FIXME: we might have run. 343621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (stop_info_sp->HasTargetRunSinceMe()) 343721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 34380296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham SetRestarted (true); 34390296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham break; 34400296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham } 34410296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham else if (!stop_info_sp->ShouldStop(event_ptr)) 34420296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 34430296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham still_should_stop = false; 3444d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton } 34450296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham } 34460296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham } 34470296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 344821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 344921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (m_process_sp->GetPrivateState() != eStateRunning) 345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 345124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!still_should_stop) 34520296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 34530296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // We've been asked to continue, so do that here. 34540296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham SetRestarted(true); 34550296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham m_process_sp->Resume(); 345660526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham } 3457d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton else 34580296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 34590296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // If we didn't restart, run the Stop Hooks here: 34600296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // They might also restart the target, so watch for that. 34610296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham m_process_sp->GetTarget().RunStopHooks(); 34620296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham if (m_process_sp->GetPrivateState() == eStateRunning) 34630296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham SetRestarted(true); 34640296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham } 34650296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham } 346660526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham 3467d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton } 346860526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham} 346960526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham 347060526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Inghamvoid 34710296fe73a7cb1482226b1303a795ede00e12d677Jim InghamProcess::ProcessEventData::Dump (Stream *s) const 34720296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham{ 34730296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham if (m_process_sp) 34746297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham s->Printf(" process = %p (pid = %llu), ", m_process_sp.get(), m_process_sp->GetID()); 34756297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham 347624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("state = %s", StateAsCString(GetState())); 34776297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham} 347821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 347921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Inghamconst Process::ProcessEventData * 348021f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamProcess::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr) 348121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham{ 34820296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham if (event_ptr) 34830296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 34840296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham const EventData *event_data = event_ptr->GetData(); 348521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString()) 348621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return static_cast <const ProcessEventData *> (event_ptr->GetData()); 348721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 348821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return NULL; 348921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham} 349021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 349121f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamProcessSP 349221f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamProcess::ProcessEventData::GetProcessFromEvent (const Event *event_ptr) 349324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 349424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp; 34956fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 349621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (data) 349721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham process_sp = data->GetProcessSP(); 3498d60d94a5126b93fda98678a68322abc2164073dbJim Ingham return process_sp; 349921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham} 350021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 350121f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamStateType 3502d60d94a5126b93fda98678a68322abc2164073dbJim InghamProcess::ProcessEventData::GetStateFromEvent (const Event *event_ptr) 350321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham{ 350421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 350521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (data == NULL) 350621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return eStateInvalid; 350721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else 350821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return data->GetState(); 350921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham} 351021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 351121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Inghambool 351221f37ad875d4f50d1b4b3d307e120f6d27103730Jim InghamProcess::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr) 3513d60d94a5126b93fda98678a68322abc2164073dbJim Ingham{ 3514d60d94a5126b93fda98678a68322abc2164073dbJim Ingham const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 351524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data == NULL) 351624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 351724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 351824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data->GetRestarted(); 351924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3522444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonProcess::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value) 352324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3524b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 352524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data != NULL) 352624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetRestarted(new_value); 352724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 352824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr) 353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 353224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data == NULL) 353424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data->GetInterrupted (); 353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 353824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 353924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 354024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value) 354124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 354324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data != NULL) 354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetInterrupted(new_value); 354524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 354724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 354824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr) 354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 355024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 355124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data) 355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 355324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetUpdateStateOnRemoval(); 355424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 355524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 355824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 355924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::TargetSP 356024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CalculateTarget () 356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target.shared_from_this(); 356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 356624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CalculateExecutionContext (ExecutionContext &exe_ctx) 356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 356824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.SetTargetPtr (&m_target); 356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.SetProcessPtr (this); 357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.SetThreadPtr(NULL); 357124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_ctx.SetFramePtr (NULL); 357224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 357324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 357424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids) 357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 35783ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//} 35793ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham// 35803ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//ArchSpec 35813ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//Process::GetArchSpecForExistingProcess (lldb::pid_t pid) 35823ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//{ 35833ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham// return Host::GetArchSpecForExistingProcess (pid); 35843ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//} 35853ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham// 35863ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//ArchSpec 35873ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//Process::GetArchSpecForExistingProcess (const char *process_name) 35883ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//{ 35893ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham// return Host::GetArchSpecForExistingProcess (process_name); 35903ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham//} 35913ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham// 35923ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghamvoid 35933ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::AppendSTDOUT (const char * s, size_t len) 35943ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{ 35953ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham Mutex::Locker locker (m_stdio_communication_mutex); 359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stdout_data.append (s, len); 359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (GetTarget().GetProcessSP(), GetState())); 359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 359924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 360024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 360124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::AppendSTDERR (const char * s, size_t len) 360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 360324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_stdio_communication_mutex); 360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stderr_data.append (s, len); 360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BroadcastEventIfUnique (eBroadcastBitSTDERR, new ProcessEventData (GetTarget().GetProcessSP(), GetState())); 360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3607289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton 3608289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton//------------------------------------------------------------------ 3609289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton// Process STDIO 3610289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton//------------------------------------------------------------------ 3611289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton 3612289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Claytonsize_t 361324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetSTDOUT (char *buf, size_t buf_size, Error &error) 3614a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton{ 361524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker(m_stdio_communication_mutex); 3616567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton size_t bytes_available = m_stdout_data.size(); 3617567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (bytes_available > 0) 3618567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 3619567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 362024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 362124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::GetSTDOUT (buf = %p, size = %zu)", buf, buf_size); 3622e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (bytes_available > buf_size) 3623e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 3624e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton memcpy(buf, m_stdout_data.c_str(), buf_size); 3625e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton m_stdout_data.erase(0, buf_size); 3626e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton bytes_available = buf_size; 3627e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 3628e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 3629e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 3630e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton memcpy(buf, m_stdout_data.c_str(), bytes_available); 3631e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton m_stdout_data.clear(); 3632e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 3633e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 3634e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return bytes_available; 3635e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 3636e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 3637e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 3638e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonsize_t 3639e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonProcess::GetSTDERR (char *buf, size_t buf_size, Error &error) 3640861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3641861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Mutex::Locker locker(m_stdio_communication_mutex); 3642861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice size_t bytes_available = m_stderr_data.size(); 364320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (bytes_available > 0) 3644861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3645b37813353540bcabee7af5f096515a8180be0426Greg Clayton LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3646861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (log) 3647861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice log->Printf ("Process::GetSTDERR (buf = %p, size = %zu)", buf, buf_size); 3648861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (bytes_available > buf_size) 3649bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 3650bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton memcpy(buf, m_stderr_data.c_str(), buf_size); 3651bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stderr_data.erase(0, buf_size); 3652bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton bytes_available = buf_size; 3653bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 3654bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton else 3655bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 3656bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton memcpy(buf, m_stderr_data.c_str(), bytes_available); 3657bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stderr_data.clear(); 3658bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 3659bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 3660bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton return bytes_available; 3661bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton} 3662bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3663bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Claytonvoid 3664bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg ClaytonProcess::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len) 3665bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton{ 3666bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton Process *process = (Process *) baton; 3667bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton process->AppendSTDOUT (static_cast<const char *>(src), src_len); 3668bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton} 3669bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3670bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Claytonsize_t 3671bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg ClaytonProcess::ProcessInputReaderCallback (void *baton, 3672bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton InputReader &reader, 3673bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton lldb::InputReaderAction notification, 3674bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton const char *bytes, 3675bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton size_t bytes_len) 3676bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton{ 3677bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton Process *process = (Process *) baton; 3678bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3679bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton switch (notification) 3680bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 3681bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton case eInputReaderActivate: 3682bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton break; 3683bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3684bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton case eInputReaderDeactivate: 3685bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton break; 3686bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3687bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton case eInputReaderReactivate: 3688bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton break; 3689bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3690bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton case eInputReaderAsynchronousOutputWritten: 3691bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton break; 3692bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3693bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton case eInputReaderGotToken: 3694bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 3695bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton Error error; 3696bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton process->PutSTDIN (bytes, bytes_len, error); 3697bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 3698bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton break; 3699bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3700bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton case eInputReaderInterrupt: 3701bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton process->Halt (); 3702bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton break; 3703bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3704bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton case eInputReaderEndOfFile: 3705bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton process->AppendSTDOUT ("^D", 2); 3706bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton break; 3707bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3708bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton case eInputReaderDone: 3709bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton break; 3710bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3711bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 3712861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3713861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice return bytes_len; 3714861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3715861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3716861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3717861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ResetProcessInputReader () 3718861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3719861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 3720861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3721861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3722861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3723861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::SetSTDIOFileDescriptor (int file_descriptor) 3724861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3725861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // First set up the Read Thread for reading/handling process I/O 3726861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3727861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice std::auto_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true)); 3728861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3729861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (conn_ap.get()) 3730861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3731861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.SetConnection (conn_ap.release()); 3732861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_stdio_communication.IsConnected()) 3733861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3734861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this); 3735861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.StartReadThread(); 3736861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3737861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // Now read thread is set up, set up input reader. 37384a348081030cdd2af758fddc869518357d9befd3Caroline Tice 37394a348081030cdd2af758fddc869518357d9befd3Caroline Tice if (!m_process_input_reader.get()) 37404a348081030cdd2af758fddc869518357d9befd3Caroline Tice { 3741861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset (new InputReader(m_target.GetDebugger())); 3742861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback, 3743861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice this, 3744861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice eInputReaderGranularityByte, 3745861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice NULL, 3746861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice NULL, 3747861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice false)); 3748c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 3749c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice if (err.Fail()) 3750c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice m_process_input_reader.reset(); 3751c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 3752c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 3753c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 3754c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 3755c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 3756861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3757861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PushProcessInputReader () 3758861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3759861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && !m_process_input_reader->IsActive()) 3760861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PushInputReader (m_process_input_reader); 3761861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3762861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3763861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3764861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PopProcessInputReader () 3765861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3766861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && m_process_input_reader->IsActive()) 3767861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PopInputReader (m_process_input_reader); 3768861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3769861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3770861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice// The process needs to know about installed plug-ins 3771464c6161464694412b7472129e789248f1cf21b9Greg Claytonvoid 3772861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::SettingsInitialize () 3773861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3774861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice static std::vector<OptionEnumValueElement> g_plugins; 3775861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3776861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice int i=0; 3777861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice const char *name; 3778861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice OptionEnumValueElement option_enum; 3779861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice while ((name = PluginManager::GetProcessPluginNameAtIndex (i)) != NULL) 3780861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3781861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (name) 3782861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3783861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice option_enum.value = i; 3784861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice option_enum.string_value = name; 3785861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice option_enum.usage = PluginManager::GetProcessPluginDescriptionAtIndex (i); 3786861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice g_plugins.push_back (option_enum); 3787861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3788861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice ++i; 3789861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3790861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice option_enum.value = 0; 3791861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice option_enum.string_value = NULL; 3792861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice option_enum.usage = NULL; 3793861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice g_plugins.push_back (option_enum); 3794861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3795861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice for (i=0; (name = SettingsController::instance_settings_table[i].var_name); ++i) 3796861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3797861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (::strcmp (name, "plugin") == 0) 3798861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3799861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice SettingsController::instance_settings_table[i].enum_values = &g_plugins[0]; 3800861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3801861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3802861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3803861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice UserSettingsControllerSP &usc = GetSettingsController(); 3804861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice usc.reset (new SettingsController); 3805861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice UserSettingsController::InitializeSettingsController (usc, 3806861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice SettingsController::global_settings_table, 3807861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice SettingsController::instance_settings_table); 3808861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3809861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // Now call SettingsInitialize() for each 'child' of Process settings 3810861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Thread::SettingsInitialize (); 3811861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3812861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3813861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3814861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::SettingsTerminate () 3815861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3816861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // Must call SettingsTerminate() on each 'child' of Process settings before terminating Process settings. 3817861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3818d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton Thread::SettingsTerminate (); 3819990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 38202a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Now terminate Process Settings. 3821990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 3822b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton UserSettingsControllerSP &usc = GetSettingsController(); 3823d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton UserSettingsController::FinalizeSettingsController (usc); 3824d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton usc.reset(); 3825d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton} 3826d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton 3827d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg ClaytonUserSettingsControllerSP & 3828d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg ClaytonProcess::GetSettingsController () 3829d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton{ 3830d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton static UserSettingsControllerSP g_settings_controller_sp; 3831d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton if (!g_settings_controller_sp) 3832d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3833d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton g_settings_controller_sp.reset (new Process::SettingsController); 3834d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton // The first shared pointer to Process::SettingsController in 3835d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton // g_settings_controller_sp must be fully created above so that 3836d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton // the TargetInstanceSettings can use a weak_ptr to refer back 3837d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton // to the master setttings controller 3838d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton InstanceSettingsSP default_instance_settings_sp (new ProcessInstanceSettings (g_settings_controller_sp, 3839d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton false, 3840d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton InstanceSettings::GetDefaultName().AsCString())); 3841d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton g_settings_controller_sp->SetDefaultInstanceSettings (default_instance_settings_sp); 3842d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3843d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton return g_settings_controller_sp; 3844d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton 3845d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton} 3846d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton 3847d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Claytonvoid 3848d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg ClaytonProcess::UpdateInstanceName () 3849d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton{ 3850d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton Module *module = GetTarget().GetExecutableModulePointer(); 3851990de7bb41d3afec6b789155408ff322187d8682Greg Clayton if (module && module->GetFileSpec().GetFilename()) 3852990de7bb41d3afec6b789155408ff322187d8682Greg Clayton { 3853990de7bb41d3afec6b789155408ff322187d8682Greg Clayton GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(), 3854990de7bb41d3afec6b789155408ff322187d8682Greg Clayton module->GetFileSpec().GetFilename().AsCString()); 3855990de7bb41d3afec6b789155408ff322187d8682Greg Clayton } 38562a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice} 38572a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 38582a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceExecutionResults 3859990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonProcess::RunThreadPlan (ExecutionContext &exe_ctx, 38606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice lldb::ThreadPlanSP &thread_plan_sp, 3861990de7bb41d3afec6b789155408ff322187d8682Greg Clayton bool stop_others, 38622a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice bool try_all_threads, 3863990de7bb41d3afec6b789155408ff322187d8682Greg Clayton bool discard_on_error, 38642a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice uint32_t single_thread_timeout_usec, 38652a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice Stream &errors) 38662a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{ 38672a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice ExecutionResults return_value = eExecutionSetupError; 38682a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 38692a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice if (thread_plan_sp.get() == NULL) 3870990de7bb41d3afec6b789155408ff322187d8682Greg Clayton { 3871990de7bb41d3afec6b789155408ff322187d8682Greg Clayton errors.Printf("RunThreadPlan called with empty thread plan."); 3872990de7bb41d3afec6b789155408ff322187d8682Greg Clayton return eExecutionSetupError; 3873990de7bb41d3afec6b789155408ff322187d8682Greg Clayton } 38746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 3875990de7bb41d3afec6b789155408ff322187d8682Greg Clayton if (exe_ctx.GetProcessPtr() != this) 3876990de7bb41d3afec6b789155408ff322187d8682Greg Clayton { 3877990de7bb41d3afec6b789155408ff322187d8682Greg Clayton errors.Printf("RunThreadPlan called on wrong process."); 3878334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton return eExecutionSetupError; 3879334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton } 3880334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton 3881334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 3882334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton if (thread == NULL) 3883334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton { 3884334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton errors.Printf("RunThreadPlan called with invalid thread."); 3885334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton return eExecutionSetupError; 3886334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton } 3887334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton 3888334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton // We rely on the thread plan we are running returning "PlanCompleted" if when it successfully completes. 3889334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton // For that to be true the plan can't be private - since private plans suppress themselves in the 3890334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton // GetCompletedPlan call. 3891334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton 3892334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton bool orig_plan_private = thread_plan_sp->GetPrivate(); 38936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice thread_plan_sp->SetPrivate(false); 38946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 38951ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice if (m_private_state.GetValue() != eStateStopped) 38961ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice { 38971ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice errors.Printf ("RunThreadPlan called while the private state was not stopped."); 38985beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton return eExecutionSetupError; 389913d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton } 39001ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 3901c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton // Save the thread & frame from the exe_ctx for restoration after we run 390213d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton const uint32_t thread_idx_id = thread->GetIndexID(); 39031ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice StackID ctx_frame_id = thread->GetSelectedFrame()->GetStackID(); 39041ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 39051ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice // N.B. Running the target may unset the currently selected thread and frame. We don't want to do that either, 3906427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton // so we should arrange to reset them as well. 3907360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 39081831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham lldb::ThreadSP selected_thread_sp = GetThreadList().GetSelectedThread(); 3909360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3910360f53f3c216ee4fb433da0a367168785328a856Jim Ingham uint32_t selected_tid; 3911360f53f3c216ee4fb433da0a367168785328a856Jim Ingham StackID selected_stack_id; 3912360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (selected_thread_sp) 3913360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3914360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_tid = selected_thread_sp->GetIndexID(); 3915360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_stack_id = selected_thread_sp->GetSelectedFrame()->GetStackID(); 3916360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 391715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham else 391815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 391915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham selected_tid = LLDB_INVALID_THREAD_ID; 3920b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton } 392115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 3922567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::thread_t backup_private_state_thread = LLDB_INVALID_HOST_THREAD; 3923567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::StateType old_state; 3924567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::ThreadPlanSP stopper_base_plan_sp; 3925567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3926567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 3927567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (Host::GetCurrentThread() == m_private_state_thread) 3928567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 3929567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton // Yikes, we are running on the private state thread! So we can't wait for public events on this thread, since 3930567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton // we are the thread that is generating public events. 3931567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton // The simplest thing to do is to spin up a temporary thread to handle private state thread events while 3932567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton // we are fielding public events here. 3933567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (log) 3934567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton log->Printf ("Running thread plan on private state thread, spinning up another state thread to handle the events."); 393515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 39365ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham 39375ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham backup_private_state_thread = m_private_state_thread; 39385ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham 39395ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // One other bit of business: we want to run just this thread plan and anything it pushes, and then stop, 39405ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // returning control here. 39415ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // But in the normal course of things, the plan above us on the stack would be given a shot at the stop 39425ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // event before deciding to stop, and we don't want that. So we insert a "stopper" base plan on the stack 3943ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham // before the plan we want to run. Since base plans always stop and return control to the user, that will 3944ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham // do just what we want. 3945ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham stopper_base_plan_sp.reset(new ThreadPlanBase (*thread)); 3946b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton thread->QueueThreadPlan (stopper_base_plan_sp, false); 3947ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham // Have to make sure our public state is stopped, since otherwise the reporting logic below doesn't work correctly. 3948ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham old_state = m_public_state.GetValue(); 39497bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham m_public_state.SetValueNoLock(eStateStopped); 3950567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3951567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton // Now spin up the private state thread: 3952360f53f3c216ee4fb433da0a367168785328a856Jim Ingham StartPrivateStateThread(true); 3953360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3954360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3955360f53f3c216ee4fb433da0a367168785328a856Jim Ingham thread->QueueThreadPlan(thread_plan_sp, false); // This used to pass "true" does that make sense? 3956567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3957360f53f3c216ee4fb433da0a367168785328a856Jim Ingham Listener listener("lldb.process.listener.run-thread-plan"); 39587bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham 39597bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham // This process event hijacker Hijacks the Public events and its destructor makes sure that the process events get 3960e40b6424d9e49306392bec4b44060da36414c382Greg Clayton // restored on exit to the function. 3961360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3962360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ProcessEventHijacker run_thread_plan_hijacker (*this, &listener); 39637bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham 3964360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 3965360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3966360f53f3c216ee4fb433da0a367168785328a856Jim Ingham StreamString s; 3967360f53f3c216ee4fb433da0a367168785328a856Jim Ingham thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose); 3968360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->Printf ("Process::RunThreadPlan(): Resuming thread %u - 0x%4.4llx to run thread plan \"%s\".", 3969360f53f3c216ee4fb433da0a367168785328a856Jim Ingham thread->GetIndexID(), 39701831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham thread->GetID(), 3971d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham s.GetData()); 3972d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham } 39731831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 3974d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham bool got_event; 39751831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham lldb::EventSP event_sp; 39761831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham lldb::StateType stop_state = lldb::eStateInvalid; 3977d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 3978d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham TimeValue* timeout_ptr = NULL; 39791831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham TimeValue real_timeout; 3980d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 3981d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham bool first_timeout = true; 3982d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham bool do_resume = true; 3983d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 3984d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham while (1) 39851831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham { 3986d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // We usually want to resume the process if we get to the top of the loop. 3987d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // The only exception is if we get two running events with no intervening 3988d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // stop, which can happen, we will just wait for then next stop event. 3989d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 3990d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham if (do_resume) 3991d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham { 3992d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham // Do the initial resume and wait for the running event before going further. 3993d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 3994d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham Error resume_error = Resume (); 3995d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham if (!resume_error.Success()) 3996d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham { 3997d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham errors.Printf("Error resuming inferior: \"%s\".\n", resume_error.AsCString()); 3998d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham return_value = eExecutionSetupError; 3999d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham break; 40001831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham } 40011831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 40021831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham real_timeout = TimeValue::Now(); 40031831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham real_timeout.OffsetWithMicroSeconds(500000); 4004360f53f3c216ee4fb433da0a367168785328a856Jim Ingham timeout_ptr = &real_timeout; 40056ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham 4006f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent(timeout_ptr, event_sp); 4007f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!got_event) 4008f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4009f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4010f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString("Didn't get any event after initial resume, exiting."); 4011ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham 401215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham errors.Printf("Didn't get any event after initial resume, exiting."); 401315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham return_value = eExecutionSetupError; 401415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham break; 401515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 4016444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 4017567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 4018567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (stop_state != eStateRunning) 4019f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 402015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham if (log) 402115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham log->Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state)); 4022f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4023f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham errors.Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state)); 4024f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return_value = eExecutionSetupError; 4025360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 4026360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4027360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4028360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 4029f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString ("Resuming succeeded."); 4030f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We need to call the function synchronously, so spin waiting for it to return. 4031360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // If we get interrupted while executing, we're going to lose our context, and 4032360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // won't be able to gather the result at this point. 4033360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // We set the timeout AFTER the resume, since the resume takes some time and we 4034f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // don't want to charge that to the timeout. 4035f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4036f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (single_thread_timeout_usec != 0) 4037f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4038f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 4039f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 4040f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(single_thread_timeout_usec); 4041f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4042567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton real_timeout.OffsetWithSeconds(10); 4043f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4044f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham timeout_ptr = &real_timeout; 4045f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4046b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton } 4047f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4048f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4049f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4050f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString ("Handled an extra running event."); 4051f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham do_resume = true; 4052f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4053f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4054faf0478359a33b892bc778a52accbac1895725e4Sean Callanan // Now wait for the process to stop again: 4055d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham stop_state = lldb::eStateInvalid; 4056f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_sp.reset(); 4057f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent (timeout_ptr, event_sp); 4058f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham 4059f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (got_event) 4060f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4061b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (event_sp.get()) 4062f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4063f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool keep_going = false; 4064f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 4065f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4066f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf("In while loop, got event: %s.", StateAsCString(stop_state)); 4067f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4068f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham switch (stop_state) 4069f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham { 4070f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham case lldb::eStateStopped: 4071f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4072b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton // Yay, we're done. Now make sure that our thread plan actually completed. 4073f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ThreadSP thread_sp = GetThreadList().FindThreadByIndexID (thread_idx_id); 4074f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!thread_sp) 4075f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4076f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Ooh, our thread has vanished. Unlikely that this was successful execution... 4077f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham if (log) 4078f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Execution completed but our thread (index-id=%u) has vanished.", thread_idx_id); 4079f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return_value = eExecutionInterrupted; 4080f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4081f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4082f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4083f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StopInfoSP stop_info_sp (thread_sp->GetStopInfo ()); 4084f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StopReason stop_reason = eStopReasonInvalid; 4085f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_info_sp) 4086f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_reason = stop_info_sp->GetStopReason(); 4087f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham if (stop_reason == eStopReasonPlanComplete) 4088f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4089f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4090f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString ("Execution completed successfully."); 4091f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Now mark this plan as private so it doesn't get reported as the stop reason 4092f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // after this point. 4093f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (thread_plan_sp) 4094f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 4095f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham return_value = eExecutionCompleted; 4096f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4097f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4098f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4099360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 4100f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString ("Thread plan didn't successfully complete."); 4101f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4102f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham return_value = eExecutionInterrupted; 4103f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham } 4104f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham } 4105f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham } 4106f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham break; 4107f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham 4108f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham case lldb::eStateCrashed: 4109f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham if (log) 4110f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham log->PutCString ("Execution crashed."); 4111f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham return_value = eExecutionInterrupted; 4112f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham break; 4113f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham 4114f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham case lldb::eStateRunning: 4115f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham do_resume = false; 4116f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham keep_going = true; 4117f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham break; 4118f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham 4119f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham default: 4120f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4121360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->Printf("Execution stopped with unexpected state: %s.", StateAsCString(stop_state)); 4122f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4123360f53f3c216ee4fb433da0a367168785328a856Jim Ingham errors.Printf ("Execution stopped with unexpected state."); 4124f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return_value = eExecutionInterrupted; 4125f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4126f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4127f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (keep_going) 4128f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 4129f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham else 4130f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4131f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4132f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4133f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 41342370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham if (log) 4135439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton log->PutCString ("got_event was true, but the event pointer was null. How odd..."); 4136567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return_value = eExecutionInterrupted; 4137439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton break; 41382370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham } 4139439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton } 41402370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham else 4141f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham { 4142439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // If we didn't get an event that means we've timed out... 41432370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham // We will interrupt the process here. Depending on what we were asked to do we will 41442370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham // either exit, or try with all threads running for the same timeout. 41452370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham // Not really sure what to do if Halt fails here... 4146439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 4147439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (log) { 4148439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (try_all_threads) 4149439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton { 4150439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (first_timeout) 4151439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, " 4152439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton "trying with all threads enabled.", 4153f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham single_thread_timeout_usec); 4154439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton else 4155439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton log->Printf ("Process::RunThreadPlan(): Restarting function with all threads enabled " 4156439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton "and timeout: %d timed out.", 4157439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton single_thread_timeout_usec); 4158439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton } 4159439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton else 4160439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, " 4161439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton "halt and abandoning execution.", 4162439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton single_thread_timeout_usec); 4163f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham } 4164439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 4165439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton Error halt_error = Halt(); 4166439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (halt_error.Success()) 41672370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 4168439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (log) 4169439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton log->PutCString ("Process::RunThreadPlan(): Halt succeeded."); 4170439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 4171f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // If halt succeeds, it always produces a stopped event. Wait for that: 4172f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4173f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham real_timeout = TimeValue::Now(); 4174b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton real_timeout.OffsetWithMicroSeconds(500000); 4175f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4176439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton got_event = listener.WaitForEvent(&real_timeout, event_sp); 4177f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4178f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (got_event) 4179f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4180f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 4181439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (log) 4182f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4183f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): Stopped with event: %s", StateAsCString(stop_state)); 4184f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham if (stop_state == lldb::eStateStopped 41852370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get())) 41862370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham log->PutCString (" Event was the Halt interruption event."); 4187b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton } 4188f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4189f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state == lldb::eStateStopped) 4190f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4191f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Between the time we initiated the Halt and the time we delivered it, the process could have 4192f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // already finished its job. Check that here: 4193f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4194f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (thread->IsThreadPlanDone (thread_plan_sp.get())) 4195f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4196f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4197f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done. " 4198f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham "Exiting wait loop."); 4199b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionCompleted; 4200f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4201f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4202f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4203f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!try_all_threads) 4204f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4205f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4206f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString ("try_all_threads was false, we stopped so now we're quitting."); 4207f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return_value = eExecutionInterrupted; 4208360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 4209f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4210c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson 4211360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (first_timeout) 4212f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4213f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Set all the other threads to run, and return to the top of the loop, which will continue; 4214f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham first_timeout = false; 4215f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_plan_sp->SetStopOthers (false); 4216f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4217f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString ("Process::RunThreadPlan(): About to resume."); 4218f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4219f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 4220f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4221f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4222360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4223f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Running all threads failed, so return Interrupted. 4224f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4225360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->PutCString("Process::RunThreadPlan(): running all threads timed out."); 4226c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson return_value = eExecutionInterrupted; 4227360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 4228567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 4229c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 4230360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4231360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 4232f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham { if (log) 4233360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->PutCString("Process::RunThreadPlan(): halt said it succeeded, but I got no event. " 4234f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "I'm getting out of here passing Interrupted."); 4235f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return_value = eExecutionInterrupted; 4236f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4237f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4238f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4239f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4240360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4241360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // This branch is to work around some problems with gdb-remote's Halt. It is a little racy, and can return 4242360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // an error from halt, but if you wait a bit you'll get a stopped event anyway. 4243360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 4244360f53f3c216ee4fb433da0a367168785328a856Jim 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.", 4245360f53f3c216ee4fb433da0a367168785328a856Jim Ingham halt_error.AsCString()); 424668ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton real_timeout = TimeValue::Now(); 4247f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(500000); 4248f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham timeout_ptr = &real_timeout; 4249f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham got_event = listener.WaitForEvent(&real_timeout, event_sp); 4250360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (!got_event || event_sp.get() == NULL) 4251360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4252f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // This is not going anywhere, bag out. 4253360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 4254f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString ("Process::RunThreadPlan(): halt failed: and waiting for the stopped event failed."); 4255f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return_value = eExecutionInterrupted; 4256f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4257567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 4258f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4259f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4260f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 4261f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4262b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton log->PutCString ("Process::RunThreadPlan(): halt failed: but then I got a stopped event. Whatever..."); 4263f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state == lldb::eStateStopped) 4264f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4265360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Between the time we initiated the Halt and the time we delivered it, the process could have 4266f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // already finished its job. Check that here: 4267f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4268f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (thread->IsThreadPlanDone (thread_plan_sp.get())) 4269f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham { 4270b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (log) 4271f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done. " 4272f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "Exiting wait loop."); 4273360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return_value = eExecutionCompleted; 4274f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4275f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4276f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4277f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 4278f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4279f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Set all the other threads to run, and return to the top of the loop, which will continue; 4280f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham first_timeout = false; 4281360f53f3c216ee4fb433da0a367168785328a856Jim Ingham thread_plan_sp->SetStopOthers (false); 4282f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4283f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString ("Process::RunThreadPlan(): About to resume."); 4284f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4285f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 4286f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4287f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4288f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham { 4289b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton // Running all threads failed, so return Interrupted. 4290f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4291f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString ("Process::RunThreadPlan(): running all threads timed out."); 4292360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return_value = eExecutionInterrupted; 4293360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 4294f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4295f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4296f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham else 4297f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4298b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (log) 4299f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): halt failed, I waited and didn't get" 4300f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham " a stopped event, instead got %s.", StateAsCString(stop_state)); 4301360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return_value = eExecutionInterrupted; 4302c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham break; 4303c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 4304f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4305f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4306c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham 4307f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4308f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4309f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } // END WAIT LOOP 4310f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4311f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // If we had to start up a temporary private state thread to run this thread plan, shut it down now. 4312f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (IS_VALID_LLDB_HOST_THREAD(backup_private_state_thread)) 4313f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 43146ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham StopPrivateStateThread(); 4315f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Error error; 4316f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham m_private_state_thread = backup_private_state_thread; 4317f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham if (stopper_base_plan_sp != NULL) 4318b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton { 4319f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread->DiscardThreadPlansUpToPlan(stopper_base_plan_sp); 4320f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4321f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham m_public_state.SetValueNoLock(old_state); 4322f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4323f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4324f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4325f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham 4326f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Now do some processing on the results of the run: 4327f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (return_value == eExecutionInterrupted) 4328f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4329f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4330f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4331567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StreamString s; 4332f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (event_sp) 4333f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_sp->Dump (&s); 4334f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham else 4335f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4336b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton log->PutCString ("Process::RunThreadPlan(): Stop event that interrupted us is NULL."); 4337f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4338f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4339f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StreamString ts; 4340f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4341f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham const char *event_explanation = NULL; 4342f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4343f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham do 4344f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4345f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get()); 4346f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham 4347f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!event_data) 4348f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4349f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_explanation = "<no event data>"; 4350f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4351f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4352f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4353f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Process *process = event_data->GetProcessSP().get(); 4354f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham 4355b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (!process) 4356f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4357f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_explanation = "<no process>"; 4358f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4359f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4360f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4361ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan ThreadList &thread_list = process->GetThreadList(); 4362ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan 4363ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan uint32_t num_threads = thread_list.GetSize(); 4364b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton uint32_t thread_index; 4365f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4366f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("<%u threads> ", num_threads); 43676ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham 4368c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham for (thread_index = 0; 4369c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham thread_index < num_threads; 4370360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ++thread_index) 4371360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4372f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Thread *thread = thread_list.GetThreadAtIndex(thread_index).get(); 4373f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 43741831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham if (!thread) 43751831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham { 43761831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham ts.Printf("<?> "); 43771831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham continue; 43781831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham } 43791831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 4380d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham ts.Printf("<0x%4.4llx ", thread->GetID()); 4381d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham RegisterContext *register_context = thread->GetRegisterContext().get(); 4382d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham 4383d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham if (register_context) 4384d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham ts.Printf("[ip 0x%llx] ", register_context->GetPC()); 4385d21d98b3cd51d9109631ad1605ee7f7dbac3cfbbJim Ingham else 43861831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham ts.Printf("[ip unknown] "); 43871831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 43881831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham lldb::StopInfoSP stop_info_sp = thread->GetStopInfo(); 4389f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_info_sp) 4390f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4391f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham const char *stop_desc = stop_info_sp->GetDescription(); 4392360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (stop_desc) 4393360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ts.PutCString (stop_desc); 4394f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4395f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf(">"); 4396f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4397f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4398360f53f3c216ee4fb433da0a367168785328a856Jim Ingham event_explanation = ts.GetData(); 4399f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham } while (0); 4400f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4401f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4402f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4403f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (event_explanation) 4404f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->Printf("Process::RunThreadPlan(): execution interrupted: %s %s", s.GetData(), event_explanation); 4405f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4406f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf("Process::RunThreadPlan(): execution interrupted: %s", s.GetData()); 4407f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4408f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4409f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (discard_on_error && thread_plan_sp) 4410f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4411c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 4412f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 4413f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4414c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 4415f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4416f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else if (return_value == eExecutionSetupError) 4417c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham { 4418f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4419f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString("Process::RunThreadPlan(): execution set up error."); 4420f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4421f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (discard_on_error && thread_plan_sp) 4422f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4423f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 4424f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 4425f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4426f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4427f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4428f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4429f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (thread->IsThreadPlanDone (thread_plan_sp.get())) 4430360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4431f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4432f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString("Process::RunThreadPlan(): thread plan is done"); 4433f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return_value = eExecutionCompleted; 4434360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4435f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else if (thread->WasThreadPlanDiscarded (thread_plan_sp.get())) 4436360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4437f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4438360f53f3c216ee4fb433da0a367168785328a856Jim Ingham log->PutCString("Process::RunThreadPlan(): thread plan was discarded"); 4439f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return_value = eExecutionDiscarded; 4440f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4441360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 4442360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4443444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (log) 4444f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString("Process::RunThreadPlan(): thread plan stopped in mid course"); 4445360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (discard_on_error && thread_plan_sp) 4446f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4447f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4448f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->PutCString("Process::RunThreadPlan(): discarding thread plan 'cause discard_on_error is set."); 4449f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 4450360f53f3c216ee4fb433da0a367168785328a856Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 4451f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4452f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4453c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 4454f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4455f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Thread we ran the function in may have gone away because we ran the target 4456f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Check that it's still there, and if it is put it back in the context. Also restore the 4457c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham // frame in the context if it is still present. 4458f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread = GetThreadList().FindThreadByIndexID(thread_idx_id, true).get(); 4459c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham if (thread) 4460f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4461f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham exe_ctx.SetFrameSP (thread->GetFrameWithStackID (ctx_frame_id)); 4462f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4463360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4464f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Also restore the current process'es selected frame & thread, since this function calling may 4465f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham // be done behind the user's back. 4466f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham 4467f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham if (selected_tid != LLDB_INVALID_THREAD_ID) 4468f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham { 4469f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham if (GetThreadList().SetSelectedThreadByIndexID (selected_tid) && selected_stack_id.IsValid()) 4470f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham { 4471f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We were able to restore the selected thread, now restore the frame: 4472360f53f3c216ee4fb433da0a367168785328a856Jim Ingham StackFrameSP old_frame_sp = GetThreadList().GetSelectedThread()->GetFrameWithStackID(selected_stack_id); 4473360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (old_frame_sp) 4474f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham GetThreadList().GetSelectedThread()->SetSelectedFrame(old_frame_sp.get()); 4475f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham } 4476567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 447721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 4478360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return return_value; 4479f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham} 4480f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham 4481f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Inghamconst char * 4482f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim InghamProcess::ExecutionResultAsCString (ExecutionResults result) 4483f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham{ 4484f641af3c2ff03ba3c0b1cee0a02a1b051f5e6ebcJim Ingham const char *result_name; 4485360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4486360f53f3c216ee4fb433da0a367168785328a856Jim Ingham switch (result) 4487f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4488f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham case eExecutionCompleted: 4489f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham result_name = "eExecutionCompleted"; 4490f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham break; 4491360f53f3c216ee4fb433da0a367168785328a856Jim Ingham case eExecutionDiscarded: 4492f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham result_name = "eExecutionDiscarded"; 4493f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4494567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton case eExecutionInterrupted: 449521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham result_name = "eExecutionInterrupted"; 4496f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4497f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham case eExecutionSetupError: 4498f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham result_name = "eExecutionSetupError"; 4499f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4500567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton case eExecutionTimedOut: 4501f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham result_name = "eExecutionTimedOut"; 4502f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4503f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham } 4504b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return result_name; 4505f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham} 4506567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 4507f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghamvoid 4508f9f40c20b210eea72ab042c63178ca000f005ed9Jim InghamProcess::GetStatus (Stream &strm) 4509f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham{ 4510b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const StateType state = GetState(); 4511f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (StateIsStoppedState(state, false)) 4512f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4513f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (state == eStateExited) 4514f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4515f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham int exit_status = GetExitStatus(); 4516f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham const char *exit_description = GetExitDescription(); 4517f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham strm.Printf ("Process %llu exited with status = %i (0x%8.8x) %s\n", 4518f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham GetID(), 4519f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham exit_status, 4520567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exit_status, 452121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham exit_description ? exit_description : ""); 4522f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4523f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4524f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4525f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (state == eStateConnected) 4526360f53f3c216ee4fb433da0a367168785328a856Jim Ingham strm.Printf ("Connected to remote target.\n"); 45277bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham else 45287bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham strm.Printf ("Process %llu %s\n", GetID(), StateAsCString (state)); 4529567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 4530567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 45317bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham else 4532567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 45337bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham strm.Printf ("Process %llu is running.\n", GetID()); 4534360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4535360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 4536360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4537360f53f3c216ee4fb433da0a367168785328a856Jim Inghamsize_t 4538360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::GetThreadStatus (Stream &strm, 4539360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool only_threads_with_stop_reason, 4540567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton uint32_t start_frame, 4541360f53f3c216ee4fb433da0a367168785328a856Jim Ingham uint32_t num_frames, 4542360f53f3c216ee4fb433da0a367168785328a856Jim Ingham uint32_t num_frames_with_source) 4543567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton{ 45447bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham size_t num_thread_infos_dumped = 0; 4545567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 4546360f53f3c216ee4fb433da0a367168785328a856Jim Ingham const size_t num_threads = GetThreadList().GetSize(); 4547360f53f3c216ee4fb433da0a367168785328a856Jim Ingham for (uint32_t i = 0; i < num_threads; i++) 4548360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4549360f53f3c216ee4fb433da0a367168785328a856Jim Ingham Thread *thread = GetThreadList().GetThreadAtIndex(i).get(); 4550360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (thread) 4551360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4552360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (only_threads_with_stop_reason) 4553360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4554360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (thread->GetStopInfo().get() == NULL) 4555360f53f3c216ee4fb433da0a367168785328a856Jim Ingham continue; 4556360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4557360f53f3c216ee4fb433da0a367168785328a856Jim Ingham thread->GetStatus (strm, 4558360f53f3c216ee4fb433da0a367168785328a856Jim Ingham start_frame, 4559b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton num_frames, 4560360f53f3c216ee4fb433da0a367168785328a856Jim Ingham num_frames_with_source); 4561360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ++num_thread_infos_dumped; 4562b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton } 4563360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4564360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return num_thread_infos_dumped; 4565b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton} 4566360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4567360f53f3c216ee4fb433da0a367168785328a856Jim Inghamvoid 4568b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonProcess::AddInvalidMemoryRegion (const LoadRange ®ion) 4569360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 4570360f53f3c216ee4fb433da0a367168785328a856Jim Ingham m_memory_cache.AddInvalidRange(region.GetRangeBase(), region.GetByteSize()); 4571b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton} 4572360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4573360f53f3c216ee4fb433da0a367168785328a856Jim Inghambool 4574360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::RemoveInvalidMemoryRange (const LoadRange ®ion) 4575360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 4576360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return m_memory_cache.RemoveInvalidRange(region.GetRangeBase(), region.GetByteSize()); 4577360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 4578abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 4579abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonvoid 4580abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::AddPreResumeAction (PreResumeActionCallback callback, void *baton) 4581abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 4582202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton m_pre_resume_actions.push_back(PreResumeCallbackAndBaton (callback, baton)); 4583abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 4584abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 4585abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonbool 4586abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::RunPreResumeActions () 4587abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 4588444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton bool result = true; 4589abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton while (!m_pre_resume_actions.empty()) 4590abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 4591abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton struct PreResumeCallbackAndBaton action = m_pre_resume_actions.back(); 4592abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton m_pre_resume_actions.pop_back(); 4593abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool this_result = action.callback (action.baton); 4594abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (result == true) result = this_result; 4595abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 4596abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton return result; 4597abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 4598abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 4599444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonvoid 4600abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::ClearPreResumeActions () 4601abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 4602abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton m_pre_resume_actions.clear(); 4603abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 4604444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 4605abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//-------------------------------------------------------------- 4606abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton// class Process::SettingsController 4607abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//-------------------------------------------------------------- 4608abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 4609abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::SettingsController::SettingsController () : 4610abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton UserSettingsController ("process", Target::GetSettingsController()) 4611abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 4612abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 4613abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 4614abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::SettingsController::~SettingsController () 4615abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 4616abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 4617abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 4618abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonlldb::InstanceSettingsSP 4619abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::SettingsController::CreateInstanceSettings (const char *instance_name) 4620abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 4621abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton lldb::InstanceSettingsSP new_settings_sp (new ProcessInstanceSettings (GetSettingsController(), 4622abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton false, 4623abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton instance_name)); 4624abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton return new_settings_sp; 4625abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 4626abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 4627abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//-------------------------------------------------------------- 4628abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton// class ProcessInstanceSettings 4629abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//-------------------------------------------------------------- 4630abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 4631abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcessInstanceSettings::ProcessInstanceSettings 4632abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton( 4633abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const UserSettingsControllerSP &owner_sp, 4634abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool live_instance, 4635abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const char *name 4636abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton) : 4637abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton InstanceSettings (owner_sp, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance) 4638761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton{ 4639761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called 4640761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton // until the vtables for ProcessInstanceSettings are properly set up, i.e. AFTER all the initializers. 4641761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton // For this reason it has to be called here, rather than in the initializer or in the parent constructor. 4642761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton // This is true for CreateInstanceName() too. 4643761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton 4644761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton if (GetInstanceName () == InstanceSettings::InvalidName()) 4645761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton { 4646761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton ChangeInstanceName (std::string (CreateInstanceName().AsCString())); 4647761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton owner_sp->RegisterInstanceSettings (this); 4648761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton } 4649761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton 46501831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham if (live_instance) 46511831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham { 46521831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham const lldb::InstanceSettingsSP &pending_settings = owner_sp->FindPendingSettings (m_instance_name); 46531831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham CopyInstanceSettings (pending_settings,false); 46541831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham } 46551831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham} 46561831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 46571831e78a6253392fca1c99e555e7adaa3f372647Jim InghamProcessInstanceSettings::ProcessInstanceSettings (const ProcessInstanceSettings &rhs) : 46581831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham InstanceSettings (Process::GetSettingsController(), CreateInstanceName().AsCString()) 46591831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham{ 46601831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham if (m_instance_name != InstanceSettings::GetDefaultName()) 46611831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham { 46621831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham UserSettingsControllerSP owner_sp (m_owner_wp.lock()); 46631831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham if (owner_sp) 46641831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham { 46651831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham CopyInstanceSettings (owner_sp->FindPendingSettings (m_instance_name), false); 46661831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham owner_sp->RemovePendingSettings (m_instance_name); 46671831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham } 46681831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham } 46691831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham} 46701831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 46711831e78a6253392fca1c99e555e7adaa3f372647Jim InghamProcessInstanceSettings::~ProcessInstanceSettings () 46721831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham{ 46731831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham} 46741831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 4675761133029ba2d5bb0c21c3a871dede340b2775fcGreg ClaytonProcessInstanceSettings& 46766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::operator= (const ProcessInstanceSettings &rhs) 4677d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 46786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (this != &rhs) 46796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 4680d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 46815bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice 46826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return *this; 46836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 46846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4685d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 46866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid 46876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name, 46886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const char *index_value, 46896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const char *value, 4690d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const ConstString &instance_name, 46916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const SettingEntry &entry, 4692334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton VarSetOperationType op, 4693334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton Error &err, 4694334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton bool pending) 46956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 46966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 46976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 46986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid 46996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings, 47006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice bool pending) 47016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4702638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton// if (new_settings.get() == NULL) 4703638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton// return; 4704334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton// 4705638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton// ProcessInstanceSettings *new_process_settings = (ProcessInstanceSettings *) new_settings.get(); 4706638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton} 4707638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 4708334d33a19fd28cf41cba74cc61cf149e7101a603Greg Claytonbool 47096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry, 4710396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice const ConstString &var_name, 4711396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice StringList &value, 4712396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice Error *err) 471375b11a343a035ab426473a785a045f0614af9984Caroline Tice{ 4714abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (err) 471575b11a343a035ab426473a785a045f0614af9984Caroline Tice err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString()); 471675b11a343a035ab426473a785a045f0614af9984Caroline Tice return false; 471775b11a343a035ab426473a785a045f0614af9984Caroline Tice} 4718334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton 471975b11a343a035ab426473a785a045f0614af9984Caroline Ticeconst ConstString 4720abb3302051246273eb92cca203c9a1b9d9736e05Greg ClaytonProcessInstanceSettings::CreateInstanceName () 4721396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice{ 47226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static int instance_count = 1; 4723334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton StreamString sstr; 47246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 47256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice sstr.Printf ("process_%d", instance_count); 47266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice ++instance_count; 47276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 47286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString ret_val (sstr.GetData()); 4729334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton return ret_val; 47306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 47316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 47326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 4733334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton// SettingsController Variable Tables 4734334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton//-------------------------------------------------- 4735334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton 4736334d33a19fd28cf41cba74cc61cf149e7101a603Greg ClaytonSettingEntry 4737334d33a19fd28cf41cba74cc61cf149e7101a603Greg ClaytonProcess::SettingsController::global_settings_table[] = 4738334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton{ 47396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice //{ "var-name", var-type , "default", enum-table, init'd, hidden, "help-text"}, 47406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } 47416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 47426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 47436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 47446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry 47456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcess::SettingsController::instance_settings_table[] = 47466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 47476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice //{ "var-name", var-type, "default", enum-table, init'd, hidden, "help-text"}, 47486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { NULL, eSetVarTypeNone, NULL, NULL, false, false, NULL } 47496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 47506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 47516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 47526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 47536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 47546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice