Author: enrico Date: Thu Apr 16 20:50:11 2015 New Revision: 235157 URL: http://llvm.org/viewvc/llvm-project?rev=235157&view=rev Log: Fix a bug where argdumper would not launch inferiors correctly in the presence of arguments of the form word1\ word2 (vs. the quoted form "word1 word2")
Fixes rdar://20493444 Modified: lldb/trunk/include/lldb/Host/Host.h lldb/trunk/source/Host/common/Host.cpp lldb/trunk/source/Host/macosx/Host.mm lldb/trunk/test/functionalities/launch_with_shellexpand/TestLaunchWithShellExpand.py Modified: lldb/trunk/include/lldb/Host/Host.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/Host.h?rev=235157&r1=235156&r2=235157&view=diff ============================================================================== --- lldb/trunk/include/lldb/Host/Host.h (original) +++ lldb/trunk/include/lldb/Host/Host.h Thu Apr 16 20:50:11 2015 @@ -268,6 +268,15 @@ public: std::string *command_output, // Pass NULL if you don't want the command output uint32_t timeout_sec, bool run_in_default_shell = true); + + static Error + RunShellCommand (const Args& args, + const char *working_dir, // Pass NULL to use the current working directory + int *status_ptr, // Pass NULL if you don't want the process exit status + int *signo_ptr, // Pass NULL if you don't want the signal that caused the process to exit + std::string *command_output, // Pass NULL if you don't want the command output + uint32_t timeout_sec, + bool run_in_default_shell = true); static lldb::DataBufferSP GetAuxvData (lldb_private::Process *process); Modified: lldb/trunk/source/Host/common/Host.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Host.cpp?rev=235157&r1=235156&r2=235157&view=diff ============================================================================== --- lldb/trunk/source/Host/common/Host.cpp (original) +++ lldb/trunk/source/Host/common/Host.cpp Thu Apr 16 20:50:11 2015 @@ -552,6 +552,18 @@ Host::RunShellCommand (const char *comma uint32_t timeout_sec, bool run_in_default_shell) { + return RunShellCommand(Args(command), working_dir, status_ptr, signo_ptr, command_output_ptr, timeout_sec, run_in_default_shell); +} + +Error +Host::RunShellCommand (const Args &args, + const char *working_dir, + int *status_ptr, + int *signo_ptr, + std::string *command_output_ptr, + uint32_t timeout_sec, + bool run_in_default_shell) +{ Error error; ProcessLaunchInfo launch_info; launch_info.SetArchitecture(HostInfo::GetArchitecture()); @@ -559,10 +571,10 @@ Host::RunShellCommand (const char *comma { // Run the command in a shell launch_info.SetShell(HostInfo::GetDefaultShell()); - launch_info.GetArguments().AppendArgument(command); + launch_info.GetArguments().AppendArguments(args); const bool localhost = true; const bool will_debug = false; - const bool first_arg_is_full_shell_command = true; + const bool first_arg_is_full_shell_command = false; launch_info.ConvertArgumentsForLaunchingInShell (error, localhost, will_debug, @@ -572,7 +584,6 @@ Host::RunShellCommand (const char *comma else { // No shell, just run it - Args args (command); const bool first_arg_is_executable = true; launch_info.SetArguments(args, first_arg_is_executable); } @@ -580,7 +591,7 @@ Host::RunShellCommand (const char *comma if (working_dir) launch_info.SetWorkingDirectory(working_dir); llvm::SmallString<PATH_MAX> output_file_path; - + if (command_output_ptr) { // Create a temporary file to get the stdout/stderr and redirect the @@ -618,10 +629,10 @@ Host::RunShellCommand (const char *comma error = LaunchProcess (launch_info); const lldb::pid_t pid = launch_info.GetProcessID(); - + if (error.Success() && pid == LLDB_INVALID_PROCESS_ID) error.SetErrorString("failed to get process ID"); - + if (error.Success()) { // The process successfully launched, so we can defer ownership of @@ -640,7 +651,7 @@ Host::RunShellCommand (const char *comma if (timed_out) { error.SetErrorString("timed out waiting for shell command to complete"); - + // Kill the process since it didn't complete within the timeout specified Kill (pid, SIGKILL); // Wait for the monitor callback to get the message @@ -653,10 +664,10 @@ Host::RunShellCommand (const char *comma { if (status_ptr) *status_ptr = shell_info->status; - + if (signo_ptr) *signo_ptr = shell_info->signo; - + if (command_output_ptr) { command_output_ptr->clear(); @@ -678,7 +689,7 @@ Host::RunShellCommand (const char *comma } shell_info->can_delete.SetValue(true, eBroadcastAlways); } - + FileSpec output_file_spec(output_file_path.c_str(), false); if (FileSystem::GetFileExists(output_file_spec)) FileSystem::Unlink(output_file_path.c_str()); @@ -688,7 +699,6 @@ Host::RunShellCommand (const char *comma return error; } - // LaunchProcessPosixSpawn for Apple, Linux, FreeBSD and other GLIBC // systems Modified: lldb/trunk/source/Host/macosx/Host.mm URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/Host.mm?rev=235157&r1=235156&r2=235157&view=diff ============================================================================== --- lldb/trunk/source/Host/macosx/Host.mm (original) +++ lldb/trunk/source/Host/macosx/Host.mm Thu Apr 16 20:50:11 2015 @@ -1352,18 +1352,13 @@ Host::ShellExpandArguments (ProcessLaunc error.SetErrorString("could not find argdumper tool"); return error; } - - std::string quoted_cmd_string; - launch_info.GetArguments().GetQuotedCommandString(quoted_cmd_string); - StreamString expand_command; - - expand_command.Printf("%s %s", - expand_tool_spec.GetPath().c_str(), - quoted_cmd_string.c_str()); + + Args expand_command(expand_tool_spec.GetPath().c_str()); + expand_command.AppendArguments (launch_info.GetArguments()); int status; std::string output; - RunShellCommand(expand_command.GetData(), launch_info.GetWorkingDirectory(), &status, nullptr, &output, 10); + RunShellCommand(expand_command, launch_info.GetWorkingDirectory(), &status, nullptr, &output, 10); if (status != 0) { Modified: lldb/trunk/test/functionalities/launch_with_shellexpand/TestLaunchWithShellExpand.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/launch_with_shellexpand/TestLaunchWithShellExpand.py?rev=235157&r1=235156&r2=235157&view=diff ============================================================================== --- lldb/trunk/test/functionalities/launch_with_shellexpand/TestLaunchWithShellExpand.py (original) +++ lldb/trunk/test/functionalities/launch_with_shellexpand/TestLaunchWithShellExpand.py Thu Apr 16 20:50:11 2015 @@ -84,6 +84,27 @@ class LaunchWithShellExpandTestCase(Test self.expect("frame variable argv[1]", substrs=['foo bar']) + self.runCmd("process kill") + + self.runCmd('process launch -X true -w %s -- foo\ bar' % (os.getcwd())) + + process = self.process() + + self.assertTrue(process.GetState() == lldb.eStateStopped, + STOPPED_DUE_TO_BREAKPOINT) + + thread = process.GetThreadAtIndex (0) + + self.assertTrue (thread.IsValid(), + "Process stopped at 'main' should have a valid thread"); + + stop_reason = thread.GetStopReason() + + self.assertTrue (stop_reason == lldb.eStopReasonBreakpoint, + "Thread in process stopped in 'main' should have a stop reason of eStopReasonBreakpoint"); + + self.expect("frame variable argv[1]", substrs=['foo bar']) + if __name__ == '__main__': import atexit lldb.SBDebugger.Initialize() _______________________________________________ lldb-commits mailing list lldb-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits