Process.cpp revision abb3302051246273eb92cca203c9a1b9d9736e05
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Process.cpp ---------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/StoppointCallbackContext.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/BreakpointLocation.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Event.h" 17861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice#include "lldb/Core/ConnectionFileDescriptor.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h" 19861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice#include "lldb/Core/InputReader.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 23f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton#include "lldb/Expression/ClangUserExpression.h" 246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice#include "lldb/Interpreter/CommandInterpreter.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Host.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ABI.h" 270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton#include "lldb/Target/DynamicLoader.h" 2837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton#include "lldb/Target/OperatingSystem.h" 29642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/LanguageRuntime.h" 30642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/CPPLanguageRuntime.h" 31642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/ObjCLanguageRuntime.h" 32e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Platform.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 34643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/StopInfo.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 44b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::Dump (Stream &s, Platform *platform) const 4524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 4624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *cstr; 47ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_pid != LLDB_INVALID_PROCESS_ID) 48ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" pid = %i\n", m_pid); 49ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 50ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_parent_pid != LLDB_INVALID_PROCESS_ID) 51ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" parent = %i\n", m_parent_pid); 52ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 53ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_executable) 54ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 55ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" name = %s\n", m_executable.GetFilename().GetCString()); 56ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString (" file = "); 57ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton m_executable.Dump(&s); 58ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.EOL(); 59ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 60b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t argc = m_arguments.GetArgumentCount(); 61ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (argc > 0) 62ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 63ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton for (uint32_t i=0; i<argc; i++) 64ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 65b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *arg = m_arguments.GetArgumentAtIndex(i); 66ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (i < 10) 67b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" arg[%u] = %s\n", i, arg); 68ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 69b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("arg[%u] = %s\n", i, arg); 70ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 71ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 72b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 73b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const uint32_t envc = m_environment.GetArgumentCount(); 74b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (envc > 0) 75b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 76b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton for (uint32_t i=0; i<envc; i++) 77b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 78b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *env = m_environment.GetArgumentAtIndex(i); 79b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (i < 10) 80b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" env[%u] = %s\n", i, env); 81b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 82b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("env[%u] = %s\n", i, env); 83b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 84b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 85b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 86ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (m_arch.IsValid()) 87ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf (" arch = %s\n", m_arch.GetTriple().str().c_str()); 88ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 89b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_uid != UINT32_MAX) 9024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 91b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_uid); 92b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" uid = %-5u (%s)\n", m_uid, cstr ? cstr : ""); 9324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 94b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_gid != UINT32_MAX) 9524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 96b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_gid); 97b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" gid = %-5u (%s)\n", m_gid, cstr ? cstr : ""); 9824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 99b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_euid != UINT32_MAX) 10024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 101b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_euid); 102b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" euid = %-5u (%s)\n", m_euid, cstr ? cstr : ""); 10324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 104b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_egid != UINT32_MAX) 10524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 106b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_egid); 107b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf (" egid = %-5u (%s)\n", m_egid, cstr ? cstr : ""); 10824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 10924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 11024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 11124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 112b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose) 11324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 114b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *label; 115b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (show_args || verbose) 116b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton label = "ARGUMENTS"; 117b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 118b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton label = "NAME"; 119b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 120ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (verbose) 121ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 122b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE %s\n", label); 123ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString ("====== ====== ========== ========== ========== ========== ======================== ============================\n"); 124ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 125ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 126ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 127b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("PID PARENT USER ARCH %s\n", label); 128ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.PutCString ("====== ====== ========== ======= ============================\n"); 129ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 13024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 13124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 13224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 133b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfo::DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const 13424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 13524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_pid != LLDB_INVALID_PROCESS_ID) 13624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 13724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *cstr; 13824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton s.Printf ("%-6u %-6u ", m_pid, m_parent_pid); 13924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 14024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 141ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (verbose) 142ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 143b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_uid); 144ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 145ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 146ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 147b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_uid); 14824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 149b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_gid); 150ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 151ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 152ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 153b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_gid); 154ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 155b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetUserName (m_euid); 156ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 157ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 158ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 159b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_euid); 160ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton 161b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton cstr = platform->GetGroupName (m_egid); 162ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 163ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-10s ", cstr); 164ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton else 165b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s.Printf ("%-10u ", m_egid); 166ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton s.Printf ("%-24s ", m_arch.IsValid() ? m_arch.GetTriple().str().c_str() : ""); 167ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton } 16824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 169ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 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 254abb3302051246273eb92cca203c9a1b9d9736e05Greg ClaytonProcessLaunchInfo::FinalizeFileActions (Target *target, Process *process) 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 const char *path; 261abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (m_flags.Test(eLaunchFlagDisableSTDIO)) 262abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 263abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton AppendSuppressFileAction (STDERR_FILENO, true , true ); 264abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton AppendSuppressFileAction (STDIN_FILENO , true , false); 265abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton AppendSuppressFileAction (STDOUT_FILENO, false, true ); 266abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 267abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton else 268abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 269abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // Check for any values that might have gotten set with any of: 270abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // (lldb) settings set target.input-path 271abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // (lldb) settings set target.output-path 272abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // (lldb) settings set target.error-path 273abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (target) 274abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 275abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton path = target->GetStandardErrorPath(); 276abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (path) 277abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 278abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton const bool read = true; 279abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton const bool write = true; 280abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton AppendOpenFileAction(STDERR_FILENO, path, read, write); 281abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 282abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton path = target->GetStandardInputPath(); 283abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (path) 284abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 285abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton const bool read = true; 286abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton const bool write = false; 287abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton AppendOpenFileAction(STDIN_FILENO, path, read, write); 288abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 289abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 290abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton path = target->GetStandardOutputPath(); 291abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (path) 292abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 293abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton const bool read = false; 294abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton const bool write = true; 295abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton AppendOpenFileAction(STDOUT_FILENO, path, read, write); 296abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 297abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 298abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 299abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton // If we still don't have any actions... 300abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (m_file_actions.empty()) 301abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton { 302abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 303abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 304abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton } 305abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton} 306abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 307b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 308b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Open (int fd, const char *path, bool read, bool write) 309b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 310b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if ((read || write) && fd >= 0 && path && path[0]) 311b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 312b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionOpen; 313b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 314b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (read && write) 315b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arg = O_RDWR; 316b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else if (read) 317b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arg = O_RDONLY; 318b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 319b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arg = O_WRONLY; 320b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_path.assign (path); 321b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return true; 322b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 323b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 324b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 325b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 326b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 327b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return false; 328b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 329b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 33024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 331b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Close (int fd) 332b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 333b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 334b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (fd >= 0) 335b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 336b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionClose; 337b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 338b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 339b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return m_fd >= 0; 340b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 341b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 342b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 343b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 344b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::Duplicate (int fd, int dup_fd) 345b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 346b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Clear(); 347b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (fd >= 0 && dup_fd >= 0) 348b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 349b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_action = eFileActionDuplicate; 350b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_fd = fd; 351b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_arg = dup_fd; 352b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 353b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return m_fd >= 0; 354b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 355b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 356b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 357b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 358b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 359b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchInfo::FileAction::AddPosixSpawnFileAction (posix_spawn_file_actions_t *file_actions, 360b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const FileAction *info, 361b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Log *log, 362b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error& error) 363b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 364b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info == NULL) 365b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return false; 366b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 367b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton switch (info->m_action) 368b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 369b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionNone: 370b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.Clear(); 371b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 372b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 373b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionClose: 374b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 375b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd for posix_spawn_file_actions_addclose(...)"); 376b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 377b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 378b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_addclose (file_actions, info->m_fd), 379b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 380b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log && (error.Fail() || log)) 381b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, "posix_spawn_file_actions_addclose (action=%p, fd=%i)", 382b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd); 383b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 384b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 385b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 386b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionDuplicate: 387b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 388b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd for posix_spawn_file_actions_adddup2(...)"); 389b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else if (info->m_arg == -1) 390b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid duplicate fd for posix_spawn_file_actions_adddup2(...)"); 391b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 392b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 393b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_adddup2 (file_actions, info->m_fd, info->m_arg), 394b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 395b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log && (error.Fail() || log)) 396b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, "posix_spawn_file_actions_adddup2 (action=%p, fd=%i, dup_fd=%i)", 397b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd, info->m_arg); 398b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 399b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 400b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 401b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case eFileActionOpen: 402b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (info->m_fd == -1) 403b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("invalid fd in posix_spawn_file_actions_addopen(...)"); 404b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 405b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 406b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton int oflag = info->m_arg; 407b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton mode_t mode = 0; 408b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 409b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetError (::posix_spawn_file_actions_addopen (file_actions, 410b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton info->m_fd, 411b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton info->m_path.c_str(), 412b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton oflag, 413b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton mode), 414b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton eErrorTypePOSIX); 415b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (error.Fail() || log) 416b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.PutToLog(log, 417b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton "posix_spawn_file_actions_addopen (action=%p, fd=%i, path='%s', oflag=%i, mode=%i)", 418b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton file_actions, info->m_fd, info->m_path.c_str(), oflag, mode); 419b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 420b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 421b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 422b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton default: 423b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorStringWithFormat ("invalid file action: %i", info->m_action); 424b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 425b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 426b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error.Success(); 427b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 428b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 429b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError 430143fcc3a15425659b381502ed4e1e50a3e726f36Greg ClaytonProcessLaunchCommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg) 431b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 432b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 433b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton char short_option = (char) m_getopt_table[option_idx].val; 434b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 435b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton switch (short_option) 436b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 437b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 's': // Stop at program entry point 438b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagStopAtEntry); 439b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 440b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 441b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'e': // STDERR for read + write 442b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 443b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 444b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDERR_FILENO, option_arg, true, true)) 445b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 446b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 447b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 448b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 449b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'i': // STDIN for read only 450b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 451b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 452b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDIN_FILENO, option_arg, true, false)) 453b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 454b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 455b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 456b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 457b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'o': // Open STDOUT for write only 458b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 459b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 460b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDOUT_FILENO, option_arg, false, true)) 461b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 462b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 463b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 464b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 465b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'p': // Process plug-in name 466b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.SetProcessPluginName (option_arg); 467b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 468b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 469b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'n': // Disable STDIO 470b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 471b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessLaunchInfo::FileAction action; 472b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDERR_FILENO, "/dev/null", true, true)) 473b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 474b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDOUT_FILENO, "/dev/null", false, true)) 475b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 476b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (action.Open(STDIN_FILENO, "/dev/null", true, false)) 477b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.AppendFileAction (action); 478b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 479b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 480b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 481b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'w': 482b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.SetWorkingDirectory (option_arg); 483b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 484b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 485b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 't': // Open process in new terminal window 486b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY); 487b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 488b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 489b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'a': 490b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetArchitecture().SetTriple (option_arg, 491b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_interpreter.GetPlatform(true).get()); 492b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 493b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 494b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'A': 495b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags().Set (eLaunchFlagDisableASLR); 496b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 497b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 49836bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton case 'c': 49936bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton launch_info.GetFlags().Set (eLaunchFlagLaunchInShell); 50036bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton break; 50136bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton 502b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton case 'v': 503b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetEnvironmentEntries().AppendArgument(option_arg); 504b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 505b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 506b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton default: 5079c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("unrecognized short option character '%c'", short_option); 508b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 509b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 510b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 511b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error; 512b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 513b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 514b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonOptionDefinition 515b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessLaunchCommandOptions::g_option_table[] = 516b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 517b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg 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."}, 518b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "disable-aslr", 'A', no_argument, NULL, 0, eArgTypeNone, "Disable address space layout randomization when launching a process."}, 519b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "plugin", 'p', required_argument, NULL, 0, eArgTypePlugin, "Name of the process plugin you want to use."}, 520b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg 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."}, 521b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_ALL, false, "arch", 'a', required_argument, NULL, 0, eArgTypeArchitecture, "Set the architecture for the process to launch when ambiguous."}, 522b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg 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."}, 523abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton{ LLDB_OPT_SET_ALL, false, "shell", 'c', no_argument, NULL, 0, eArgTypeNone, "Run the process in a shell (not supported on all platforms)."}, 524b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 525b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1 , false, "stdin", 'i', required_argument, NULL, 0, eArgTypePath, "Redirect stdin for the process to <path>."}, 526b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1 , false, "stdout", 'o', required_argument, NULL, 0, eArgTypePath, "Redirect stdout for the process to <path>."}, 527b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_1 , false, "stderr", 'e', required_argument, NULL, 0, eArgTypePath, "Redirect stderr for the process to <path>."}, 528b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 529b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ LLDB_OPT_SET_2 , false, "tty", 't', no_argument, NULL, 0, eArgTypeNone, "Start the process in a terminal (not supported on all platforms)."}, 530b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 531b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg 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."}, 532b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 533b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 0 , false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 534b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}; 535b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 536b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 537b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 538b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonbool 539b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::NameMatches (const char *process_name) const 54024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 54124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name_match_type == eNameMatchIgnore || process_name == NULL) 54224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 54324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *match_name = m_match_info.GetName(); 54424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (!match_name) 54524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 54624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 54724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return lldb_private::NameMatches (process_name, m_name_match_type, match_name); 54824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 54924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 55024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 551b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::Matches (const ProcessInstanceInfo &proc_info) const 55224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 55324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (!NameMatches (proc_info.GetName())) 55424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 55524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 55624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ProcessIDIsValid() && 55724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetProcessID() != proc_info.GetProcessID()) 55824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 55924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 56024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ParentProcessIDIsValid() && 56124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetParentProcessID() != proc_info.GetParentProcessID()) 56224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 56324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 564b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.UserIDIsValid () && 565b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_match_info.GetUserID() != proc_info.GetUserID()) 56624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 56724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 568b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.GroupIDIsValid () && 569b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton m_match_info.GetGroupID() != proc_info.GetGroupID()) 57024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 57124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 57224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveUserIDIsValid () && 57324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID()) 57424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 57524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 57624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveGroupIDIsValid () && 57724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID()) 57824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 57924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 58024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.GetArchitecture().IsValid() && 58124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.GetArchitecture() != proc_info.GetArchitecture()) 58224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 58324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 58424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 58524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 58624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 587b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::MatchAllProcesses () const 58824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 58924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name_match_type != eNameMatchIgnore) 59024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 59124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 59224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ProcessIDIsValid()) 59324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 59424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 59524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.ParentProcessIDIsValid()) 59624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 59724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 598b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.UserIDIsValid ()) 59924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 60024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 601b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_match_info.GroupIDIsValid ()) 60224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 60324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 60424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveUserIDIsValid ()) 60524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 60624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 60724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.EffectiveGroupIDIsValid ()) 60824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 60924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 61024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_info.GetArchitecture().IsValid()) 61124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 61224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 61324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_match_all_users) 61424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 61524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 61624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return true; 61724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 61824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 61924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 62024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonvoid 621b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcessInstanceInfoMatch::Clear() 62224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 62324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_info.Clear(); 62424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_name_match_type = eNameMatchIgnore; 62524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_match_all_users = false; 62624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 627fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess* 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::FindPlugin (Target &target, const char *plugin_name, Listener &listener) 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessCreateInstance create_callback = NULL; 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (plugin_name) 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner create_callback = PluginManager::GetProcessCreateCallbackForPluginName (plugin_name); 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (create_callback) 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Process> debugger_ap(create_callback(target, listener)); 6388d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (debugger_ap->CanDebug(target, true)) 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return debugger_ap.release(); 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 64454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx) 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 64654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton std::auto_ptr<Process> debugger_ap(create_callback(target, listener)); 6478d2ea2888a4acb7f140f9af64ddd2b16b2dee870Greg Clayton if (debugger_ap->CanDebug(target, false)) 64854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton return debugger_ap.release(); 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process constructor 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Process(Target &target, Listener &listener) : 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UserID (LLDB_INVALID_PROCESS_ID), 66049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton Broadcaster ("lldb.process"), 661c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton ProcessInstanceSettings (*GetSettingsController()), 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target (target), 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_public_state (eStateUnloaded), 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state (eStateUnloaded), 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_broadcaster ("lldb.process.internal_state_broadcaster"), 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_broadcaster ("lldb.process.internal_state_control_broadcaster"), 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener ("lldb.process.internal_state_listener"), 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait(), 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_thread (LLDB_INVALID_HOST_THREAD), 67021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id (), 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_index_id (0), 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_status (-1), 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_exit_string (), 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_list (this), 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications (), 67620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_image_tokens (), 67720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_listener (listener), 67820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_breakpoint_site_list (), 67920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_dynamic_checkers_ap (), 680861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_unix_signals (), 68120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_abi_sp (), 682861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader (), 683a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_stdio_communication ("process.stdio"), 68420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_stdio_communication_mutex (Mutex::eMutexTypeRecursive), 685fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton m_stdout_data (), 686613b8739a4d489b7f1c571288d5786768c024205Greg Clayton m_memory_cache (*this), 687613b8739a4d489b7f1c571288d5786768c024205Greg Clayton m_allocated_memory_cache (*this), 688c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham m_attached_to_process (false), 6896cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan m_next_event_action_ap(), 6906cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan m_can_jit(eCanJITYes) 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6921ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice UpdateInstanceName(); 6931ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 694e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Process::Process()", this); 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitStateChanged, "state-changed"); 69949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitInterrupt, "interrupt"); 70049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitSTDOUT, "stdout-available"); 70149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton SetEventName (eBroadcastBitSTDERR, "stderr-available"); 70249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner listener.StartListeningForEvents (this, 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitStateChanged | 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitInterrupt | 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitSTDOUT | 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitSTDERR); 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster, 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastBitStateChanged); 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster, 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlStop | 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlPause | 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eBroadcastInternalStateControlResume); 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::~Process() 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 723e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Process::~Process()", this); 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Finalize() 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7322f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton // Clear our broadcaster before we proceed with destroying 7332f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton Broadcaster::Clear(); 7342f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Do any cleanup needed prior to being destructed... Subclasses 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // that override this method should call this superclass method as well. 73788fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham 73888fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham // We need to destroy the loader before the derived Process class gets destroyed 73988fa7bdfdc4b4880bd1fc12b95fa5a37a7457c74Jim Ingham // since it is very likely that undoing the loader will require access to the real process. 74037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_dyld_ap.reset(); 74137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RegisterNotificationCallbacks (const Notifications& callbacks) 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications.push_back(callbacks); 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (callbacks.initialize != NULL) 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner callbacks.initialize (callbacks.baton, this); 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::UnregisterNotificationCallbacks(const Notifications& callbacks) 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<Notifications>::iterator pos, end = m_notifications.end(); 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_notifications.begin(); pos != end; ++pos) 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->baton == callbacks.baton && 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->initialize == callbacks.initialize && 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos->process_state_changed == callbacks.process_state_changed) 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_notifications.erase(pos); 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SynchronouslyNotifyStateChanged (StateType state) 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end(); 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos) 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (notification_pos->process_state_changed) 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner notification_pos->process_state_changed (notification_pos->baton, this, state); 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: We need to do some work on events before the general Listener sees them. 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// For instance if we are continuing from a breakpoint, we need to ensure that we do 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the little "insert real insn, step & stop" trick. But we can't do that when the 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// event is delivered by the broadcaster - since that is done on the thread that is 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// waiting for new events, so if we needed more than one event for our handling, we would 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// stall. So instead we do it when we fetch the event off of the queue. 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextEvent (EventSP &event_sp) 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp) 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent (event_sp.get()); 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessToStop (const TimeValue *timeout) 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 80321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We can't just wait for a "stopped" event, because the stopped event may have restarted the target. 80421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We have to actually check each event, and in the case of a stopped event check the restarted flag 80521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // on the event. 80621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham EventSP event_sp; 80721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham StateType state = GetState(); 80821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // If we are exited or detached, we won't ever get back to any 80921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // other valid state... 81021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (state == eStateDetached || state == eStateExited) 81121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 81221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 81321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham while (state != eStateInvalid) 81421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 81521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham state = WaitForStateChangedEvents (timeout, event_sp); 81621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham switch (state) 81721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 81821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateCrashed: 81921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateDetached: 82021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateExited: 82121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateUnloaded: 82221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 82321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham case eStateStopped: 82421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get())) 82521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham continue; 82621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else 82721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 82821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham default: 82921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham continue; 83021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 83121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 83221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham return state; 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForState 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const TimeValue *timeout, 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType *match_states, const uint32_t num_match_states 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t i; 845d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton StateType state = GetState(); 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (state != eStateInvalid) 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 848d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton // If we are exited or detached, we won't ever get back to any 849d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton // other valid state... 850d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton if (state == eStateDetached || state == eStateExited) 851d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton return state; 852d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = WaitForStateChangedEvents (timeout, event_sp); 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (i=0; i<num_match_states; ++i) 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_states[i] == state) 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghambool 86563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::HijackProcessEvents (Listener *listener) 86663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 86763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham if (listener != NULL) 86863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham { 86963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return HijackBroadcaster(listener, eBroadcastBitStateChanged); 87063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham } 87163e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham else 87263e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham return false; 87363e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 87463e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 87563e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Inghamvoid 87663e24d7aeae8a7feb2aae0581e597b922749d4a1Jim InghamProcess::RestoreProcessEvents () 87763e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham{ 87863e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham RestoreBroadcaster(); 87963e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham} 88063e24d7aeae8a7feb2aae0581e597b922749d4a1Jim Ingham 881f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghambool 882f9f40c20b210eea72ab042c63178ca000f005ed9Jim InghamProcess::HijackPrivateProcessEvents (Listener *listener) 883f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham{ 884f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (listener != NULL) 885f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 886f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return m_private_state_broadcaster.HijackBroadcaster(listener, eBroadcastBitStateChanged); 887f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 888f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 889f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return false; 890f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham} 891f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 892f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghamvoid 893f9f40c20b210eea72ab042c63178ca000f005ed9Jim InghamProcess::RestorePrivateProcessEvents () 894f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham{ 895f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham m_private_state_broadcaster.RestoreBroadcaster(); 896f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham} 897f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp) 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 901e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 90736f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton if (m_listener.WaitForEventForBroadcasterWithType (timeout, 90836f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton this, 90936f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton eBroadcastBitStateChanged, 91036f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton event_sp)) 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp) => %s", 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__, 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout, 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(state)); 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerEvent * 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PeekAtStateChangedEvents () 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 924e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s...", __FUNCTION__); 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Event *event_ptr; 93036f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this, 93136f63a92bae332929e1a047b59ed6df651d8537fGreg Clayton eBroadcastBitStateChanged); 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_ptr) 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (event_ptr) => %s", 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__, 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr))); 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s no events found", 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner __FUNCTION__); 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return event_ptr; 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp) 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 952e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = eStateInvalid; 95872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (m_private_state_listener.WaitForEventForBroadcasterWithType (timeout, 95972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton &m_private_state_broadcaster, 96072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton eBroadcastBitStateChanged, 96172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton event_sp)) 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a bit of a hack, but when we wait here we could very well return 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to the command-line, and that could disable the log, which would render the 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // log we got above invalid. 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 96872e1c782ba1e4226da37af4722af608de9f39408Greg Clayton { 96972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (state == eStateInvalid) 97072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton log->Printf ("Process::%s (timeout = %p, event_sp) => TIMEOUT", __FUNCTION__, timeout); 97172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton else 97272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state)); 97372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton } 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only) 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 980e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (control_only) 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp); 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state_listener.WaitForEvent(timeout, event_sp); 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::IsRunning () const 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return StateIsRunningState (m_public_state.GetValue()); 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitStatus () 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateExited) 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_exit_status; 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1005638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetExitDescription () 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty()) 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_exit_string.c_str(); 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101472e1c782ba1e4226da37af4722af608de9f39408Greg Claytonbool 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetExitStatus (int status, const char *cstr) 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 101768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 101868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton if (log) 101968ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton log->Printf("Process::SetExitStatus (status=%i (0x%8.8x), description=%s%s%s)", 102068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton status, status, 102168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton cstr ? "\"" : "", 102268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton cstr ? cstr : "NULL", 102368ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton cstr ? "\"" : ""); 102468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton 102572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton // We were already in the exited state 102672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (m_private_state.GetValue() == eStateExited) 102768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton { 1028644ddfbc1b36eabdb93c5acb150f9a77a92ee1fdGreg Clayton if (log) 1029644ddfbc1b36eabdb93c5acb150f9a77a92ee1fdGreg Clayton log->Printf("Process::SetExitStatus () ignoring exit status because state was already set to eStateExited"); 103072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton return false; 103168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton } 103272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 103372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_exit_status = status; 103472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (cstr) 103572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_exit_string = cstr; 103672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton else 103772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton m_exit_string.clear(); 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton DidExit (); 104058e844b3561848e73e69d6d98746d4851e78306eGreg Clayton 104172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton SetPrivateState (eStateExited); 104272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton return true; 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This static callback can be used to watch for local child processes on 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the current host. The the child process exits, the process will be 104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// found in the global target list (we want to be completely sure that the 104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// lldb_private::Process doesn't go away before we can deliver the signal. 104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetProcessExitStatus 105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *callback_baton, 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::pid_t pid, 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int signo, // Zero for no signal 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int exit_status // Exit value of process if signal is zero 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signo == 0 || exit_status) 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 106063094e0bb161580564954dee512955c1c79d3476Greg Clayton TargetSP target_sp(Debugger::FindTargetWithProcessID (pid)); 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_sp) 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp (target_sp->GetProcessSP()); 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process_sp) 106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *signal_cstr = NULL; 106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signo) 106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo); 106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process_sp->SetExitStatus (exit_status, signal_cstr); 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonvoid 108037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg ClaytonProcess::UpdateThreadListIfNeeded () 108137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{ 108237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton const uint32_t stop_id = GetStopID(); 108337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID()) 108437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton { 108537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton Mutex::Locker locker (m_thread_list.GetMutex ()); 108637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton ThreadList new_thread_list(this); 108737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton // Always update the thread list with the protocol specific 108837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton // thread list 108937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton UpdateThreadList (m_thread_list, new_thread_list); 109037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton OperatingSystem *os = GetOperatingSystem (); 109137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (os) 109237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton os->UpdateThreadList (m_thread_list, new_thread_list); 109337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_thread_list.Update (new_thread_list); 109437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_thread_list.SetStopID (stop_id); 109537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 109637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton} 109737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton 109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetNextThreadIndexID () 110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ++m_thread_index_id; 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetState() 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If any other threads access this we will need a mutex for it 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_public_state.GetValue (); 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetPublicState (StateType new_state) 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 111468ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPublicState (%s)", StateAsCString(new_state)); 111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_public_state.SetValue (new_state); 111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetPrivateState () 112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_private_state.GetValue(); 112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::SetPrivateState (StateType new_state) 112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 112968ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool state_changed = false; 113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state)); 113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker(m_private_state.GetMutex()); 113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType old_state = m_private_state.GetValueNoLock (); 113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner state_changed = old_state != new_state; 113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (state_changed) 114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state.SetValueNoLock (new_state); 114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (StateIsStoppedState(new_state)) 114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 114421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.BumpStopID(); 1145fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton m_memory_cache.Clear(); 114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 114721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_mod_id.GetStopID()); 114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Use our target to get a shared pointer to ourselves... 115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (GetTarget().GetProcessSP(), new_state)); 115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 11557e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state)); 115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetImageInfoAddress() 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_ADDRESS; 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11650baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 11660baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// LoadImage 11670baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// 11680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most 11690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library 11700baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// loading differently should override LoadImage and UnloadImage and 11710baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed. 11720baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 11730baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonuint32_t 11740baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::LoadImage (const FileSpec &image_spec, Error &error) 11750baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 11760baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton DynamicLoader *loader = GetDynamicLoader(); 11770baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (loader) 11780baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11790baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = loader->CanLoadImage(); 11800baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Fail()) 11810baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 11820baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 11830baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 11840baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Success()) 11850baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 11870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 11880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp) 11890baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 11910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 11920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (frame_sp) 11930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 11940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 11950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton frame_sp->CalculateExecutionContext (exe_ctx); 1196ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham bool unwind_on_error = true; 11970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StreamString expr; 11980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton char path[PATH_MAX]; 11990baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton image_spec.GetPath(path, sizeof(path)); 12000baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton expr.Printf("dlopen (\"%s\", 2)", path); 12010baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n"; 1202360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ValueObjectSP result_valobj_sp; 12035b658cc411e8810073f7f633f3c5d6f177cb3dcdSean Callanan ClangUserExpression::Evaluate (exe_ctx, eExecutionPolicyAlways, lldb::eLanguageTypeUnknown, unwind_on_error, expr.GetData(), prefix, result_valobj_sp); 1204b14ec34165772877c8242f5b15acb116b0d9a9b5Johnny Chen error = result_valobj_sp->GetError(); 1205b14ec34165772877c8242f5b15acb116b0d9a9b5Johnny Chen if (error.Success()) 12060baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12070baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Scalar scalar; 1208fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (result_valobj_sp->ResolveValue (scalar)) 12090baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12100baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS); 12110baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS) 12120baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12130baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton uint32_t image_token = m_image_tokens.size(); 12140baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_image_tokens.push_back (image_ptr); 12150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return image_token; 12160baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12170baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12180baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12200baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12210baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12220baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return LLDB_INVALID_IMAGE_TOKEN; 12230baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 12240baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 12250baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 12260baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// UnloadImage 12270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// 12280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// This function provides a default implementation that works for most 12290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// unix variants. Any Process subclasses that need to do shared library 12300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// loading differently should override LoadImage and UnloadImage and 12310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton// do what is needed. 12320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton//---------------------------------------------------------------------- 12330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonError 12340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonProcess::UnloadImage (uint32_t image_token) 12350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{ 12360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Error error; 12370baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_token < m_image_tokens.size()) 12380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const addr_t image_addr = m_image_tokens[image_token]; 12400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (image_addr == LLDB_INVALID_ADDRESS) 12410baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12420baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorString("image already unloaded"); 12430baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12440baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 12450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton DynamicLoader *loader = GetDynamicLoader(); 12470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (loader) 12480baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = loader->CanLoadImage(); 12490baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 12500baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (error.Success()) 12510baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12520baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 12530baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 12540baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (thread_sp) 12550baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12560baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 12570baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 12580baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (frame_sp) 12590baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12600baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton ExecutionContext exe_ctx; 12610baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton frame_sp->CalculateExecutionContext (exe_ctx); 1262ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham bool unwind_on_error = true; 12630baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton StreamString expr; 12640baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton expr.Printf("dlclose ((void *)0x%llx)", image_addr); 12650baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton const char *prefix = "extern \"C\" int dlclose(void* handle);\n"; 1266360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ValueObjectSP result_valobj_sp; 12675b658cc411e8810073f7f633f3c5d6f177cb3dcdSean Callanan ClangUserExpression::Evaluate (exe_ctx, eExecutionPolicyAlways, lldb::eLanguageTypeUnknown, unwind_on_error, expr.GetData(), prefix, result_valobj_sp); 12680baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (result_valobj_sp->GetError().Success()) 12690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12700baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton Scalar scalar; 1271fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (result_valobj_sp->ResolveValue (scalar)) 12720baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12730baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton if (scalar.UInt(1)) 12740baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12750baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData()); 12760baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12770baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 12780baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12790baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton m_image_tokens[image_token] = LLDB_INVALID_ADDRESS; 12800baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12810baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12820baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12830baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 12840baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12850baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error = result_valobj_sp->GetError(); 12860baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12870baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12880baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12890baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12900baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12910baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12920baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton else 12930baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton { 12940baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton error.SetErrorString("invalid image token"); 12950baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton } 12960baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton return error; 12970baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton} 12980baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton 129975906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonconst lldb::ABISP & 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetABI() 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 130275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton if (!m_abi_sp) 130375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton m_abi_sp = ABI::FindPlugin(m_target.GetArchitecture()); 130475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return m_abi_sp; 130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1307642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamLanguageRuntime * 1308642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetLanguageRuntime(lldb::LanguageType language) 1309642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1310642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntimeCollection::iterator pos; 1311642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham pos = m_language_runtimes.find (language); 1312642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (pos == m_language_runtimes.end()) 1313642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham { 1314642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham lldb::LanguageRuntimeSP runtime(LanguageRuntime::FindPlugin(this, language)); 1315642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1316642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham m_language_runtimes[language] 1317642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham = runtime; 1318642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return runtime.get(); 1319642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham } 1320642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham else 1321642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return (*pos).second.get(); 1322642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1323642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1324642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamCPPLanguageRuntime * 1325642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetCPPLanguageRuntime () 1326642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1327642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus); 1328642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus) 1329642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return static_cast<CPPLanguageRuntime *> (runtime); 1330642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return NULL; 1331642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1332642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 1333642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamObjCLanguageRuntime * 1334642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamProcess::GetObjCLanguageRuntime () 1335642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{ 1336642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC); 1337642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC) 1338642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return static_cast<ObjCLanguageRuntime *> (runtime); 1339642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham return NULL; 1340642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} 1341642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham 134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBreakpointSiteList & 134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetBreakpointSiteList() 134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list; 134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst BreakpointSiteList & 134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetBreakpointSiteList() const 135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list; 135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableAllBreakpointSites () 135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.SetEnabledForAll (false); 135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ClearBreakpointSiteByID (lldb::user_id_t break_id) 136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (DisableBreakpointSiteByID (break_id)); 136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.Remove(break_id); 136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableBreakpointSiteByID (lldb::user_id_t break_id) 137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp->IsEnabled()) 138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DisableBreakpoint (bp_site_sp.get()); 138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1384444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton error.SetErrorStringWithFormat("invalid breakpoint site ID: %llu", break_id); 138524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableBreakpointSiteByID (lldb::user_id_t break_id) 139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!bp_site_sp->IsEnabled()) 139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = EnableBreakpoint (bp_site_sp.get()); 139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1402444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton error.SetErrorStringWithFormat("invalid breakpoint site ID: %llu", break_id); 140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14073fd1f36c937575dbf57bae04c7ebaef78d8ecc1dStephen Wilsonlldb::break_id_t 140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::CreateBreakpointSite (BreakpointLocationSP &owner, bool use_hardware) 140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1410265ab33ae56209d2bfdc47510a557aa075b2a829Greg Clayton const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target); 141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (load_addr != LLDB_INVALID_ADDRESS) 141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp_site_sp; 141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Look up this breakpoint site. If it exists, then add this new owner, otherwise 141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // create a new breakpoint site and add it. 141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr); 141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 142224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp->AddOwner (owner); 142324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner owner->SetBreakpointSite (bp_site_sp); 142424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bp_site_sp->GetID(); 142524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 142624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 142724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 142824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, LLDB_INVALID_THREAD_ID, use_hardware)); 142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site_sp) 143024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 143124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (EnableBreakpoint (bp_site_sp.get()).Success()) 143224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 143324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner owner->SetBreakpointSite (bp_site_sp); 143424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_breakpoint_site_list.Add (bp_site_sp); 143524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 143624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 143824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 143924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We failed to enable the breakpoint 144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_BREAK_ID; 144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp) 144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id); 144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_owners == 0) 144924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableBreakpoint(bp_site_sp.get()); 145124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress()); 145224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 145424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 145624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 145724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const 145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 145924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_removed = 0; 146024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t intersect_addr; 146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t intersect_size; 146224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t opcode_offset; 146324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t idx; 1464987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton BreakpointSiteSP bp_sp; 146582820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham BreakpointSiteList bp_sites_in_range; 146624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 146782820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham if (m_breakpoint_site_list.FindInRange (bp_addr, bp_addr + size, bp_sites_in_range)) 146824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1469987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton for (idx = 0; (bp_sp = bp_sites_in_range.GetByIndex(idx)); ++idx) 147024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1471987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton if (bp_sp->GetType() == BreakpointSite::eSoftware) 147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1473987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton if (bp_sp->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset)) 147482820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham { 147582820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size); 147682820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size); 1477987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton assert(opcode_offset + intersect_size <= bp_sp->GetByteSize()); 147882820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham size_t buf_offset = intersect_addr - bp_addr; 1479987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton ::memcpy(buf + buf_offset, bp_sp->GetSavedOpcodeBytes() + opcode_offset, intersect_size); 148082820f9f021e289431ff3b79e56bd7d88097f327Jim Ingham } 148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 148324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 148424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_removed; 148524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 148624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 148724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1488b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 1489b1888f24fa181489840b9acf193e224d125d0776Greg Claytonsize_t 1490b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonProcess::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site) 1491b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 1492b1888f24fa181489840b9acf193e224d125d0776Greg Clayton PlatformSP platform_sp (m_target.GetPlatform()); 1493b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (platform_sp) 1494b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return platform_sp->GetSoftwareBreakpointTrapOpcode (m_target, bp_site); 1495b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return 0; 1496b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 1497b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 149924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::EnableSoftwareBreakpoint (BreakpointSite *bp_site) 150024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 150224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bp_site != NULL); 1503e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t bp_addr = bp_site->GetLoadAddress(); 150524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 150624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx", bp_site->GetID(), (uint64_t)bp_addr); 150724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site->IsEnabled()) 150824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 150924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 151024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already enabled", bp_site->GetID(), (uint64_t)bp_addr); 151124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 151224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 151324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 151424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_addr == LLDB_INVALID_ADDRESS) 151524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 151624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("BreakpointSite contains an invalid load address."); 151724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 151824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 151924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Ask the lldb::Process subclass to fill in the correct software breakpoint 152024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // trap for the breakpoint site 152124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site); 152224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_opcode_size == 0) 152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15259c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%llx", bp_addr); 152624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 152724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 152824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 152924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes(); 153024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 153124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_opcode_bytes == NULL) 153224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 153324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode."); 153424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 153524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 153624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 153724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Save the original opcode by reading it 153824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size) 153924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 154024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Write a software breakpoint in place of the original opcode 154124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 154224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 154324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t verify_bp_opcode_bytes[64]; 154424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 154524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 154624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0) 154724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 154824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetEnabled(true); 154924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetType (BreakpointSite::eSoftware); 155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 155124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", 155224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 155324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr); 155424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 155524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 15569c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorString("failed to verify the breakpoint trap in memory."); 155724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory to verify breakpoint trap."); 156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to write breakpoint trap to memory."); 156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory at breakpoint address."); 156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1567c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson if (log && error.Fail()) 156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s", 156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr, 157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.AsCString()); 157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DisableSoftwareBreakpoint (BreakpointSite *bp_site) 157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bp_site != NULL); 1580e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t bp_addr = bp_site->GetLoadAddress(); 158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::user_id_t breakID = bp_site->GetID(); 158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 1584444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::DisableBreakpoint (breakID = %llu) addr = 0x%llx", breakID, (uint64_t)bp_addr); 158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bp_site->IsHardware()) 158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Breakpoint site is a hardware breakpoint."); 158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bp_site->IsEnabled()) 159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t break_op_size = bp_site->GetByteSize(); 159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes(); 159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (break_op_size > 0) 159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear a software breakoint instruction 159754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t curr_break_op[8]; 1598141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson assert (break_op_size <= sizeof(curr_break_op)); 159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool break_op_found = false; 160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Read the breakpoint opcode 160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size) 160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool verify = false; 160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure we have the a breakpoint opcode exists at this address 160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp (curr_break_op, break_op, break_op_size) == 0) 160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break_op_found = true; 160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We found a valid breakpoint opcode at this address, now restore 161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the saved opcode. 161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size) 161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner verify = true; 161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Memory write failed when restoring original opcode."); 161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Original breakpoint trap is no longer in memory."); 162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set verify to true and so we can check if the original opcode has already been restored 162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner verify = true; 162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (verify) 162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 162754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t verify_opcode[8]; 1628141eeac2adf8987d31b1f0e955c259e93e539b18Stephen Wilson assert (break_op_size < sizeof(verify_opcode)); 162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Verify that our original opcode made it back to the inferior 163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size) 163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // compare the memory we just read with the original opcode 163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0) 163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // SUCCESS 163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->SetEnabled(false); 163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr); 163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (break_op_found) 164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to restore original opcode."); 164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored."); 164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("Unable to read memory that should contain the breakpoint trap."); 165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- already disabled", bp_site->GetID(), (uint64_t)bp_addr); 165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%llx -- FAILED: %s", 166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp_site->GetID(), 166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (uint64_t)bp_addr, 166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.AsCString()); 166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1671fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton// Comment out line below to disable memory caching 1672fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#define ENABLE_MEMORY_CACHING 1673fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton// Uncomment to verify memory caching works after making changes to caching code 1674fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton//#define VERIFY_MEMORY_READS 1675fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1676fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#if defined (ENABLE_MEMORY_CACHING) 1677fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1678fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#if defined (VERIFY_MEMORY_READS) 1679fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1680fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 1681fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 1682fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 1683fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Memory caching is enabled, with debug verification 1684fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton if (buf && size) 1685fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton { 1686fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Uncomment the line below to make sure memory caching is working. 1687fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // I ran this through the test suite and got no assertions, so I am 1688fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // pretty confident this is working well. If any changes are made to 1689fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // memory caching, uncomment the line below and test your changes! 1690fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1691fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Verify all memory reads by using the cache first, then redundantly 1692fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // reading the same memory from the inferior and comparing to make sure 1693fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // everything is exactly the same. 1694fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton std::string verify_buf (size, '\0'); 1695fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (verify_buf.size() == size); 1696fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton const size_t cache_bytes_read = m_memory_cache.Read (this, addr, buf, size, error); 1697fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton Error verify_error; 1698fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton const size_t verify_bytes_read = ReadMemoryFromInferior (addr, const_cast<char *>(verify_buf.data()), verify_buf.size(), verify_error); 1699fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (cache_bytes_read == verify_bytes_read); 1700fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (memcmp(buf, verify_buf.data(), verify_buf.size()) == 0); 1701fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton assert (verify_error.Success() == error.Success()); 1702fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return cache_bytes_read; 1703fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton } 1704fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return 0; 1705fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 1706fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1707fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#else // #if defined (VERIFY_MEMORY_READS) 1708fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1709fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 1710fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 1711fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 1712fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Memory caching enabled, no verification 1713613b8739a4d489b7f1c571288d5786768c024205Greg Clayton return m_memory_cache.Read (addr, buf, size, error); 1714fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 1715fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1716fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif // #else for #if defined (VERIFY_MEMORY_READS) 1717fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1718fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#else // #if defined (ENABLE_MEMORY_CACHING) 171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 172024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1723fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton // Memory caching is disabled 1724fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton return ReadMemoryFromInferior (addr, buf, size, error); 1725fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton} 1726fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1727fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif // #else for #if defined (ENABLE_MEMORY_CACHING) 1728fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1729fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 1730fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Claytonsize_t 1731b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonProcess::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len) 1732b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 1733b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t total_cstr_len = 0; 1734b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (dst && dst_max_len) 1735b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 1736b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // NULL out everything just to be safe 1737b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton memset (dst, 0, dst_max_len); 1738b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 1739b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton addr_t curr_addr = addr; 1740b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize(); 1741b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t bytes_left = dst_max_len - 1; 1742b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton char *curr_dst = dst; 1743b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1744b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton while (bytes_left > 0) 1745b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 1746b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size); 1747b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); 1748b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error); 1749b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1750b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (bytes_read == 0) 1751b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 1752b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton dst[total_cstr_len] = '\0'; 1753b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 1754b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 1755b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const size_t len = strlen(curr_dst); 1756b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1757b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton total_cstr_len += len; 1758b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1759b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (len < bytes_to_read) 1760b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton break; 1761b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1762b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton curr_dst += bytes_read; 1763b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton curr_addr += bytes_read; 1764b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton bytes_left -= bytes_read; 1765b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 1766b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 1767b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return total_cstr_len; 1768b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 1769b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 1770b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonsize_t 1771fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg ClaytonProcess::ReadMemoryFromInferior (addr_t addr, void *buf, size_t size, Error &error) 1772fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton{ 177324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (buf == NULL || size == 0) 177424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_read = 0; 177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t *bytes = (uint8_t *)buf; 177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (bytes_read < size) 178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_size = size - bytes_read; 178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_bytes_read = DoReadMemory (addr + bytes_read, 178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes + bytes_read, 178424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_read += curr_bytes_read; 178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_read == curr_size || curr_bytes_read == 0) 178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Replace any software breakpoint opcodes that fall into this range back 179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // into "buf" before we return 179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_read > 0) 179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf); 179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_read; 179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1798f72fdeee129bbd7195f3db888b561ede689886aaGreg Claytonuint64_t 1799c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadUnsignedIntegerFromMemory (lldb::addr_t vm_addr, size_t integer_byte_size, uint64_t fail_value, Error &error) 1800f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton{ 1801c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar scalar; 1802c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar, error)) 1803c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return scalar.ULongLong(fail_value); 1804c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return fail_value; 1805c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 1806c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1807c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonaddr_t 1808c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadPointerFromMemory (lldb::addr_t vm_addr, Error &error) 1809c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 1810c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar scalar; 1811c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar, error)) 1812c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return scalar.ULongLong(LLDB_INVALID_ADDRESS); 1813c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return LLDB_INVALID_ADDRESS; 1814c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 1815c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1816c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1817c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonbool 1818c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::WritePointerToMemory (lldb::addr_t vm_addr, 1819c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::addr_t ptr_value, 1820c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error &error) 1821c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 1822c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar scalar; 1823c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton const uint32_t addr_byte_size = GetAddressByteSize(); 1824c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (addr_byte_size <= 4) 1825c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = (uint32_t)ptr_value; 1826f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton else 1827c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = ptr_value; 1828c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) == addr_byte_size; 1829f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton} 1830f72fdeee129bbd7195f3db888b561ede689886aaGreg Clayton 183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error) 183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_written = 0; 183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t *bytes = (const uint8_t *)buf; 183624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 183724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (bytes_written < size) 183824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 183924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_size = size - bytes_written; 184024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written, 184124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes + bytes_written, 184224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 184324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 184424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += curr_bytes_written; 184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_written == curr_size || curr_bytes_written == 0) 184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error) 185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1854fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#if defined (ENABLE_MEMORY_CACHING) 1855fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton m_memory_cache.Flush (addr, size); 1856fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton#endif 1857fd119995f2693eb6e9e2ea3e685f9d872f5cd4f1Greg Clayton 185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (buf == NULL || size == 0) 185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 1860e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 186121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.BumpMemoryID(); 1862e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We need to write any data that would go where any current software traps 186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // (enabled software breakpoints) any software traps (breakpoints) that we 186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // may have placed in our tasks memory. 186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator iter = m_breakpoint_site_list.GetMap()->lower_bound (addr); 186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator end = m_breakpoint_site_list.GetMap()->end(); 186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (iter == end || iter->second->GetLoadAddress() > addr + size) 1871c8bc1c318cfed0e3fe22731d808ddac1b32bb26eGreg Clayton return WriteMemoryPrivate (addr, buf, size, error); 187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteList::collection::const_iterator pos; 187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t bytes_written = 0; 187554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton addr_t intersect_addr = 0; 187654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton size_t intersect_size = 0; 187754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton size_t opcode_offset = 0; 187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t *ubuf = (const uint8_t *)buf; 187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = iter; pos != end; ++pos) 188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointSiteSP bp; 188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bp = pos->second; 188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset)); 188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(addr <= intersect_addr && intersect_addr < addr + size); 188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size); 188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(opcode_offset + intersect_size <= bp->GetByteSize()); 188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check for bytes before this breakpoint 189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t curr_addr = addr + bytes_written; 189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (intersect_addr > curr_addr) 189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // There are some bytes before this breakpoint that we need to 189524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // just write to memory 189624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t curr_size = intersect_addr - curr_addr; 189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t curr_bytes_written = WriteMemoryPrivate (curr_addr, 189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ubuf + bytes_written, 189924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner curr_size, 190024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 190124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += curr_bytes_written; 190224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (curr_bytes_written != curr_size) 190324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 190424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to write all of the requested bytes, we 190524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // are done looping and will return the number of bytes that 190624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we have written so far. 190724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 190824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 190924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 191024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 191124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now write any bytes that would cover up any software breakpoints 191224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // directly into the breakpoint opcode buffer 191324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size); 191424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += intersect_size; 191524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 191624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 191724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Write any remaining bytes after the last breakpoint if we have any left 191824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_written < size) 191924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += WriteMemoryPrivate (addr + bytes_written, 192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ubuf + bytes_written, 192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size - bytes_written, 192224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error); 1923e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham 192424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 192524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1926c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1927c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonsize_t 1928c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::WriteScalarToMemory (addr_t addr, const Scalar &scalar, uint32_t byte_size, Error &error) 1929c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 1930c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size == UINT32_MAX) 1931c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton byte_size = scalar.GetByteSize(); 1932c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size > 0) 1933c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 1934c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint8_t buf[32]; 1935c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton const size_t mem_size = scalar.GetAsMemoryData (buf, byte_size, GetByteOrder(), error); 1936c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (mem_size > 0) 1937c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return WriteMemory(addr, buf, mem_size, error); 1938c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 1939c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorString ("failed to get scalar as memory data"); 1940c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 1941c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 1942c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 1943c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorString ("invalid scalar value"); 1944c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 1945c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return 0; 1946c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 1947c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1948c0fa53324d62a48257c092a3347d6e7236aa3152Greg Claytonsize_t 1949c0fa53324d62a48257c092a3347d6e7236aa3152Greg ClaytonProcess::ReadScalarIntegerFromMemory (addr_t addr, 1950c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint32_t byte_size, 1951c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton bool is_signed, 1952c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar &scalar, 1953c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error &error) 1954c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton{ 1955c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint64_t uval; 1956c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1957c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size <= sizeof(uval)) 1958c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 1959c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton size_t bytes_read = ReadMemory (addr, &uval, byte_size, error); 1960c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (bytes_read == byte_size) 1961c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 1962c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton DataExtractor data (&uval, sizeof(uval), GetByteOrder(), GetAddressByteSize()); 1963c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton uint32_t offset = 0; 1964c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (byte_size <= 4) 1965c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = data.GetMaxU32 (&offset, byte_size); 1966c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 1967c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar = data.GetMaxU64 (&offset, byte_size); 1968c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1969c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (is_signed) 1970c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton scalar.SignExtend(byte_size * 8); 1971c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return bytes_read; 1972c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 1973c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 1974c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton else 1975c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton { 1976c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size); 1977c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 1978c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return 0; 1979c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton} 1980c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1981613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#define USE_ALLOCATE_MEMORY_CACHE 1 198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneraddr_t 198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::AllocateMemory(size_t size, uint32_t permissions, Error &error) 198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1985e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham if (GetPrivateState() != eStateStopped) 1986e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham return LLDB_INVALID_ADDRESS; 1987e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham 1988613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#if defined (USE_ALLOCATE_MEMORY_CACHE) 1989613b8739a4d489b7f1c571288d5786768c024205Greg Clayton return m_allocated_memory_cache.AllocateMemory(size, permissions, error); 1990613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#else 19912860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton addr_t allocated_addr = DoAllocateMemory (size, permissions, error); 19922860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 19932860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton if (log) 199421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham log->Printf("Process::AllocateMemory(size=%4zu, permissions=%s) => 0x%16.16llx (m_stop_id = %u m_memory_id = %u)", 19952860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton size, 1996613b8739a4d489b7f1c571288d5786768c024205Greg Clayton GetPermissionsAsCString (permissions), 19972860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton (uint64_t)allocated_addr, 199821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetStopID(), 199921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetMemoryID()); 20002860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton return allocated_addr; 2001613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#endif 200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20046cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callananbool 20056cf6c474742a23e7cb6b4f618bf1de711db90a85Sean CallananProcess::CanJIT () 20066cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan{ 20076cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan return m_can_jit == eCanJITYes; 20086cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan} 20096cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan 20106cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callananvoid 20116cf6c474742a23e7cb6b4f618bf1de711db90a85Sean CallananProcess::SetCanJIT (bool can_jit) 20126cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan{ 20136cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan m_can_jit = (can_jit ? eCanJITYes : eCanJITNo); 20146cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan} 20156cf6c474742a23e7cb6b4f618bf1de711db90a85Sean Callanan 201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::DeallocateMemory (addr_t ptr) 201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2019613b8739a4d489b7f1c571288d5786768c024205Greg Clayton Error error; 2020613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#if defined (USE_ALLOCATE_MEMORY_CACHE) 2021613b8739a4d489b7f1c571288d5786768c024205Greg Clayton if (!m_allocated_memory_cache.DeallocateMemory(ptr)) 2022613b8739a4d489b7f1c571288d5786768c024205Greg Clayton { 2023613b8739a4d489b7f1c571288d5786768c024205Greg Clayton error.SetErrorStringWithFormat ("deallocation of memory at 0x%llx failed.", (uint64_t)ptr); 2024613b8739a4d489b7f1c571288d5786768c024205Greg Clayton } 2025613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#else 2026613b8739a4d489b7f1c571288d5786768c024205Greg Clayton error = DoDeallocateMemory (ptr); 20272860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton 20282860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 20292860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton if (log) 203021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham log->Printf("Process::DeallocateMemory(addr=0x%16.16llx) => err = %s (m_stop_id = %u, m_memory_id = %u)", 20312860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton ptr, 20322860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton error.AsCString("SUCCESS"), 203321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetStopID(), 203421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetMemoryID()); 2035613b8739a4d489b7f1c571288d5786768c024205Greg Clayton#endif 20362860ba9c531076adc93cb6fe7bbf2933b42ade69Greg Clayton return error; 203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 203924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 204024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 2041ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenProcess::EnableWatchpoint (Watchpoint *watchpoint) 204224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 204424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("watchpoints are not supported"); 204524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 2049ecd4feb5111432d2878e95461220c720cb2d24c8Johnny ChenProcess::DisableWatchpoint (Watchpoint *watchpoint) 205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("watchpoints are not supported"); 205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 205424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 205524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp) 205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state; 206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now wait for the process to launch and return control to us, and then 206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // call DidLaunch: 206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (1) 206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 206472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton event_sp.reset(); 206572e1c782ba1e4226da37af4722af608de9f39408Greg Clayton state = WaitForStateChangedEventsPrivate (timeout, event_sp); 206672e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 206772e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (StateIsStoppedState(state)) 206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 206972e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 207072e1c782ba1e4226da37af4722af608de9f39408Greg Clayton // If state is invalid, then we timed out 207172e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (state == eStateInvalid) 207272e1c782ba1e4226da37af4722af608de9f39408Greg Clayton break; 207372e1c782ba1e4226da37af4722af608de9f39408Greg Clayton 207472e1c782ba1e4226da37af4722af608de9f39408Greg Clayton if (event_sp) 207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return state; 207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 208024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 208136bc5ea5a48c19421d44f559e2165c105657b809Greg ClaytonProcess::Launch (const ProcessLaunchInfo &launch_info) 208224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 208324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 208424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 208575c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap.reset(); 208637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 2087861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 208824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20895beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module *exe_module = m_target.GetExecutableModulePointer(); 209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_module) 209124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2092180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton char local_exec_file_path[PATH_MAX]; 2093180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton char platform_exec_file_path[PATH_MAX]; 2094180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path)); 2095180546b3feb8c7bcca70a56776a7c4fad99ba09cGreg Clayton exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path)); 209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_module->GetFileSpec().Exists()) 209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2098a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton if (PrivateStateThreadIsValid ()) 2099a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton PausePrivateStateThread (); 2100a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton 210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = WillLaunch (exe_module); 210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2104d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton SetPublicState (eStateLaunching); 210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now launch using these arguments. 210736bc5ea5a48c19421d44f559e2165c105657b809Greg Clayton error = DoLaunch (exe_module, launch_info); 210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Fail()) 211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetID() != LLDB_INVALID_PROCESS_ID) 211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetID (LLDB_INVALID_PROCESS_ID); 211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *error_string = error.AsCString(); 211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error_string == NULL) 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_string = "launch failed"; 211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetExitStatus (-1, error_string); 211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 21234985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton TimeValue timeout_time; 21244985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton timeout_time = TimeValue::Now(); 21254985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton timeout_time.OffsetWithSeconds(10); 21264985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton StateType state = WaitForProcessStopPrivate(&timeout_time, event_sp); 212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21284985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton if (state == eStateInvalid || event_sp.get() == NULL) 21294985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton { 21304985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton // We were able to launch the process, but we failed to 21314985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton // catch the initial stop. 21324985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton SetExitStatus (0, "failed to catch stop after launch"); 21334985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton Destroy(); 21344985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton } 21354985959bb1ce4ce9859cbfdf4c330262d2f250abGreg Clayton else if (state == eStateStopped || state == eStateCrashed) 213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 213775c703dd8b492bad25a987b96853626641ae7246Greg Clayton 213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidLaunch (); 213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 214037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_dyld_ap.reset (DynamicLoader::FindPlugin (this, NULL)); 214175c703dd8b492bad25a987b96853626641ae7246Greg Clayton if (m_dyld_ap.get()) 214275c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap->DidLaunch(); 214375c703dd8b492bad25a987b96853626641ae7246Greg Clayton 214437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This delays passing the stopped event to listeners till DidLaunch gets 214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a chance to complete... 214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 2148a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton 2149a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton if (PrivateStateThreadIsValid ()) 2150a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton ResumePrivateStateThread (); 2151a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton else 2152a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton StartPrivateStateThread (); 215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (state == eStateExited) 215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We exited while trying to launch somehow. Don't call DidLaunch as that's 215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // not likely to work, and return an invalid pid. 215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21659c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("file doesn't exist: '%s'", local_exec_file_path); 216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 216824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2171c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::NextEventAction::EventActionResult 2172c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp) 217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2174c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham StateType state = ProcessEventData::GetStateFromEvent (event_sp.get()); 2175c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham switch (state) 217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21777e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateRunning: 2178a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton case eStateConnected: 21797e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton return eEventActionRetry; 21807e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 21817e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateStopped: 21827e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateCrashed: 21837508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 21847e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // During attach, prior to sending the eStateStopped event, 21857e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // lldb_private::Process subclasses must set the process must set 21867e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // the new process ID. 21877e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID); 218875c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_process->CompleteAttach (); 21897e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton return eEventActionSuccess; 21907508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 21917e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 21927e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 21937e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton break; 21947e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton default: 21957e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateExited: 21967e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton case eStateInvalid: 21977e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton m_exit_string.assign ("No valid Process"); 21987e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton return eEventActionExit; 21997e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton break; 220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2201c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham} 2202c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2203c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::NextEventAction::EventActionResult 2204c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::AttachCompletionHandler::HandleBeingInterrupted() 2205c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham{ 2206c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham return eEventActionSuccess; 2207c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham} 2208c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2209c2dc7c88cebe05cce059970cc907768256b28a42Jim Inghamconst char * 2210c2dc7c88cebe05cce059970cc907768256b28a42Jim InghamProcess::AttachCompletionHandler::GetExitString () 2211c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham{ 2212c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham return m_exit_string.c_str(); 221324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 221524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 221624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Attach (lldb::pid_t attach_pid) 221724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 2220861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 222275c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap.reset(); 222337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 222475c703dd8b492bad25a987b96853626641ae7246Greg Clayton 222554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton Error error (WillAttachToProcessWithID(attach_pid)); 222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2228d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton SetPublicState (eStateAttaching); 2229d8c625380b56759fc3fef8b9cf0389ae1a07f44dGreg Clayton 223054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton error = DoAttachToProcessWithID (attach_pid); 223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2233c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham SetNextEventAction(new Process::AttachCompletionHandler(this)); 2234c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham StartPrivateStateThread(); 223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetID() != LLDB_INVALID_PROCESS_ID) 223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetID (LLDB_INVALID_PROCESS_ID); 224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *error_string = error.AsCString(); 224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error_string == NULL) 224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_string = "attach failed"; 224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetExitStatus(-1, error_string); 224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Attach (const char *process_name, bool wait_for_launch) 225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_abi_sp.reset(); 2256861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 22577508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 22587508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham // Find the process and its architecture. Make sure it matches the architecture 22597508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham // of the current Target, and if not adjust it. 2260e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 22617508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 2262ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham if (!wait_for_launch) 22637508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 2264b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoList process_infos; 22650d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham PlatformSP platform_sp (m_target.GetPlatform ()); 22660d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham assert (platform_sp.get()); 22670d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham 2268e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (platform_sp) 2269ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham { 2270b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoMatch match_info; 227124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_info.GetProcessInfo().SetName(process_name); 227224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_info.SetNameMatchType (eNameMatchEquals); 227324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton platform_sp->FindProcesses (match_info, process_infos); 2274e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (process_infos.GetSize() > 1) 2275e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 22769c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("more than one process named %s", process_name); 2277e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2278e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else if (process_infos.GetSize() == 0) 2279e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 22809c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("could not find a process named %s", process_name); 2281e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2282e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2283e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 2284e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 22859c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorString ("invalid platform"); 2286ea2941843e51df4018bbe9f0f42050964d78d2c0Jim Ingham } 22877508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 228875c703dd8b492bad25a987b96853626641ae7246Greg Clayton 228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2291e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton m_dyld_ap.reset(); 229237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset(); 2293e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 2294e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error = WillAttachToProcessWithName(process_name, wait_for_launch); 2295e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error.Success()) 229624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2297e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetPublicState (eStateAttaching); 2298e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error = DoAttachToProcessWithName (process_name, wait_for_launch); 2299e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error.Fail()) 230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2301e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 2302e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2303e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetID (LLDB_INVALID_PROCESS_ID); 2304e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton const char *error_string = error.AsCString(); 2305e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error_string == NULL) 2306e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error_string = "attach failed"; 230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2308e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetExitStatus(-1, error_string); 2309e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2310e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 2311e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 2312e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 2313e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton SetNextEventAction(new Process::AttachCompletionHandler(this)); 2314e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton StartPrivateStateThread(); 231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 231724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 231824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 231924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 232024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 232175c703dd8b492bad25a987b96853626641ae7246Greg Claytonvoid 232275c703dd8b492bad25a987b96853626641ae7246Greg ClaytonProcess::CompleteAttach () 232375c703dd8b492bad25a987b96853626641ae7246Greg Clayton{ 232475c703dd8b492bad25a987b96853626641ae7246Greg Clayton // Let the process subclass figure out at much as it can about the process 232575c703dd8b492bad25a987b96853626641ae7246Greg Clayton // before we go looking for a dynamic loader plug-in. 2326c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham m_attached_to_process = true; 232775c703dd8b492bad25a987b96853626641ae7246Greg Clayton DidAttach(); 232875c703dd8b492bad25a987b96853626641ae7246Greg Clayton 23290d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham // We just attached. If we have a platform, ask it for the process architecture, and if it isn't 23300d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham // the same as the one we've already set, switch architectures. 23310d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham PlatformSP platform_sp (m_target.GetPlatform ()); 23320d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham assert (platform_sp.get()); 23330d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham if (platform_sp) 23340d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham { 23350d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham ProcessInstanceInfo process_info; 23360d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham platform_sp->GetProcessInfo (GetID(), process_info); 23370d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham const ArchSpec &process_arch = process_info.GetArchitecture(); 23380d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham if (process_arch.IsValid() && m_target.GetArchitecture() != process_arch) 23390d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham m_target.SetArchitecture (process_arch); 23400d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham } 23410d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham 23420d7f7775b6e1e7fd957b306828e9537cdb1e27b2Jim Ingham // We have completed the attach, now it is time to find the dynamic loader 234375c703dd8b492bad25a987b96853626641ae7246Greg Clayton // plug-in 23444fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL)); 234575c703dd8b492bad25a987b96853626641ae7246Greg Clayton if (m_dyld_ap.get()) 234675c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_dyld_ap->DidAttach(); 234775c703dd8b492bad25a987b96853626641ae7246Greg Clayton 234837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 234975c703dd8b492bad25a987b96853626641ae7246Greg Clayton // Figure out which one is the executable, and set that in our target: 235075c703dd8b492bad25a987b96853626641ae7246Greg Clayton ModuleList &modules = m_target.GetImages(); 235175c703dd8b492bad25a987b96853626641ae7246Greg Clayton 235275c703dd8b492bad25a987b96853626641ae7246Greg Clayton size_t num_modules = modules.GetSize(); 235375c703dd8b492bad25a987b96853626641ae7246Greg Clayton for (int i = 0; i < num_modules; i++) 235475c703dd8b492bad25a987b96853626641ae7246Greg Clayton { 235575c703dd8b492bad25a987b96853626641ae7246Greg Clayton ModuleSP module_sp (modules.GetModuleAtIndex(i)); 2356b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (module_sp && module_sp->IsExecutable()) 235775c703dd8b492bad25a987b96853626641ae7246Greg Clayton { 23585beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton if (m_target.GetExecutableModulePointer() != module_sp.get()) 235975c703dd8b492bad25a987b96853626641ae7246Greg Clayton m_target.SetExecutableModule (module_sp, false); 236075c703dd8b492bad25a987b96853626641ae7246Greg Clayton break; 236175c703dd8b492bad25a987b96853626641ae7246Greg Clayton } 236275c703dd8b492bad25a987b96853626641ae7246Greg Clayton } 236375c703dd8b492bad25a987b96853626641ae7246Greg Clayton} 236475c703dd8b492bad25a987b96853626641ae7246Greg Clayton 236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 2366e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg ClaytonProcess::ConnectRemote (const char *remote_url) 2367e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton{ 2368e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton m_abi_sp.reset(); 2369e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton m_process_input_reader.reset(); 2370e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2371e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // Find the process and its architecture. Make sure it matches the architecture 2372e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton // of the current Target, and if not adjust it. 2373e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2374e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton Error error (DoConnectRemote (remote_url)); 2375e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton if (error.Success()) 2376e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton { 2377a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton if (GetID() != LLDB_INVALID_PROCESS_ID) 2378a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton { 237924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton EventSP event_sp; 238024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton StateType state = WaitForProcessStopPrivate(NULL, event_sp); 238124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 238224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (state == eStateStopped || state == eStateCrashed) 238324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 238424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // If we attached and actually have a process on the other end, then 238524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // this ended up being the equivalent of an attach. 238624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton CompleteAttach (); 238724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 238824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // This delays passing the stopped event to listeners till 238924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // CompleteAttach gets a chance to complete... 239024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton HandlePrivateEvent (event_sp); 239124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 239224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 2393a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton } 239424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 239524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (PrivateStateThreadIsValid ()) 239624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ResumePrivateStateThread (); 239724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 239824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton StartPrivateStateThread (); 2399e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton } 2400e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton return error; 2401e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton} 2402e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2403e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton 2404e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg ClaytonError 240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Resume () 240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2407e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 2409ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham log->Printf("Process::Resume() m_stop_id = %u, public state: %s private state: %s", 241021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_mod_id.GetStopID(), 2411ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham StateAsCString(m_public_state.GetValue()), 2412ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham StateAsCString(m_private_state.GetValue())); 241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillResume()); 241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Tell the process it is about to resume before the thread list 241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24189c11d478f7c2a1611b591cd599782b7a0a8c5c37Johnny Chen // Now let the thread list know we are about to resume so it 241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // can let all of our threads know that they are about to be 242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // resumed. Threads will each be called with 242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Thread::WillResume(StateType) where StateType contains the state 242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // that they are supposed to have when the process is resumed 242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // (suspended/running/stepping). Threads should also check 242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // their resume signal in lldb::Thread::GetResumeSignal() 242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to see if they are suppoed to start back up with a signal. 242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_list.WillResume()) 242724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoResume(); 242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidResume(); 243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_list.DidResume(); 2433ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham if (log) 2434ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham log->Printf ("Process thinks the process has resumed."); 243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2439ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham error.SetErrorStringWithFormat("Process::WillResume() thread list returned false after WillResume"); 244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2442ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham else if (log) 2443ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham log->Printf ("Process::WillResume() got an error \"%s\".", error.AsCString("<unknown error>")); 244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Halt () 244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2450c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Pause our private state thread so we can ensure no one else eats 2451c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // the stop event out from under us. 2452f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Listener halt_listener ("lldb.process.halt_listener"); 2453f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham HijackPrivateProcessEvents(&halt_listener); 2454c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2455c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham EventSP event_sp; 24567e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton Error error (WillHalt()); 245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24587e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton if (error.Success()) 2459c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 246020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 24617e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton bool caused_stop = false; 24627e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton 24637e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton // Ask the process subclass to actually halt our process 24647e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton error = DoHalt(caused_stop); 246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 24663ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 24677e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton if (m_public_state.GetValue() == eStateAttaching) 24687e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton { 24697e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton SetExitStatus(SIGKILL, "Cancelled async attach."); 24707e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton Destroy (); 24717e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton } 24727e2f91cb958c8670774cb2190db7b858618b5b9bGreg Clayton else 24733ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 2474c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // If "caused_stop" is true, then DoHalt stopped the process. If 2475c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // "caused_stop" is false, the process was already stopped. 2476c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // If the DoHalt caused the process to stop, then we want to catch 2477c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // this event and set the interrupted bool to true before we pass 2478c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // this along so clients know that the process was interrupted by 2479c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // a halt command. 2480c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (caused_stop) 248120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 2482f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Wait for 1 second for the process to stop. 2483c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham TimeValue timeout_time; 2484c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham timeout_time = TimeValue::Now(); 2485c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham timeout_time.OffsetWithSeconds(1); 2486f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool got_event = halt_listener.WaitForEvent (&timeout_time, event_sp); 2487f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StateType state = ProcessEventData::GetStateFromEvent(event_sp.get()); 2488c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2489f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!got_event || state == eStateInvalid) 249020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 2491c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // We timeout out and didn't get a stop event... 2492f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham error.SetErrorStringWithFormat ("Halt timed out. State = %s", StateAsCString(GetState())); 249320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 249420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton else 249520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton { 2496c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (StateIsStoppedState (state)) 2497c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2498c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // We caused the process to interrupt itself, so mark this 2499c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // as such in the stop event so clients can tell an interrupted 2500c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // process from a natural stop 2501c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham ProcessEventData::SetInterruptedInEvent (event_sp.get(), true); 2502c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2503c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham else 2504c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2505c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2506c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (log) 2507c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state)); 2508c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham error.SetErrorString ("Did not get stopped event after halt."); 2509c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 251020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 251120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton } 2512c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham DidHalt(); 2513c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 25143ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 2515c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2516c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Resume our private state thread before we post the event (if any) 2517f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham RestorePrivateProcessEvents(); 251820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 2519c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // Post any event we might have consumed. If all goes well, we will have 2520c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // stopped the process, intercepted the event and set the interrupted 2521c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // bool in the event. Post it to the private event queue and that will end up 2522c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // correctly setting the state. 2523c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham if (event_sp) 2524c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham m_private_state_broadcaster.BroadcastEvent(event_sp); 252520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 252824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Detach () 253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 253224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillDetach()); 253324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableAllBreakpointSites(); 253724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoDetach(); 253824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidDetach(); 254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Destroy () 254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillDestroy()); 255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisableAllBreakpointSites(); 255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoDestroy(); 255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidDestroy(); 255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopPrivateStateThread(); 255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2560861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.StopReadThread(); 2561861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.Disconnect(); 2562861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && m_process_input_reader->IsActive()) 2563861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PopInputReader (m_process_input_reader); 2564861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader) 2565861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::Signal (int signal) 257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (WillSignal()); 257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error = DoSignal(signal); 257724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidSignal(); 257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2583395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Claytonlldb::ByteOrder 2584395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonProcess::GetByteOrder () const 258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2586395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return m_target.GetArchitecture().GetByteOrder(); 258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 2590395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonProcess::GetAddressByteSize () const 259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2592395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return m_target.GetArchitecture().GetAddressByteSize(); 259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2595395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ShouldBroadcastEvent (Event *event_ptr) 259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr); 260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool return_value = true; 2601e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 260324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (state) 260424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2605e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton case eStateConnected: 260624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateAttaching: 260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateLaunching: 260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateDetached: 260924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateExited: 261024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateUnloaded: 261124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // These events indicate changes in the state of the debugging session, always report them. 261224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateInvalid: 261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We stopped for no apparent reason, don't report it. 261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we've started the target running, we handle the cases where we 262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // are already running and where there is a transition from stopped to 262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // running differently. 262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // running -> running: Automatically suppress extra running events 262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // stopped -> running: Report except when there is one or more no votes 262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and no yes votes. 262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SynchronouslyNotifyStateChanged (state); 262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_public_state.GetValue()) 262824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateRunning: 263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStepping: 263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We always suppress multiple runnings with no PUBLIC stop in between. 263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: make this work correctly. For now always report 263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // run if we aren't running so we don't miss any runnning 263724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // events. If I run the lldb/test/thread/a.out file and 263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // break at main.cpp:58, run and hit the breakpoints on 263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // multiple threads, then somehow during the stepping over 264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // of all breakpoints no run gets reported. 264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a transition from stop to run. 264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_thread_list.ShouldReportRun (event_ptr)) 264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteYes: 264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNoOpinion: 264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNo: 265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateStopped: 265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateCrashed: 265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eStateSuspended: 266024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We've stopped. First see if we're going to restart the target. 266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we are going to stop, then we always broadcast the event. 266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't going to stop, let the thread plans decide if we're going to report this event. 26645a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham // If no thread has an opinion, we don't report it. 26653ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (ProcessEventData::GetInterruptedFromEvent (event_ptr)) 26663ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 266720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton if (log) 266820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s", event_ptr, StateAsCString(state)); 26693ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return true; 26703ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 26713ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham else 267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RefreshStateAfterStop (); 267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 267524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_list.ShouldStop (event_ptr) == false) 267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (m_thread_list.ShouldReportStop (event_ptr)) 267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteYes: 268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process::ProcessEventData::SetRestartedInEvent (event_ptr, true); 2681028784b321087f1547df8f02f01631c59e5a9859Johnny Chen // Intentional fall-through here. 268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNoOpinion: 268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eVoteNo: 268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = false; 268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 26893ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state)); 269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Resume (); 269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_value = true; 269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SynchronouslyNotifyStateChanged (state); 269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 27027e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda log->Printf ("Process::ShouldBroadcastEvent (%p) => %s - %s", event_ptr, StateAsCString(state), return_value ? "YES" : "NO"); 270324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_value; 270424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StartPrivateStateThread () 270924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2710e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 271124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2712b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton bool already_running = PrivateStateThreadIsValid (); 271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 2714b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton log->Printf ("Process::%s()%s ", __FUNCTION__, already_running ? " already running" : " starting private state thread"); 2715b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 2716b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (already_running) 2717b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return true; 271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 271924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Create a thread that watches our internal state and controls which 272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // events make it to clients (into the DCProcess event queue). 2721a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton char thread_name[1024]; 2722444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state(pid=%llu)>", GetID()); 2723a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_private_state_thread = Host::ThreadCreate (thread_name, Process::PrivateStateThread, this, NULL); 272409c81efd010d1c9ac8821bad00cdfc9747fcae79Greg Clayton return IS_VALID_LLDB_HOST_THREAD(m_private_state_thread); 272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PausePrivateStateThread () 272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 273024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ControlPrivateStateThread (eBroadcastInternalStateControlPause); 273124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 273224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ResumePrivateStateThread () 273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 273624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ControlPrivateStateThread (eBroadcastInternalStateControlResume); 273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 273924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 274024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::StopPrivateStateThread () 274124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2742b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (PrivateStateThreadIsValid ()) 2743b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ControlPrivateStateThread (eBroadcastInternalStateControlStop); 274424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 274524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 274724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ControlPrivateStateThread (uint32_t signal) 274824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2749e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 275024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (signal == eBroadcastInternalStateControlStop || 275224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal == eBroadcastInternalStateControlPause || 275324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal == eBroadcastInternalStateControlResume); 275424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 275524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 2756f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal); 275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2758f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // Signal the private state thread. First we should copy this is case the 2759f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // thread starts exiting since the private state thread will NULL this out 2760f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton // when it exits 2761f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton const lldb::thread_t private_state_thread = m_private_state_thread; 276209c81efd010d1c9ac8821bad00cdfc9747fcae79Greg Clayton if (IS_VALID_LLDB_HOST_THREAD(private_state_thread)) 276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TimeValue timeout_time; 276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool timed_out; 276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_broadcaster.BroadcastEvent (signal, NULL); 276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout_time = TimeValue::Now(); 277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner timeout_time.OffsetWithSeconds(2); 277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out); 277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (false, eBroadcastNever); 277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (signal == eBroadcastInternalStateControlStop) 277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 277624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (timed_out) 2777f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton Host::ThreadCancel (private_state_thread, NULL); 277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread_result_t result = NULL; 2780f4fbc0b6c4ce465dca72467e3e33edfa5f7381e2Greg Clayton Host::ThreadJoin (private_state_thread, &result, NULL); 2781c607d8681f443d03806f105ceceb11dcadd16184Greg Clayton m_private_state_thread = LLDB_INVALID_HOST_THREAD; 278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::HandlePrivateEvent (EventSP &event_sp) 278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2789e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2790c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 279168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton const StateType new_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 2792c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 2793c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham // First check to see if anybody wants a shot at this event: 279468bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham if (m_next_event_action_ap.get() != NULL) 2795c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 279668bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham NextEventAction::EventActionResult action_result = m_next_event_action_ap->PerformAction(event_sp); 2797c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham switch (action_result) 2798c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham { 2799c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham case NextEventAction::eEventActionSuccess: 2800c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham SetNextEventAction(NULL); 2801c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham break; 2802c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham case NextEventAction::eEventActionRetry: 2803c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham break; 2804c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham case NextEventAction::eEventActionExit: 280584c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // Handle Exiting Here. If we already got an exited event, 280684c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // we should just propagate it. Otherwise, swallow this event, 280784c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // and set our state to exit so the next event will kill us. 280884c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham if (new_state != eStateExited) 280984c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham { 281084c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham // FIXME: should cons up an exited event, and discard this one. 281168bffc51b218dc3a124820cb4d983204bf20be4aJim Ingham SetExitStatus(0, m_next_event_action_ap->GetExitString()); 281284c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham SetNextEventAction(NULL); 281384c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham return; 281484c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham } 281584c8638c46e3325d73e614b4ce0ad383ff216488Jim Ingham SetNextEventAction(NULL); 2816c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham break; 2817c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2818c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham } 2819c2dc7c88cebe05cce059970cc907768256b28a42Jim Ingham 282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if we should broadcast this state to external clients? 282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const bool should_broadcast = ShouldBroadcastEvent (event_sp.get()); 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (should_broadcast) 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2827444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::%s (pid = %llu) broadcasting new state %s (old state %s) to %s", 282868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton __FUNCTION__, 282968ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton GetID(), 283068ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString(new_state), 283168ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString (GetState ()), 283268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public"); 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2834d60d94a5126b93fda98678a68322abc2164073dbJim Ingham Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get()); 283568ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton if (StateIsRunningState (new_state)) 2836861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice PushProcessInputReader (); 2837861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice else 2838861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice PopProcessInputReader (); 2839d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 284024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BroadcastEvent (event_sp); 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2846444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::%s (pid = %llu) suppressing state %s (old state %s): should_broadcast == false", 284768ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton __FUNCTION__, 284868ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton GetID(), 284968ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton StateAsCString(new_state), 28507e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda StateAsCString (GetState ())); 285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::PrivateStateThread (void *arg) 285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process *proc = static_cast<Process*> (arg); 285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *result = proc->RunPrivateStateThread (); 286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::RunPrivateStateThread () 286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool control_only = false; 286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (false, eBroadcastNever); 286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2869e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 2871444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::%s (arg = %p, pid = %llu) thread starting...", __FUNCTION__, this, GetID()); 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool exit_now = false; 287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (!exit_now) 287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventSP event_sp; 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WaitForEventsPrivate (NULL, event_sp, control_only); 287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster)) 287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (event_sp->GetType()) 288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlStop: 288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exit_now = true; 288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; // Go to next loop iteration so we exit without 288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; // doing any internal state managment below 288624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlPause: 288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner control_only = true; 288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 289124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eBroadcastInternalStateControlResume: 289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner control_only = false; 289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 28953ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 28963ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (log) 2897444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::%s (arg = %p, pid = %llu) got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType()); 28983ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_private_state_control_wait.SetValue (true, eBroadcastAlways); 29003ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham continue; 290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (internal_state != eStateInvalid) 290724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePrivateEvent (event_sp); 290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29113b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton if (internal_state == eStateInvalid || 29123b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton internal_state == eStateExited || 29133b2c41c9d12bafdad87cc271fadd1f816081b9a8Greg Clayton internal_state == eStateDetached ) 29143ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham { 29153ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (log) 2916444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::%s (arg = %p, pid = %llu) about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state)); 29173ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 29193ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham } 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2922926060e198137f8a64face70455324a8cd4362a5Caroline Tice // Verify log is still enabled before attempting to write to it... 292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 2924444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::%s (arg = %p, pid = %llu) thread exiting...", __FUNCTION__, this, GetID()); 292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2926a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton m_private_state_control_wait.SetValue (true, eBroadcastAlways); 2927a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton m_private_state_thread = LLDB_INVALID_HOST_THREAD; 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Process Event Data 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData () : 293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventData (), 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp (), 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_state (eStateInvalid), 293954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton m_restarted (false), 29406cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham m_update_state (0), 29413ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_interrupted (false) 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) : 294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EventData (), 294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp (process_sp), 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_state (state), 294954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton m_restarted (false), 29506cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham m_update_state (0), 29513ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham m_interrupted (false) 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::~ProcessEventData() 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetFlavorString () 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString g_flavor ("Process::ProcessEventData"); 296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_flavor; 296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetFlavor () const 296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ProcessEventData::GetFlavorString (); 297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::DoOnRemoval (Event *event_ptr) 297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This function gets called twice for each event, once when the event gets pulled 29766cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // off of the private process event queue, and then any number of times, first when it gets pulled off of 29776cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // the public event queue, then other times when we're pretending that this is where we stopped at the 29786cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // end of expression evaluation. m_update_state is used to distinguish these 29796cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // three cases; it is 0 when we're just pulling it off for private handling, 29806cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham // and > 1 for expression evaluation, and we don't want to do the breakpoint command handling then. 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29826cf4d2b31bf208cd6e48d4e37af671ab9b451446Jim Ingham if (m_update_state != 1) 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_process_sp->SetPublicState (m_state); 298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we're stopped and haven't restarted, then do the breakpoint commands here: 298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_state == eStateStopped && ! m_restarted) 298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int num_threads = m_process_sp->GetThreadList().GetSize(); 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int idx; 2992643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 299321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // The actions might change one of the thread's stop_info's opinions about whether we should 299421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // stop the process, so we need to query that as we go. 299521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham bool still_should_stop = true; 299621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx = 0; idx < num_threads; ++idx) 299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ThreadSP thread_sp = m_process_sp->GetThreadList().GetThreadAtIndex(idx); 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30016297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham StopInfoSP stop_info_sp = thread_sp->GetStopInfo (); 30026297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham if (stop_info_sp) 300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30046297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham stop_info_sp->PerformAction(event_ptr); 300521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // The stop action might restart the target. If it does, then we want to mark that in the 300621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // event so that whoever is receiving it will know to wait for the running event and reflect 300721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // that state appropriately. 300821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We also need to stop processing actions, since they aren't expecting the target to be running. 300921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (m_process_sp->GetPrivateState() == eStateRunning) 301021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 301121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham SetRestarted (true); 301221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham break; 301321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 301421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else if (!stop_info_sp->ShouldStop(event_ptr)) 301521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 301621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham still_should_stop = false; 301721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30206fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham 302121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 302221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (m_process_sp->GetPrivateState() != eStateRunning) 3023d60d94a5126b93fda98678a68322abc2164073dbJim Ingham { 302421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (!still_should_stop) 302521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 302621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // We've been asked to continue, so do that here. 3027d60d94a5126b93fda98678a68322abc2164073dbJim Ingham SetRestarted(true); 302821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_process_sp->Resume(); 302921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 303021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham else 303121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 303221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // If we didn't restart, run the Stop Hooks here: 303321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham // They might also restart the target, so watch for that. 303421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham m_process_sp->GetTarget().RunStopHooks(); 303521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham if (m_process_sp->GetPrivateState() == eStateRunning) 303621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham SetRestarted(true); 303721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 3038d60d94a5126b93fda98678a68322abc2164073dbJim Ingham } 3039d60d94a5126b93fda98678a68322abc2164073dbJim Ingham 304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::Dump (Stream *s) const 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_process_sp) 3047444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton s->Printf(" process = %p (pid = %llu), ", m_process_sp.get(), m_process_sp->GetID()); 304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3049b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton s->Printf("state = %s", StateAsCString(GetState())); 305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Process::ProcessEventData * 305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr) 305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_ptr) 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EventData *event_data = event_ptr->GetData(); 305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString()) 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast <const ProcessEventData *> (event_ptr->GetData()); 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcessSP 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetProcessFromEvent (const Event *event_ptr) 306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessSP process_sp; 306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data) 307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process_sp = data->GetProcessSP(); 307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return process_sp; 307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetStateFromEvent (const Event *event_ptr) 307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data == NULL) 307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eStateInvalid; 308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data->GetState(); 308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr) 308624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 308724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data == NULL) 308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return data->GetRestarted(); 309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value) 309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data != NULL) 309924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetRestarted(new_value); 310024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 31033ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr) 31043ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{ 31053ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 31063ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (data == NULL) 31073ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return false; 31083ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham else 31093ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham return data->GetInterrupted (); 31103ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham} 31113ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 31123ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghamvoid 31133ae449a5c3b4f51afc0da22cfeaef00c303c0accJim InghamProcess::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value) 31143ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham{ 31153ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 31163ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham if (data != NULL) 31173ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham data->SetInterrupted(new_value); 31183ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham} 31193ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Ingham 31203ae449a5c3b4f51afc0da22cfeaef00c303c0accJim Inghambool 312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr) 312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 312324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data) 312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner data->SetUpdateStateOnRemoval(); 312724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 312824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 313124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3133a830adbcd63d1995a01e6e18da79893c1426ca43Greg ClaytonProcess::CalculateExecutionContext (ExecutionContext &exe_ctx) 313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3135567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetTargetPtr (&m_target); 3136567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetProcessPtr (this); 3137567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetThreadPtr(NULL); 3138567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFramePtr (NULL); 313924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 314024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::ProcessSP 314224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcess::GetSP () 314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetTarget().GetProcessSP(); 314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3147e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//uint32_t 3148e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids) 3149e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//{ 3150e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// return 0; 3151e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//} 3152e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 3153e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//ArchSpec 3154e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//Process::GetArchSpecForExistingProcess (lldb::pid_t pid) 3155e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//{ 3156e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// return Host::GetArchSpecForExistingProcess (pid); 3157e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//} 3158e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 3159e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//ArchSpec 3160e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//Process::GetArchSpecForExistingProcess (const char *process_name) 3161e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//{ 3162e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// return Host::GetArchSpecForExistingProcess (process_name); 3163e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//} 3164e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// 3165861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3166861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::AppendSTDOUT (const char * s, size_t len) 3167861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 316820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton Mutex::Locker locker (m_stdio_communication_mutex); 3169861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdout_data.append (s, len); 3170861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3171b37813353540bcabee7af5f096515a8180be0426Greg Clayton BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (GetTarget().GetProcessSP(), GetState())); 3172861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3173861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3174861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3175861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len) 3176861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3177861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Process *process = (Process *) baton; 3178861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice process->AppendSTDOUT (static_cast<const char *>(src), src_len); 3179861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3180861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3181861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticesize_t 3182861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ProcessInputReaderCallback (void *baton, 3183861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice InputReader &reader, 3184861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice lldb::InputReaderAction notification, 3185861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice const char *bytes, 3186861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice size_t bytes_len) 3187861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3188861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Process *process = (Process *) baton; 3189861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3190861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice switch (notification) 3191861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3192861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderActivate: 3193861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3194861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3195861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderDeactivate: 3196861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3197861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3198861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderReactivate: 3199861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3200861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 32014a348081030cdd2af758fddc869518357d9befd3Caroline Tice case eInputReaderAsynchronousOutputWritten: 32024a348081030cdd2af758fddc869518357d9befd3Caroline Tice break; 32034a348081030cdd2af758fddc869518357d9befd3Caroline Tice 3204861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderGotToken: 3205861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3206861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Error error; 3207861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice process->PutSTDIN (bytes, bytes_len, error); 3208861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3209861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3210861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3211c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice case eInputReaderInterrupt: 3212c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice process->Halt (); 3213c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice break; 3214c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 3215c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice case eInputReaderEndOfFile: 3216c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice process->AppendSTDOUT ("^D", 2); 3217c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice break; 3218c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 3219861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice case eInputReaderDone: 3220861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice break; 3221861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3222861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3223861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3224861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice return bytes_len; 3225861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3226861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3227861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3228861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::ResetProcessInputReader () 3229861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3230861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 3231861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3232861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3233861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3234861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::SetUpProcessInputReader (int file_descriptor) 3235861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3236861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // First set up the Read Thread for reading/handling process I/O 3237861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3238861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice std::auto_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true)); 3239861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3240861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (conn_ap.get()) 3241861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3242861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.SetConnection (conn_ap.release()); 3243861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_stdio_communication.IsConnected()) 3244861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3245861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this); 3246861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_stdio_communication.StartReadThread(); 3247861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3248861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice // Now read thread is set up, set up input reader. 3249861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3250861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (!m_process_input_reader.get()) 3251861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice { 3252861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset (new InputReader(m_target.GetDebugger())); 3253861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback, 3254861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice this, 3255861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice eInputReaderGranularityByte, 3256861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice NULL, 3257861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice NULL, 3258861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice false)); 3259861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3260861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (err.Fail()) 3261861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_process_input_reader.reset(); 3262861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3263861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3264861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice } 3265861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3266861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3267861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3268861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PushProcessInputReader () 3269861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3270861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && !m_process_input_reader->IsActive()) 3271861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PushInputReader (m_process_input_reader); 3272861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3273861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3274861efb3f6e225e45c45511d6da894633b36025a1Caroline Ticevoid 3275861efb3f6e225e45c45511d6da894633b36025a1Caroline TiceProcess::PopProcessInputReader () 3276861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice{ 3277861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice if (m_process_input_reader && m_process_input_reader->IsActive()) 3278861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice m_target.GetDebugger().PopInputReader (m_process_input_reader); 3279861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice} 3280861efb3f6e225e45c45511d6da894633b36025a1Caroline Tice 3281d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton// The process needs to know about installed plug-ins 3282990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 32832a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceProcess::SettingsInitialize () 3284990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 3285b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static std::vector<OptionEnumValueElement> g_plugins; 3286d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton 3287d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton int i=0; 3288d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton const char *name; 3289d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton OptionEnumValueElement option_enum; 3290d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton while ((name = PluginManager::GetProcessPluginNameAtIndex (i)) != NULL) 3291d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3292d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton if (name) 3293d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3294d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.value = i; 3295d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.string_value = name; 3296d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.usage = PluginManager::GetProcessPluginDescriptionAtIndex (i); 3297d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton g_plugins.push_back (option_enum); 3298d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3299d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton ++i; 3300d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3301d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.value = 0; 3302d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.string_value = NULL; 3303d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton option_enum.usage = NULL; 3304d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton g_plugins.push_back (option_enum); 3305d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton 3306d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton for (i=0; (name = SettingsController::instance_settings_table[i].var_name); ++i) 3307d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3308d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton if (::strcmp (name, "plugin") == 0) 3309d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton { 3310d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton SettingsController::instance_settings_table[i].enum_values = &g_plugins[0]; 3311d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton break; 3312d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3313d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton } 3314990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsControllerSP &usc = GetSettingsController(); 3315990de7bb41d3afec6b789155408ff322187d8682Greg Clayton usc.reset (new SettingsController); 3316990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsController::InitializeSettingsController (usc, 3317990de7bb41d3afec6b789155408ff322187d8682Greg Clayton SettingsController::global_settings_table, 3318990de7bb41d3afec6b789155408ff322187d8682Greg Clayton SettingsController::instance_settings_table); 33192a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 33202a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Now call SettingsInitialize() for each 'child' of Process settings 33212a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice Thread::SettingsInitialize (); 3322990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 33236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 3324990de7bb41d3afec6b789155408ff322187d8682Greg Claytonvoid 33252a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceProcess::SettingsTerminate () 3326990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 33272a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Must call SettingsTerminate() on each 'child' of Process settings before terminating Process settings. 33282a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 33292a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice Thread::SettingsTerminate (); 33302a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 33312a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Now terminate Process Settings. 33322a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 3333990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsControllerSP &usc = GetSettingsController(); 3334990de7bb41d3afec6b789155408ff322187d8682Greg Clayton UserSettingsController::FinalizeSettingsController (usc); 3335990de7bb41d3afec6b789155408ff322187d8682Greg Clayton usc.reset(); 3336990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 33376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 3338990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonUserSettingsControllerSP & 3339990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonProcess::GetSettingsController () 3340990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 3341990de7bb41d3afec6b789155408ff322187d8682Greg Clayton static UserSettingsControllerSP g_settings_controller; 33426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return g_settings_controller; 33436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 33446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 33451ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Ticevoid 33461ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline TiceProcess::UpdateInstanceName () 33471ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice{ 33485beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module *module = GetTarget().GetExecutableModulePointer(); 33495beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton if (module) 33501ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice { 33511ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice StreamString sstr; 33525beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton sstr.Printf ("%s", module->GetFileSpec().GetFilename().AsCString()); 33531ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 3354c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(), 3355b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton sstr.GetData()); 33561ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice } 33571ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice} 33581ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 3359427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonExecutionResults 3360360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::RunThreadPlan (ExecutionContext &exe_ctx, 3361360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::ThreadPlanSP &thread_plan_sp, 3362360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool stop_others, 3363360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool try_all_threads, 3364360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool discard_on_error, 3365360f53f3c216ee4fb433da0a367168785328a856Jim Ingham uint32_t single_thread_timeout_usec, 3366360f53f3c216ee4fb433da0a367168785328a856Jim Ingham Stream &errors) 3367360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 3368360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ExecutionResults return_value = eExecutionSetupError; 3369360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 337015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham if (thread_plan_sp.get() == NULL) 337115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 337215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham errors.Printf("RunThreadPlan called with empty thread plan."); 3373b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return eExecutionSetupError; 337415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 3375567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3376567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetProcessPtr() != this) 3377567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 3378567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton errors.Printf("RunThreadPlan called on wrong process."); 3379567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return eExecutionSetupError; 3380567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 3381567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3382567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 3383567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread == NULL) 3384567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 3385567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton errors.Printf("RunThreadPlan called with invalid thread."); 3386567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return eExecutionSetupError; 3387567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 338815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 33895ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // We rely on the thread plan we are running returning "PlanCompleted" if when it successfully completes. 33905ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // For that to be true the plan can't be private - since private plans suppress themselves in the 33915ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham // GetCompletedPlan call. 33925ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham 33935ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham bool orig_plan_private = thread_plan_sp->GetPrivate(); 33945ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham thread_plan_sp->SetPrivate(false); 33955ab7fba0d0a07add74e542689e51b729a26b7dc5Jim Ingham 3396ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham if (m_private_state.GetValue() != eStateStopped) 3397ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham { 3398ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham errors.Printf ("RunThreadPlan called while the private state was not stopped."); 3399b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return eExecutionSetupError; 3400ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham } 3401ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham 34027bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham // Save the thread & frame from the exe_ctx for restoration after we run 3403567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton const uint32_t thread_idx_id = thread->GetIndexID(); 3404567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackID ctx_frame_id = thread->GetSelectedFrame()->GetStackID(); 3405360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3406360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // N.B. Running the target may unset the currently selected thread and frame. We don't want to do that either, 3407360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // so we should arrange to reset them as well. 3408360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3409567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::ThreadSP selected_thread_sp = GetThreadList().GetSelectedThread(); 3410360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 34117bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham uint32_t selected_tid; 34127bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham StackID selected_stack_id; 3413e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (selected_thread_sp) 3414360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3415360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_tid = selected_thread_sp->GetIndexID(); 34167bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham selected_stack_id = selected_thread_sp->GetSelectedFrame()->GetStackID(); 3417360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3418360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 3419360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3420360f53f3c216ee4fb433da0a367168785328a856Jim Ingham selected_tid = LLDB_INVALID_THREAD_ID; 3421360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3422360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3423567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->QueueThreadPlan(thread_plan_sp, true); 3424360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 34256ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham Listener listener("lldb.process.listener.run-thread-plan"); 3426f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3427f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // This process event hijacker Hijacks the Public events and its destructor makes sure that the process events get 3428f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // restored on exit to the function. 3429f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3430f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ProcessEventHijacker run_thread_plan_hijacker (*this, &listener); 3431ac95966f900e8af29c25b3bd85b3d41cd4568857Jim Ingham 34326ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham lldb::LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 343315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham if (log) 343415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 343515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham StreamString s; 343615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose); 3437444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton log->Printf ("Process::RunThreadPlan(): Resuming thread %u - 0x%4.4llx to run thread plan \"%s\".", 3438567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->GetIndexID(), 3439567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->GetID(), 3440f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham s.GetData()); 344115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 344215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 3443f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool got_event; 3444f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham lldb::EventSP event_sp; 3445f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham lldb::StateType stop_state = lldb::eStateInvalid; 3446360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3447360f53f3c216ee4fb433da0a367168785328a856Jim Ingham TimeValue* timeout_ptr = NULL; 3448360f53f3c216ee4fb433da0a367168785328a856Jim Ingham TimeValue real_timeout; 3449360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3450f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool first_timeout = true; 3451f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool do_resume = true; 3452360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3453360f53f3c216ee4fb433da0a367168785328a856Jim Ingham while (1) 3454360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3455f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We usually want to resume the process if we get to the top of the loop. 3456f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // The only exception is if we get two running events with no intervening 3457f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // stop, which can happen, we will just wait for then next stop event. 3458f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3459f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (do_resume) 3460f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3461f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Do the initial resume and wait for the running event before going further. 3462f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3463567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error resume_error = Resume (); 3464f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!resume_error.Success()) 3465f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3466f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham errors.Printf("Error resuming inferior: \"%s\".\n", resume_error.AsCString()); 3467b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionSetupError; 3468f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3469f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3470f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3471f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 3472f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(500000); 3473f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham timeout_ptr = &real_timeout; 3474f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3475f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent(NULL, event_sp); 3476f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!got_event) 3477f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3478f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3479f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Didn't get any event after initial resume, exiting."); 3480f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3481f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham errors.Printf("Didn't get any event after initial resume, exiting."); 3482b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionSetupError; 3483f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3484f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3485f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3486f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3487f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state != eStateRunning) 3488f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3489f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3490f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state)); 3491f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3492f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham errors.Printf("Didn't get running event after initial resume, got %s instead.", StateAsCString(stop_state)); 3493b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionSetupError; 3494f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3495f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3496f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3497f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3498f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Resuming succeeded."); 3499f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We need to call the function synchronously, so spin waiting for it to return. 3500f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // If we get interrupted while executing, we're going to lose our context, and 3501f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // won't be able to gather the result at this point. 3502f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We set the timeout AFTER the resume, since the resume takes some time and we 3503f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // don't want to charge that to the timeout. 3504f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3505f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (single_thread_timeout_usec != 0) 3506f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3507f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 3508f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 3509f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(single_thread_timeout_usec); 3510f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3511f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithSeconds(10); 3512f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3513f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham timeout_ptr = &real_timeout; 3514f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3515f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3516f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3517f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3518f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3519f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Handled an extra running event."); 3520f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham do_resume = true; 3521f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3522f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3523360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Now wait for the process to stop again: 3524f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = lldb::eStateInvalid; 3525f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_sp.reset(); 3526f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent (timeout_ptr, event_sp); 3527360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3528f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (got_event) 3529360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3530f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (event_sp.get()) 3531f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3532f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool keep_going = false; 3533f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3534f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3535f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf("In while loop, got event: %s.", StateAsCString(stop_state)); 3536f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3537f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham switch (stop_state) 3538f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3539f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham case lldb::eStateStopped: 35402370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 3541439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // Yay, we're done. Now make sure that our thread plan actually completed. 3542567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ThreadSP thread_sp = GetThreadList().FindThreadByIndexID (thread_idx_id); 3543439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (!thread_sp) 35442370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 3545439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // Ooh, our thread has vanished. Unlikely that this was successful execution... 35462370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham if (log) 3547439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton log->Printf ("Execution completed but our thread (index-id=%u) has vanished.", thread_idx_id); 3548439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton return_value = eExecutionInterrupted; 35492370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham } 35502370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham else 35512370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 3552439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton StopInfoSP stop_info_sp (thread_sp->GetStopInfo ()); 3553439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton StopReason stop_reason = eStopReasonInvalid; 3554439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (stop_info_sp) 3555439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton stop_reason = stop_info_sp->GetStopReason(); 3556439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (stop_reason == eStopReasonPlanComplete) 3557439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton { 3558439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (log) 3559f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Execution completed successfully."); 3560439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // Now mark this plan as private so it doesn't get reported as the stop reason 3561439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton // after this point. 3562439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (thread_plan_sp) 3563439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton thread_plan_sp->SetPrivate (orig_plan_private); 3564439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton return_value = eExecutionCompleted; 3565439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton } 3566439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton else 3567439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton { 3568439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton if (log) 3569f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Thread plan didn't successfully complete."); 3570439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 3571439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton return_value = eExecutionInterrupted; 3572439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton } 35732370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham } 3574439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton } 3575439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton break; 3576439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 3577f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham case lldb::eStateCrashed: 3578f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3579f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Execution crashed."); 3580b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3581f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3582439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 3583f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham case lldb::eStateRunning: 3584f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham do_resume = false; 3585f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham keep_going = true; 3586f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3587439944614eba902fd4faf2bc9a1d838a4fbf5784Greg Clayton 3588f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham default: 3589f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3590f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf("Execution stopped with unexpected state: %s.", StateAsCString(stop_state)); 35912370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham 35922370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham errors.Printf ("Execution stopped with unexpected state."); 3593b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3594f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3595f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3596f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (keep_going) 3597f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 3598f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3599f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3600f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3601f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3602f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3603f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3604f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("got_event was true, but the event pointer was null. How odd..."); 3605b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3606f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3607f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3608f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3609f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3610f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3611f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // If we didn't get an event that means we've timed out... 3612f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // We will interrupt the process here. Depending on what we were asked to do we will 3613f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // either exit, or try with all threads running for the same timeout. 3614360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Not really sure what to do if Halt fails here... 3615f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3616c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson if (log) { 3617360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (try_all_threads) 3618f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3619f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 3620f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, " 3621f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "trying with all threads enabled.", 3622f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham single_thread_timeout_usec); 3623f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3624f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): Restarting function with all threads enabled " 3625f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "and timeout: %d timed out.", 3626f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham single_thread_timeout_usec); 3627f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3628360f53f3c216ee4fb433da0a367168785328a856Jim Ingham else 3629f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham log->Printf ("Process::RunThreadPlan(): Running function with timeout: %d timed out, " 3630f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "halt and abandoning execution.", 3631360f53f3c216ee4fb433da0a367168785328a856Jim Ingham single_thread_timeout_usec); 3632c2b9825ed2e06f90bb2764181fa53afd1a3763ebStephen Wilson } 3633360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3634567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error halt_error = Halt(); 3635c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham if (halt_error.Success()) 3636360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3637360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 3638f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): Halt succeeded."); 3639360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3640f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // If halt succeeds, it always produces a stopped event. Wait for that: 3641f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3642f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 3643f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(500000); 3644f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3645f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent(&real_timeout, event_sp); 3646360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3647360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (got_event) 3648360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3649360f53f3c216ee4fb433da0a367168785328a856Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3650360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 3651360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 365268ca823ad1ab94805bcee03f3ad0b649d94e5a09Greg Clayton log->Printf ("Process::RunThreadPlan(): Stopped with event: %s", StateAsCString(stop_state)); 3653f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state == lldb::eStateStopped 3654f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get())) 3655f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString (" Event was the Halt interruption event."); 3656360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3657360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3658f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state == lldb::eStateStopped) 3659360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3660f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Between the time we initiated the Halt and the time we delivered it, the process could have 3661f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // already finished its job. Check that here: 3662f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3663567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread->IsThreadPlanDone (thread_plan_sp.get())) 3664f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3665f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3666f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done. " 3667f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "Exiting wait loop."); 3668b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionCompleted; 3669f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3670f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3671360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3672f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!try_all_threads) 3673f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3674f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3675f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("try_all_threads was false, we stopped so now we're quitting."); 3676b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3677f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3678f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3679360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3680f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 3681f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3682f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Set all the other threads to run, and return to the top of the loop, which will continue; 3683f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham first_timeout = false; 3684f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_plan_sp->SetStopOthers (false); 3685f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3686f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): About to resume."); 3687360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3688f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 3689f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3690f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3691f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3692f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Running all threads failed, so return Interrupted. 3693f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3694f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): running all threads timed out."); 3695b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3696f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3697f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3698360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3699360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3700f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3701f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { if (log) 3702f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): halt said it succeeded, but I got no event. " 3703f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "I'm getting out of here passing Interrupted."); 3704b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3705f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3706f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3707360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3708c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham else 3709c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham { 3710f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // This branch is to work around some problems with gdb-remote's Halt. It is a little racy, and can return 3711f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // an error from halt, but if you wait a bit you'll get a stopped event anyway. 3712c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham if (log) 3713f9f40c20b210eea72ab042c63178ca000f005ed9Jim 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.", 3714f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham halt_error.AsCString()); 3715f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout = TimeValue::Now(); 3716f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham real_timeout.OffsetWithMicroSeconds(500000); 3717f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham timeout_ptr = &real_timeout; 3718f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham got_event = listener.WaitForEvent(&real_timeout, event_sp); 3719f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!got_event || event_sp.get() == NULL) 37206ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham { 3721f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // This is not going anywhere, bag out. 3722f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3723f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): halt failed: and waiting for the stopped event failed."); 3724b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3725f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3726f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3727f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3728f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3729f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 3730f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3731f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): halt failed: but then I got a stopped event. Whatever..."); 3732f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_state == lldb::eStateStopped) 3733f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3734f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Between the time we initiated the Halt and the time we delivered it, the process could have 3735f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // already finished its job. Check that here: 3736f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3737567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread->IsThreadPlanDone (thread_plan_sp.get())) 3738f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3739f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3740f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done. " 3741f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham "Exiting wait loop."); 3742b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionCompleted; 3743f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3744f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3745f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3746f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (first_timeout) 3747f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3748f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Set all the other threads to run, and return to the top of the loop, which will continue; 3749f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham first_timeout = false; 3750f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_plan_sp->SetStopOthers (false); 3751f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3752f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): About to resume."); 3753f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3754f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 3755f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3756f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3757f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3758f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Running all threads failed, so return Interrupted. 3759f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3760f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): running all threads timed out."); 3761b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3762f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3763f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3764f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3765f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3766f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3767ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan if (log) 3768ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan log->Printf ("Process::RunThreadPlan(): halt failed, I waited and didn't get" 3769ed3f86b97e0a84d6ca9bda7eaeff3a12ed353a90Sean Callanan " a stopped event, instead got %s.", StateAsCString(stop_state)); 3770b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionInterrupted; 3771f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3772f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 37736ae318c875fac58fb2d952739ee554c5ba18368fJim Ingham } 3774c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 3775c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham 3776360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3777360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3778f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } // END WAIT LOOP 3779f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3780f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // Now do some processing on the results of the run: 3781f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (return_value == eExecutionInterrupted) 3782f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3783360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (log) 3784360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3785f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StreamString s; 3786f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (event_sp) 3787f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_sp->Dump (&s); 3788f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3789360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3790f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString ("Process::RunThreadPlan(): Stop event that interrupted us is NULL."); 3791f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3792f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3793f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham StreamString ts; 3794f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3795f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham const char *event_explanation = NULL; 3796f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3797f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham do 3798f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3799f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get()); 3800f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3801f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!event_data) 3802c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham { 3803f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_explanation = "<no event data>"; 3804f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3805c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 3806f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3807f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Process *process = event_data->GetProcessSP().get(); 3808c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham 3809f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!process) 3810f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3811f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_explanation = "<no process>"; 3812f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham break; 3813f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3814f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3815f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ThreadList &thread_list = process->GetThreadList(); 3816f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3817f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham uint32_t num_threads = thread_list.GetSize(); 3818f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham uint32_t thread_index; 3819f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3820f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("<%u threads> ", num_threads); 3821360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3822f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham for (thread_index = 0; 3823f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham thread_index < num_threads; 3824f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ++thread_index) 3825360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3826f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham Thread *thread = thread_list.GetThreadAtIndex(thread_index).get(); 3827360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3828f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!thread) 3829360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3830f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("<?> "); 3831f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham continue; 3832360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3833360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3834444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton ts.Printf("<0x%4.4llx ", thread->GetID()); 3835f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham RegisterContext *register_context = thread->GetRegisterContext().get(); 3836360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3837f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (register_context) 3838f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("[ip 0x%llx] ", register_context->GetPC()); 3839f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3840f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf("[ip unknown] "); 3841360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3842f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham lldb::StopInfoSP stop_info_sp = thread->GetStopInfo(); 3843f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_info_sp) 3844c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham { 3845f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham const char *stop_desc = stop_info_sp->GetDescription(); 3846f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (stop_desc) 3847f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.PutCString (stop_desc); 3848c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 3849f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham ts.Printf(">"); 3850c556b46d7eaf949acd818d9ca4d64ddd952345cfJim Ingham } 3851f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3852f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham event_explanation = ts.GetData(); 3853f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } while (0); 3854360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3855f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3856f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham { 3857f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham if (event_explanation) 3858f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->Printf("Process::RunThreadPlan(): execution interrupted: %s %s", s.GetData(), event_explanation); 3859f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham else 3860f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->Printf("Process::RunThreadPlan(): execution interrupted: %s", s.GetData()); 3861f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham } 3862f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3863360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (discard_on_error && thread_plan_sp) 3864360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3865567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 386621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 3867360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3868360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3869360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3870f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else if (return_value == eExecutionSetupError) 3871f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3872f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3873f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): execution set up error."); 3874360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3875f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (discard_on_error && thread_plan_sp) 3876f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3877567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 387821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 3879f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3880f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3881f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3882f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3883567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread->IsThreadPlanDone (thread_plan_sp.get())) 3884f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3885f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3886f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): thread plan is done"); 3887b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionCompleted; 3888f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3889567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (thread->WasThreadPlanDiscarded (thread_plan_sp.get())) 3890f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3891f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3892f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): thread plan was discarded"); 3893b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton return_value = eExecutionDiscarded; 3894f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3895f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham else 3896f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3897f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3898f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): thread plan stopped in mid course"); 3899f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (discard_on_error && thread_plan_sp) 3900f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 3901f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (log) 3902f6d3d79f94e1909056bb73322c09120936d08ccfJim Ingham log->PutCString("Process::RunThreadPlan(): discarding thread plan 'cause discard_on_error is set."); 3903567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 390421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham thread_plan_sp->SetPrivate (orig_plan_private); 3905f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3906f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3907f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 3908f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3909360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Thread we ran the function in may have gone away because we ran the target 39107bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham // Check that it's still there, and if it is put it back in the context. Also restore the 39117bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham // frame in the context if it is still present. 3912567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton thread = GetThreadList().FindThreadByIndexID(thread_idx_id, true).get(); 3913567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread) 39147bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham { 3915567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFrameSP (thread->GetFrameWithStackID (ctx_frame_id)); 39167bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham } 3917360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3918360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // Also restore the current process'es selected frame & thread, since this function calling may 3919360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // be done behind the user's back. 3920360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3921360f53f3c216ee4fb433da0a367168785328a856Jim Ingham if (selected_tid != LLDB_INVALID_THREAD_ID) 3922360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3923567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (GetThreadList().SetSelectedThreadByIndexID (selected_tid) && selected_stack_id.IsValid()) 3924360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3925360f53f3c216ee4fb433da0a367168785328a856Jim Ingham // We were able to restore the selected thread, now restore the frame: 3926567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrameSP old_frame_sp = GetThreadList().GetSelectedThread()->GetFrameWithStackID(selected_stack_id); 39277bbebaf6b46cd5d504544ad432d06fb989b770f9Jim Ingham if (old_frame_sp) 3928567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton GetThreadList().GetSelectedThread()->SetSelectedFrame(old_frame_sp.get()); 3929360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3930360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3931360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3932360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return return_value; 3933360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 3934360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3935360f53f3c216ee4fb433da0a367168785328a856Jim Inghamconst char * 3936360f53f3c216ee4fb433da0a367168785328a856Jim InghamProcess::ExecutionResultAsCString (ExecutionResults result) 3937360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 3938360f53f3c216ee4fb433da0a367168785328a856Jim Ingham const char *result_name; 3939360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3940360f53f3c216ee4fb433da0a367168785328a856Jim Ingham switch (result) 3941360f53f3c216ee4fb433da0a367168785328a856Jim Ingham { 3942b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionCompleted: 3943360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionCompleted"; 3944360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 3945b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionDiscarded: 3946360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionDiscarded"; 3947360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 3948b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionInterrupted: 3949360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionInterrupted"; 3950360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 3951b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionSetupError: 3952360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionSetupError"; 3953360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 3954b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton case eExecutionTimedOut: 3955360f53f3c216ee4fb433da0a367168785328a856Jim Ingham result_name = "eExecutionTimedOut"; 3956360f53f3c216ee4fb433da0a367168785328a856Jim Ingham break; 3957360f53f3c216ee4fb433da0a367168785328a856Jim Ingham } 3958360f53f3c216ee4fb433da0a367168785328a856Jim Ingham return result_name; 3959360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 3960360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 3961abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonvoid 3962abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::GetStatus (Stream &strm) 3963abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 3964abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const StateType state = GetState(); 3965abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (StateIsStoppedState(state)) 3966abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 3967abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (state == eStateExited) 3968abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 3969abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton int exit_status = GetExitStatus(); 3970abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const char *exit_description = GetExitDescription(); 3971444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton strm.Printf ("Process %llu exited with status = %i (0x%8.8x) %s\n", 3972abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton GetID(), 3973abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton exit_status, 3974abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton exit_status, 3975abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton exit_description ? exit_description : ""); 3976abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 3977abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 3978abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 3979abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (state == eStateConnected) 3980abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.Printf ("Connected to remote target.\n"); 3981abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 3982444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton strm.Printf ("Process %llu %s\n", GetID(), StateAsCString (state)); 3983abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 3984abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 3985abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton else 3986abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 3987444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton strm.Printf ("Process %llu is running.\n", GetID()); 3988abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 3989abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 3990abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 3991abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Claytonsize_t 3992abe0fed36d83e1c37af9dae90c2d25db742b4515Greg ClaytonProcess::GetThreadStatus (Stream &strm, 3993abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool only_threads_with_stop_reason, 3994abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t start_frame, 3995abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames, 3996abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames_with_source) 3997abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton{ 3998abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton size_t num_thread_infos_dumped = 0; 3999abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 4000abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const size_t num_threads = GetThreadList().GetSize(); 4001abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton for (uint32_t i = 0; i < num_threads; i++) 4002abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 4003abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton Thread *thread = GetThreadList().GetThreadAtIndex(i).get(); 4004abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (thread) 4005abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 4006abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (only_threads_with_stop_reason) 4007abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 4008abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (thread->GetStopInfo().get() == NULL) 4009abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton continue; 4010abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 4011abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton thread->GetStatus (strm, 4012abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton start_frame, 4013abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_frames, 4014abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_frames_with_source); 4015abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton ++num_thread_infos_dumped; 4016abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 4017abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton } 4018abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton return num_thread_infos_dumped; 4019abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton} 4020abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 40216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 4022d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// class Process::SettingsController 40236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 40246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4025d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::SettingsController () : 40265bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice UserSettingsController ("process", Target::GetSettingsController()) 40276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4028638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton m_default_settings.reset (new ProcessInstanceSettings (*this, 4029638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton false, 4030004afcb95736e97d071b1dd9b5254800e11e581cCaroline Tice InstanceSettings::GetDefaultName().AsCString())); 40316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 40326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4033d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::~SettingsController () 40346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 40356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 40366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 40376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticelldb::InstanceSettingsSP 4038d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::CreateInstanceSettings (const char *instance_name) 40396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4040c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton ProcessInstanceSettings *new_settings = new ProcessInstanceSettings (*GetSettingsController(), 4041c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton false, 4042c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton instance_name); 40436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice lldb::InstanceSettingsSP new_settings_sp (new_settings); 40446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return new_settings_sp; 40456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 40466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 40476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 40486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice// class ProcessInstanceSettings 40496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------------------- 40506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4051638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonProcessInstanceSettings::ProcessInstanceSettings 4052638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton( 4053638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton UserSettingsController &owner, 4054638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton bool live_instance, 4055638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton const char *name 4056638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton) : 4057abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton InstanceSettings (owner, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance) 40586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4059396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called 4060396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // until the vtables for ProcessInstanceSettings are properly set up, i.e. AFTER all the initializers. 4061396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // For this reason it has to be called here, rather than in the initializer or in the parent constructor. 406275b11a343a035ab426473a785a045f0614af9984Caroline Tice // This is true for CreateInstanceName() too. 4063abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 406475b11a343a035ab426473a785a045f0614af9984Caroline Tice if (GetInstanceName () == InstanceSettings::InvalidName()) 406575b11a343a035ab426473a785a045f0614af9984Caroline Tice { 406675b11a343a035ab426473a785a045f0614af9984Caroline Tice ChangeInstanceName (std::string (CreateInstanceName().AsCString())); 406775b11a343a035ab426473a785a045f0614af9984Caroline Tice m_owner.RegisterInstanceSettings (this); 406875b11a343a035ab426473a785a045f0614af9984Caroline Tice } 4069abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 4070396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice if (live_instance) 40716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 40726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); 40736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice CopyInstanceSettings (pending_settings,false); 4074396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice //m_owner.RemovePendingSettings (m_instance_name); 40756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 40766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 40776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 40786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::ProcessInstanceSettings (const ProcessInstanceSettings &rhs) : 4079abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton InstanceSettings (*Process::GetSettingsController(), CreateInstanceName().AsCString()) 40806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 40816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (m_instance_name != InstanceSettings::GetDefaultName()) 40826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 40836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name); 40846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice CopyInstanceSettings (pending_settings,false); 40856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_owner.RemovePendingSettings (m_instance_name); 40866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 40876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 40886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 40896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::~ProcessInstanceSettings () 40906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 40916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 40926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 40936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings& 40946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::operator= (const ProcessInstanceSettings &rhs) 40956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 40966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (this != &rhs) 40976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 40986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 40996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return *this; 41016e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 41026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid 41056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name, 41066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const char *index_value, 41076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const char *value, 41086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString &instance_name, 41096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const SettingEntry &entry, 4110b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton VarSetOperationType op, 41116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice Error &err, 41126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice bool pending) 41136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 41146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 41156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid 41176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings, 41186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice bool pending) 41196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4120abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton// if (new_settings.get() == NULL) 4121abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton// return; 4122abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton// 4123abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton// ProcessInstanceSettings *new_process_settings = (ProcessInstanceSettings *) new_settings.get(); 41246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 41256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 4126bcb5b454767121980d937d2610ba762fdb575c45Caroline Ticebool 41276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry, 41286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString &var_name, 41295bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice StringList &value, 4130bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice Error *err) 41316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4132abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton if (err) 4133abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString()); 4134abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton return false; 41356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 41366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString 41386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceProcessInstanceSettings::CreateInstanceName () 41396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 41406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static int instance_count = 1; 41416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice StreamString sstr; 41426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice sstr.Printf ("process_%d", instance_count); 41446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice ++instance_count; 41456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString ret_val (sstr.GetData()); 41476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return ret_val; 41486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 41496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 4151d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// SettingsController Variable Tables 41526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 41536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry 4155d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::global_settings_table[] = 41566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 41576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice //{ "var-name", var-type , "default", enum-table, init'd, hidden, "help-text"}, 41586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } 41596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 41606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry 4163d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonProcess::SettingsController::instance_settings_table[] = 41646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 4165638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton //{ "var-name", var-type, "default", enum-table, init'd, hidden, "help-text"}, 4166638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton { NULL, eSetVarTypeNone, NULL, NULL, false, false, NULL } 41676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 41686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 41707508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 4171abb3302051246273eb92cca203c9a1b9d9736e05Greg Clayton 4172