[Lldb-commits] [lldb] cc0fc35 - [LLDB] Fix the use of "platform process launch" with no extra arguments

David Spickett via lldb-commits lldb-commits at lists.llvm.org
Tue Jun 27 00:41:22 PDT 2023


Author: David Spickett
Date: 2023-06-27T07:41:18Z
New Revision: cc0fc358540517a3d205243c27bd543afeae2b02

URL: https://github.com/llvm/llvm-project/commit/cc0fc358540517a3d205243c27bd543afeae2b02
DIFF: https://github.com/llvm/llvm-project/commit/cc0fc358540517a3d205243c27bd543afeae2b02.diff

LOG: [LLDB] Fix the use of "platform process launch" with no extra arguments

This fixes #62068.

After 8d1de7b34af46a089eb5433c700419ad9b2923ee the following issue appeared:
```
$ ./bin/lldb /tmp/test.o
(lldb) target create "/tmp/test.o"
Current executable set to '/tmp/test.o' (aarch64).
(lldb) platform process launch -s
error: Cannot launch '': Nothing to launch
```

Previously would call target->GetRunArguments when there were no extra
arguments, so we could find out what target.run-args might be.

Once that change started relying on the first arg being the exe,
the fact that that call clears the existing argument list caused the bug.

Instead, have it set a local arg list and append that to the existing
one. Which in this case will just contain the exe name.

Since there's no existing tests for this command I've added a new file
that covers enough to check this issue.

Reviewed By: labath

Differential Revision: https://reviews.llvm.org/D153636

Added: 
    lldb/test/API/commands/platform/process/launch/Makefile
    lldb/test/API/commands/platform/process/launch/TestPlatformProcessLaunch.py
    lldb/test/API/commands/platform/process/launch/main.c

Modified: 
    lldb/source/Commands/CommandObjectPlatform.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/source/Commands/CommandObjectPlatform.cpp b/lldb/source/Commands/CommandObjectPlatform.cpp
index 92aa110cba7f1..6c954ce6fbbcb 100644
--- a/lldb/source/Commands/CommandObjectPlatform.cpp
+++ b/lldb/source/Commands/CommandObjectPlatform.cpp
@@ -1207,8 +1207,12 @@ class CommandObjectPlatformProcessLaunch : public CommandObjectParsed {
       if (m_options.launch_info.GetExecutableFile()) {
         Debugger &debugger = GetDebugger();
 
-        if (argc == 0)
-          target->GetRunArguments(m_options.launch_info.GetArguments());
+        if (argc == 0) {
+          // If no arguments were given to the command, use target.run-args.
+          Args target_run_args;
+          target->GetRunArguments(target_run_args);
+          m_options.launch_info.GetArguments().AppendArguments(target_run_args);
+        }
 
         ProcessSP process_sp(platform_sp->DebugProcess(
             m_options.launch_info, debugger, *target, error));

diff  --git a/lldb/test/API/commands/platform/process/launch/Makefile b/lldb/test/API/commands/platform/process/launch/Makefile
new file mode 100644
index 0000000000000..10495940055b6
--- /dev/null
+++ b/lldb/test/API/commands/platform/process/launch/Makefile
@@ -0,0 +1,3 @@
+C_SOURCES := main.c
+
+include Makefile.rules

diff  --git a/lldb/test/API/commands/platform/process/launch/TestPlatformProcessLaunch.py b/lldb/test/API/commands/platform/process/launch/TestPlatformProcessLaunch.py
new file mode 100644
index 0000000000000..59031e7531dcd
--- /dev/null
+++ b/lldb/test/API/commands/platform/process/launch/TestPlatformProcessLaunch.py
@@ -0,0 +1,59 @@
+"""
+Test platform process launch.
+"""
+
+from textwrap import dedent
+from lldbsuite.test.lldbtest import TestBase
+
+
+class ProcessLaunchTestCase(TestBase):
+    NO_DEBUG_INFO_TESTCASE = True
+
+    def setup(self):
+        self.build()
+        exe = self.getBuildArtifact("a.out")
+        self.runCmd("file " + exe)
+        return (exe, self.getBuildArtifact("stdio.log"))
+
+    def test_process_launch_no_args(self):
+        # When there are no extra arguments we just have 0, the program name.
+        exe, outfile = self.setup()
+        self.runCmd("platform process launch --stdout {} -s".format(outfile))
+        self.runCmd("continue")
+
+        with open(outfile) as f:
+           self.assertEqual(dedent("""\
+                Got 1 argument(s).
+                [0]: {}
+                """.format(exe)), f.read())
+
+    def test_process_launch_command_args(self):
+        exe, outfile = self.setup()
+        # Arguments given via the command override those in the settings.
+        self.runCmd("settings set target.run-args D E")
+        self.runCmd("platform process launch --stdout {} -s -- A B C".format(outfile))
+        self.runCmd("continue")
+
+        with open(outfile) as f:
+           self.assertEqual(dedent("""\
+                Got 4 argument(s).
+                [0]: {}
+                [1]: A
+                [2]: B
+                [3]: C
+                """.format(exe)), f.read())
+
+    def test_process_launch_target_args(self):
+        exe, outfile = self.setup()
+        # When no arguments are passed via the command, use the setting.
+        self.runCmd("settings set target.run-args D E")
+        self.runCmd("platform process launch --stdout {}".format(outfile))
+        self.runCmd("continue")
+
+        with open(outfile) as f:
+           self.assertEqual(dedent("""\
+                Got 3 argument(s).
+                [0]: {}
+                [1]: D
+                [2]: E
+                """.format(exe)), f.read())
\ No newline at end of file

diff  --git a/lldb/test/API/commands/platform/process/launch/main.c b/lldb/test/API/commands/platform/process/launch/main.c
new file mode 100644
index 0000000000000..84208372bc4d1
--- /dev/null
+++ b/lldb/test/API/commands/platform/process/launch/main.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+int main(int argc, char const *argv[]) {
+  printf("Got %d argument(s).\n", argc);
+  for (int i = 0; i < argc; ++i)
+    printf("[%d]: %s\n", i, argv[i]);
+  return 0;
+}


        


More information about the lldb-commits mailing list