summaryrefslogtreecommitdiffstats
path: root/lldb/source
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-01-23 05:56:20 +0000
committerGreg Clayton <gclayton@apple.com>2011-01-23 05:56:20 +0000
commitbd82a5d2cc9451c15f66d5dc8475fc6e01c19332 (patch)
treeb9305f6381fdf6f2d990f8e95c34d58832cc69a3 /lldb/source
parent4b7b7fba38e029234bbf6260980fb998c705d56a (diff)
downloadbcm5719-llvm-bd82a5d2cc9451c15f66d5dc8475fc6e01c19332.tar.gz
bcm5719-llvm-bd82a5d2cc9451c15f66d5dc8475fc6e01c19332.zip
Added a new variant of SBTarget::Launch() that deprectates the old one that
takes separate file handles for stdin, stdout, and stder and also allows for the working directory to be specified. Added support to "process launch" to a new option: --working-dir=PATH. We can now set the working directory. If this is not set, it defaults to that of the process that has LLDB loaded. Added the working directory to the host LaunchInNewTerminal function to allows the current working directory to be set in processes that are spawned in their own terminal. Also hooked this up to the lldb_private::Process and all mac plug-ins. The linux plug-in had its API changed, but nothing is making use of it yet. Modfied "debugserver" and "darwin-debug" to also handle the current working directory options and modified the code in LLDB that spawns these tools to pass the info along. Fixed ProcessGDBRemote to properly pass along all file handles for stdin, stdout and stderr. After clearing the default values for the stdin/out/err file handles for process to be NULL, we had a crasher in UserSettingsController::UpdateStringVariable which is now fixed. Also fixed the setting of boolean values to be able to be set as "true", "yes", "on", "1" for true (case insensitive) and "false", "no", "off", or "0" for false. Fixed debugserver to properly handle files for STDIN, STDOUT and STDERR that are not already opened. Previous to this fix debugserver would only correctly open and dupe file handles for the slave side of a pseudo terminal. It now correctly handles getting STDIN for the inferior from a file, and spitting STDOUT and STDERR out to files. Also made sure the file handles were correctly opened with the NOCTTY flag for terminals. llvm-svn: 124060
Diffstat (limited to 'lldb/source')
-rw-r--r--lldb/source/API/SBTarget.cpp49
-rw-r--r--lldb/source/Commands/CommandObjectProcess.cpp30
-rw-r--r--lldb/source/Core/UserSettingsController.cpp42
-rw-r--r--lldb/source/Host/common/Host.cpp1
-rw-r--r--lldb/source/Host/macosx/Host.mm10
-rw-r--r--lldb/source/Plugins/Process/Linux/ProcessLinux.cpp3
-rw-r--r--lldb/source/Plugins/Process/Linux/ProcessLinux.h3
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp3
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h5
-rw-r--r--lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp91
-rw-r--r--lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h8
-rw-r--r--lldb/source/Target/Process.cpp14
12 files changed, 179 insertions, 80 deletions
diff --git a/lldb/source/API/SBTarget.cpp b/lldb/source/API/SBTarget.cpp
index b23262b0005..5247189e383 100644
--- a/lldb/source/API/SBTarget.cpp
+++ b/lldb/source/API/SBTarget.cpp
@@ -117,51 +117,48 @@ SBTarget::GetDebugger () const
}
SBProcess
-SBTarget::LaunchProcess
+SBTarget::Launch
(
char const **argv,
char const **envp,
const char *tty,
uint32_t launch_flags,
- bool stop_at_entry
+ bool stop_at_entry,
+ SBError &error
)
{
- LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
-
- if (log)
- log->Printf ("SBTarget(%p)::LaunchProcess (argv=%p, envp=%p, tty=\"%s\", launch_flags=%d, stop_at_entry=%i)",
- m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry);
-
- SBError sb_error;
- SBProcess sb_process = Launch (argv, envp, tty, launch_flags, stop_at_entry, sb_error);
-
- log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
- if (log)
- {
- log->Printf ("SBTarget(%p)::LaunchProcess (...) => SBProcess(%p)",
- m_opaque_sp.get(), sb_process.get());
- }
-
- return sb_process;
+ return Launch (argv, envp, tty, tty, tty, NULL, launch_flags, stop_at_entry, error);
}
SBProcess
-SBTarget::Launch
+SBTarget::Launch
(
char const **argv,
char const **envp,
- const char *tty,
- uint32_t launch_flags,
+ const char *stdin_path,
+ const char *stdout_path,
+ const char *stderr_path,
+ const char *working_directory,
+ uint32_t launch_flags, // See LaunchFlags
bool stop_at_entry,
- SBError &error
+ lldb::SBError& error
)
{
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
if (log)
{
- log->Printf ("SBTarget(%p)::Launch (argv=%p, envp=%p, tty=\"%s\", launch_flags=%d, stop_at_entry=%i, &error (%p))...",
- m_opaque_sp.get(), argv, envp, tty, launch_flags, stop_at_entry, error.get());
+ log->Printf ("SBTarget(%p)::Launch (argv=%p, envp=%p, stdin=%s, stdout=%s, stderr=%s, working-dir=%s, launch_flags=0x%x, stop_at_entry=%i, &error (%p))...",
+ m_opaque_sp.get(),
+ argv,
+ envp,
+ stdin_path ? stdin_path : "NULL",
+ stdout_path ? stdout_path : "NULL",
+ stderr_path ? stderr_path : "NULL",
+ working_directory ? working_directory : "NULL",
+ launch_flags,
+ stop_at_entry,
+ error.get());
}
SBProcess sb_process;
if (m_opaque_sp)
@@ -171,7 +168,7 @@ SBTarget::Launch
if (sb_process.IsValid())
{
- error.SetError (sb_process->Launch (argv, envp, launch_flags, tty, tty, tty));
+ 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!
diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp
index c07de3ee6ae..5239b7bf2d6 100644
--- a/lldb/source/Commands/CommandObjectProcess.cpp
+++ b/lldb/source/Commands/CommandObjectProcess.cpp
@@ -57,12 +57,13 @@ public:
switch (short_option)
{
- case 's': stop_at_entry = true; break;
- case 'e': stderr_path = option_arg; break;
- case 'i': stdin_path = option_arg; break;
- case 'o': stdout_path = option_arg; break;
- case 'p': plugin_name = option_arg; break;
- case 'n': no_stdio = true; break;
+ case 's': stop_at_entry = true; break;
+ case 'e': stderr_path.assign (option_arg); break;
+ case 'i': stdin_path.assign (option_arg); break;
+ case 'o': stdout_path.assign (option_arg); break;
+ case 'p': plugin_name.assign (option_arg); break;
+ case 'n': no_stdio = true; break;
+ case 'w': working_dir.assign (option_arg); break;
case 't':
if (option_arg && option_arg[0])
tty_name.assign (option_arg);
@@ -87,6 +88,7 @@ public:
stdout_path.clear();
stderr_path.clear();
plugin_name.clear();
+ working_dir.clear();
no_stdio = false;
}
@@ -110,6 +112,7 @@ public:
std::string stdin_path;
std::string stdout_path;
std::string plugin_name;
+ std::string working_dir;
};
@@ -249,6 +252,9 @@ public:
const char **inferior_envp = environment.GetArgumentCount() ? environment.GetConstArgumentVector() : NULL;
Error error;
+ const char *working_dir = NULL;
+ if (!m_options.working_dir.empty())
+ working_dir = m_options.working_dir.c_str();
if (m_options.in_new_tty)
{
@@ -256,6 +262,7 @@ public:
lldb::pid_t pid = Host::LaunchInNewTerminal (m_options.tty_name.c_str(),
inferior_argv,
inferior_envp,
+ working_dir,
&exe_module->GetArchitecture(),
true,
process->GetDisableASLR());
@@ -287,19 +294,13 @@ public:
stderr_path = m_options.stderr_path.empty() ? NULL : m_options.stderr_path.c_str();
}
- if (stdin_path == NULL)
- stdin_path = "/dev/null";
- if (stdout_path == NULL)
- stdout_path = "/dev/null";
- if (stderr_path == NULL)
- stderr_path = "/dev/null";
-
error = process->Launch (inferior_argv,
inferior_envp,
launch_flags,
stdin_path,
stdout_path,
- stderr_path);
+ stderr_path,
+ working_dir);
}
if (error.Success())
@@ -363,6 +364,7 @@ CommandObjectProcessLaunch::CommandOptions::g_option_table[] =
{ SET1 | SET2 | SET3, false, "plugin", 'p', required_argument, NULL, 0, eArgTypePlugin, "Name of the process plugin you want to use."},
{ SET2 , false, "tty", 't', optional_argument, NULL, 0, eArgTypePath, "Start the process in a terminal. If <path> is specified, look for a terminal whose name contains <path>, else start the process in a new terminal."},
{ SET3, false, "no-stdio", 'n', no_argument, NULL, 0, eArgTypeNone, "Do not set up for terminal I/O to go to running process."},
+{ SET1 | SET2 | SET3, false, "working-dir", 'w', required_argument, NULL, 0, eArgTypePath, "Set the current working directory to <path> when running the inferior."},
{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
};
diff --git a/lldb/source/Core/UserSettingsController.cpp b/lldb/source/Core/UserSettingsController.cpp
index 6cd1f3ccfd8..ea7d84e9494 100644
--- a/lldb/source/Core/UserSettingsController.cpp
+++ b/lldb/source/Core/UserSettingsController.cpp
@@ -1946,9 +1946,17 @@ UserSettingsController::UpdateStringVariable (lldb::VarSetOperationType op,
Error &err)
{
if (op == lldb::eVarSetOperationAssign)
- string_var = new_value;
+ {
+ if (new_value && new_value[0])
+ string_var.assign (new_value);
+ else
+ string_var.clear();
+ }
else if (op == lldb::eVarSetOperationAppend)
- string_var.append (new_value);
+ {
+ if (new_value && new_value[0])
+ string_var.append (new_value);
+ }
else if (op == lldb::eVarSetOperationClear)
string_var.clear();
else
@@ -1964,19 +1972,25 @@ UserSettingsController::UpdateBooleanVariable (lldb::VarSetOperationType op,
if (op != lldb::eVarSetOperationAssign)
err.SetErrorString ("Invalid operation for Boolean variable. Cannot update value.\n");
+ if (new_value && new_value[0])
+ {
+ if ((::strcasecmp(new_value, "true") == 0) ||
+ (::strcasecmp(new_value, "yes") == 0) ||
+ (::strcasecmp(new_value, "on") == 0) ||
+ (::strcasecmp(new_value, "1") == 0))
+ bool_var = true;
+ else
+ if ((::strcasecmp(new_value, "false") == 0) ||
+ (::strcasecmp(new_value, "no") == 0) ||
+ (::strcasecmp(new_value, "off") == 0) ||
+ (::strcasecmp(new_value, "0") == 0))
+ bool_var = false;
+ else
+ err.SetErrorStringWithFormat ("Invalid boolean value '%s'\n", new_value);
+ }
+ else
+ err.SetErrorString ("Invalid value. Cannot perform update.\n");
- if ((new_value == NULL)
- || (new_value[0] == '\0'))
- err.SetErrorString ("Invalid value. Cannot perform update.\n");
-
- std::string bool_val_str (new_value);
-
- std::transform (bool_val_str.begin(), bool_val_str.end(), bool_val_str.begin(), ::tolower);
-
- if (bool_val_str == "true")
- bool_var = true;
- else if (bool_val_str == "false")
- bool_var = false;
}
void
diff --git a/lldb/source/Host/common/Host.cpp b/lldb/source/Host/common/Host.cpp
index 5755aa72c6d..ce82694ca2b 100644
--- a/lldb/source/Host/common/Host.cpp
+++ b/lldb/source/Host/common/Host.cpp
@@ -907,6 +907,7 @@ Host::LaunchInNewTerminal
const char *tty_name,
const char **argv,
const char **envp,
+ const char *working_dir,
const ArchSpec *arch_spec,
bool stop_at_entry,
bool disable_aslr
diff --git a/lldb/source/Host/macosx/Host.mm b/lldb/source/Host/macosx/Host.mm
index a76ec805c19..08aec38c3ec 100644
--- a/lldb/source/Host/macosx/Host.mm
+++ b/lldb/source/Host/macosx/Host.mm
@@ -226,6 +226,7 @@ LaunchInNewTerminalWithCommandFile
(
const char **argv,
const char **envp,
+ const char *working_dir,
const ArchSpec *arch_spec,
bool stop_at_entry,
bool disable_aslr
@@ -404,6 +405,7 @@ LaunchInNewTerminalWithAppleScript
const char *tty_name,
const char **argv,
const char **envp,
+ const char *working_dir,
const ArchSpec *arch_spec,
bool stop_at_entry,
bool disable_aslr
@@ -440,6 +442,9 @@ LaunchInNewTerminalWithAppleScript
if (arch_spec && arch_spec->IsValid())
command.Printf(" --arch=%s", arch_spec->AsCString());
+ if (working_dir)
+ command.Printf(" --working-dir '%s'", working_dir);
+
if (disable_aslr)
command.PutCString(" --disable-aslr");
@@ -520,15 +525,16 @@ Host::LaunchInNewTerminal
const char *tty_name,
const char **argv,
const char **envp,
+ const char *working_dir,
const ArchSpec *arch_spec,
bool stop_at_entry,
bool disable_aslr
)
{
#if defined (LLDB_HOST_USE_APPLESCRIPT)
- return LaunchInNewTerminalWithAppleScript (tty_name, argv, envp, arch_spec, stop_at_entry, disable_aslr);
+ return LaunchInNewTerminalWithAppleScript (tty_name, argv, envp, working_dir, arch_spec, stop_at_entry, disable_aslr);
#else
- return LaunchInNewTerminalWithCommandFile (argv, envp, arch_spec, stop_at_entry, disable_aslr);
+ return LaunchInNewTerminalWithCommandFile (argv, envp, working_dir, arch_spec, stop_at_entry, disable_aslr);
#endif
}
diff --git a/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp b/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp
index ecf8479ddde..fa5b5b70ec3 100644
--- a/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp
+++ b/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp
@@ -122,7 +122,8 @@ ProcessLinux::DoLaunch(Module *module,
uint32_t launch_flags,
const char *stdin_path,
const char *stdout_path,
- const char *stderr_path)
+ const char *stderr_path,
+ const char *working_directory)
{
Error error;
assert(m_monitor == NULL);
diff --git a/lldb/source/Plugins/Process/Linux/ProcessLinux.h b/lldb/source/Plugins/Process/Linux/ProcessLinux.h
index fbf14df1988..6fe05526647 100644
--- a/lldb/source/Plugins/Process/Linux/ProcessLinux.h
+++ b/lldb/source/Plugins/Process/Linux/ProcessLinux.h
@@ -72,7 +72,8 @@ public:
uint32_t launch_flags,
const char *stdin_path,
const char *stdout_path,
- const char *stderr_path);
+ const char *stderr_path,
+ const char *working_directory);
virtual void
DidLaunch();
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp
index c650f5bb622..9aebc8fdec6 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.cpp
@@ -316,7 +316,8 @@ ProcessMacOSX::DoLaunch
uint32_t flags,
const char *stdin_path,
const char *stdout_path,
- const char *stderr_path
+ const char *stderr_path,
+ const char *working_dir
)
{
// ::LogSetBitMask (PD_LOG_DEFAULT);
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h
index 4f8bdb930b7..c3df2f3a2dc 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/ProcessMacOSX.h
@@ -95,8 +95,9 @@ public:
char const *envp[], // Can be NULL
uint32_t launch_flags,
const char *stdin_path, // Can be NULL
- const char *stdout_path, // Can be NULL
- const char *stderr_path); // Can be NULL
+ const char *stdout_path, // Can be NULL
+ const char *stderr_path, // Can be NULL
+ const char *working_dir); // Can be NULL
virtual void
DidLaunch ();
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index fe4e06820fc..ffec00e6d6f 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -375,7 +375,8 @@ ProcessGDBRemote::DoLaunch
uint32_t launch_flags,
const char *stdin_path,
const char *stdout_path,
- const char *stderr_path
+ const char *stderr_path,
+ const char *working_dir
)
{
Error error;
@@ -400,7 +401,10 @@ ProcessGDBRemote::DoLaunch
error = StartDebugserverProcess (host_port,
argv,
envp,
- NULL, //stdin_path,
+ stdin_path,
+ stdout_path,
+ stderr_path,
+ working_dir,
launch_process,
LLDB_INVALID_PROCESS_ID,
NULL, false,
@@ -420,10 +424,14 @@ ProcessGDBRemote::DoLaunch
error = StartDebugserverProcess (host_port,
NULL,
NULL,
- NULL, //stdin_path
+ stdin_path,
+ stdout_path,
+ stderr_path,
+ working_dir,
launch_process,
LLDB_INVALID_PROCESS_ID,
- NULL, false,
+ NULL,
+ false,
launch_flags,
inferior_arch);
if (error.Fail())
@@ -644,6 +652,9 @@ ProcessGDBRemote::DoAttachToProcessWithID (lldb::pid_t attach_pid)
NULL, // inferior_argv
NULL, // inferior_envp
NULL, // stdin_path
+ NULL, // stdout_path
+ NULL, // stderr_path
+ NULL, // working_dir
false, // launch_process == false (we are attaching)
LLDB_INVALID_PROCESS_ID, // Don't send any attach to pid options to debugserver
NULL, // Don't send any attach by process name option to debugserver
@@ -746,6 +757,9 @@ ProcessGDBRemote::DoAttachToProcessWithName (const char *process_name, bool wait
NULL, // inferior_argv
NULL, // inferior_envp
NULL, // stdin_path
+ NULL, // stdout_path
+ NULL, // stderr_path
+ NULL, // working_dir
false, // launch_process == false (we are attaching)
LLDB_INVALID_PROCESS_ID, // Don't send any attach to pid options to debugserver
NULL, // Don't send any attach by process name option to debugserver
@@ -1732,7 +1746,10 @@ ProcessGDBRemote::StartDebugserverProcess
const char *debugserver_url, // The connection string to use in the spawned debugserver ("localhost:1234" or "/dev/tty...")
char const *inferior_argv[], // Arguments for the inferior program including the path to the inferior itself as the first argument
char const *inferior_envp[], // Environment to pass along to the inferior program
- char const *stdio_path,
+ const char *stdin_path,
+ const char *stdout_path,
+ const char *stderr_path,
+ const char *working_dir,
bool launch_process, // Set to true if we are going to be launching a the process
lldb::pid_t attach_pid, // If inferior inferior_argv == NULL, and attach_pid != LLDB_INVALID_PROCESS_ID send this pid as an argument to debugserver
const char *attach_name, // Wait for the next process to launch whose basename matches "attach_name"
@@ -1824,7 +1841,13 @@ ProcessGDBRemote::StartDebugserverProcess
char arg_cstr[PATH_MAX];
lldb_utility::PseudoTerminal pty;
- if (launch_process && stdio_path == NULL && m_local_debugserver && !no_stdio)
+ const char *stdio_path = NULL;
+ if (launch_process &&
+ stdin_path == NULL &&
+ stdout_path == NULL &&
+ stderr_path == NULL &&
+ m_local_debugserver &&
+ no_stdio == false)
{
if (pty.OpenFirstAvailableMaster(O_RDWR|O_NOCTTY, NULL, 0))
stdio_path = pty.GetSlaveName (NULL, 0);
@@ -1843,14 +1866,60 @@ ProcessGDBRemote::StartDebugserverProcess
debugserver_args.AppendArguments("--disable-aslr");
// Only set the inferior
- if (launch_process && stdio_path)
+ if (launch_process)
{
- debugserver_args.AppendArgument("--stdio-path");
- debugserver_args.AppendArgument(stdio_path);
+ if (no_stdio)
+ debugserver_args.AppendArgument("--no-stdio");
+ else
+ {
+ if (stdin_path && stdout_path && stderr_path &&
+ strcmp(stdin_path, stdout_path) == 0 &&
+ strcmp(stdin_path, stderr_path) == 0)
+ {
+ stdio_path = stdin_path;
+ stdin_path = stdout_path = stderr_path = NULL;
+ }
+
+ if (stdio_path)
+ {
+ // All file handles to stdin, stdout, stderr are the same...
+ debugserver_args.AppendArgument("--stdio-path");
+ debugserver_args.AppendArgument(stdio_path);
+ }
+ else
+ {
+ if (stdin_path == NULL && (stdout_path || stderr_path))
+ stdin_path = "/dev/null";
+
+ if (stdout_path == NULL && (stdin_path || stderr_path))
+ stdout_path = "/dev/null";
+
+ if (stderr_path == NULL && (stdin_path || stdout_path))
+ stderr_path = "/dev/null";
+
+ if (stdin_path)
+ {
+ debugserver_args.AppendArgument("--stdin-path");
+ debugserver_args.AppendArgument(stdin_path);
+ }
+ if (stdout_path)
+ {
+ debugserver_args.AppendArgument("--stdout-path");
+ debugserver_args.AppendArgument(stdout_path);
+ }
+ if (stderr_path)
+ {
+ debugserver_args.AppendArgument("--stderr-path");
+ debugserver_args.AppendArgument(stderr_path);
+ }
+ }
+ }
}
- else if (launch_process && no_stdio)
+
+ if (working_dir)
{
- debugserver_args.AppendArgument("--no-stdio");
+ debugserver_args.AppendArgument("--working-dir");
+ debugserver_args.AppendArgument(working_dir);
}
const char *env_debugserver_log_file = getenv("LLDB_DEBUGSERVER_LOG_FILE");
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
index d8a2cebbd33..8c8f1a8a9af 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
@@ -82,8 +82,9 @@ public:
char const *envp[], // Can be NULL
uint32_t flags,
const char *stdin_path, // Can be NULL
- const char *stdout_path, // Can be NULL
- const char *stderr_path); // Can be NULL
+ const char *stdout_path, // Can be NULL
+ const char *stderr_path, // Can be NULL
+ const char *working_dir); // Can be NULL
virtual void
DidLaunch ();
@@ -295,6 +296,9 @@ protected:
char const *inferior_argv[],
char const *inferior_envp[],
const char *stdin_path,
+ const char *stdout_path,
+ const char *stderr_path,
+ const char *working_dir,
bool launch_process, // Set to true if we are going to be launching a the process
lldb::pid_t attach_pid, // If inferior inferior_argv == NULL, then attach to this pid
const char *attach_pid_name, // Wait for the next process to launch whose basename matches "attach_wait_name"
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index c3b9dfbdd23..f0b79b99ff0 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -1456,7 +1456,8 @@ Process::Launch
uint32_t launch_flags,
const char *stdin_path,
const char *stdout_path,
- const char *stderr_path
+ const char *stderr_path,
+ const char *working_directory
)
{
Error error;
@@ -1507,7 +1508,8 @@ Process::Launch
launch_flags,
stdin_path,
stdout_path,
- stderr_path);
+ stderr_path,
+ working_directory);
if (error.Fail())
{
@@ -3252,10 +3254,10 @@ Process::SettingsController::instance_settings_table[] =
{ "run-args", eSetVarTypeArray, NULL, NULL, false, false, "A list containing all the arguments to be passed to the executable when it is run." },
{ "env-vars", eSetVarTypeDictionary, NULL, NULL, false, false, "A list of all the environment variables to be passed to the executable's environment, and their values." },
{ "inherit-env", eSetVarTypeBoolean, "true", NULL, false, false, "Inherit the environment from the process that is running LLDB." },
- { "input-path", eSetVarTypeString, "/dev/stdin", NULL, false, false, "The file/path to be used by the executable program for reading its input." },
- { "output-path", eSetVarTypeString, "/dev/stdout", NULL, false, false, "The file/path to be used by the executable program for writing its output." },
- { "error-path", eSetVarTypeString, "/dev/stderr", NULL, false, false, "The file/path to be used by the executable program for writings its error messages." },
- { "plugin", eSetVarTypeEnum, NULL , g_plugins, false, false, "The plugin to be used to run the process." },
+ { "input-path", eSetVarTypeString, NULL, NULL, false, false, "The file/path to be used by the executable program for reading its input." },
+ { "output-path", eSetVarTypeString, NULL, NULL, false, false, "The file/path to be used by the executable program for writing its output." },
+ { "error-path", eSetVarTypeString, NULL, NULL, false, false, "The file/path to be used by the executable program for writings its error messages." },
+ { "plugin", eSetVarTypeEnum, NULL, g_plugins, false, false, "The plugin to be used to run the process." },
{ "disable-aslr", eSetVarTypeBoolean, "true", NULL, false, false, "Disable Address Space Layout Randomization (ASLR)" },
{ "disable-stdio", eSetVarTypeBoolean, "false", NULL, false, false, "Disable stdin/stdout for process (e.g. for a GUI application)" },
{ NULL, eSetVarTypeNone, NULL, NULL, false, false, NULL }
OpenPOWER on IntegriCloud