summaryrefslogtreecommitdiffstats
path: root/lldb/tools/debugserver/source
diff options
context:
space:
mode:
authorCaroline Tice <ctice@apple.com>2010-12-03 18:46:09 +0000
committerCaroline Tice <ctice@apple.com>2010-12-03 18:46:09 +0000
commitf8da863196a173ed90c627e468d42381bf48675d (patch)
tree34388cc707538d81088cb19416da67689f3db8f3 /lldb/tools/debugserver/source
parent6423c29e14fbde59ecee91d542f0cc3cab43b63a (diff)
downloadbcm5719-llvm-f8da863196a173ed90c627e468d42381bf48675d.tar.gz
bcm5719-llvm-f8da863196a173ed90c627e468d42381bf48675d.zip
Add '-no-stdio' option to 'process launch' command, which causes the
inferior to be launched without setting up terminal stdin/stdout for it (leaving the lldb command line accessible while the program is executing). Also add a user settings variable, 'target.process.disable-stdio' to allow the user to set this globally rather than having to use the command option each time the process is launched. llvm-svn: 120825
Diffstat (limited to 'lldb/tools/debugserver/source')
-rw-r--r--lldb/tools/debugserver/source/DNB.cpp3
-rw-r--r--lldb/tools/debugserver/source/DNB.h2
-rw-r--r--lldb/tools/debugserver/source/MacOSX/MachProcess.cpp54
-rw-r--r--lldb/tools/debugserver/source/MacOSX/MachProcess.h8
-rw-r--r--lldb/tools/debugserver/source/debugserver.cpp13
5 files changed, 56 insertions, 24 deletions
diff --git a/lldb/tools/debugserver/source/DNB.cpp b/lldb/tools/debugserver/source/DNB.cpp
index 516e0cd8c8e..0a8eb59b114 100644
--- a/lldb/tools/debugserver/source/DNB.cpp
+++ b/lldb/tools/debugserver/source/DNB.cpp
@@ -176,6 +176,7 @@ DNBProcessLaunch (const char *path,
char const *argv[],
const char *envp[],
const char *stdio_path,
+ bool no_stdio,
nub_launch_flavor_t launch_flavor,
int disable_aslr,
char *err_str,
@@ -198,7 +199,7 @@ DNBProcessLaunch (const char *path,
if (processSP.get())
{
DNBError launch_err;
- pid_t pid = processSP->LaunchForDebug(path, argv, envp, stdio_path, launch_flavor, disable_aslr, launch_err);
+ pid_t pid = processSP->LaunchForDebug(path, argv, envp, stdio_path, no_stdio, launch_flavor, disable_aslr, launch_err);
if (err_str)
{
*err_str = '\0';
diff --git a/lldb/tools/debugserver/source/DNB.h b/lldb/tools/debugserver/source/DNB.h
index 38a8a07131a..f5eb17b3afd 100644
--- a/lldb/tools/debugserver/source/DNB.h
+++ b/lldb/tools/debugserver/source/DNB.h
@@ -33,7 +33,7 @@ nub_bool_t DNBSetArchitecture (const char *arch);
//----------------------------------------------------------------------
// Process control
//----------------------------------------------------------------------
-nub_process_t DNBProcessLaunch (const char *path, char const *argv[], const char *envp[], const char *stdio_path, nub_launch_flavor_t launch_flavor, int disable_aslr, char *err_str, size_t err_len) DNB_EXPORT;
+nub_process_t DNBProcessLaunch (const char *path, char const *argv[], const char *envp[], const char *stdio_path, bool no_stdio, nub_launch_flavor_t launch_flavor, int disable_aslr, char *err_str, size_t err_len) DNB_EXPORT;
nub_process_t DNBProcessAttach (nub_process_t pid, struct timespec *timeout, char *err_str, size_t err_len) DNB_EXPORT;
nub_process_t DNBProcessAttachByName (const char *name, struct timespec *timeout, char *err_str, size_t err_len) DNB_EXPORT;
nub_process_t DNBProcessAttachWait (const char *wait_name, nub_launch_flavor_t launch_flavor, struct timespec *timeout, useconds_t interval, char *err_str, size_t err_len, DNBShouldCancelCallback should_cancel = NULL, void *callback_data = NULL) DNB_EXPORT;
diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp b/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp
index de3ee45c24f..10f86f91225 100644
--- a/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp
+++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp
@@ -1495,6 +1495,7 @@ MachProcess::LaunchForDebug
char const *argv[],
char const *envp[],
const char *stdio_path,
+ bool no_stdio,
nub_launch_flavor_t launch_flavor,
int disable_aslr,
DNBError &launch_err
@@ -1519,7 +1520,8 @@ MachProcess::LaunchForDebug
DNBArchProtocol::GetArchitecture (),
argv,
envp,
- stdio_path,
+ stdio_path,
+ no_stdio,
this,
disable_aslr,
launch_err);
@@ -1533,7 +1535,7 @@ MachProcess::LaunchForDebug
if (app_ext != NULL)
{
std::string app_bundle_path(path, app_ext + strlen(".app"));
- return SBLaunchForDebug (app_bundle_path.c_str(), argv, envp, launch_err);
+ return SBLaunchForDebug (app_bundle_path.c_str(), argv, envp, no_stdio, launch_err);
}
}
break;
@@ -1609,6 +1611,7 @@ MachProcess::PosixSpawnChildForPTraceDebugging
char const *argv[],
char const *envp[],
const char *stdio_path,
+ bool no_stdio,
MachProcess* process,
int disable_aslr,
DNBError& err
@@ -1665,7 +1668,7 @@ MachProcess::PosixSpawnChildForPTraceDebugging
pid_t pid = INVALID_NUB_PROCESS;
if (file_actions_valid)
{
- if (stdio_path == NULL)
+ if (stdio_path == NULL && !no_stdio)
{
pty_error = pty.OpenFirstAvailableMaster(O_RDWR|O_NOCTTY);
if (pty_error == PseudoTerminal::success)
@@ -1675,7 +1678,25 @@ MachProcess::PosixSpawnChildForPTraceDebugging
stdio_path = "/dev/null";
}
- if (stdio_path != NULL)
+ // if no_stdio, then do open file actions, opening /dev/null.
+ if (no_stdio)
+ {
+ err.SetError( ::posix_spawn_file_actions_addopen (&file_actions, STDIN_FILENO, "/dev/null",
+ O_RDONLY | O_NOCTTY, 0), DNBError::POSIX);
+ if (err.Fail() || DNBLogCheckLogBit (LOG_PROCESS))
+ err.LogThreaded ("::posix_spawn_file_actions_addopen (&file_actions, filedes=STDIN_FILENO, path=/dev/null)");
+
+ err.SetError( ::posix_spawn_file_actions_addopen (&file_actions, STDOUT_FILENO, "/dev/null",
+ O_WRONLY | O_NOCTTY, 0), DNBError::POSIX);
+ if (err.Fail() || DNBLogCheckLogBit (LOG_PROCESS))
+ err.LogThreaded ("::posix_spawn_file_actions_addopen (&file_actions, filedes=STDOUT_FILENO, path=/dev/null)");
+
+ err.SetError( ::posix_spawn_file_actions_addopen (&file_actions, STDERR_FILENO, "/dev/null",
+ O_RDWR | O_NOCTTY, 0), DNBError::POSIX);
+ if (err.Fail() || DNBLogCheckLogBit (LOG_PROCESS))
+ err.LogThreaded ("::posix_spawn_file_actions_addopen (&file_actions, filedes=STDERR_FILENO, path=/dev/null)");
+ }
+ else if (stdio_path != NULL)
{
int slave_fd_err = open (stdio_path, O_RDWR, 0);
int slave_fd_in = open (stdio_path, O_RDONLY, 0);
@@ -1807,7 +1828,7 @@ MachProcess::ForkChildForPTraceDebugging
#if defined (__arm__)
pid_t
-MachProcess::SBLaunchForDebug (const char *path, char const *argv[], char const *envp[], DNBError &launch_err)
+MachProcess::SBLaunchForDebug (const char *path, char const *argv[], char const *envp[], bool no_stdio, DNBError &launch_err)
{
// Clear out and clean up from any current state
Clear();
@@ -1816,7 +1837,7 @@ MachProcess::SBLaunchForDebug (const char *path, char const *argv[], char const
// Fork a child process for debugging
SetState(eStateLaunching);
- m_pid = MachProcess::SBForkChildForPTraceDebugging(path, argv, envp, this, launch_err);
+ m_pid = MachProcess::SBForkChildForPTraceDebugging(path, argv, envp, no_stdio, this, launch_err);
if (m_pid != 0)
{
m_flags |= eMachProcessFlagsUsingSBS;
@@ -1892,7 +1913,7 @@ CopyBundleIDForPath (const char *app_bundle_path, DNBError &err_str)
}
pid_t
-MachProcess::SBForkChildForPTraceDebugging (const char *app_bundle_path, char const *argv[], char const *envp[], MachProcess* process, DNBError &launch_err)
+MachProcess::SBForkChildForPTraceDebugging (const char *app_bundle_path, char const *argv[], char const *envp[], bool no_stdio, MachProcess* process, DNBError &launch_err)
{
DNBLogThreadedIf(LOG_PROCESS, "%s( '%s', argv, %p)", __FUNCTION__, app_bundle_path, process);
CFAllocatorRef alloc = kCFAllocatorDefault;
@@ -1961,18 +1982,21 @@ MachProcess::SBForkChildForPTraceDebugging (const char *app_bundle_path, char co
CFString stdio_path;
PseudoTerminal pty;
- PseudoTerminal::Error pty_err = pty.OpenFirstAvailableMaster(O_RDWR|O_NOCTTY);
- if (pty_err == PseudoTerminal::success)
+ if (!no_stdio)
{
- const char* slave_name = pty.SlaveName();
- DNBLogThreadedIf(LOG_PROCESS, "%s() successfully opened master pty, slave is %s", __FUNCTION__, slave_name);
- if (slave_name && slave_name[0])
+ PseudoTerminal::Error pty_err = pty.OpenFirstAvailableMaster(O_RDWR|O_NOCTTY);
+ if (pty_err == PseudoTerminal::success)
{
- ::chmod (slave_name, S_IRWXU | S_IRWXG | S_IRWXO);
- stdio_path.SetFileSystemRepresentation (slave_name);
+ const char* slave_name = pty.SlaveName();
+ DNBLogThreadedIf(LOG_PROCESS, "%s() successfully opened master pty, slave is %s", __FUNCTION__, slave_name);
+ if (slave_name && slave_name[0])
+ {
+ ::chmod (slave_name, S_IRWXU | S_IRWXG | S_IRWXO);
+ stdio_path.SetFileSystemRepresentation (slave_name);
+ }
}
}
-
+
if (stdio_path.get() == NULL)
{
stdio_path.SetFileSystemRepresentation ("/dev/null");
diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.h b/lldb/tools/debugserver/source/MacOSX/MachProcess.h
index 9b6d51fc542..04ad02eb634 100644
--- a/lldb/tools/debugserver/source/MacOSX/MachProcess.h
+++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.h
@@ -46,16 +46,16 @@ public:
// Child process control
//----------------------------------------------------------------------
pid_t AttachForDebug (pid_t pid, char *err_str, size_t err_len);
- pid_t LaunchForDebug (const char *path, char const *argv[], char const *envp[], const char *stdio_path, nub_launch_flavor_t launch_flavor, int disable_aslr, DNBError &err);
+ pid_t LaunchForDebug (const char *path, char const *argv[], char const *envp[], const char *stdio_path, bool no_stdio, nub_launch_flavor_t launch_flavor, int disable_aslr, DNBError &err);
static pid_t ForkChildForPTraceDebugging (const char *path, char const *argv[], char const *envp[], MachProcess* process, DNBError &err);
- static pid_t PosixSpawnChildForPTraceDebugging (const char *path, cpu_type_t cpu_type, char const *argv[], char const *envp[], const char *stdio_path, MachProcess* process, int disable_aslr, DNBError& err);
+ static pid_t PosixSpawnChildForPTraceDebugging (const char *path, cpu_type_t cpu_type, char const *argv[], char const *envp[], const char *stdio_path, bool no_stdio, MachProcess* process, int disable_aslr, DNBError& err);
nub_addr_t GetDYLDAllImageInfosAddress ();
static const void * PrepareForAttach (const char *path, nub_launch_flavor_t launch_flavor, bool waitfor, DNBError &err_str);
static void CleanupAfterAttach (const void *attach_token, bool success, DNBError &err_str);
static nub_process_t CheckForProcess (const void *attach_token);
#if defined (__arm__)
- pid_t SBLaunchForDebug (const char *app_bundle_path, char const *argv[], char const *envp[], DNBError &launch_err);
- static pid_t SBForkChildForPTraceDebugging (const char *path, char const *argv[], char const *envp[], MachProcess* process, DNBError &launch_err);
+ pid_t SBLaunchForDebug (const char *app_bundle_path, char const *argv[], char const *envp[], bool no_stdio, DNBError &launch_err);
+ static pid_t SBForkChildForPTraceDebugging (const char *path, char const *argv[], char const *envp[], bool no_stdio, MachProcess* process, DNBError &launch_err);
#endif
nub_addr_t LookupSymbol (const char *name, const char *shlib);
void SetNameToAddressCallback (DNBCallbackNameToAddress callback, void *baton)
diff --git a/lldb/tools/debugserver/source/debugserver.cpp b/lldb/tools/debugserver/source/debugserver.cpp
index f7696acfb99..6b08b1bf9c1 100644
--- a/lldb/tools/debugserver/source/debugserver.cpp
+++ b/lldb/tools/debugserver/source/debugserver.cpp
@@ -151,7 +151,7 @@ RNBRunLoopGetStartModeFromRemote (RNBRemoteSP &remoteSP)
// or crash process state.
//----------------------------------------------------------------------
RNBRunLoopMode
-RNBRunLoopLaunchInferior (RNBRemoteSP &remote, const char *stdio_path)
+RNBRunLoopLaunchInferior (RNBRemoteSP &remote, const char *stdio_path, bool no_stdio)
{
RNBContext& ctx = remote->Context();
@@ -209,6 +209,7 @@ RNBRunLoopLaunchInferior (RNBRemoteSP &remote, const char *stdio_path)
&inferior_argv[0],
&inferior_envp[0],
stdio_path,
+ no_stdio,
launch_flavor,
g_disable_aslr,
launch_err_str,
@@ -656,6 +657,7 @@ static struct option g_long_options[] =
{ "waitfor-duration", required_argument, NULL, 'd' }, // The time in seconds to wait for a process to show up by name
{ "native-regs", no_argument, NULL, 'r' }, // Specify to use the native registers instead of the gdb defaults for the architecture.
{ "stdio-path", required_argument, NULL, 's' }, // Set the STDIO path to be used when launching applications
+ { "no-stdio", no_argument, NULL, 'n' }, // Do not set up any stdio (perhaps the program is a GUI program)
{ "setsid", no_argument, NULL, 'S' }, // call setsid() to make debugserver run in its own sessions
{ "disable-aslr", no_argument, NULL, 'D' }, // Use _POSIX_SPAWN_DISABLE_ASLR to avoid shared library randomization
{ NULL, 0, NULL, 0 }
@@ -698,6 +700,7 @@ main (int argc, char *argv[])
std::string arch_name;
useconds_t waitfor_interval = 1000; // Time in usecs between process lists polls when waiting for a process by name, default 1 msec.
useconds_t waitfor_duration = 0; // Time in seconds to wait for a process by name, 0 means wait forever.
+ bool no_stdio = false;
#if !defined (DNBLOG_ENABLED)
compile_options += "(no-logging) ";
@@ -705,7 +708,7 @@ main (int argc, char *argv[])
RNBRunLoopMode start_mode = eRNBRunLoopModeExit;
- while ((ch = getopt_long(argc, argv, "a:A:d:gi:vktl:f:w:x:rs:", g_long_options, &long_option_index)) != -1)
+ while ((ch = getopt_long(argc, argv, "a:A:d:gi:vktl:f:w:x:rs:n", g_long_options, &long_option_index)) != -1)
{
DNBLogDebug("option: ch == %c (0x%2.2x) --%s%c%s\n",
ch, (uint8_t)ch,
@@ -856,6 +859,10 @@ main (int argc, char *argv[])
stdio_path = optarg;
break;
+ case 'n':
+ no_stdio = true;
+ break;
+
case 'S':
// Put debugserver into a new session. Terminals group processes
// into sessions and when a special terminal key sequences
@@ -1208,7 +1215,7 @@ main (int argc, char *argv[])
break;
case eRNBRunLoopModeInferiorLaunching:
- mode = RNBRunLoopLaunchInferior (g_remoteSP, stdio_path.empty() ? NULL : stdio_path.c_str());
+ mode = RNBRunLoopLaunchInferior (g_remoteSP, stdio_path.empty() ? NULL : stdio_path.c_str(), no_stdio);
if (mode == eRNBRunLoopModeInferiorExecuting)
{
OpenPOWER on IntegriCloud