Process.cpp revision 334d33a19fd28cf41cba74cc61cf149e7101a603
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Process.cpp ---------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/StoppointCallbackContext.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointLocation.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Event.h" 17861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice#include "lldb/Core/ConnectionFileDescriptor.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h" 19861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice#include "lldb/Core/InputReader.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 23f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton#include "lldb/Expression/ClangUserExpression.h" 246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice#include "lldb/Interpreter/CommandInterpreter.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Host.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ABI.h" 270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton#include "lldb/Target/DynamicLoader.h" 2837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton#include "lldb/Target/OperatingSystem.h" 29642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/LanguageRuntime.h" 30642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/CPPLanguageRuntime.h" 31642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/ObjCLanguageRuntime.h" 32e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Platform.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 34643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/StopInfo.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 44b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::Dump (Stream &s, Platform *platform) const 4524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 4624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *cstr; 47ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_pid != LLDB_INVALID_PROCESS_ID) 48d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton s.Printf (" pid = %llu\n", m_pid); 49ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 50ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_parent_pid != LLDB_INVALID_PROCESS_ID) 51d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton s.Printf (" parent = %llu\n", m_parent_pid); 52ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 53ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_executable) 54ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 55ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" name = %s\n", m_executable.GetFilename().GetCString()); 56ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString (" file = "); 57ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton m_executable.Dump(&s); 58ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.EOL(); 59ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 60b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t argc = m_arguments.GetArgumentCount(); 61ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (argc > 0) 62ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 63ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton for (uint32_t i=0; i<argc; i++) 64ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 65b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *arg = m_arguments.GetArgumentAtIndex(i); 66ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (i < 10) 67b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" arg[%u] = %s\n", i, arg); 68ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 69b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("arg[%u] = %s\n", i, arg); 70ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 71ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 72b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 73b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t envc = m_environment.GetArgumentCount(); 74b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (envc > 0) 75b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 76b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton for (uint32_t i=0; i<envc; i++) 77b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 78b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *env = m_environment.GetArgumentAtIndex(i); 79b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (i < 10) 80b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" env[%u] = %s\n", i, env); 81b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 82b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("env[%u] = %s\n", i, env); 83b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 84b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 85b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 86ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_arch.IsValid()) 87ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" arch = %s\n", m_arch.GetTriple().str().c_str()); 88ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 89b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_uid != UINT32_MAX) 9024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 91b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_uid); 92b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" uid = %-5u (%s)\n", m_uid, cstr ? cstr : ""); 9324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 94b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_gid != UINT32_MAX) 9524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 96b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_gid); 97b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" gid = %-5u (%s)\n", m_gid, cstr ? cstr : ""); 9824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 99b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_euid != UINT32_MAX) 10024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 101b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_euid); 102b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" euid = %-5u (%s)\n", m_euid, cstr ? cstr : ""); 10324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 104b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_egid != UINT32_MAX) 10524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 106b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_egid); 107b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" egid = %-5u (%s)\n", m_egid, cstr ? cstr : ""); 10824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 10924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 11024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 11124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 112b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose) 11324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 114b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *label; 115b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (show_args || verbose) 116b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton label = "ARGUMENTS"; 117b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 118b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton label = "NAME"; 119b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 120ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (verbose) 121ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 122b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE %s\n", label); 123ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString ("====== ====== ========== ========== ========== ========== ======================== ============================\n"); 124ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 125ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 126ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 127b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("PID PARENT USER ARCH %s\n", label); 128ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString ("====== ====== ========== ======= ============================\n"); 129ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 13024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 13124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 13224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 133b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const 13424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 13524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_pid != LLDB_INVALID_PROCESS_ID) 13624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 13724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *cstr; 138d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton s.Printf ("%-6llu %-6llu ", m_pid, m_parent_pid); 13924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 14024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 141ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (verbose) 142ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 143b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_uid); 144ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 145ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 146ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 147b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_uid); 14824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 149b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_gid); 150ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 151ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 152ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 153b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_gid); 154ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 155b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_euid); 156ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 157ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 158ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 159b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_euid); 160ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 161b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_egid); 162ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 163ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 164ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 165b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_egid); 166ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-24s ", m_arch.IsValid() ? m_arch.GetTriple().str().c_str() : ""); 167ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 16824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 169ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 1707e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda s.Printf ("%-10s %-7d %s ", 171b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton platform->GetUserName (m_euid), 172ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton (int)m_arch.GetTriple().getArchName().size(), 173ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton m_arch.GetTriple().getArchName().data()); 174ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 175ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 176b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (verbose || show_args) 177ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 178b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t argc = m_arguments.GetArgumentCount(); 179ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (argc > 0) 180ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 181ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton for (uint32_t i=0; i<argc; i++) 182ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 183ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (i > 0) 184ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutChar (' '); 185b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.PutCString (m_arguments.GetArgumentAtIndex(i)); 186ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 187ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 188ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 18924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 190ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 191ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString (GetName()); 192ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 19324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 194ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.EOL(); 19524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 19624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 19724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 198b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 199b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonvoid 20036bc5ea5a48c19421d44f559e2165c105657b809Greg ClaytonProcessInfo::SetArguments (char const **argv, 20136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton bool first_arg_is_executable, 20236bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton bool first_arg_is_executable_and_argument) 20336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton{ 20436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton m_arguments.SetArguments (argv); 20536bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton 20636bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // Is the first argument the executable? 20736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton if (first_arg_is_executable) 20836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton { 20936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton const char *first_arg = m_arguments.GetArgumentAtIndex (0); 21036bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton if (first_arg) 21136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton { 21236bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // Yes the first argument is an executable, set it as the executable 21336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // in the launch options. Don't resolve the file path as the path 21436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // could be a remote platform path 21536bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton const bool resolve = false; 21636bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton m_executable.SetFile(first_arg, resolve); 21736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton 21836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // If argument zero is an executable and shouldn't be included 21936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton // in the arguments, remove it from the front of the arguments 22036bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton if (first_arg_is_executable_and_argument == false) 22136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton m_arguments.DeleteArgumentAtIndex (0); 22236bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton } 22336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton } 22436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton} 22536bc5ea5a48c19421d44f559e2165c105657b809Greg Claytonvoid 22636bc5ea5a48c19421d44f559e2165c105657b809Greg ClaytonProcessInfo::SetArguments (const Args& args, 22736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton bool first_arg_is_executable, 22836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton bool first_arg_is_executable_and_argument) 229b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 230b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Copy all arguments 231b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arguments = args; 232b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 233b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Is the first argument the executable? 234b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (first_arg_is_executable) 235b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 23636bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton const char *first_arg = m_arguments.GetArgumentAtIndex (0); 237b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (first_arg) 238b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 239b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Yes the first argument is an executable, set it as the executable 240b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // in the launch options. Don't resolve the file path as the path 241b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // could be a remote platform path 242b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const bool resolve = false; 243b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_executable.SetFile(first_arg, resolve); 244b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 245b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // If argument zero is an executable and shouldn't be included 246b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // in the arguments, remove it from the front of the arguments 247b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (first_arg_is_executable_and_argument == false) 248b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arguments.DeleteArgumentAtIndex (0); 249b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 250b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 251b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 252b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 253abb3302051246273eb92cca203c9a1b9d9736e05Greg Claytonvoid 254464c6161464694412b7472129e789248f1cf21b9Greg ClaytonProcessLaunchInfo::FinalizeFileActions (Target *target, bool default_to_use_pty) 255abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton{ 256abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // If notthing was specified, then check the process for any default 257abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // settings that were set with "settings set" 258abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (m_file_actions.empty()) 259abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 260abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (m_flags.Test(eLaunchFlagDisableSTDIO)) 261abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 262abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton AppendSuppressFileAction (STDERR_FILENO, true , true ); 263abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton AppendSuppressFileAction (STDIN_FILENO , true , false); 264abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton AppendSuppressFileAction (STDOUT_FILENO, false, true ); 265abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 266abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton else 267abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 268abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // Check for any values that might have gotten set with any of: 269abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // (lldb) settings set target.input-path 270abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // (lldb) settings set target.output-path 271abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // (lldb) settings set target.error-path 272464c6161464694412b7472129e789248f1cf21b9Greg Clayton const char *in_path = NULL; 273464c6161464694412b7472129e789248f1cf21b9Greg Clayton const char *out_path = NULL; 274464c6161464694412b7472129e789248f1cf21b9Greg Clayton const char *err_path = NULL; 275abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (target) 276abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 277464c6161464694412b7472129e789248f1cf21b9Greg Clayton in_path = target->GetStandardErrorPath(); 278464c6161464694412b7472129e789248f1cf21b9Greg Clayton out_path = target->GetStandardInputPath(); 279464c6161464694412b7472129e789248f1cf21b9Greg Clayton err_path = target->GetStandardOutputPath(); 280464c6161464694412b7472129e789248f1cf21b9Greg Clayton } 281464c6161464694412b7472129e789248f1cf21b9Greg Clayton 282464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (default_to_use_pty && (!in_path && !out_path && !err_path)) 283464c6161464694412b7472129e789248f1cf21b9Greg Clayton { 284464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (m_pty.OpenFirstAvailableMaster (O_RDWR|O_NOCTTY, NULL, 0)) 285abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 286464c6161464694412b7472129e789248f1cf21b9Greg Clayton in_path = out_path = err_path = m_pty.GetSlaveName (NULL, 0); 287abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 288abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 289abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 290464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (in_path) 291464c6161464694412b7472129e789248f1cf21b9Greg Clayton AppendOpenFileAction(STDERR_FILENO, in_path, true, true); 292464c6161464694412b7472129e789248f1cf21b9Greg Clayton 293464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (out_path) 294464c6161464694412b7472129e789248f1cf21b9Greg Clayton AppendOpenFileAction(STDIN_FILENO, out_path, true, false); 295464c6161464694412b7472129e789248f1cf21b9Greg Clayton 296464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (err_path) 297464c6161464694412b7472129e789248f1cf21b9Greg Clayton AppendOpenFileAction(STDOUT_FILENO, err_path, false, true); 298abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 299abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 300abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton} 301abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 302527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 303527154d8e532f27f25af226c9e1dac607c48b5d1Greg Claytonbool 304527154d8e532f27f25af226c9e1dac607c48b5d1Greg ClaytonProcessLaunchInfo::ConvertArgumentsForLaunchingInShell (Error &error, bool localhost) 305527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton{ 306527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.Clear(); 307527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 308527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (GetFlags().Test (eLaunchFlagLaunchInShell)) 309527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 310527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const char *shell_executable = GetShell(); 311527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (shell_executable) 312527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 313527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton char shell_resolved_path[PATH_MAX]; 314527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 315527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (localhost) 316527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 317527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton FileSpec shell_filespec (shell_executable, true); 318527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 319527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (!shell_filespec.Exists()) 320527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 321527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // Resolve the path in case we just got "bash", "sh" or "tcsh" 322527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (!shell_filespec.ResolveExecutableLocation ()) 323527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 324527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorStringWithFormat("invalid shell path '%s'", shell_executable); 325527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return false; 326527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 327527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 328527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_filespec.GetPath (shell_resolved_path, sizeof(shell_resolved_path)); 329527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_executable = shell_resolved_path; 330527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 331527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 332527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton Args shell_arguments; 333527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton std::string safe_arg; 334527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_arguments.AppendArgument (shell_executable); 335527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton StreamString shell_command; 336527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_arguments.AppendArgument ("-c"); 337527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_command.PutCString ("exec"); 338527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (GetArchitecture().IsValid()) 339527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 340527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_command.Printf(" /usr/bin/arch -arch %s", GetArchitecture().GetArchitectureName()); 341527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // Set the resume count to 2: 342527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // 1 - stop in shell 343527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // 2 - stop in /usr/bin/arch 344527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // 3 - then we will stop in our program 345527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetResumeCount(2); 346527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 347527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 348527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 349527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // Set the resume count to 1: 350527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // 1 - stop in shell 351527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // 2 - then we will stop in our program 352527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetResumeCount(1); 353527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 354527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 355527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const char **argv = GetArguments().GetConstArgumentVector (); 356527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (argv) 357527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 358527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton for (size_t i=0; argv[i] != NULL; ++i) 359527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 360527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const char *arg = Args::GetShellSafeArgument (argv[i], safe_arg); 361527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_command.Printf(" %s", arg); 362527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 363527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 364527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton shell_arguments.AppendArgument (shell_command.GetString().c_str()); 365527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 366527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_executable.SetFile(shell_executable, false); 367527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_arguments = shell_arguments; 368527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return true; 369527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 370527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 371527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 372527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString ("invalid shell path"); 373527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 374527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 375527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 376527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 377527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString ("not launching in shell"); 378527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 379527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return false; 380527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton} 381527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 382527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 383b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 384b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Open (int fd, const char *path, bool read, bool write) 385b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 386b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if ((read || write) && fd >= 0 && path && path[0]) 387b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 388b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionOpen; 389b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 390b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (read && write) 391527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_arg = O_NOCTTY | O_CREAT | O_RDWR; 392b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else if (read) 393527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_arg = O_NOCTTY | O_RDONLY; 394b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 395527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton m_arg = O_NOCTTY | O_CREAT | O_WRONLY; 396b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_path.assign (path); 397b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return true; 398b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 399b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 400b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 401b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 402b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 403b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return false; 404b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 405b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 40624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 407b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Close (int fd) 408b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 409b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 410b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (fd >= 0) 411b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 412b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionClose; 413b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 414b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 415b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return m_fd >= 0; 416b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 417b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 418b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 419b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 420b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Duplicate (int fd, int dup_fd) 421b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 422b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 423b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (fd >= 0 && dup_fd >= 0) 424b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 425b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionDuplicate; 426b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 427b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arg = dup_fd; 428b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 429b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return m_fd >= 0; 430b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 431b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 432b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 433b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 434b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 435b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::AddPosixSpawnFileAction (posix_spawn_file_actions_t *file_actions, 436b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const FileAction *info, 437b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Log *log, 438b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error& error) 439b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 440b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info == NULL) 441b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return false; 442b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 443b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton switch (info->m_action) 444b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 445b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionNone: 446b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.Clear(); 447b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 448b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 449b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionClose: 450b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 451b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd for posix_spawn_file_actions_addclose(...)"); 452b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 453b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 454b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_addclose (file_actions, info->m_fd), 455b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 456b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log && (error.Fail() || log)) 457b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, "posix_spawn_file_actions_addclose (action=%p, fd=%i)", 458b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd); 459b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 460b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 461b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 462b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionDuplicate: 463b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 464b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd for posix_spawn_file_actions_adddup2(...)"); 465b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else if (info->m_arg == -1) 466b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid duplicate fd for posix_spawn_file_actions_adddup2(...)"); 467b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 468b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 469b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_adddup2 (file_actions, info->m_fd, info->m_arg), 470b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 471b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log && (error.Fail() || log)) 472b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, "posix_spawn_file_actions_adddup2 (action=%p, fd=%i, dup_fd=%i)", 473b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd, info->m_arg); 474b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 475b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 476b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 477b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionOpen: 478b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 479b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd in posix_spawn_file_actions_addopen(...)"); 480b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 481b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 482b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton int oflag = info->m_arg; 483527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 484b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton mode_t mode = 0; 485b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 486527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (oflag & O_CREAT) 487527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton mode = 0640; 488527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 489b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_addopen (file_actions, 490b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton info->m_fd, 491b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton info->m_path.c_str(), 492b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton oflag, 493b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton mode), 494b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 495b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (error.Fail() || log) 496b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, 497b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton "posix_spawn_file_actions_addopen (action=%p, fd=%i, path='%s', oflag=%i, mode=%i)", 498b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd, info->m_path.c_str(), oflag, mode); 499b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 500b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 501b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 502b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton default: 503b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorStringWithFormat ("invalid file action: %i", info->m_action); 504b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 505b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 506b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error.Success(); 507b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 508b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 509b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError 510143fcc3a15425659b381502ed4e1e50a3e726f36Greg ClaytonProcessLaunchCommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg) 511b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 512b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 513b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton char short_option = (char) m_getopt_table[option_idx].val; 514b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 515b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton switch (short_option) 516b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 517b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 's': // Stop at program entry point 518b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagStopAtEntry); 519b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 520b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 521b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'e': // STDERR for read + write 522b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 523b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 524b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDERR_FILENO, option_arg, true, true)) 525b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 526b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 527b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 528b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 529b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'i': // STDIN for read only 530b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 531b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 532b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDIN_FILENO, option_arg, true, false)) 533b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 534b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 535b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 536b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 537b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'o': // Open STDOUT for write only 538b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 539b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 540b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDOUT_FILENO, option_arg, false, true)) 541b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 542b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 543b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 544b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 545b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'p': // Process plug-in name 546b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.SetProcessPluginName (option_arg); 547b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 548b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 549b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'n': // Disable STDIO 550b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 551b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 552b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDERR_FILENO, "/dev/null", true, true)) 553b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 554b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDOUT_FILENO, "/dev/null", false, true)) 555b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 556b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDIN_FILENO, "/dev/null", true, false)) 557b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 558b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 559b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 560b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 561b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'w': 562b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.SetWorkingDirectory (option_arg); 563b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 564b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 565b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 't': // Open process in new terminal window 566b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY); 567b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 568b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 569b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'a': 570b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetArchitecture().SetTriple (option_arg, 571b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_interpreter.GetPlatform(true).get()); 572b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 573b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 574b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'A': 575b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagDisableASLR); 576b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 577b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 57836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton case 'c': 579527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (option_arg && option_arg[0]) 580527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton launch_info.SetShell (option_arg); 581527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 582527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton launch_info.SetShell ("/bin/bash"); 58336bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton break; 58436bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton 585b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'v': 586b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetEnvironmentEntries().AppendArgument(option_arg); 587b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 588b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 589b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton default: 5909c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("unrecognized short option character '%c'", short_option); 591b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 592b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 593b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 594b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error; 595b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 596b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 597b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonOptionDefinition 598b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchCommandOptions::g_option_table[] = 599b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 600b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg 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."}, 601b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "disable-aslr", 'A', no_argument, NULL, 0, eArgTypeNone, "Disable address space layout randomization when launching a process."}, 602b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "plugin", 'p', required_argument, NULL, 0, eArgTypePlugin, "Name of the process plugin you want to use."}, 603b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg 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."}, 604b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "arch", 'a', required_argument, NULL, 0, eArgTypeArchitecture, "Set the architecture for the process to launch when ambiguous."}, 605b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg 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."}, 606527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton{ LLDB_OPT_SET_ALL, false, "shell", 'c', optional_argument, NULL, 0, eArgTypePath, "Run the process in a shell (not supported on all platforms)."}, 607b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 608b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1 , false, "stdin", 'i', required_argument, NULL, 0, eArgTypePath, "Redirect stdin for the process to <path>."}, 609b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1 , false, "stdout", 'o', required_argument, NULL, 0, eArgTypePath, "Redirect stdout for the process to <path>."}, 610b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1 , false, "stderr", 'e', required_argument, NULL, 0, eArgTypePath, "Redirect stderr for the process to <path>."}, 611b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 612b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_2 , false, "tty", 't', no_argument, NULL, 0, eArgTypeNone, "Start the process in a terminal (not supported on all platforms)."}, 613b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 614b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg 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."}, 615b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 616b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 0 , false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 617b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}; 618b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 619b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 620b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 621b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 622b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::NameMatches (const char *process_name) const 62324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 62424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name_match_type == eNameMatchIgnore || process_name == NULL) 62524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 62624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *match_name = m_match_info.GetName(); 62724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (!match_name) 62824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 62924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 63024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return lldb_private::NameMatches (process_name, m_name_match_type, match_name); 63124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 63224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 63324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 634b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::Matches (const ProcessInstanceInfo &proc_info) const 63524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 63624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (!NameMatches (proc_info.GetName())) 63724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 63824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 63924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ProcessIDIsValid() && 64024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetProcessID() != proc_info.GetProcessID()) 64124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 64224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 64324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ParentProcessIDIsValid() && 64424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetParentProcessID() != proc_info.GetParentProcessID()) 64524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 64624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 647b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.UserIDIsValid () && 648b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_match_info.GetUserID() != proc_info.GetUserID()) 64924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 65024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 651b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.GroupIDIsValid () && 652b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_match_info.GetGroupID() != proc_info.GetGroupID()) 65324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 65424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 65524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveUserIDIsValid () && 65624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID()) 65724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 65824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 65924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveGroupIDIsValid () && 66024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID()) 66124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 66224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 66324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.GetArchitecture().IsValid() && 66424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetArchitecture() != proc_info.GetArchitecture()) 66524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 66624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 66724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 66824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 66924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 670b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::MatchAllProcesses () const 67124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 67224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name_match_type != eNameMatchIgnore) 67324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 67424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 67524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ProcessIDIsValid()) 67624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 67724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 67824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ParentProcessIDIsValid()) 67924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 68024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 681b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.UserIDIsValid ()) 68224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 68324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 684b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.GroupIDIsValid ()) 68524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 68624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 68724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveUserIDIsValid ()) 68824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 68924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 69024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveGroupIDIsValid ()) 69124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 69224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 69324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.GetArchitecture().IsValid()) 69424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 69524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 69624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_all_users) 69724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 69824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 69924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 70024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 70124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 70224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 70324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 704b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::Clear() 70524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 70624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.Clear(); 70724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_name_match_type = eNameMatchIgnore; 70824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_all_users = false; 70924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 710fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess* 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::FindPlugin (Target &target, const char *plugin_name, Listener &listener) 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessCreateInstance create_callback = NULL; 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (plugin_name) 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner create_callback = PluginManager::GetProcessCreateCallbackForPluginName (plugin_name); 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (create_callback) 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Process> debugger_ap(create_callback(target, listener)); 7218d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (debugger_ap->CanDebug(target, true)) 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return debugger_ap.release(); 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx) 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton std::auto_ptr<Process> debugger_ap(create_callback(target, listener)); 7308d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (debugger_ap->CanDebug(target, false)) 73154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton return debugger_ap.release(); 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process constructor 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Process(Target &target, Listener &listener) : 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UserID (LLDB_INVALID_PROCESS_ID), 74349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton Broadcaster ("lldb.process"), 744334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton ProcessInstanceSettings (GetSettingsController()), 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target (target), 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_public_state (eStateUnloaded), 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state (eStateUnloaded), 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_broadcaster ("lldb.process.internal_state_broadcaster"), 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_broadcaster ("lldb.process.internal_state_control_broadcaster"), 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener ("lldb.process.internal_state_listener"), 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait(), 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_thread (LLDB_INVALID_HOST_THREAD), 75321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id (), 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_index_id (0), 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_status (-1), 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_string (), 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_list (this), 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications (), 75920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_image_tokens (), 76020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_listener (listener), 76120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_breakpoint_site_list (), 76220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_dynamic_checkers_ap (), 763861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_unix_signals (), 76420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_abi_sp (), 765861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader (), 766a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_stdio_communication ("process.stdio"), 76720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_stdio_communication_mutex (Mutex::eMutexTypeRecursive), 768fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton m_stdout_data (), 769bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stderr_data (), 770613b8739a4d489b7f1c571288d5786768c024205Greg Clayton m_memory_cache (*this), 771613b8739a4d489b7f1c571288d5786768c024205Greg Clayton m_allocated_memory_cache (*this), 772ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_should_detach (false), 7736cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan m_next_event_action_ap(), 7746cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan m_can_jit(eCanJITYes) 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7761ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice UpdateInstanceName(); 7771ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 778e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Process::Process()", this); 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitStateChanged, "state-changed"); 78349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitInterrupt, "interrupt"); 78449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitSTDOUT, "stdout-available"); 78549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitSTDERR, "stderr-available"); 78649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner listener.StartListeningForEvents (this, 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitStateChanged | 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitInterrupt | 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitSTDOUT | 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitSTDERR); 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster, 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitStateChanged); 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster, 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlStop | 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlPause | 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlResume); 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::~Process() 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 807e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Process::~Process()", this); 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Finalize() 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 816ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton switch (GetPrivateState()) 817ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton { 818ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateConnected: 819ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateAttaching: 820ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateLaunching: 821ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateStopped: 822ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateRunning: 823ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateStepping: 824ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateCrashed: 825ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateSuspended: 826ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton if (GetShouldDetach()) 827ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton Detach(); 828ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton else 829ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton Destroy(); 830ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton break; 831ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton 832ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateInvalid: 833ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateUnloaded: 834ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateDetached: 835ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton case eStateExited: 836ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton break; 837ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton } 838ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton 8392f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton // Clear our broadcaster before we proceed with destroying 8402f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton Broadcaster::Clear(); 8412f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Do any cleanup needed prior to being destructed... Subclasses 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // that override this method should call this superclass method as well. 84488fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham 84588fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham // We need to destroy the loader before the derived Process class gets destroyed 84688fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham // since it is very likely that undoing the loader will require access to the real process. 847182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_dynamic_checkers_ap.reset(); 848182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_abi_sp.reset(); 84937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 850182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_dyld_ap.reset(); 85113d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton m_thread_list.Destroy(); 852182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton std::vector<Notifications> empty_notifications; 853182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_notifications.swap(empty_notifications); 854182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_image_tokens.clear(); 855182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_memory_cache.Clear(); 856182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_allocated_memory_cache.Clear(); 857182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_language_runtimes.clear(); 858182be6a8df48d9c22ac6a0a5ad58b962887f4f11Greg Clayton m_next_event_action_ap.reset(); 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RegisterNotificationCallbacks (const Notifications& callbacks) 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications.push_back(callbacks); 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (callbacks.initialize != NULL) 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner callbacks.initialize (callbacks.baton, this); 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::UnregisterNotificationCallbacks(const Notifications& callbacks) 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<Notifications>::iterator pos, end = m_notifications.end(); 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_notifications.begin(); pos != end; ++pos) 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->baton == callbacks.baton && 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->initialize == callbacks.initialize && 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->process_state_changed == callbacks.process_state_changed) 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications.erase(pos); 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SynchronouslyNotifyStateChanged (StateType state) 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end(); 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos) 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (notification_pos->process_state_changed) 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner notification_pos->process_state_changed (notification_pos->baton, this, state); 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: We need to do some work on events before the general Listener sees them. 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// For instance if we are continuing from a breakpoint, we need to ensure that we do 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the little "insert real insn, step & stop" trick. But we can't do that when the 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// event is delivered by the broadcaster - since that is done on the thread that is 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// waiting for new events, so if we needed more than one event for our handling, we would 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// stall. So instead we do it when we fetch the event off of the queue. 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextEvent (EventSP &event_sp) 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp) 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent (event_sp.get()); 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessToStop (const TimeValue *timeout) 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 92021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We can't just wait for a "stopped" event, because the stopped event may have restarted the target. 92121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We have to actually check each event, and in the case of a stopped event check the restarted flag 92221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // on the event. 92321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham EventSP event_sp; 92421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham StateType state = GetState(); 92521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // If we are exited or detached, we won't ever get back to any 92621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // other valid state... 92721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (state == eStateDetached || state == eStateExited) 92821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 92921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 93021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham while (state != eStateInvalid) 93121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 93221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham state = WaitForStateChangedEvents (timeout, event_sp); 93321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham switch (state) 93421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 93521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateCrashed: 93621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateDetached: 93721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateExited: 93821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateUnloaded: 93921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 94021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateStopped: 94121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get())) 94221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham continue; 94321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else 94421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 94521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham default: 94621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham continue; 94721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 94821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 94921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForState 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const TimeValue *timeout, 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType *match_states, const uint32_t num_match_states 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 962d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton StateType state = GetState(); 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (state != eStateInvalid) 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 965d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton // If we are exited or detached, we won't ever get back to any 966d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton // other valid state... 967d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton if (state == eStateDetached || state == eStateExited) 968d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton return state; 969d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = WaitForStateChangedEvents (timeout, event_sp); 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_match_states; ++i) 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_states[i] == state) 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghambool 98263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::HijackProcessEvents (Listener *listener) 98363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 98463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham if (listener != NULL) 98563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham { 98663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return HijackBroadcaster(listener, eBroadcastBitStateChanged); 98763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham } 98863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham else 98963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return false; 99063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 99163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 99263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghamvoid 99363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::RestoreProcessEvents () 99463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 99563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham RestoreBroadcaster(); 99663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 99763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 998f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghambool 999f9f40c20b210eea72ab042c63178ca000f005ed9Jim InghamProcess::HijackPrivateProcessEvents (Listener *listener) 1000f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham{ 1001f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (listener != NULL) 1002f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 1003f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return m_private_state_broadcaster.HijackBroadcaster(listener, eBroadcastBitStateChanged); 1004f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 1005f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 1006f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return false; 1007f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham} 1008f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 1009f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghamvoid 1010f9f40c20b210eea72ab042c63178ca000f005ed9Jim InghamProcess::RestorePrivateProcessEvents () 1011f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham{ 1012f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham m_private_state_broadcaster.RestoreBroadcaster(); 1013f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham} 1014f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp) 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1018e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 102436f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton if (m_listener.WaitForEventForBroadcasterWithType (timeout, 102536f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton this, 102636f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton eBroadcastBitStateChanged, 102736f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton event_sp)) 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp) => %s", 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__, 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout, 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(state)); 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent * 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PeekAtStateChangedEvents () 104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1041e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s...", __FUNCTION__); 104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Event *event_ptr; 104736f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this, 104836f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton eBroadcastBitStateChanged); 104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_ptr) 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (event_ptr) => %s", 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__, 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr))); 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s no events found", 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__); 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return event_ptr; 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp) 106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1069e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 107572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (m_private_state_listener.WaitForEventForBroadcasterWithType (timeout, 107672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton &m_private_state_broadcaster, 107772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton eBroadcastBitStateChanged, 107872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton event_sp)) 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a bit of a hack, but when we wait here we could very well return 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to the command-line, and that could disable the log, which would render the 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // log we got above invalid. 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 108572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton { 108672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (state == eStateInvalid) 108772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton log->Printf ("Process::%s (timeout = %p, event_sp) => TIMEOUT", __FUNCTION__, timeout); 108872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton else 108972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state)); 109072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton } 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only) 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1097e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (control_only) 110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp); 110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_listener.WaitForEvent(timeout, event_sp); 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::IsRunning () const 111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return StateIsRunningState (m_public_state.GetValue()); 111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitStatus () 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateExited) 111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_exit_status; 111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1122638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitDescription () 112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty()) 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_exit_string.c_str(); 112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 113172e1c782ba1e4226da37af4722af608de9f39408Greg Claytonbool 113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetExitStatus (int status, const char *cstr) 113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 113468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 113568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton if (log) 113668ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton log->Printf("Process::SetExitStatus (status=%i (0x%8.8x), description=%s%s%s)", 113768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton status, status, 113868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton cstr ? "\"" : "", 113968ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton cstr ? cstr : "NULL", 114068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton cstr ? "\"" : ""); 114168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton 114272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton // We were already in the exited state 114372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (m_private_state.GetValue() == eStateExited) 114468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton { 1145644ddfbc1b36eabdb93c5acb150f9a77a92ee1fdGreg Clayton if (log) 1146644ddfbc1b36eabdb93c5acb150f9a77a92ee1fdGreg Clayton log->Printf("Process::SetExitStatus () ignoring exit status because state was already set to eStateExited"); 114772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton return false; 114868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton } 114972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 115072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_exit_status = status; 115172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (cstr) 115272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_exit_string = cstr; 115372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton else 115472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_exit_string.clear(); 115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 115672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton DidExit (); 115758e844b3561848e73e69d6d98746d4851e78306eGreg Clayton 115872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton SetPrivateState (eStateExited); 115972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton return true; 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This static callback can be used to watch for local child processes on 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the current host. The the child process exits, the process will be 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// found in the global target list (we want to be completely sure that the 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// lldb_private::Process doesn't go away before we can deliver the signal. 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 11671c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonProcess::SetProcessExitStatus (void *callback_baton, 11681c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton lldb::pid_t pid, 11691c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton bool exited, 11701c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton int signo, // Zero for no signal 11711c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton int exit_status // Exit value of process if signal is zero 117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11741c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS)); 11751c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton if (log) 1176d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton log->Printf ("Process::SetProcessExitStatus (baton=%p, pid=%llu, exited=%i, signal=%i, exit_status=%i)\n", 11771c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton callback_baton, 11781c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton pid, 11791c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton exited, 11801c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton signo, 11811c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton exit_status); 11821c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 11831c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton if (exited) 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 118563094e0bb161580564954dee512955c1c79d3476Greg Clayton TargetSP target_sp(Debugger::FindTargetWithProcessID (pid)); 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_sp) 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp (target_sp->GetProcessSP()); 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process_sp) 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *signal_cstr = NULL; 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signo) 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo); 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process_sp->SetExitStatus (exit_status, signal_cstr); 119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonvoid 120537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg ClaytonProcess::UpdateThreadListIfNeeded () 120637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{ 120737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton const uint32_t stop_id = GetStopID(); 120837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID()) 120937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton { 1210202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton const StateType state = GetPrivateState(); 1211202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton if (StateIsStoppedState (state, true)) 1212202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton { 1213202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton Mutex::Locker locker (m_thread_list.GetMutex ()); 1214ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // m_thread_list does have its own mutex, but we need to 1215ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // hold onto the mutex between the call to UpdateThreadList(...) 1216ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // and the os->UpdateThreadList(...) so it doesn't change on us 1217202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton ThreadList new_thread_list(this); 1218202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton // Always update the thread list with the protocol specific 1219202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton // thread list 1220202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton UpdateThreadList (m_thread_list, new_thread_list); 1221202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton OperatingSystem *os = GetOperatingSystem (); 1222202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton if (os) 1223202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton os->UpdateThreadList (m_thread_list, new_thread_list); 1224202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton m_thread_list.Update (new_thread_list); 1225202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton m_thread_list.SetStopID (stop_id); 1226202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton } 122737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 122837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton} 122937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextThreadIndexID () 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ++m_thread_index_id; 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetState() 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If any other threads access this we will need a mutex for it 124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_public_state.GetValue (); 124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetPublicState (StateType new_state) 124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 124668ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPublicState (%s)", StateAsCString(new_state)); 124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_public_state.SetValue (new_state); 125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetPrivateState () 125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state.GetValue(); 125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetPrivateState (StateType new_state) 126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 126168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool state_changed = false; 126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state)); 126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker(m_private_state.GetMutex()); 126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType old_state = m_private_state.GetValueNoLock (); 127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state_changed = old_state != new_state; 127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state_changed) 127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state.SetValueNoLock (new_state); 1274202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton if (StateIsStoppedState(new_state, false)) 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.BumpStopID(); 1277fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton m_memory_cache.Clear(); 127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 127921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_mod_id.GetStopID()); 128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Use our target to get a shared pointer to ourselves... 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (GetTarget().GetProcessSP(), new_state)); 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 12877e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state)); 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12910296fe73a7cb1482226b1303a795ede00e12d677Jim Inghamvoid 12920296fe73a7cb1482226b1303a795ede00e12d677Jim InghamProcess::SetRunningUserExpression (bool on) 12930296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham{ 12940296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham m_mod_id.SetRunningUserExpression (on); 12950296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham} 12960296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetImageInfoAddress() 129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_ADDRESS; 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13030baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 13040baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// LoadImage 13050baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// 13060baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most 13070baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library 13080baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// loading differently should override LoadImage and UnloadImage and 13090baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed. 13100baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 13110baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonuint32_t 13120baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::LoadImage (const FileSpec &image_spec, Error &error) 13130baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 13140baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton DynamicLoader *loader = GetDynamicLoader(); 13150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (loader) 13160baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13170baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = loader->CanLoadImage(); 13180baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Fail()) 13190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 13200baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 13210baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 13220baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Success()) 13230baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13240baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 13250baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 13260baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp) 13270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 13290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 13300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (frame_sp) 13310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 13330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton frame_sp->CalculateExecutionContext (exe_ctx); 1334ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham bool unwind_on_error = true; 13350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StreamString expr; 13360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton char path[PATH_MAX]; 13370baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton image_spec.GetPath(path, sizeof(path)); 13380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton expr.Printf("dlopen (\"%s\", 2)", path); 13390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n"; 1340360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ValueObjectSP result_valobj_sp; 1341daa6efe771f5f068e29328a774fa5bf2358ce14aSean Callanan ClangUserExpression::Evaluate (exe_ctx, eExecutionPolicyAlways, lldb::eLanguageTypeUnknown, ClangUserExpression::eResultTypeAny, unwind_on_error, expr.GetData(), prefix, result_valobj_sp); 1342b14ec34165772877c8242f5b15acb116b0d9a9b5Johnny Chen error = result_valobj_sp->GetError(); 1343b14ec34165772877c8242f5b15acb116b0d9a9b5Johnny Chen if (error.Success()) 13440baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Scalar scalar; 1346fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (result_valobj_sp->ResolveValue (scalar)) 13470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13480baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS); 13490baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS) 13500baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13510baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton uint32_t image_token = m_image_tokens.size(); 13520baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_image_tokens.push_back (image_ptr); 13530baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return image_token; 13540baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 13550baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 13560baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 13570baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 13580baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 13590baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 13600baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 13610baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 13620baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 13630baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 13640baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// UnloadImage 13650baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// 13660baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most 13670baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library 13680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// loading differently should override LoadImage and UnloadImage and 13690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed. 13700baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 13710baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonError 13720baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::UnloadImage (uint32_t image_token) 13730baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 13740baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Error error; 13750baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_token < m_image_tokens.size()) 13760baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13770baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const addr_t image_addr = m_image_tokens[image_token]; 13780baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_addr == LLDB_INVALID_ADDRESS) 13790baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13800baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorString("image already unloaded"); 13810baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 13820baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 13830baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13840baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton DynamicLoader *loader = GetDynamicLoader(); 13850baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (loader) 13860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = loader->CanLoadImage(); 13870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 13880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Success()) 13890baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 13910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 13920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp) 13930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 13950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 13960baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (frame_sp) 13970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 13980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 13990baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton frame_sp->CalculateExecutionContext (exe_ctx); 1400ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham bool unwind_on_error = true; 14010baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StreamString expr; 14020baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton expr.Printf("dlclose ((void *)0x%llx)", image_addr); 14030baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const char *prefix = "extern \"C\" int dlclose(void* handle);\n"; 1404360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ValueObjectSP result_valobj_sp; 1405daa6efe771f5f068e29328a774fa5bf2358ce14aSean Callanan ClangUserExpression::Evaluate (exe_ctx, eExecutionPolicyAlways, lldb::eLanguageTypeUnknown, ClangUserExpression::eResultTypeAny, unwind_on_error, expr.GetData(), prefix, result_valobj_sp); 14060baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (result_valobj_sp->GetError().Success()) 14070baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14080baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Scalar scalar; 1409fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (result_valobj_sp->ResolveValue (scalar)) 14100baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14110baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (scalar.UInt(1)) 14120baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14130baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData()); 14140baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 14160baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14170baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_image_tokens[image_token] = LLDB_INVALID_ADDRESS; 14180baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14200baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14210baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 14220baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14230baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = result_valobj_sp->GetError(); 14240baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14250baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14260baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 14310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 14320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorString("invalid image token"); 14330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 14340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return error; 14350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 14360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 143775906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonconst lldb::ABISP & 143824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetABI() 143924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 144075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton if (!m_abi_sp) 144175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton m_abi_sp = ABI::FindPlugin(m_target.GetArchitecture()); 144275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return m_abi_sp; 144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1445642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamLanguageRuntime * 1446642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetLanguageRuntime(lldb::LanguageType language) 1447642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1448642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntimeCollection::iterator pos; 1449642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham pos = m_language_runtimes.find (language); 1450642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (pos == m_language_runtimes.end()) 1451642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham { 1452642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham lldb::LanguageRuntimeSP runtime(LanguageRuntime::FindPlugin(this, language)); 1453642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1454642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham m_language_runtimes[language] 1455642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham = runtime; 1456642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return runtime.get(); 1457642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham } 1458642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham else 1459642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return (*pos).second.get(); 1460642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1461642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1462642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamCPPLanguageRuntime * 1463642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetCPPLanguageRuntime () 1464642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1465642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus); 1466642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus) 1467642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return static_cast<CPPLanguageRuntime *> (runtime); 1468642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return NULL; 1469642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1470642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1471642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamObjCLanguageRuntime * 1472642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetObjCLanguageRuntime () 1473642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1474642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC); 1475642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC) 1476642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return static_cast<ObjCLanguageRuntime *> (runtime); 1477642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return NULL; 1478642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1479642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 148024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointSiteList & 148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetBreakpointSiteList() 148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 148324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list; 148424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 148524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 148624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst BreakpointSiteList & 148724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetBreakpointSiteList() const 148824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list; 149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 149124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 149424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableAllBreakpointSites () 149524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.SetEnabledForAll (false); 149724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 150024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ClearBreakpointSiteByID (lldb::user_id_t break_id) 150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 150224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (DisableBreakpointSiteByID (break_id)); 150324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 150524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.Remove(break_id); 150624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 150724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 150824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 150924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 151024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 151124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableBreakpointSiteByID (lldb::user_id_t break_id) 151224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 151324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 151424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 151524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 151624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 151724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp->IsEnabled()) 151824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DisableBreakpoint (bp_site_sp.get()); 151924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 152024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 152124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1522444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton error.SetErrorStringWithFormat("invalid breakpoint site ID: %llu", break_id); 152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 152524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 152624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 152724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 152824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 152924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableBreakpointSiteByID (lldb::user_id_t break_id) 153024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 153124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 153224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 153324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 153424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 153524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!bp_site_sp->IsEnabled()) 153624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = EnableBreakpoint (bp_site_sp.get()); 153724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 153824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 153924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1540444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton error.SetErrorStringWithFormat("invalid breakpoint site ID: %llu", break_id); 154124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 154224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 154324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 154424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15453fd1f36c937575dbf57bae04c7ebaef78d8ecc1dStephen Wilsonlldb::break_id_t 154613d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg ClaytonProcess::CreateBreakpointSite (const BreakpointLocationSP &owner, bool use_hardware) 154724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1548265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target); 154924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (load_addr != LLDB_INVALID_ADDRESS) 155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 155124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp; 155224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 155324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Look up this breakpoint site. If it exists, then add this new owner, otherwise 155424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // create a new breakpoint site and add it. 155524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 155624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr); 155724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp->AddOwner (owner); 156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner owner->SetBreakpointSite (bp_site_sp); 156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bp_site_sp->GetID(); 156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, LLDB_INVALID_THREAD_ID, use_hardware)); 156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (EnableBreakpoint (bp_site_sp.get()).Success()) 157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner owner->SetBreakpointSite (bp_site_sp); 157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list.Add (bp_site_sp); 157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We failed to enable the breakpoint 157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_BREAK_ID; 157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp) 158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id); 158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_owners == 0) 158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableBreakpoint(bp_site_sp.get()); 158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress()); 159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const 159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_removed = 0; 159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t intersect_addr; 159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t intersect_size; 160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t opcode_offset; 160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t idx; 1602987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton BreakpointSiteSP bp_sp; 160382820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham BreakpointSiteList bp_sites_in_range; 160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 160582820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham if (m_breakpoint_site_list.FindInRange (bp_addr, bp_addr + size, bp_sites_in_range)) 160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1607987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton for (idx = 0; (bp_sp = bp_sites_in_range.GetByIndex(idx)); ++idx) 160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1609987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton if (bp_sp->GetType() == BreakpointSite::eSoftware) 161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1611987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton if (bp_sp->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset)) 161282820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham { 161382820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size); 161482820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size); 1615987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton assert(opcode_offset + intersect_size <= bp_sp->GetByteSize()); 161682820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham size_t buf_offset = intersect_addr - bp_addr; 1617987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton ::memcpy(buf + buf_offset, bp_sp->GetSavedOpcodeBytes() + opcode_offset, intersect_size); 161882820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham } 161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_removed; 162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1626b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 1627b1888f24fa181489840b9acf193e224d125d0776Greg Claytonsize_t 1628b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonProcess::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site) 1629b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 1630b1888f24fa181489840b9acf193e224d125d0776Greg Clayton PlatformSP platform_sp (m_target.GetPlatform()); 1631b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (platform_sp) 1632b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return platform_sp->GetSoftwareBreakpointTrapOpcode (m_target, bp_site); 1633b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return 0; 1634b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 1635b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableSoftwareBreakpoint (BreakpointSite *bp_site) 163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bp_site != NULL); 1641e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t bp_addr = bp_site->GetLoadAddress(); 164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx", bp_site->GetID(), (uint64_t)bp_addr); 164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site->IsEnabled()) 164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already enabled", bp_site->GetID(), (uint64_t)bp_addr); 164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_addr == LLDB_INVALID_ADDRESS) 165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("BreakpointSite contains an invalid load address."); 165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Ask the lldb::Process subclass to fill in the correct software breakpoint 165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // trap for the breakpoint site 165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site); 166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_opcode_size == 0) 166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16639c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%llx", bp_addr); 166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes(); 166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_opcode_bytes == NULL) 167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode."); 167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Save the original opcode by reading it 167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size) 167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Write a software breakpoint in place of the original opcode 167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t verify_bp_opcode_bytes[64]; 168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0) 168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetEnabled(true); 168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetType (BreakpointSite::eSoftware); 168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", 169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr); 169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 16949c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorString("failed to verify the breakpoint trap in memory."); 169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory to verify breakpoint trap."); 169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to write breakpoint trap to memory."); 170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory at breakpoint address."); 170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1705c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson if (log && error.Fail()) 170624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s", 170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 170824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr, 170924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.AsCString()); 171024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 171124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 171224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 171324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 171424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableSoftwareBreakpoint (BreakpointSite *bp_site) 171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bp_site != NULL); 1718e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t bp_addr = bp_site->GetLoadAddress(); 172024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t breakID = bp_site->GetID(); 172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 1722444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::DisableBreakpoint (breakID = %llu) addr = 0x%llx", breakID, (uint64_t)bp_addr); 172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site->IsHardware()) 172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Breakpoint site is a hardware breakpoint."); 172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bp_site->IsEnabled()) 172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t break_op_size = bp_site->GetByteSize(); 173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes(); 173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (break_op_size > 0) 173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear a software breakoint instruction 173554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t curr_break_op[8]; 1736141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson assert (break_op_size <= sizeof(curr_break_op)); 173724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool break_op_found = false; 173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Read the breakpoint opcode 174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size) 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool verify = false; 174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure we have the a breakpoint opcode exists at this address 174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp (curr_break_op, break_op, break_op_size) == 0) 174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break_op_found = true; 174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We found a valid breakpoint opcode at this address, now restore 174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the saved opcode. 174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size) 175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner verify = true; 175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Memory write failed when restoring original opcode."); 175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Original breakpoint trap is no longer in memory."); 175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set verify to true and so we can check if the original opcode has already been restored 176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner verify = true; 176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (verify) 176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 176554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t verify_opcode[8]; 1766141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson assert (break_op_size < sizeof(verify_opcode)); 176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Verify that our original opcode made it back to the inferior 176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size) 176924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // compare the memory we just read with the original opcode 177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0) 177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 177324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // SUCCESS 177424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetEnabled(false); 177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr); 177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (break_op_found) 178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to restore original opcode."); 178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 178424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored."); 178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory that should contain the breakpoint trap."); 179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already disabled", bp_site->GetID(), (uint64_t)bp_addr); 179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s", 180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr, 180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.AsCString()); 180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1809fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton// Comment out line below to disable memory caching 1810fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#define ENABLE_MEMORY_CACHING 1811fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton// Uncomment to verify memory caching works after making changes to caching code 1812fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton//#define VERIFY_MEMORY_READS 1813fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1814fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#if defined (ENABLE_MEMORY_CACHING) 1815fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1816fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#if defined (VERIFY_MEMORY_READS) 1817fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1818fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 1819fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 1820fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 1821fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Memory caching is enabled, with debug verification 1822fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton if (buf && size) 1823fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton { 1824fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Uncomment the line below to make sure memory caching is working. 1825fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // I ran this through the test suite and got no assertions, so I am 1826fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // pretty confident this is working well. If any changes are made to 1827fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // memory caching, uncomment the line below and test your changes! 1828fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1829fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Verify all memory reads by using the cache first, then redundantly 1830fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // reading the same memory from the inferior and comparing to make sure 1831fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // everything is exactly the same. 1832fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton std::string verify_buf (size, '\0'); 1833fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (verify_buf.size() == size); 1834fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton const size_t cache_bytes_read = m_memory_cache.Read (this, addr, buf, size, error); 1835fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton Error verify_error; 1836fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton const size_t verify_bytes_read = ReadMemoryFromInferior (addr, const_cast<char *>(verify_buf.data()), verify_buf.size(), verify_error); 1837fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (cache_bytes_read == verify_bytes_read); 1838fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (memcmp(buf, verify_buf.data(), verify_buf.size()) == 0); 1839fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (verify_error.Success() == error.Success()); 1840fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return cache_bytes_read; 1841fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton } 1842fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return 0; 1843fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 1844fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1845fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#else // #if defined (VERIFY_MEMORY_READS) 1846fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1847fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 1848fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 1849fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 1850fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Memory caching enabled, no verification 1851613b8739a4d489b7f1c571288d5786768c024205Greg Clayton return m_memory_cache.Read (addr, buf, size, error); 1852fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 1853fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1854fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif // #else for #if defined (VERIFY_MEMORY_READS) 1855fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1856fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#else // #if defined (ENABLE_MEMORY_CACHING) 185724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 186024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1861fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Memory caching is disabled 1862fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return ReadMemoryFromInferior (addr, buf, size, error); 1863fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 1864fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1865fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif // #else for #if defined (ENABLE_MEMORY_CACHING) 1866fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1867fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1868fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 18694a2e33769873d68d5703da5742c0e248f46e3a72Greg ClaytonProcess::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len, Error &result_error) 1870b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 1871b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t total_cstr_len = 0; 1872b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (dst && dst_max_len) 1873b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 18744a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton result_error.Clear(); 1875b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // NULL out everything just to be safe 1876b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton memset (dst, 0, dst_max_len); 1877b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 1878b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton addr_t curr_addr = addr; 1879b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize(); 1880b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t bytes_left = dst_max_len - 1; 1881b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton char *curr_dst = dst; 1882b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1883b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton while (bytes_left > 0) 1884b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 1885b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size); 1886b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); 1887b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error); 1888b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1889b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (bytes_read == 0) 1890b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 18914a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton result_error = error; 1892b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton dst[total_cstr_len] = '\0'; 1893b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 1894b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 1895b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const size_t len = strlen(curr_dst); 1896b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1897b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton total_cstr_len += len; 1898b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1899b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (len < bytes_to_read) 1900b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 1901b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1902b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton curr_dst += bytes_read; 1903b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton curr_addr += bytes_read; 1904b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton bytes_left -= bytes_read; 1905b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 1906b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 19074a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton else 19084a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton { 19094a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton if (dst == NULL) 19104a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton result_error.SetErrorString("invalid arguments"); 19114a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton else 19124a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton result_error.Clear(); 19134a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton } 1914b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return total_cstr_len; 1915b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 1916b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1917b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonsize_t 1918fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemoryFromInferior (addr_t addr, void *buf, size_t size, Error &error) 1919fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (buf == NULL || size == 0) 192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 192224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_read = 0; 192424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t *bytes = (uint8_t *)buf; 192524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 192624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (bytes_read < size) 192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 192824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_size = size - bytes_read; 192924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_bytes_read = DoReadMemory (addr + bytes_read, 193024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes + bytes_read, 193124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 193224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 193324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_read += curr_bytes_read; 193424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_read == curr_size || curr_bytes_read == 0) 193524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 193624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 193824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Replace any software breakpoint opcodes that fall into this range back 193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // into "buf" before we return 194024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_read > 0) 194124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf); 194224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_read; 194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1945f72fdeee129bbd7195f3db888b561ede689886aaGreg Claytonuint64_t 1946c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadUnsignedIntegerFromMemory (lldb::addr_t vm_addr, size_t integer_byte_size, uint64_t fail_value, Error &error) 1947f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton{ 1948c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar scalar; 1949c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar, error)) 1950c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return scalar.ULongLong(fail_value); 1951c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return fail_value; 1952c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 1953c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1954c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonaddr_t 1955c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadPointerFromMemory (lldb::addr_t vm_addr, Error &error) 1956c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 1957c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar scalar; 1958c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar, error)) 1959c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return scalar.ULongLong(LLDB_INVALID_ADDRESS); 1960c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return LLDB_INVALID_ADDRESS; 1961c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 1962c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1963c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1964c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonbool 1965c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::WritePointerToMemory (lldb::addr_t vm_addr, 1966c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::addr_t ptr_value, 1967c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error &error) 1968c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 1969c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar scalar; 1970c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton const uint32_t addr_byte_size = GetAddressByteSize(); 1971c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (addr_byte_size <= 4) 1972c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = (uint32_t)ptr_value; 1973f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton else 1974c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = ptr_value; 1975c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) == addr_byte_size; 1976f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton} 1977f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton 197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error) 198024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_written = 0; 198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t *bytes = (const uint8_t *)buf; 198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (bytes_written < size) 198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_size = size - bytes_written; 198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written, 198824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes + bytes_written, 198924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 199024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 199124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += curr_bytes_written; 199224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_written == curr_size || curr_bytes_written == 0) 199324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 199424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 199524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 199624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 199724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 199824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 199924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error) 200024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2001fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#if defined (ENABLE_MEMORY_CACHING) 2002fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton m_memory_cache.Flush (addr, size); 2003fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif 2004fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (buf == NULL || size == 0) 200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 2007e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 200821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.BumpMemoryID(); 2009e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We need to write any data that would go where any current software traps 201124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // (enabled software breakpoints) any software traps (breakpoints) that we 201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // may have placed in our tasks memory. 201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator iter = m_breakpoint_site_list.GetMap()->lower_bound (addr); 201524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator end = m_breakpoint_site_list.GetMap()->end(); 201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (iter == end || iter->second->GetLoadAddress() > addr + size) 2018c8bc1c318cfed0e3fe22731d808ddac1b32bb26eGreg Clayton return WriteMemoryPrivate (addr, buf, size, error); 201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator pos; 202124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_written = 0; 202254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton addr_t intersect_addr = 0; 202354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton size_t intersect_size = 0; 202454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton size_t opcode_offset = 0; 202524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t *ubuf = (const uint8_t *)buf; 202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = iter; pos != end; ++pos) 202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp; 203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp = pos->second; 203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset)); 203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(addr <= intersect_addr && intersect_addr < addr + size); 203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size); 203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(opcode_offset + intersect_size <= bp->GetByteSize()); 203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check for bytes before this breakpoint 203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t curr_addr = addr + bytes_written; 203924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (intersect_addr > curr_addr) 204024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // There are some bytes before this breakpoint that we need to 204224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // just write to memory 204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t curr_size = intersect_addr - curr_addr; 204424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t curr_bytes_written = WriteMemoryPrivate (curr_addr, 204524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ubuf + bytes_written, 204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += curr_bytes_written; 204924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_written != curr_size) 205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to write all of the requested bytes, we 205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // are done looping and will return the number of bytes that 205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we have written so far. 205424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 205524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now write any bytes that would cover up any software breakpoints 205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // directly into the breakpoint opcode buffer 206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size); 206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += intersect_size; 206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Write any remaining bytes after the last breakpoint if we have any left 206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_written < size) 206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += WriteMemoryPrivate (addr + bytes_written, 206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ubuf + bytes_written, 206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size - bytes_written, 206924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 2070e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 207224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2073c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2074c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonsize_t 2075c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::WriteScalarToMemory (addr_t addr, const Scalar &scalar, uint32_t byte_size, Error &error) 2076c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 2077c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size == UINT32_MAX) 2078c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton byte_size = scalar.GetByteSize(); 2079c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size > 0) 2080c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2081c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint8_t buf[32]; 2082c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton const size_t mem_size = scalar.GetAsMemoryData (buf, byte_size, GetByteOrder(), error); 2083c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (mem_size > 0) 2084c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return WriteMemory(addr, buf, mem_size, error); 2085c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 2086c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorString ("failed to get scalar as memory data"); 2087c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2088c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 2089c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2090c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorString ("invalid scalar value"); 2091c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2092c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return 0; 2093c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 2094c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2095c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonsize_t 2096c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadScalarIntegerFromMemory (addr_t addr, 2097c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint32_t byte_size, 2098c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton bool is_signed, 2099c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar &scalar, 2100c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error &error) 2101c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 2102c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint64_t uval; 2103c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2104c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size <= sizeof(uval)) 2105c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2106c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton size_t bytes_read = ReadMemory (addr, &uval, byte_size, error); 2107c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (bytes_read == byte_size) 2108c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2109c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton DataExtractor data (&uval, sizeof(uval), GetByteOrder(), GetAddressByteSize()); 2110c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint32_t offset = 0; 2111c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size <= 4) 2112c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = data.GetMaxU32 (&offset, byte_size); 2113c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 2114c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = data.GetMaxU64 (&offset, byte_size); 2115c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2116c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (is_signed) 2117c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar.SignExtend(byte_size * 8); 2118c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return bytes_read; 2119c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2120c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2121c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 2122c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 2123c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size); 2124c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 2125c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return 0; 2126c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 2127c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 2128613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#define USE_ALLOCATE_MEMORY_CACHE 1 212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t 213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::AllocateMemory(size_t size, uint32_t permissions, Error &error) 213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2132e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham if (GetPrivateState() != eStateStopped) 2133e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham return LLDB_INVALID_ADDRESS; 2134e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham 2135613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#if defined (USE_ALLOCATE_MEMORY_CACHE) 2136613b8739a4d489b7f1c571288d5786768c024205Greg Clayton return m_allocated_memory_cache.AllocateMemory(size, permissions, error); 2137613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#else 21382860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton addr_t allocated_addr = DoAllocateMemory (size, permissions, error); 21392860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 21402860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton if (log) 214121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham log->Printf("Process::AllocateMemory(size=%4zu, permissions=%s) => 0x%16.16llx (m_stop_id = %u m_memory_id = %u)", 21422860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton size, 2143613b8739a4d489b7f1c571288d5786768c024205Greg Clayton GetPermissionsAsCString (permissions), 21442860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton (uint64_t)allocated_addr, 214521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetStopID(), 214621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetMemoryID()); 21472860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton return allocated_addr; 2148613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#endif 214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21516cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callananbool 21526cf6c474742a23e7cb6b4f618bf1de711db90a85Sean CallananProcess::CanJIT () 21536cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan{ 21546cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan return m_can_jit == eCanJITYes; 21556cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan} 21566cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan 21576cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callananvoid 21586cf6c474742a23e7cb6b4f618bf1de711db90a85Sean CallananProcess::SetCanJIT (bool can_jit) 21596cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan{ 21606cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan m_can_jit = (can_jit ? eCanJITYes : eCanJITNo); 21616cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan} 21626cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan 216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DeallocateMemory (addr_t ptr) 216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2166613b8739a4d489b7f1c571288d5786768c024205Greg Clayton Error error; 2167613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#if defined (USE_ALLOCATE_MEMORY_CACHE) 2168613b8739a4d489b7f1c571288d5786768c024205Greg Clayton if (!m_allocated_memory_cache.DeallocateMemory(ptr)) 2169613b8739a4d489b7f1c571288d5786768c024205Greg Clayton { 2170613b8739a4d489b7f1c571288d5786768c024205Greg Clayton error.SetErrorStringWithFormat ("deallocation of memory at 0x%llx failed.", (uint64_t)ptr); 2171613b8739a4d489b7f1c571288d5786768c024205Greg Clayton } 2172613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#else 2173613b8739a4d489b7f1c571288d5786768c024205Greg Clayton error = DoDeallocateMemory (ptr); 21742860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton 21752860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 21762860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton if (log) 217721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham log->Printf("Process::DeallocateMemory(addr=0x%16.16llx) => err = %s (m_stop_id = %u, m_memory_id = %u)", 21782860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton ptr, 21792860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton error.AsCString("SUCCESS"), 218021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetStopID(), 218121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetMemoryID()); 2182613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#endif 21832860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton return error; 218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 2188ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenProcess::EnableWatchpoint (Watchpoint *watchpoint) 218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("watchpoints are not supported"); 219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 2196ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenProcess::DisableWatchpoint (Watchpoint *watchpoint) 219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("watchpoints are not supported"); 220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 220324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp) 220524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 220624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state; 220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now wait for the process to launch and return control to us, and then 220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // call DidLaunch: 220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (1) 221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 221172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton event_sp.reset(); 221272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton state = WaitForStateChangedEventsPrivate (timeout, event_sp); 221372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 2214202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton if (StateIsStoppedState(state, false)) 221524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 221672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 221772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton // If state is invalid, then we timed out 221872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (state == eStateInvalid) 221972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton break; 222072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 222172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (event_sp) 222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 222836bc5ea5a48c19421d44f559e2165c105657b809Greg ClaytonProcess::Launch (const ProcessLaunchInfo &launch_info) 222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 223275c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap.reset(); 223337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 2234861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22365beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module *exe_module = m_target.GetExecutableModulePointer(); 223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_module) 223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2239180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton char local_exec_file_path[PATH_MAX]; 2240180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton char platform_exec_file_path[PATH_MAX]; 2241180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path)); 2242180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path)); 224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_module->GetFileSpec().Exists()) 224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2245a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton if (PrivateStateThreadIsValid ()) 2246a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton PausePrivateStateThread (); 2247a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton 224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = WillLaunch (exe_module); 224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2251d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton SetPublicState (eStateLaunching); 2252ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_should_detach = false; 225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now launch using these arguments. 225536bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton error = DoLaunch (exe_module, launch_info); 225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Fail()) 225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetID() != LLDB_INVALID_PROCESS_ID) 226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetID (LLDB_INVALID_PROCESS_ID); 226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *error_string = error.AsCString(); 226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error_string == NULL) 226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_string = "launch failed"; 226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetExitStatus (-1, error_string); 226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 22714985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton TimeValue timeout_time; 22724985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton timeout_time = TimeValue::Now(); 22734985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton timeout_time.OffsetWithSeconds(10); 22744985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton StateType state = WaitForProcessStopPrivate(&timeout_time, event_sp); 227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22764985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton if (state == eStateInvalid || event_sp.get() == NULL) 22774985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton { 22784985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton // We were able to launch the process, but we failed to 22794985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton // catch the initial stop. 22804985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton SetExitStatus (0, "failed to catch stop after launch"); 22814985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton Destroy(); 22824985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton } 22834985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton else if (state == eStateStopped || state == eStateCrashed) 228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 228575c703dd8b492bad25a987b96853626641ae7246Greg Clayton 228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidLaunch (); 228724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 228837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_dyld_ap.reset (DynamicLoader::FindPlugin (this, NULL)); 228975c703dd8b492bad25a987b96853626641ae7246Greg Clayton if (m_dyld_ap.get()) 229075c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap->DidLaunch(); 229175c703dd8b492bad25a987b96853626641ae7246Greg Clayton 229237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 229324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This delays passing the stopped event to listeners till DidLaunch gets 229424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a chance to complete... 229524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 2296a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton 2297a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton if (PrivateStateThreadIsValid ()) 2298a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton ResumePrivateStateThread (); 2299a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton else 2300a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton StartPrivateStateThread (); 230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (state == eStateExited) 230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We exited while trying to launch somehow. Don't call DidLaunch as that's 230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // not likely to work, and return an invalid pid. 230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23139c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("file doesn't exist: '%s'", local_exec_file_path); 231424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 231724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 231824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2319c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::NextEventAction::EventActionResult 2320c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp) 232124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2322c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham StateType state = ProcessEventData::GetStateFromEvent (event_sp.get()); 2323c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham switch (state) 232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23257e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateRunning: 2326a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton case eStateConnected: 23277e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton return eEventActionRetry; 23287e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 23297e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateStopped: 23307e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateCrashed: 23312d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton { 23322d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton // During attach, prior to sending the eStateStopped event, 23332d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton // lldb_private::Process subclasses must set the process must set 23342d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton // the new process ID. 23352d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID); 23362d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton if (m_exec_count > 0) 23372d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton { 23382d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton --m_exec_count; 23392d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton m_process->Resume(); 23402d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton return eEventActionRetry; 23412d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton } 23422d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton else 23432d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton { 23442d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton m_process->CompleteAttach (); 23452d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton return eEventActionSuccess; 23462d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton } 23472d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton } 23487e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton break; 23492d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton 23507e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton default: 23517e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateExited: 23527e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateInvalid: 23537e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton break; 235424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23552d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton 23562d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton m_exit_string.assign ("No valid Process"); 23572d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton return eEventActionExit; 2358c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham} 2359c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2360c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::NextEventAction::EventActionResult 2361c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::AttachCompletionHandler::HandleBeingInterrupted() 2362c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham{ 2363c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham return eEventActionSuccess; 2364c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham} 2365c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2366c2dc7c88cebe05cce059970cc907768256b28a42Jim Inghamconst char * 2367c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::AttachCompletionHandler::GetExitString () 2368c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham{ 2369c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham return m_exit_string.c_str(); 237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 2373527154d8e532f27f25af226c9e1dac607c48b5d1Greg ClaytonProcess::Attach (ProcessAttachInfo &attach_info) 237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 237524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 2376861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 237775c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap.reset(); 237837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 23797508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 2380527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton lldb::pid_t attach_pid = attach_info.GetProcessID(); 2381e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 2382527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (attach_pid == LLDB_INVALID_PROCESS_ID) 23837508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 2384527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton char process_name[PATH_MAX]; 23850d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham 2386527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (attach_info.GetExecutableFile().GetPath (process_name, sizeof(process_name))) 2387ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham { 2388527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const bool wait_for_launch = attach_info.GetWaitForLaunch(); 2389527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2390527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (wait_for_launch) 2391e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2392527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error = WillAttachToProcessWithName(process_name, wait_for_launch); 2393527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (error.Success()) 2394527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2395ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_should_detach = true; 2396ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton 2397527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetPublicState (eStateAttaching); 2398527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error = DoAttachToProcessWithName (process_name, wait_for_launch); 2399527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (error.Fail()) 2400527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2401527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 2402527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2403527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetID (LLDB_INVALID_PROCESS_ID); 2404527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (error.AsCString() == NULL) 2405527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString("attach failed"); 2406527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2407527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetExitStatus(-1, error.AsCString()); 2408527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2409527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2410527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 2411527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2412527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount())); 2413527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton StartPrivateStateThread(); 2414527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2415527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return error; 2416527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2417e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2418527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 2419e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2420527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton ProcessInstanceInfoList process_infos; 2421527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton PlatformSP platform_sp (m_target.GetPlatform ()); 2422527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2423527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (platform_sp) 2424527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2425527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton ProcessInstanceInfoMatch match_info; 2426527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton match_info.GetProcessInfo() = attach_info; 2427527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton match_info.SetNameMatchType (eNameMatchEquals); 2428527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton platform_sp->FindProcesses (match_info, process_infos); 2429527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton const uint32_t num_matches = process_infos.GetSize(); 2430527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (num_matches == 1) 2431527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2432527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton attach_pid = process_infos.GetProcessIDAtIndex(0); 2433527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton // Fall through and attach using the above process ID 2434527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2435527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 2436527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2437527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton match_info.GetProcessInfo().GetExecutableFile().GetPath (process_name, sizeof(process_name)); 2438527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (num_matches > 1) 2439527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorStringWithFormat ("more than one process named %s", process_name); 2440527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 2441527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorStringWithFormat ("could not find a process named %s", process_name); 2442527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2443527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2444527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 2445527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2446527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString ("invalid platform, can't find processes by name"); 2447527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton return error; 2448527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2449e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2450e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2451e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 2452527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2453527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error.SetErrorString ("invalid process name"); 2454ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham } 24557508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 2456527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2457527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (attach_pid != LLDB_INVALID_PROCESS_ID) 245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2459527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error = WillAttachToProcessWithID(attach_pid); 2460e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error.Success()) 246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2462ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton m_should_detach = true; 2463e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetPublicState (eStateAttaching); 2464527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2465527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error = DoAttachToProcessWithID (attach_pid); 2466527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (error.Success()) 2467527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton { 2468527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 2469527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount())); 2470527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton StartPrivateStateThread(); 2471527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton } 2472527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton else 247324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2474e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 2475e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2476e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetID (LLDB_INVALID_PROCESS_ID); 2477e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton const char *error_string = error.AsCString(); 2478e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error_string == NULL) 2479e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error_string = "attach failed"; 248024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2481e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetExitStatus(-1, error_string); 2482e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2483e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2489527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//Error 2490527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//Process::Attach (const char *process_name, bool wait_for_launch) 2491527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//{ 2492527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// m_abi_sp.reset(); 2493527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// m_process_input_reader.reset(); 2494527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// 2495527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// // Find the process and its architecture. Make sure it matches the architecture 2496527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// // of the current Target, and if not adjust it. 2497527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// Error error; 2498527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// 2499527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (!wait_for_launch) 2500527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2501527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// ProcessInstanceInfoList process_infos; 2502527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// PlatformSP platform_sp (m_target.GetPlatform ()); 2503527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// assert (platform_sp.get()); 2504527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// 2505527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (platform_sp) 2506527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2507527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// ProcessInstanceInfoMatch match_info; 2508527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// match_info.GetProcessInfo().SetName(process_name); 2509527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// match_info.SetNameMatchType (eNameMatchEquals); 2510527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// platform_sp->FindProcesses (match_info, process_infos); 2511527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (process_infos.GetSize() > 1) 2512527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2513527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// error.SetErrorStringWithFormat ("more than one process named %s", process_name); 2514527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2515527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// else if (process_infos.GetSize() == 0) 2516527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2517527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// error.SetErrorStringWithFormat ("could not find a process named %s", process_name); 2518527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2519527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2520527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// else 2521527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2522527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// error.SetErrorString ("invalid platform"); 2523527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2524527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2525527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// 2526527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (error.Success()) 2527527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2528527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// m_dyld_ap.reset(); 2529527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// m_os_ap.reset(); 2530527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// 2531527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// error = WillAttachToProcessWithName(process_name, wait_for_launch); 2532527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (error.Success()) 2533527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2534527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// SetPublicState (eStateAttaching); 2535527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// error = DoAttachToProcessWithName (process_name, wait_for_launch); 2536527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (error.Fail()) 2537527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2538527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (GetID() != LLDB_INVALID_PROCESS_ID) 2539527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2540527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// SetID (LLDB_INVALID_PROCESS_ID); 2541527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// const char *error_string = error.AsCString(); 2542527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// if (error_string == NULL) 2543527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// error_string = "attach failed"; 2544527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// 2545527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// SetExitStatus(-1, error_string); 2546527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2547527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2548527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// else 2549527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// { 2550527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// SetNextEventAction(new Process::AttachCompletionHandler(this, 0)); 2551527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// StartPrivateStateThread(); 2552527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2553527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2554527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// } 2555527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton// return error; 2556527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton//} 2557527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 255875c703dd8b492bad25a987b96853626641ae7246Greg Claytonvoid 255975c703dd8b492bad25a987b96853626641ae7246Greg ClaytonProcess::CompleteAttach () 256075c703dd8b492bad25a987b96853626641ae7246Greg Clayton{ 256175c703dd8b492bad25a987b96853626641ae7246Greg Clayton // Let the process subclass figure out at much as it can about the process 256275c703dd8b492bad25a987b96853626641ae7246Greg Clayton // before we go looking for a dynamic loader plug-in. 256375c703dd8b492bad25a987b96853626641ae7246Greg Clayton DidAttach(); 256475c703dd8b492bad25a987b96853626641ae7246Greg Clayton 25650d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham // We just attached. If we have a platform, ask it for the process architecture, and if it isn't 25660d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham // the same as the one we've already set, switch architectures. 25670d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham PlatformSP platform_sp (m_target.GetPlatform ()); 25680d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham assert (platform_sp.get()); 25690d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham if (platform_sp) 25700d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham { 25710d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham ProcessInstanceInfo process_info; 25720d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham platform_sp->GetProcessInfo (GetID(), process_info); 25730d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham const ArchSpec &process_arch = process_info.GetArchitecture(); 25740d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham if (process_arch.IsValid() && m_target.GetArchitecture() != process_arch) 25750d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham m_target.SetArchitecture (process_arch); 25760d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham } 25770d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham 25780d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham // We have completed the attach, now it is time to find the dynamic loader 257975c703dd8b492bad25a987b96853626641ae7246Greg Clayton // plug-in 25804fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL)); 258175c703dd8b492bad25a987b96853626641ae7246Greg Clayton if (m_dyld_ap.get()) 258275c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap->DidAttach(); 258375c703dd8b492bad25a987b96853626641ae7246Greg Clayton 258437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 258575c703dd8b492bad25a987b96853626641ae7246Greg Clayton // Figure out which one is the executable, and set that in our target: 258675c703dd8b492bad25a987b96853626641ae7246Greg Clayton ModuleList &modules = m_target.GetImages(); 258775c703dd8b492bad25a987b96853626641ae7246Greg Clayton 258875c703dd8b492bad25a987b96853626641ae7246Greg Clayton size_t num_modules = modules.GetSize(); 258975c703dd8b492bad25a987b96853626641ae7246Greg Clayton for (int i = 0; i < num_modules; i++) 259075c703dd8b492bad25a987b96853626641ae7246Greg Clayton { 259175c703dd8b492bad25a987b96853626641ae7246Greg Clayton ModuleSP module_sp (modules.GetModuleAtIndex(i)); 2592b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (module_sp && module_sp->IsExecutable()) 259375c703dd8b492bad25a987b96853626641ae7246Greg Clayton { 25945beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton if (m_target.GetExecutableModulePointer() != module_sp.get()) 259575c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_target.SetExecutableModule (module_sp, false); 259675c703dd8b492bad25a987b96853626641ae7246Greg Clayton break; 259775c703dd8b492bad25a987b96853626641ae7246Greg Clayton } 259875c703dd8b492bad25a987b96853626641ae7246Greg Clayton } 259975c703dd8b492bad25a987b96853626641ae7246Greg Clayton} 260075c703dd8b492bad25a987b96853626641ae7246Greg Clayton 260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 2602e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg ClaytonProcess::ConnectRemote (const char *remote_url) 2603e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton{ 2604e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton m_abi_sp.reset(); 2605e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton m_process_input_reader.reset(); 2606e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2607e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // Find the process and its architecture. Make sure it matches the architecture 2608e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // of the current Target, and if not adjust it. 2609e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2610e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton Error error (DoConnectRemote (remote_url)); 2611e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton if (error.Success()) 2612e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton { 2613a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 2614a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton { 261524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton EventSP event_sp; 261624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton StateType state = WaitForProcessStopPrivate(NULL, event_sp); 261724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 261824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (state == eStateStopped || state == eStateCrashed) 261924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 262024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // If we attached and actually have a process on the other end, then 262124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // this ended up being the equivalent of an attach. 262224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton CompleteAttach (); 262324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 262424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // This delays passing the stopped event to listeners till 262524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // CompleteAttach gets a chance to complete... 262624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton HandlePrivateEvent (event_sp); 262724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 262824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 2629a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton } 263024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 263124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (PrivateStateThreadIsValid ()) 263224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ResumePrivateStateThread (); 263324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 263424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton StartPrivateStateThread (); 2635e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton } 2636e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton return error; 2637e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton} 2638e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2639e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2640e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg ClaytonError 264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Resume () 264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2643e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 2645ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham log->Printf("Process::Resume() m_stop_id = %u, public state: %s private state: %s", 264621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetStopID(), 2647ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham StateAsCString(m_public_state.GetValue()), 2648ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham StateAsCString(m_private_state.GetValue())); 264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillResume()); 265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Tell the process it is about to resume before the thread list 265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26549c11d478f7c2a1611b591cd599782b7a0a8c5c37Johnny Chen // Now let the thread list know we are about to resume so it 265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // can let all of our threads know that they are about to be 265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // resumed. Threads will each be called with 265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Thread::WillResume(StateType) where StateType contains the state 265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // that they are supposed to have when the process is resumed 265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // (suspended/running/stepping). Threads should also check 266024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // their resume signal in lldb::Thread::GetResumeSignal() 266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to see if they are suppoed to start back up with a signal. 266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_list.WillResume()) 266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26640296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham m_mod_id.BumpResumeID(); 266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoResume(); 266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidResume(); 266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_list.DidResume(); 2670ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham if (log) 2671ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham log->Printf ("Process thinks the process has resumed."); 267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 267524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2676ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham error.SetErrorStringWithFormat("Process::WillResume() thread list returned false after WillResume"); 267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2679ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham else if (log) 2680ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham log->Printf ("Process::WillResume() got an error \"%s\".", error.AsCString("<unknown error>")); 268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Halt () 268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2687c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Pause our private state thread so we can ensure no one else eats 2688c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // the stop event out from under us. 2689f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Listener halt_listener ("lldb.process.halt_listener"); 2690f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham HijackPrivateProcessEvents(&halt_listener); 2691c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2692c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham EventSP event_sp; 26937e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton Error error (WillHalt()); 269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26957e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton if (error.Success()) 2696c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 269720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 26987e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton bool caused_stop = false; 26997e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 27007e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // Ask the process subclass to actually halt our process 27017e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton error = DoHalt(caused_stop); 270224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 27033ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 27047e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton if (m_public_state.GetValue() == eStateAttaching) 27057e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton { 27067e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton SetExitStatus(SIGKILL, "Cancelled async attach."); 27077e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton Destroy (); 27087e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton } 27097e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton else 27103ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 2711c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // If "caused_stop" is true, then DoHalt stopped the process. If 2712c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // "caused_stop" is false, the process was already stopped. 2713c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // If the DoHalt caused the process to stop, then we want to catch 2714c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // this event and set the interrupted bool to true before we pass 2715c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // this along so clients know that the process was interrupted by 2716c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // a halt command. 2717c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (caused_stop) 271820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 2719f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Wait for 1 second for the process to stop. 2720c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham TimeValue timeout_time; 2721c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham timeout_time = TimeValue::Now(); 2722c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham timeout_time.OffsetWithSeconds(1); 2723f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool got_event = halt_listener.WaitForEvent (&timeout_time, event_sp); 2724f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StateType state = ProcessEventData::GetStateFromEvent(event_sp.get()); 2725c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2726f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!got_event || state == eStateInvalid) 272720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 2728c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // We timeout out and didn't get a stop event... 2729f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham error.SetErrorStringWithFormat ("Halt timed out. State = %s", StateAsCString(GetState())); 273020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 273120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton else 273220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 2733202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton if (StateIsStoppedState (state, false)) 2734c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2735c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // We caused the process to interrupt itself, so mark this 2736c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // as such in the stop event so clients can tell an interrupted 2737c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // process from a natural stop 2738c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham ProcessEventData::SetInterruptedInEvent (event_sp.get(), true); 2739c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2740c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham else 2741c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2742c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2743c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (log) 2744c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state)); 2745c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham error.SetErrorString ("Did not get stopped event after halt."); 2746c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 274720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 274820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 2749c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham DidHalt(); 2750c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 27513ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 2752c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2753c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Resume our private state thread before we post the event (if any) 2754f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham RestorePrivateProcessEvents(); 275520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 2756c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Post any event we might have consumed. If all goes well, we will have 2757c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // stopped the process, intercepted the event and set the interrupted 2758c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // bool in the event. Post it to the private event queue and that will end up 2759c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // correctly setting the state. 2760c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (event_sp) 2761c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham m_private_state_broadcaster.BroadcastEvent(event_sp); 276220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Detach () 276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillDetach()); 277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableAllBreakpointSites(); 277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoDetach(); 277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 277624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidDetach(); 277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Destroy () 278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillDestroy()); 278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 279024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableAllBreakpointSites(); 279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoDestroy(); 279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidDestroy(); 279524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2797861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.StopReadThread(); 2798861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.Disconnect(); 2799861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && m_process_input_reader->IsActive()) 2800861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PopInputReader (m_process_input_reader); 2801861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader) 2802861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Signal (int signal) 280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillSignal()); 281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoSignal(signal); 281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidSignal(); 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2820395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Claytonlldb::ByteOrder 2821395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonProcess::GetByteOrder () const 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2823395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return m_target.GetArchitecture().GetByteOrder(); 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 2827395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonProcess::GetAddressByteSize () const 282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2829395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return m_target.GetArchitecture().GetAddressByteSize(); 283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2832395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ShouldBroadcastEvent (Event *event_ptr) 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr); 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool return_value = true; 2838e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 284024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (state) 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2842e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton case eStateConnected: 284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateAttaching: 284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateLaunching: 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateDetached: 284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateExited: 284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateUnloaded: 284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // These events indicate changes in the state of the debugging session, always report them. 284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateInvalid: 285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We stopped for no apparent reason, don't report it. 285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we've started the target running, we handle the cases where we 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // are already running and where there is a transition from stopped to 285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // running differently. 286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // running -> running: Automatically suppress extra running events 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // stopped -> running: Report except when there is one or more no votes 286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and no yes votes. 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SynchronouslyNotifyStateChanged (state); 286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_public_state.GetValue()) 286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We always suppress multiple runnings with no PUBLIC stop in between. 286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: make this work correctly. For now always report 287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // run if we aren't running so we don't miss any runnning 287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // events. If I run the lldb/test/thread/a.out file and 287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // break at main.cpp:58, run and hit the breakpoints on 287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // multiple threads, then somehow during the stepping over 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // of all breakpoints no run gets reported. 287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a transition from stop to run. 288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_thread_list.ShouldReportRun (event_ptr)) 288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteYes: 288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNoOpinion: 288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 288624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNo: 288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 289124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStopped: 289524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateCrashed: 289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateSuspended: 289724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 289824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We've stopped. First see if we're going to restart the target. 289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we are going to stop, then we always broadcast the event. 290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't going to stop, let the thread plans decide if we're going to report this event. 29015a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham // If no thread has an opinion, we don't report it. 29023ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (ProcessEventData::GetInterruptedFromEvent (event_ptr)) 29033ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 290420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (log) 290520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s", event_ptr, StateAsCString(state)); 29063ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return true; 29073ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 29083ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham else 290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RefreshStateAfterStop (); 291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 291224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_list.ShouldStop (event_ptr) == false) 291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_thread_list.ShouldReportStop (event_ptr)) 291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteYes: 291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process::ProcessEventData::SetRestartedInEvent (event_ptr, true); 2918028784b321087f1547df8f02f01631c59e5a9859Johnny Chen // Intentional fall-through here. 291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNoOpinion: 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNo: 292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 29263ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state)); 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Resume (); 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SynchronouslyNotifyStateChanged (state); 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 29397e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda log->Printf ("Process::ShouldBroadcastEvent (%p) => %s - %s", event_ptr, StateAsCString(state), return_value ? "YES" : "NO"); 294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_value; 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StartPrivateStateThread () 294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2947e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2949b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton bool already_running = PrivateStateThreadIsValid (); 295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 2951b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton log->Printf ("Process::%s()%s ", __FUNCTION__, already_running ? " already running" : " starting private state thread"); 2952b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 2953b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (already_running) 2954b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return true; 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Create a thread that watches our internal state and controls which 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // events make it to clients (into the DCProcess event queue). 2958a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton char thread_name[1024]; 2959444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state(pid=%llu)>", GetID()); 2960a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_private_state_thread = Host::ThreadCreate (thread_name, Process::PrivateStateThread, this, NULL); 296109c81efd010d1c9ac8821bad00cdfc9747fcae79Greg Clayton return IS_VALID_LLDB_HOST_THREAD(m_private_state_thread); 296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PausePrivateStateThread () 296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ControlPrivateStateThread (eBroadcastInternalStateControlPause); 296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ResumePrivateStateThread () 297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ControlPrivateStateThread (eBroadcastInternalStateControlResume); 297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StopPrivateStateThread () 297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2979b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (PrivateStateThreadIsValid ()) 2980b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ControlPrivateStateThread (eBroadcastInternalStateControlStop); 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ControlPrivateStateThread (uint32_t signal) 298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2986e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (signal == eBroadcastInternalStateControlStop || 298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal == eBroadcastInternalStateControlPause || 299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal == eBroadcastInternalStateControlResume); 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 2993f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal); 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2995f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // Signal the private state thread. First we should copy this is case the 2996f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // thread starts exiting since the private state thread will NULL this out 2997f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // when it exits 2998f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton const lldb::thread_t private_state_thread = m_private_state_thread; 299909c81efd010d1c9ac8821bad00cdfc9747fcae79Greg Clayton if (IS_VALID_LLDB_HOST_THREAD(private_state_thread)) 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TimeValue timeout_time; 300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool timed_out; 300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_broadcaster.BroadcastEvent (signal, NULL); 300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout_time = TimeValue::Now(); 300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout_time.OffsetWithSeconds(2); 300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out); 300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (false, eBroadcastNever); 301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signal == eBroadcastInternalStateControlStop) 301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (timed_out) 3014f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton Host::ThreadCancel (private_state_thread, NULL); 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread_result_t result = NULL; 3017f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton Host::ThreadJoin (private_state_thread, &result, NULL); 3018c607d8681f443d03806f105ceceb11dcadd16184Greg Clayton m_private_state_thread = LLDB_INVALID_HOST_THREAD; 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::HandlePrivateEvent (EventSP &event_sp) 302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3026e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3027c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 302868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton const StateType new_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3029c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 3030c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // First check to see if anybody wants a shot at this event: 303168bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham if (m_next_event_action_ap.get() != NULL) 3032c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 303368bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham NextEventAction::EventActionResult action_result = m_next_event_action_ap->PerformAction(event_sp); 3034c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham switch (action_result) 3035c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 3036c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham case NextEventAction::eEventActionSuccess: 3037c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham SetNextEventAction(NULL); 3038c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham break; 30392d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton 3040c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham case NextEventAction::eEventActionRetry: 3041c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham break; 30422d9adb73af7520bec430e0585ca40467828e6ed1Greg Clayton 3043c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham case NextEventAction::eEventActionExit: 304484c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // Handle Exiting Here. If we already got an exited event, 304584c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // we should just propagate it. Otherwise, swallow this event, 304684c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // and set our state to exit so the next event will kill us. 304784c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham if (new_state != eStateExited) 304884c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham { 304984c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // FIXME: should cons up an exited event, and discard this one. 305068bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham SetExitStatus(0, m_next_event_action_ap->GetExitString()); 305184c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham SetNextEventAction(NULL); 305284c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham return; 305384c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham } 305484c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham SetNextEventAction(NULL); 3055c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham break; 3056c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 3057c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 3058c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if we should broadcast this state to external clients? 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const bool should_broadcast = ShouldBroadcastEvent (event_sp.get()); 306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (should_broadcast) 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3066444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::%s (pid = %llu) broadcasting new state %s (old state %s) to %s", 306768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton __FUNCTION__, 306868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton GetID(), 306968ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString(new_state), 307068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString (GetState ()), 307168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public"); 307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3073d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get()); 307468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton if (StateIsRunningState (new_state)) 3075861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice PushProcessInputReader (); 3076861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice else 3077861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice PopProcessInputReader (); 3078d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BroadcastEvent (event_sp); 308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3085444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::%s (pid = %llu) suppressing state %s (old state %s): should_broadcast == false", 308668ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton __FUNCTION__, 308768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton GetID(), 308868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString(new_state), 30897e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda StateAsCString (GetState ())); 309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PrivateStateThread (void *arg) 309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process *proc = static_cast<Process*> (arg); 309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *result = proc->RunPrivateStateThread (); 309924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 310024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 310324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RunPrivateStateThread () 310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool control_only = false; 310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (false, eBroadcastNever); 310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3108e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 3110444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::%s (arg = %p, pid = %llu) thread starting...", __FUNCTION__, this, GetID()); 311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool exit_now = false; 311324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (!exit_now) 311424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 311524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 311624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WaitForEventsPrivate (NULL, event_sp, control_only); 311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster)) 311824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 311924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (event_sp->GetType()) 312024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlStop: 312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exit_now = true; 312324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; // Go to next loop iteration so we exit without 312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; // doing any internal state managment below 312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlPause: 312724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner control_only = true; 312824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlResume: 313124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner control_only = false; 313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 313324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31343ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 31353ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (log) 3136444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::%s (arg = %p, pid = %llu) got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType()); 31373ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 313824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (true, eBroadcastAlways); 31393ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham continue; 314024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 314124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (internal_state != eStateInvalid) 314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31503b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton if (internal_state == eStateInvalid || 31513b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton internal_state == eStateExited || 31523b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton internal_state == eStateDetached ) 31533ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 31543ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (log) 3155444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::%s (arg = %p, pid = %llu) about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state)); 31563ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 31583ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3161926060e198137f8a64face70455324a8cd4362a5Caroline Tice // Verify log is still enabled before attempting to write to it... 316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 3163444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::%s (arg = %p, pid = %llu) thread exiting...", __FUNCTION__, this, GetID()); 316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3165a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton m_private_state_control_wait.SetValue (true, eBroadcastAlways); 3166a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton m_private_state_thread = LLDB_INVALID_HOST_THREAD; 316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process Event Data 317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData () : 317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventData (), 317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp (), 317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_state (eStateInvalid), 317854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton m_restarted (false), 31796cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham m_update_state (0), 31803ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_interrupted (false) 318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) : 318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventData (), 318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp (process_sp), 318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_state (state), 318854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton m_restarted (false), 31896cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham m_update_state (0), 31903ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_interrupted (false) 319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::~ProcessEventData() 319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetFlavorString () 320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString g_flavor ("Process::ProcessEventData"); 320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_flavor; 320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 320624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetFlavor () const 320724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ProcessEventData::GetFlavorString (); 320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 321024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 321124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::DoOnRemoval (Event *event_ptr) 321324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This function gets called twice for each event, once when the event gets pulled 32156cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // off of the private process event queue, and then any number of times, first when it gets pulled off of 32166cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // the public event queue, then other times when we're pretending that this is where we stopped at the 32176cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // end of expression evaluation. m_update_state is used to distinguish these 32186cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // three cases; it is 0 when we're just pulling it off for private handling, 32196cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // and > 1 for expression evaluation, and we don't want to do the breakpoint command handling then. 322024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32216cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham if (m_update_state != 1) 322224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 322324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp->SetPublicState (m_state); 322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we're stopped and haven't restarted, then do the breakpoint commands here: 322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_state == eStateStopped && ! m_restarted) 32280296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 32290296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham ThreadList &curr_thread_list = m_process_sp->GetThreadList(); 3230d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton uint32_t num_threads = curr_thread_list.GetSize(); 3231d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton uint32_t idx; 3232643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 323321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // The actions might change one of the thread's stop_info's opinions about whether we should 323421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // stop the process, so we need to query that as we go. 32350296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 32360296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // One other complication here, is that we try to catch any case where the target has run (except for expressions) 32370296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // and immediately exit, but if we get that wrong (which is possible) then the thread list might have changed, and 32380296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // that would cause our iteration here to crash. We could make a copy of the thread list, but we'd really like 32390296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // to also know if it has changed at all, so we make up a vector of the thread ID's and check what we get back 32400296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // against this list & bag out if anything differs. 3241d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton std::vector<uint32_t> thread_index_array(num_threads); 32420296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham for (idx = 0; idx < num_threads; ++idx) 32430296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham thread_index_array[idx] = curr_thread_list.GetThreadAtIndex(idx)->GetIndexID(); 32440296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 324521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham bool still_should_stop = true; 324621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 324724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; idx < num_threads; ++idx) 324824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32490296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham curr_thread_list = m_process_sp->GetThreadList(); 32500296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham if (curr_thread_list.GetSize() != num_threads) 32510296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 32520296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 325360526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham if (log) 3254d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton log->Printf("Number of threads changed from %u to %u while processing event.", num_threads, curr_thread_list.GetSize()); 32550296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham break; 32560296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham } 32570296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 32580296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham lldb::ThreadSP thread_sp = curr_thread_list.GetThreadAtIndex(idx); 32590296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 32600296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham if (thread_sp->GetIndexID() != thread_index_array[idx]) 32610296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 32620296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 326360526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham if (log) 3264d9919d3f46c5069eef065a27f96abc021330d5f3Greg Clayton log->Printf("The thread at position %u changed from %u to %u while processing event.", 326560526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham idx, 326660526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham thread_index_array[idx], 326760526c438ed8c41f54e4b76fc008c99ff4b9da17Jim Ingham thread_sp->GetIndexID()); 32680296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham break; 32690296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham } 32700296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 32716297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham StopInfoSP stop_info_sp = thread_sp->GetStopInfo (); 32726297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham if (stop_info_sp) 327324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32746297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham stop_info_sp->PerformAction(event_ptr); 327521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // The stop action might restart the target. If it does, then we want to mark that in the 327621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // event so that whoever is receiving it will know to wait for the running event and reflect 327721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // that state appropriately. 327821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We also need to stop processing actions, since they aren't expecting the target to be running. 32790296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham 32800296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham // FIXME: we might have run. 32810296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham if (stop_info_sp->HasTargetRunSinceMe()) 328221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 328321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham SetRestarted (true); 328421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham break; 328521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 328621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else if (!stop_info_sp->ShouldStop(event_ptr)) 328721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 328821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham still_should_stop = false; 328921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32926fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham 329321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 329421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (m_process_sp->GetPrivateState() != eStateRunning) 3295d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 329621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (!still_should_stop) 329721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 329821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We've been asked to continue, so do that here. 3299d60d94a5126b93fda98678a68322abc2164073dbJim Ingham SetRestarted(true); 330021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_process_sp->Resume(); 330121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 330221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else 330321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 330421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // If we didn't restart, run the Stop Hooks here: 330521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // They might also restart the target, so watch for that. 330621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_process_sp->GetTarget().RunStopHooks(); 330721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (m_process_sp->GetPrivateState() == eStateRunning) 330821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham SetRestarted(true); 330921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 3310d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 3311d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 331224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::Dump (Stream *s) const 331724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_process_sp) 3319444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton s->Printf(" process = %p (pid = %llu), ", m_process_sp.get(), m_process_sp->GetID()); 332024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3321b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s->Printf("state = %s", StateAsCString(GetState())); 332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Process::ProcessEventData * 332524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr) 332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 332724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_ptr) 332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EventData *event_data = event_ptr->GetData(); 333024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString()) 333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast <const ProcessEventData *> (event_ptr->GetData()); 333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 333424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcessSP 333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetProcessFromEvent (const Event *event_ptr) 333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp; 334024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data) 334224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process_sp = data->GetProcessSP(); 334324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return process_sp; 334424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 334524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 334624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 334724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetStateFromEvent (const Event *event_ptr) 334824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data == NULL) 335124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eStateInvalid; 335224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 335324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data->GetState(); 335424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 335524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 335624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr) 335824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 335924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 336024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data == NULL) 336124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data->GetRestarted(); 336424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value) 336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 336924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data != NULL) 337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetRestarted(new_value); 337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 33753ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr) 33763ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{ 33773ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 33783ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (data == NULL) 33793ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return false; 33803ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham else 33813ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return data->GetInterrupted (); 33823ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham} 33833ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 33843ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghamvoid 33853ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value) 33863ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{ 33873ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 33883ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (data != NULL) 33893ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham data->SetInterrupted(new_value); 33903ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham} 33913ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 33923ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghambool 339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr) 339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 339524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 339624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data) 339724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 339824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetUpdateStateOnRemoval(); 339924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3405a830adbcd63d1995a01e6e18da79893c1426ca43Greg ClaytonProcess::CalculateExecutionContext (ExecutionContext &exe_ctx) 340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3407567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetTargetPtr (&m_target); 3408567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetProcessPtr (this); 3409567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetThreadPtr(NULL); 3410567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFramePtr (NULL); 341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3413e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//uint32_t 3414e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids) 3415e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//{ 3416e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// return 0; 3417e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//} 3418e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 3419e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//ArchSpec 3420e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//Process::GetArchSpecForExistingProcess (lldb::pid_t pid) 3421e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//{ 3422e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// return Host::GetArchSpecForExistingProcess (pid); 3423e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//} 3424e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 3425e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//ArchSpec 3426e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//Process::GetArchSpecForExistingProcess (const char *process_name) 3427e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//{ 3428e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// return Host::GetArchSpecForExistingProcess (process_name); 3429e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//} 3430e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 3431861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3432861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::AppendSTDOUT (const char * s, size_t len) 3433861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 343420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton Mutex::Locker locker (m_stdio_communication_mutex); 3435861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdout_data.append (s, len); 3436b37813353540bcabee7af5f096515a8180be0426Greg Clayton BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (GetTarget().GetProcessSP(), GetState())); 3437861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3438861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3439861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3440bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg ClaytonProcess::AppendSTDERR (const char * s, size_t len) 3441bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton{ 3442bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton Mutex::Locker locker (m_stdio_communication_mutex); 3443bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stderr_data.append (s, len); 3444bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton BroadcastEventIfUnique (eBroadcastBitSTDERR, new ProcessEventData (GetTarget().GetProcessSP(), GetState())); 3445bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton} 3446bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3447bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton//------------------------------------------------------------------ 3448bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton// Process STDIO 3449bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton//------------------------------------------------------------------ 3450bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3451bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Claytonsize_t 3452bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg ClaytonProcess::GetSTDOUT (char *buf, size_t buf_size, Error &error) 3453bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton{ 3454bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton Mutex::Locker locker(m_stdio_communication_mutex); 3455bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton size_t bytes_available = m_stdout_data.size(); 3456bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton if (bytes_available > 0) 3457bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 3458bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3459bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton if (log) 3460bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton log->Printf ("Process::GetSTDOUT (buf = %p, size = %zu)", buf, buf_size); 3461bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton if (bytes_available > buf_size) 3462bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 3463bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton memcpy(buf, m_stdout_data.c_str(), buf_size); 3464bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stdout_data.erase(0, buf_size); 3465bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton bytes_available = buf_size; 3466bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 3467bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton else 3468bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 3469bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton memcpy(buf, m_stdout_data.c_str(), bytes_available); 3470bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stdout_data.clear(); 3471bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 3472bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 3473bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton return bytes_available; 3474bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton} 3475bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3476bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3477bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Claytonsize_t 3478bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg ClaytonProcess::GetSTDERR (char *buf, size_t buf_size, Error &error) 3479bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton{ 3480bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton Mutex::Locker locker(m_stdio_communication_mutex); 3481bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton size_t bytes_available = m_stderr_data.size(); 3482bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton if (bytes_available > 0) 3483bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 3484bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3485bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton if (log) 3486bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton log->Printf ("Process::GetSTDERR (buf = %p, size = %zu)", buf, buf_size); 3487bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton if (bytes_available > buf_size) 3488bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 3489bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton memcpy(buf, m_stderr_data.c_str(), buf_size); 3490bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stderr_data.erase(0, buf_size); 3491bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton bytes_available = buf_size; 3492bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 3493bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton else 3494bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton { 3495bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton memcpy(buf, m_stderr_data.c_str(), bytes_available); 3496bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton m_stderr_data.clear(); 3497bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 3498bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton } 3499bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton return bytes_available; 3500bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton} 3501bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Clayton 3502bd06ff435614ff4e884c40f3ea13e24f0cef96f7Greg Claytonvoid 3503861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len) 3504861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3505861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Process *process = (Process *) baton; 3506861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice process->AppendSTDOUT (static_cast<const char *>(src), src_len); 3507861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3508861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3509861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticesize_t 3510861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ProcessInputReaderCallback (void *baton, 3511861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice InputReader &reader, 3512861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice lldb::InputReaderAction notification, 3513861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice const char *bytes, 3514861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice size_t bytes_len) 3515861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3516861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Process *process = (Process *) baton; 3517861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3518861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice switch (notification) 3519861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3520861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderActivate: 3521861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3522861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3523861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderDeactivate: 3524861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3525861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3526861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderReactivate: 3527861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3528861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 35294a348081030cdd2af758fddc869518357d9befd3Caroline Tice case eInputReaderAsynchronousOutputWritten: 35304a348081030cdd2af758fddc869518357d9befd3Caroline Tice break; 35314a348081030cdd2af758fddc869518357d9befd3Caroline Tice 3532861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderGotToken: 3533861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3534861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Error error; 3535861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice process->PutSTDIN (bytes, bytes_len, error); 3536861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3537861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3538861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3539c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice case eInputReaderInterrupt: 3540c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice process->Halt (); 3541c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice break; 3542c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 3543c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice case eInputReaderEndOfFile: 3544c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice process->AppendSTDOUT ("^D", 2); 3545c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice break; 3546c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 3547861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderDone: 3548861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3549861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3550861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3551861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3552861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice return bytes_len; 3553861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3554861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3555861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3556861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ResetProcessInputReader () 3557861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3558861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 3559861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3560861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3561861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3562464c6161464694412b7472129e789248f1cf21b9Greg ClaytonProcess::SetSTDIOFileDescriptor (int file_descriptor) 3563861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3564861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // First set up the Read Thread for reading/handling process I/O 3565861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3566861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice std::auto_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true)); 3567861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3568861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (conn_ap.get()) 3569861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3570861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.SetConnection (conn_ap.release()); 3571861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_stdio_communication.IsConnected()) 3572861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3573861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this); 3574861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.StartReadThread(); 3575861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3576861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // Now read thread is set up, set up input reader. 3577861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3578861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (!m_process_input_reader.get()) 3579861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3580861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset (new InputReader(m_target.GetDebugger())); 3581861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback, 3582861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice this, 3583861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice eInputReaderGranularityByte, 3584861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice NULL, 3585861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice NULL, 3586861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice false)); 3587861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3588861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (err.Fail()) 3589861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 3590861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3591861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3592861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3593861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3594861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3595861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3596861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PushProcessInputReader () 3597861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3598861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && !m_process_input_reader->IsActive()) 3599861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PushInputReader (m_process_input_reader); 3600861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3601861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3602861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3603861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PopProcessInputReader () 3604861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3605861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && m_process_input_reader->IsActive()) 3606861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PopInputReader (m_process_input_reader); 3607861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3608861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3609d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton// The process needs to know about installed plug-ins 3610990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 36112a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceProcess::SettingsInitialize () 3612990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 3613b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static std::vector<OptionEnumValueElement> g_plugins; 3614d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton 3615d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton int i=0; 3616d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton const char *name; 3617d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton OptionEnumValueElement option_enum; 3618d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton while ((name = PluginManager::GetProcessPluginNameAtIndex (i)) != NULL) 3619d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3620d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton if (name) 3621d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3622d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.value = i; 3623d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.string_value = name; 3624d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.usage = PluginManager::GetProcessPluginDescriptionAtIndex (i); 3625d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton g_plugins.push_back (option_enum); 3626d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3627d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton ++i; 3628d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3629d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.value = 0; 3630d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.string_value = NULL; 3631d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.usage = NULL; 3632d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton g_plugins.push_back (option_enum); 3633d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton 3634d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton for (i=0; (name = SettingsController::instance_settings_table[i].var_name); ++i) 3635d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3636d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton if (::strcmp (name, "plugin") == 0) 3637d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3638d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton SettingsController::instance_settings_table[i].enum_values = &g_plugins[0]; 3639d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton break; 3640d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3641d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3642990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsControllerSP &usc = GetSettingsController(); 3643990de7bb41d3afec6b789155408ff322187d8682Greg Clayton usc.reset (new SettingsController); 3644990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsController::InitializeSettingsController (usc, 3645990de7bb41d3afec6b789155408ff322187d8682Greg Clayton SettingsController::global_settings_table, 3646990de7bb41d3afec6b789155408ff322187d8682Greg Clayton SettingsController::instance_settings_table); 36472a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 36482a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Now call SettingsInitialize() for each 'child' of Process settings 36492a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice Thread::SettingsInitialize (); 3650990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 36516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 3652990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 36532a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceProcess::SettingsTerminate () 3654990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 36552a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Must call SettingsTerminate() on each 'child' of Process settings before terminating Process settings. 36562a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 36572a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice Thread::SettingsTerminate (); 36582a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 36592a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Now terminate Process Settings. 36602a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 3661990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsControllerSP &usc = GetSettingsController(); 3662990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsController::FinalizeSettingsController (usc); 3663990de7bb41d3afec6b789155408ff322187d8682Greg Clayton usc.reset(); 3664990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 36656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 3666990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonUserSettingsControllerSP & 3667990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonProcess::GetSettingsController () 3668990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 3669334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton static UserSettingsControllerSP g_settings_controller_sp; 3670334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton if (!g_settings_controller_sp) 3671334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton { 3672334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton g_settings_controller_sp.reset (new Process::SettingsController); 3673334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton // The first shared pointer to Process::SettingsController in 3674334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton // g_settings_controller_sp must be fully created above so that 3675334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton // the TargetInstanceSettings can use a weak_ptr to refer back 3676334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton // to the master setttings controller 3677334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton InstanceSettingsSP default_instance_settings_sp (new ProcessInstanceSettings (g_settings_controller_sp, 3678334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton false, 3679334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton InstanceSettings::GetDefaultName().AsCString())); 3680334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton g_settings_controller_sp->SetDefaultInstanceSettings (default_instance_settings_sp); 3681334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton } 3682334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton return g_settings_controller_sp; 3683334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton 36846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 36856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 36861ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Ticevoid 36871ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline TiceProcess::UpdateInstanceName () 36881ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice{ 36895beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module *module = GetTarget().GetExecutableModulePointer(); 369013d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton if (module && module->GetFileSpec().GetFilename()) 36911ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice { 3692c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(), 369313d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton module->GetFileSpec().GetFilename().AsCString()); 36941ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice } 36951ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice} 36961ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 3697427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonExecutionResults 3698360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::RunThreadPlan (ExecutionContext &exe_ctx, 3699360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ThreadPlanSP &thread_plan_sp, 3700360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool stop_others, 3701360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool try_all_threads, 3702360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool discard_on_error, 3703360f53f3c216ee4fb433da0a367168785328a856Jim Ingham uint32_t single_thread_timeout_usec, 3704360f53f3c216ee4fb433da0a367168785328a856Jim Ingham Stream &errors) 3705360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 3706360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ExecutionResults return_value = eExecutionSetupError; 3707360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 370815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham if (thread_plan_sp.get() == NULL) 370915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 371015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham errors.Printf("RunThreadPlan called with empty thread plan."); 3711b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return eExecutionSetupError; 371215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 3713567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3714567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetProcessPtr() != this) 3715567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 3716567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton errors.Printf("RunThreadPlan called on wrong process."); 3717567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return eExecutionSetupError; 3718567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 3719567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3720567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 3721567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread == NULL) 3722567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 3723567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton errors.Printf("RunThreadPlan called with invalid thread."); 3724567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return eExecutionSetupError; 3725567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 372615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 37275ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // We rely on the thread plan we are running returning "PlanCompleted" if when it successfully completes. 37285ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // For that to be true the plan can't be private - since private plans suppress themselves in the 37295ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // GetCompletedPlan call. 37305ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham 37315ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham bool orig_plan_private = thread_plan_sp->GetPrivate(); 37325ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham thread_plan_sp->SetPrivate(false); 37335ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham 3734ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham if (m_private_state.GetValue() != eStateStopped) 3735ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham { 3736ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham errors.Printf ("RunThreadPlan called while the private state was not stopped."); 3737b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return eExecutionSetupError; 3738ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham } 3739ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham 37407bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham // Save the thread & frame from the exe_ctx for restoration after we run 3741567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton const uint32_t thread_idx_id = thread->GetIndexID(); 3742567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackID ctx_frame_id = thread->GetSelectedFrame()->GetStackID(); 3743360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3744360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // N.B. Running the target may unset the currently selected thread and frame. We don't want to do that either, 3745360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // so we should arrange to reset them as well. 3746360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3747567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::ThreadSP selected_thread_sp = GetThreadList().GetSelectedThread(); 3748360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 37497bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham uint32_t selected_tid; 37507bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham StackID selected_stack_id; 3751e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (selected_thread_sp) 3752360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3753360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_tid = selected_thread_sp->GetIndexID(); 37547bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham selected_stack_id = selected_thread_sp->GetSelectedFrame()->GetStackID(); 3755360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3756360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 3757360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3758360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_tid = LLDB_INVALID_THREAD_ID; 3759360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3760360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3761567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->QueueThreadPlan(thread_plan_sp, true); 3762360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 37636ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham Listener listener("lldb.process.listener.run-thread-plan"); 3764f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3765f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // This process event hijacker Hijacks the Public events and its destructor makes sure that the process events get 3766f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // restored on exit to the function. 3767f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3768f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ProcessEventHijacker run_thread_plan_hijacker (*this, &listener); 3769ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham 37706ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 377115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham if (log) 377215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 377315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham StreamString s; 377415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose); 3775444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::RunThreadPlan(): Resuming thread %u - 0x%4.4llx to run thread plan \"%s\".", 3776567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->GetIndexID(), 3777567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->GetID(), 3778f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham s.GetData()); 377915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 378015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 3781f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool got_event; 3782f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham lldb::EventSP event_sp; 3783f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham lldb::StateType stop_state = lldb::eStateInvalid; 3784360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3785360f53f3c216ee4fb433da0a367168785328a856Jim Ingham TimeValue* timeout_ptr = NULL; 3786360f53f3c216ee4fb433da0a367168785328a856Jim Ingham TimeValue real_timeout; 3787360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3788f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool first_timeout = true; 3789f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool do_resume = true; 3790360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3791360f53f3c216ee4fb433da0a367168785328a856Jim Ingham while (1) 3792360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3793f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We usually want to resume the process if we get to the top of the loop. 3794f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // The only exception is if we get two running events with no intervening 3795f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // stop, which can happen, we will just wait for then next stop event. 3796f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3797f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (do_resume) 3798f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3799f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Do the initial resume and wait for the running event before going further. 3800f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3801567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error resume_error = Resume (); 3802f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!resume_error.Success()) 3803f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3804f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham errors.Printf("Error resuming inferior: \"%s\".\n", resume_error.AsCString()); 3805b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionSetupError; 3806f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3807f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3808f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3809f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 3810f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(500000); 3811f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham timeout_ptr = &real_timeout; 3812f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3813faf0478359a33b892bc778a52accbac1895725e4Sean Callanan got_event = listener.WaitForEvent(timeout_ptr, event_sp); 3814f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!got_event) 3815f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3816f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3817f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Didn't get any event after initial resume, exiting."); 3818f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3819f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham errors.Printf("Didn't get any event after initial resume, exiting."); 3820b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionSetupError; 3821f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3822f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3823f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3824f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3825f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state != eStateRunning) 3826f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3827f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3828f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state)); 3829f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3830f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham errors.Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state)); 3831b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionSetupError; 3832f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3833f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3834f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3835f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3836f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Resuming succeeded."); 3837f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We need to call the function synchronously, so spin waiting for it to return. 3838f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // If we get interrupted while executing, we're going to lose our context, and 3839f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // won't be able to gather the result at this point. 3840f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We set the timeout AFTER the resume, since the resume takes some time and we 3841f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // don't want to charge that to the timeout. 3842f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3843f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (single_thread_timeout_usec != 0) 3844f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3845f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 3846f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 3847f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(single_thread_timeout_usec); 3848f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3849f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithSeconds(10); 3850f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3851f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham timeout_ptr = &real_timeout; 3852f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3853f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3854f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3855f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3856f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3857f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Handled an extra running event."); 3858f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham do_resume = true; 3859f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3860f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3861360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Now wait for the process to stop again: 3862f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = lldb::eStateInvalid; 3863f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_sp.reset(); 3864f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent (timeout_ptr, event_sp); 3865360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3866f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (got_event) 3867360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3868f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (event_sp.get()) 3869f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3870f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool keep_going = false; 3871f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3872f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3873f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf("In while loop, got event: %s.", StateAsCString(stop_state)); 3874f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3875f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham switch (stop_state) 3876f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3877f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham case lldb::eStateStopped: 38782370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 3879439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // Yay, we're done. Now make sure that our thread plan actually completed. 3880567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ThreadSP thread_sp = GetThreadList().FindThreadByIndexID (thread_idx_id); 3881439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (!thread_sp) 38822370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 3883439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // Ooh, our thread has vanished. Unlikely that this was successful execution... 38842370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham if (log) 3885439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton log->Printf ("Execution completed but our thread (index-id=%u) has vanished.", thread_idx_id); 3886439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton return_value = eExecutionInterrupted; 38872370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham } 38882370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham else 38892370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 3890439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton StopInfoSP stop_info_sp (thread_sp->GetStopInfo ()); 3891439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton StopReason stop_reason = eStopReasonInvalid; 3892439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (stop_info_sp) 3893439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton stop_reason = stop_info_sp->GetStopReason(); 3894439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (stop_reason == eStopReasonPlanComplete) 3895439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton { 3896439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (log) 3897f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Execution completed successfully."); 3898439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // Now mark this plan as private so it doesn't get reported as the stop reason 3899439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // after this point. 3900439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (thread_plan_sp) 3901439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton thread_plan_sp->SetPrivate (orig_plan_private); 3902439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton return_value = eExecutionCompleted; 3903439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton } 3904439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton else 3905439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton { 3906439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (log) 3907f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Thread plan didn't successfully complete."); 3908439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 3909439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton return_value = eExecutionInterrupted; 3910439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton } 39112370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham } 3912439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton } 3913439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton break; 3914439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 3915f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham case lldb::eStateCrashed: 3916f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3917f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Execution crashed."); 3918b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3919f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3920439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 3921f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham case lldb::eStateRunning: 3922f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham do_resume = false; 3923f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham keep_going = true; 3924f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3925439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 3926f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham default: 3927f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3928f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf("Execution stopped with unexpected state: %s.", StateAsCString(stop_state)); 39292370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham 39302370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham errors.Printf ("Execution stopped with unexpected state."); 3931b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3932f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3933f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3934f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (keep_going) 3935f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 3936f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3937f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3938f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3939f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3940f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3941f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3942f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("got_event was true, but the event pointer was null. How odd..."); 3943b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3944f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3945f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3946f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3947f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3948f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3949f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // If we didn't get an event that means we've timed out... 3950f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We will interrupt the process here. Depending on what we were asked to do we will 3951f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // either exit, or try with all threads running for the same timeout. 3952360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Not really sure what to do if Halt fails here... 3953f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3954c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson if (log) { 3955360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (try_all_threads) 3956f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3957f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 3958f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, " 3959f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "trying with all threads enabled.", 3960f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham single_thread_timeout_usec); 3961f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3962f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): Restarting function with all threads enabled " 3963f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "and timeout: %d timed out.", 3964f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham single_thread_timeout_usec); 3965f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3966360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 3967f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, " 3968f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "halt and abandoning execution.", 3969360f53f3c216ee4fb433da0a367168785328a856Jim Ingham single_thread_timeout_usec); 3970c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson } 3971360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3972567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error halt_error = Halt(); 3973c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham if (halt_error.Success()) 3974360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3975360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 3976f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): Halt succeeded."); 3977360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3978f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // If halt succeeds, it always produces a stopped event. Wait for that: 3979f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3980f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 3981f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(500000); 3982f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3983f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent(&real_timeout, event_sp); 3984360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3985360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (got_event) 3986360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3987360f53f3c216ee4fb433da0a367168785328a856Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3988360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 3989360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 399068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton log->Printf ("Process::RunThreadPlan(): Stopped with event: %s", StateAsCString(stop_state)); 3991f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state == lldb::eStateStopped 3992f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get())) 3993f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString (" Event was the Halt interruption event."); 3994360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3995360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3996f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state == lldb::eStateStopped) 3997360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3998f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Between the time we initiated the Halt and the time we delivered it, the process could have 3999f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // already finished its job. Check that here: 4000f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4001567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread->IsThreadPlanDone (thread_plan_sp.get())) 4002f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4003f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4004f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done. " 4005f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "Exiting wait loop."); 4006b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionCompleted; 4007f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4008f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4009360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4010f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!try_all_threads) 4011f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4012f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4013f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("try_all_threads was false, we stopped so now we're quitting."); 4014b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 4015f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4016f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4017360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4018f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 4019f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4020f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Set all the other threads to run, and return to the top of the loop, which will continue; 4021f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham first_timeout = false; 4022f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_plan_sp->SetStopOthers (false); 4023f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4024f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): About to resume."); 4025360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4026f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 4027f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4028f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4029f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4030f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Running all threads failed, so return Interrupted. 4031f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4032f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): running all threads timed out."); 4033b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 4034f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4035f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4036360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4037360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4038f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4039f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { if (log) 4040f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): halt said it succeeded, but I got no event. " 4041f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "I'm getting out of here passing Interrupted."); 4042b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 4043f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4044f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4045360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4046c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham else 4047c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham { 4048f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // This branch is to work around some problems with gdb-remote's Halt. It is a little racy, and can return 4049f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // an error from halt, but if you wait a bit you'll get a stopped event anyway. 4050c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham if (log) 4051f9f40c20b210eea72ab042c63178ca000f005ed9Jim 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.", 4052f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham halt_error.AsCString()); 4053f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 4054f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(500000); 4055f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham timeout_ptr = &real_timeout; 4056f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent(&real_timeout, event_sp); 4057f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!got_event || event_sp.get() == NULL) 40586ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham { 4059f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // This is not going anywhere, bag out. 4060f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4061f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): halt failed: and waiting for the stopped event failed."); 4062b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 4063f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4064f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4065f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4066f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4067f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 4068f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4069f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): halt failed: but then I got a stopped event. Whatever..."); 4070f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state == lldb::eStateStopped) 4071f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4072f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Between the time we initiated the Halt and the time we delivered it, the process could have 4073f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // already finished its job. Check that here: 4074f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4075567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread->IsThreadPlanDone (thread_plan_sp.get())) 4076f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4077f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4078f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done. " 4079f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "Exiting wait loop."); 4080b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionCompleted; 4081f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4082f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4083f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4084f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 4085f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4086f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Set all the other threads to run, and return to the top of the loop, which will continue; 4087f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham first_timeout = false; 4088f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_plan_sp->SetStopOthers (false); 4089f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4090f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): About to resume."); 4091f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4092f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 4093f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4094f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4095f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4096f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Running all threads failed, so return Interrupted. 4097f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4098f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): running all threads timed out."); 4099b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 4100f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4101f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4102f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4103f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4104f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4105ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan if (log) 4106ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan log->Printf ("Process::RunThreadPlan(): halt failed, I waited and didn't get" 4107ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan " a stopped event, instead got %s.", StateAsCString(stop_state)); 4108b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 4109f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4110f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 41116ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham } 4112c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 4113c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham 4114360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4115360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4116f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } // END WAIT LOOP 4117f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4118f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Now do some processing on the results of the run: 4119f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (return_value == eExecutionInterrupted) 4120f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4121360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 4122360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4123f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StreamString s; 4124f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (event_sp) 4125f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_sp->Dump (&s); 4126f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4127360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4128f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): Stop event that interrupted us is NULL."); 4129f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4130f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4131f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StreamString ts; 4132f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4133f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham const char *event_explanation = NULL; 4134f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4135f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham do 4136f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4137f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get()); 4138f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4139f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!event_data) 4140c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham { 4141f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_explanation = "<no event data>"; 4142f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4143c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 4144f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4145f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Process *process = event_data->GetProcessSP().get(); 4146c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham 4147f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!process) 4148f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4149f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_explanation = "<no process>"; 4150f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 4151f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4152f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4153f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ThreadList &thread_list = process->GetThreadList(); 4154f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4155f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham uint32_t num_threads = thread_list.GetSize(); 4156f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham uint32_t thread_index; 4157f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4158f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("<%u threads> ", num_threads); 4159360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4160f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham for (thread_index = 0; 4161f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_index < num_threads; 4162f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ++thread_index) 4163360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4164f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Thread *thread = thread_list.GetThreadAtIndex(thread_index).get(); 4165360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4166f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!thread) 4167360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4168f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("<?> "); 4169f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 4170360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4171360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4172444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton ts.Printf("<0x%4.4llx ", thread->GetID()); 4173f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham RegisterContext *register_context = thread->GetRegisterContext().get(); 4174360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4175f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (register_context) 4176f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("[ip 0x%llx] ", register_context->GetPC()); 4177f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4178f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("[ip unknown] "); 4179360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4180f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham lldb::StopInfoSP stop_info_sp = thread->GetStopInfo(); 4181f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_info_sp) 4182c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham { 4183f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham const char *stop_desc = stop_info_sp->GetDescription(); 4184f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_desc) 4185f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.PutCString (stop_desc); 4186c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 4187f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf(">"); 4188c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 4189f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4190f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_explanation = ts.GetData(); 4191f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } while (0); 4192360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4193f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4194f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham { 4195f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham if (event_explanation) 4196f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->Printf("Process::RunThreadPlan(): execution interrupted: %s %s", s.GetData(), event_explanation); 4197f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham else 4198f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->Printf("Process::RunThreadPlan(): execution interrupted: %s", s.GetData()); 4199f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham } 4200f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4201360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (discard_on_error && thread_plan_sp) 4202360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4203567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 420421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 4205360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4206360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4207360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4208f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else if (return_value == eExecutionSetupError) 4209f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4210f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4211f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): execution set up error."); 4212360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4213f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (discard_on_error && thread_plan_sp) 4214f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4215567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 421621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 4217f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4218f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4219f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4220f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4221567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread->IsThreadPlanDone (thread_plan_sp.get())) 4222f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4223f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4224f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): thread plan is done"); 4225b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionCompleted; 4226f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4227567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (thread->WasThreadPlanDiscarded (thread_plan_sp.get())) 4228f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4229f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4230f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): thread plan was discarded"); 4231b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionDiscarded; 4232f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4233f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 4234f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4235f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4236f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): thread plan stopped in mid course"); 4237f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (discard_on_error && thread_plan_sp) 4238f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 4239f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 4240f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): discarding thread plan 'cause discard_on_error is set."); 4241567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 424221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 4243f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4244f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4245f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 4246f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 4247360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Thread we ran the function in may have gone away because we ran the target 42487bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham // Check that it's still there, and if it is put it back in the context. Also restore the 42497bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham // frame in the context if it is still present. 4250567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread = GetThreadList().FindThreadByIndexID(thread_idx_id, true).get(); 4251567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread) 42527bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham { 4253567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFrameSP (thread->GetFrameWithStackID (ctx_frame_id)); 42547bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham } 4255360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4256360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Also restore the current process'es selected frame & thread, since this function calling may 4257360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // be done behind the user's back. 4258360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4259360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (selected_tid != LLDB_INVALID_THREAD_ID) 4260360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4261567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (GetThreadList().SetSelectedThreadByIndexID (selected_tid) && selected_stack_id.IsValid()) 4262360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4263360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // We were able to restore the selected thread, now restore the frame: 4264567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrameSP old_frame_sp = GetThreadList().GetSelectedThread()->GetFrameWithStackID(selected_stack_id); 42657bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham if (old_frame_sp) 4266567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton GetThreadList().GetSelectedThread()->SetSelectedFrame(old_frame_sp.get()); 4267360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4268360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4269360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4270360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return return_value; 4271360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 4272360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4273360f53f3c216ee4fb433da0a367168785328a856Jim Inghamconst char * 4274360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::ExecutionResultAsCString (ExecutionResults result) 4275360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 4276360f53f3c216ee4fb433da0a367168785328a856Jim Ingham const char *result_name; 4277360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4278360f53f3c216ee4fb433da0a367168785328a856Jim Ingham switch (result) 4279360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 4280b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionCompleted: 4281360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionCompleted"; 4282360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 4283b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionDiscarded: 4284360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionDiscarded"; 4285360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 4286b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionInterrupted: 4287360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionInterrupted"; 4288360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 4289b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionSetupError: 4290360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionSetupError"; 4291360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 4292b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionTimedOut: 4293360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionTimedOut"; 4294360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 4295360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 4296360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return result_name; 4297360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 4298360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 4299abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonvoid 4300abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::GetStatus (Stream &strm) 4301abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 4302abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const StateType state = GetState(); 4303202060806d75f812b56a3cfa70d85fff536e5c2fGreg Clayton if (StateIsStoppedState(state, false)) 4304abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 4305abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (state == eStateExited) 4306abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 4307abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton int exit_status = GetExitStatus(); 4308abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const char *exit_description = GetExitDescription(); 4309444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton strm.Printf ("Process %llu exited with status = %i (0x%8.8x) %s\n", 4310abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton GetID(), 4311abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton exit_status, 4312abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton exit_status, 4313abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton exit_description ? exit_description : ""); 4314abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 4315abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 4316abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 4317abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (state == eStateConnected) 4318abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.Printf ("Connected to remote target.\n"); 4319abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 4320444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton strm.Printf ("Process %llu %s\n", GetID(), StateAsCString (state)); 4321abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 4322abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 4323abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 4324abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 4325444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton strm.Printf ("Process %llu is running.\n", GetID()); 4326abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 4327abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 4328abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 4329abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonsize_t 4330abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::GetThreadStatus (Stream &strm, 4331abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool only_threads_with_stop_reason, 4332abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t start_frame, 4333abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames, 4334abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames_with_source) 4335abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 4336abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton size_t num_thread_infos_dumped = 0; 4337abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 4338abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const size_t num_threads = GetThreadList().GetSize(); 4339abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton for (uint32_t i = 0; i < num_threads; i++) 4340abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 4341abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton Thread *thread = GetThreadList().GetThreadAtIndex(i).get(); 4342abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (thread) 4343abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 4344abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (only_threads_with_stop_reason) 4345abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 4346abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (thread->GetStopInfo().get() == NULL) 4347abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton continue; 4348abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 4349abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton thread->GetStatus (strm, 4350abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton start_frame, 4351abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_frames, 4352abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_frames_with_source); 4353abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton ++num_thread_infos_dumped; 4354abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 4355abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 4356abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton return num_thread_infos_dumped; 4357abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 4358abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 43596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 4360d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// class Process::SettingsController 43616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 43626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4363d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::SettingsController () : 43645bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice UserSettingsController ("process", Target::GetSettingsController()) 43656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 43666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 43676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4368d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::~SettingsController () 43696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 43706e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 43716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 43726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticelldb::InstanceSettingsSP 4373d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::CreateInstanceSettings (const char *instance_name) 43746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4375334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton lldb::InstanceSettingsSP new_settings_sp (new ProcessInstanceSettings (GetSettingsController(), 4376334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton false, 4377334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton instance_name)); 43786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return new_settings_sp; 43796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 43806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 43816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 43826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice// class ProcessInstanceSettings 43836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 43846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4385638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcessInstanceSettings::ProcessInstanceSettings 4386638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton( 4387334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton const UserSettingsControllerSP &owner_sp, 4388638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton bool live_instance, 4389638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton const char *name 4390638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton) : 4391334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton InstanceSettings (owner_sp, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance) 43926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4393396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called 4394396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // until the vtables for ProcessInstanceSettings are properly set up, i.e. AFTER all the initializers. 4395396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // For this reason it has to be called here, rather than in the initializer or in the parent constructor. 439675b11a343a035ab426473a785a045f0614af9984Caroline Tice // This is true for CreateInstanceName() too. 4397abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 439875b11a343a035ab426473a785a045f0614af9984Caroline Tice if (GetInstanceName () == InstanceSettings::InvalidName()) 439975b11a343a035ab426473a785a045f0614af9984Caroline Tice { 440075b11a343a035ab426473a785a045f0614af9984Caroline Tice ChangeInstanceName (std::string (CreateInstanceName().AsCString())); 4401334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton owner_sp->RegisterInstanceSettings (this); 440275b11a343a035ab426473a785a045f0614af9984Caroline Tice } 4403abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 4404396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice if (live_instance) 44056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 4406334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton const lldb::InstanceSettingsSP &pending_settings = owner_sp->FindPendingSettings (m_instance_name); 44076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice CopyInstanceSettings (pending_settings,false); 44086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 44096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 44106e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::ProcessInstanceSettings (const ProcessInstanceSettings &rhs) : 4412334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton InstanceSettings (Process::GetSettingsController(), CreateInstanceName().AsCString()) 44136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 44146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (m_instance_name != InstanceSettings::GetDefaultName()) 44156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 4416334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton UserSettingsControllerSP owner_sp (m_owner_wp.lock()); 4417334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton if (owner_sp) 4418334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton { 4419334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton CopyInstanceSettings (owner_sp->FindPendingSettings (m_instance_name), false); 4420334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton owner_sp->RemovePendingSettings (m_instance_name); 4421334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton } 44226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 44236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 44246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::~ProcessInstanceSettings () 44266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 44276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 44286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings& 44306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::operator= (const ProcessInstanceSettings &rhs) 44316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 44326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (this != &rhs) 44336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 44346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 44356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return *this; 44376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 44386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid 44416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name, 44426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const char *index_value, 44436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const char *value, 44446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString &instance_name, 44456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const SettingEntry &entry, 4446b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton VarSetOperationType op, 44476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice Error &err, 44486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice bool pending) 44496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 44506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 44516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid 44536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings, 44546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice bool pending) 44556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4456abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton// if (new_settings.get() == NULL) 4457abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton// return; 4458abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton// 4459abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton// ProcessInstanceSettings *new_process_settings = (ProcessInstanceSettings *) new_settings.get(); 44606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 44616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4462bcb5b454767121980d937d2610ba762fdb575c45Caroline Ticebool 44636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry, 44646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString &var_name, 44655bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice StringList &value, 4466bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice Error *err) 44676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4468abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (err) 4469abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString()); 4470abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton return false; 44716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 44726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString 44746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::CreateInstanceName () 44756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 44766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static int instance_count = 1; 44776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice StreamString sstr; 44786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice sstr.Printf ("process_%d", instance_count); 44806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice ++instance_count; 44816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString ret_val (sstr.GetData()); 44836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return ret_val; 44846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 44856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 4487d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// SettingsController Variable Tables 44886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 44896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry 4491d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::global_settings_table[] = 44926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 44936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice //{ "var-name", var-type , "default", enum-table, init'd, hidden, "help-text"}, 44946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } 44956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 44966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 44986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry 4499d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::instance_settings_table[] = 45006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4501638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton //{ "var-name", var-type, "default", enum-table, init'd, hidden, "help-text"}, 4502638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { NULL, eSetVarTypeNone, NULL, NULL, false, false, NULL } 45036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 45046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 45056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 45067508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 4507abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 4508