diff options
Diffstat (limited to 'lldb/source')
| -rw-r--r-- | lldb/source/API/SBDebugger.cpp | 20 | ||||
| -rw-r--r-- | lldb/source/API/SBModule.cpp | 46 | ||||
| -rw-r--r-- | lldb/source/API/SBTarget.cpp | 154 | ||||
| -rw-r--r-- | lldb/source/Core/ConnectionFileDescriptor.cpp | 40 | ||||
| -rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | 9 | ||||
| -rw-r--r-- | lldb/source/Target/Process.cpp | 10 |
6 files changed, 164 insertions, 115 deletions
diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp index 700098e2f4e..84b13ab641e 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -15,6 +15,7 @@ #include "lldb/API/SBBroadcaster.h" #include "lldb/API/SBCommandInterpreter.h" #include "lldb/API/SBCommandReturnObject.h" +#include "lldb/API/SBError.h" #include "lldb/API/SBEvent.h" #include "lldb/API/SBFrame.h" #include "lldb/API/SBInputReader.h" @@ -811,3 +812,22 @@ SBDebugger::GetID() return m_opaque_sp->GetID(); return LLDB_INVALID_UID; } + + +SBError +SBDebugger::SetCurrentPlatform (const char *platform_name) +{ + SBError sb_error; + if (m_opaque_sp) + { + PlatformSP platform_sp (Platform::Create (platform_name, sb_error.ref())); + + if (platform_sp) + { + bool make_selected = true; + m_opaque_sp->GetPlatformList().Append (platform_sp, make_selected); + } + } + return sb_error; +} + diff --git a/lldb/source/API/SBModule.cpp b/lldb/source/API/SBModule.cpp index e7e95be1e8b..427850ec46c 100644 --- a/lldb/source/API/SBModule.cpp +++ b/lldb/source/API/SBModule.cpp @@ -71,6 +71,52 @@ SBModule::GetFileSpec () const return file_spec; } +lldb::SBFileSpec +SBModule::GetPlatformFileSpec () const +{ + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + + SBFileSpec file_spec; + if (m_opaque_sp) + file_spec.SetFileSpec(m_opaque_sp->GetPlatformFileSpec()); + + if (log) + { + log->Printf ("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)", + m_opaque_sp.get(), file_spec.get()); + } + + return file_spec; + +} + +bool +SBModule::SetPlatformFileSpec (const lldb::SBFileSpec &platform_file) +{ + bool result = false; + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + + if (m_opaque_sp) + { + m_opaque_sp->SetPlatformFileSpec(*platform_file); + result = true; + } + + if (log) + { + log->Printf ("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s%s%s)) => %i", + m_opaque_sp.get(), + platform_file.get(), + platform_file->GetDirectory().GetCString(), + platform_file->GetDirectory() ? "/" : "", + platform_file->GetFilename().GetCString(), + result); + } + return result; +} + + + const uint8_t * SBModule::GetUUIDBytes () const { diff --git a/lldb/source/API/SBTarget.cpp b/lldb/source/API/SBTarget.cpp index 551a49680e1..ab70e6c0af2 100644 --- a/lldb/source/API/SBTarget.cpp +++ b/lldb/source/API/SBTarget.cpp @@ -183,126 +183,74 @@ SBTarget::Launch if (getenv("LLDB_LAUNCH_FLAG_DISABLE_ASLR")) launch_flags |= eLaunchFlagDisableASLR; - static const char *g_launch_tty = NULL; - static bool g_got_launch_tty = false; - if (!g_got_launch_tty) + StateType state = eStateInvalid; + sb_process.SetProcess (m_opaque_sp->GetProcessSP()); + if (sb_process.IsValid()) { - // Get the LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY only once - g_got_launch_tty = true; - g_launch_tty = ::getenv ("LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY"); - if (g_launch_tty) + state = sb_process->GetState(); + + if (sb_process->IsAlive() && state != eStateConnected) + { + if (state == eStateAttaching) + error.SetErrorString ("process attach is in progress"); + else + error.SetErrorString ("a process is already being debugged"); + sb_process.Clear(); + return sb_process; + } + } + + if (state == eStateConnected) + { + // If we are already connected, then we have already specified the + // listener, so if a valid listener is supplied, we need to error out + // to let the client know. + if (listener.IsValid()) { - // LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY is a path to a terminal to reuse - // if the first character is '/', else it is a boolean value. - if (g_launch_tty[0] != '/') - { - if (Args::StringToBoolean(g_launch_tty, false, NULL)) - g_launch_tty = ""; - else - g_launch_tty = NULL; - } + error.SetErrorString ("process is connected and already has a listener, pass empty listener"); + sb_process.Clear(); + return sb_process; } } - -// if ((launch_flags & eLaunchFlagLaunchInTTY) || g_launch_tty) -// { -// ArchSpec arch (m_opaque_sp->GetArchitecture ()); -// -// Module *exe_module = m_opaque_sp->GetExecutableModule().get(); -// if (exe_module) -// { -// char exec_file_path[PATH_MAX]; -// exe_module->GetFileSpec().GetPath(exec_file_path, sizeof(exec_file_path)); -// if (exe_module->GetFileSpec().Exists()) -// { -// // Make a new argument vector -// std::vector<const char *> exec_path_plus_argv; -// // Append the resolved executable path -// exec_path_plus_argv.push_back (exec_file_path); -// -// // Push all args if there are any -// if (argv) -// { -// for (int i = 0; argv[i]; ++i) -// exec_path_plus_argv.push_back(argv[i]); -// } -// -// // Push a NULL to terminate the args. -// exec_path_plus_argv.push_back(NULL); -// -// -// const char *tty_name = NULL; -// if (g_launch_tty && g_launch_tty[0] == '/') -// tty_name = g_launch_tty; -// -// lldb::pid_t pid = Host::LaunchInNewTerminal (tty_name, -// &exec_path_plus_argv[0], -// envp, -// working_directory, -// &arch, -// true, -// launch_flags & eLaunchFlagDisableASLR); -// -// if (pid != LLDB_INVALID_PROCESS_ID) -// { -// sb_process = AttachToProcessWithID(listener, pid, error); -// } -// else -// { -// error.SetErrorStringWithFormat("failed to launch process in terminal"); -// } -// } -// else -// { -// error.SetErrorStringWithFormat("executable doesn't exist: \"%s\"", exec_file_path); -// } -// } -// else -// { -// error.SetErrorStringWithFormat("invalid executable"); -// } -// } -// else + else { if (listener.IsValid()) sb_process.SetProcess (m_opaque_sp->CreateProcess (listener.ref())); else sb_process.SetProcess (m_opaque_sp->CreateProcess (m_opaque_sp->GetDebugger().GetListener())); + } - if (sb_process.IsValid()) - { + if (sb_process.IsValid()) + { + if (getenv("LLDB_LAUNCH_FLAG_DISABLE_STDIO")) + launch_flags |= eLaunchFlagDisableSTDIO; - if (getenv("LLDB_LAUNCH_FLAG_DISABLE_STDIO")) - launch_flags |= eLaunchFlagDisableSTDIO; + error.SetError (sb_process->Launch (argv, envp, launch_flags, stdin_path, stdout_path, stderr_path, working_directory)); + if (error.Success()) + { + // We we are stopping at the entry point, we can return now! + if (stop_at_entry) + return sb_process; - - error.SetError (sb_process->Launch (argv, envp, launch_flags, stdin_path, stdout_path, stderr_path, working_directory)); - if (error.Success()) + // Make sure we are stopped at the entry + StateType state = sb_process->WaitForProcessToStop (NULL); + if (state == eStateStopped) { - // We we are stopping at the entry point, we can return now! - if (stop_at_entry) - return sb_process; - - // Make sure we are stopped at the entry - StateType state = sb_process->WaitForProcessToStop (NULL); - if (state == eStateStopped) + // resume the process to skip the entry point + error.SetError (sb_process->Resume()); + if (error.Success()) { - // resume the process to skip the entry point - error.SetError (sb_process->Resume()); - if (error.Success()) - { - // If we are doing synchronous mode, then wait for the - // process to stop yet again! - if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false) - sb_process->WaitForProcessToStop (NULL); - } + // If we are doing synchronous mode, then wait for the + // process to stop yet again! + if (m_opaque_sp->GetDebugger().GetAsyncExecution () == false) + sb_process->WaitForProcessToStop (NULL); } } } - else - { - error.SetErrorString ("unable to create lldb_private::Process"); - } + } + else + { + error.SetErrorString ("unable to create lldb_private::Process"); } } else diff --git a/lldb/source/Core/ConnectionFileDescriptor.cpp b/lldb/source/Core/ConnectionFileDescriptor.cpp index ce306c90e4d..2a9b16b7d63 100644 --- a/lldb/source/Core/ConnectionFileDescriptor.cpp +++ b/lldb/source/Core/ConnectionFileDescriptor.cpp @@ -97,6 +97,46 @@ ConnectionFileDescriptor::Connect (const char *s, Error *error_ptr) { return SocketConnect (s + strlen("connect://"), error_ptr); } + else if (strstr(s, "fd://")) + { + // Just passing a native file descriptor within this current process + // that is already opened (possibly from a service or other source). + s += strlen ("fd://"); + bool success = false; + m_fd = Args::StringToSInt32 (s, -1, 0, &success); + if (success) + { + // We have what looks to be a valid file descriptor, but we + // should make it is. We currently are doing this by trying to + // get the flags from the file descriptor and making sure it + // isn't a bad fd. We also need to enable non blocking mode for + // the fd if it already isn't. + errno = 0; + int flags = ::fcntl (m_fd, F_GETFL, 0); + if (flags == -1 || errno == EBADF) + { + if (error_ptr) + error_ptr->SetErrorStringWithFormat ("stale file descriptor: %s", s); + m_fd = -1; + return eConnectionStatusError; + } + else + { + if ((flags & O_NONBLOCK) == 0) + { + flags |= O_NONBLOCK; + ::fcntl (m_fd, F_SETFL, flags); + } + m_should_close_fd = true; + return eConnectionStatusSuccess; + } + } + + if (error_ptr) + error_ptr->SetErrorStringWithFormat ("invalid file descriptor: \"fd://%s\"", s); + m_fd = -1; + return eConnectionStatusError; + } else if (strstr(s, "file://")) { // file:///PATH diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index 79f77e219d1..afd6af6a5c2 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -352,14 +352,7 @@ ProcessGDBRemote::DoConnectRemote (const char *remote_url) if (error.Fail()) return error; - if (strncmp (remote_url, "connect://", strlen ("connect://")) == 0) - { - error = ConnectToDebugserver (remote_url); - } - else - { - error.SetErrorStringWithFormat ("unsupported remote url: %s", remote_url); - } + error = ConnectToDebugserver (remote_url); if (error.Fail()) return error; diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 5ad5ac22445..8e96c716e74 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -2065,8 +2065,10 @@ Process::Launch Module *exe_module = m_target.GetExecutableModule().get(); if (exe_module) { - char exec_file_path[PATH_MAX]; - exe_module->GetFileSpec().GetPath(exec_file_path, sizeof(exec_file_path)); + char local_exec_file_path[PATH_MAX]; + char platform_exec_file_path[PATH_MAX]; + exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path)); + exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path)); if (exe_module->GetFileSpec().Exists()) { if (PrivateStateThreadIsValid ()) @@ -2089,7 +2091,7 @@ Process::Launch // Make a new argument vector std::vector<const char *> exec_path_plus_argv; // Append the resolved executable path - exec_path_plus_argv.push_back (exec_file_path); + exec_path_plus_argv.push_back (platform_exec_file_path); // Push all args if there are any if (argv) @@ -2156,7 +2158,7 @@ Process::Launch } else { - error.SetErrorStringWithFormat("File doesn't exist: '%s'.\n", exec_file_path); + error.SetErrorStringWithFormat("File doesn't exist: '%s'.\n", local_exec_file_path); } } return error; |

