Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1039,6 +1039,7 @@ def request_launch(
disableSTDIO=False,
shellExpandArguments=False,
console: Optional[str] = None,
stdio: Optional[list[str]] = None,
enableAutoVariableSummaries=False,
displayExtendedBacktrace=False,
enableSyntheticChildDebugging=False,
Expand Down Expand Up @@ -1090,6 +1091,8 @@ def request_launch(
args_dict["sourceMap"] = sourceMap
if console:
args_dict["console"] = console
if stdio:
args_dict["stdio"] = stdio
if postRunCommands:
args_dict["postRunCommands"] = postRunCommands
if customFrameFormat:
Expand Down
16 changes: 16 additions & 0 deletions lldb/test/API/tools/lldb-dap/launch/TestDAP_launch.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from lldbsuite.test.lldbtest import *
import lldbdap_testcase
import os
import pathlib
import re
import tempfile

Expand Down Expand Up @@ -624,3 +625,18 @@ def test_no_lldbinit_flag(self):

# Verify the initCommands were executed
self.verify_commands("initCommands", output, initCommands)

def test_stdio_redirection(self):
"""
Test stdio redirection.
"""
self.build_and_create_debug_adapter()
program = self.getBuildArtifact("a.out")

with tempfile.NamedTemporaryFile("rt") as f:
self.launch(program, stdio=[None, f.name, None])
self.continue_to_exit()
lines = f.readlines()
self.assertIn(
program, lines[0], "make sure program path is in first argument"
)
30 changes: 30 additions & 0 deletions lldb/tools/lldb-dap/Handler/RequestHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,33 @@ static uint32_t SetLaunchFlag(uint32_t flags, bool flag,
return flags;
}

static void
SetupIORedirection(const std::vector<std::optional<std::string>> &stdio,
lldb::SBLaunchInfo &launch_info) {
size_t n = std::max(stdio.size(), static_cast<size_t>(3));
for (size_t i = 0; i < n; i++) {
std::optional<std::string> path;
if (stdio.size() < i)
path = stdio.back();
else
path = stdio[i];
if (!path)
continue;
switch (i) {
case 0:
launch_info.AddOpenFileAction(i, path->c_str(), true, false);
break;
case 1:
case 2:
launch_info.AddOpenFileAction(i, path->c_str(), false, true);
break;
default:
launch_info.AddOpenFileAction(i, path->c_str(), true, true);
break;
}
}
}

static llvm::Error
RunInTerminal(DAP &dap, const protocol::LaunchRequestArguments &arguments) {
if (!dap.clientFeatures.contains(
Expand Down Expand Up @@ -177,6 +204,9 @@ llvm::Error BaseRequestHandler::LaunchProcess(
launch_info.SetEnvironment(env, true);
}

if (!arguments.stdio.empty() && !arguments.disableSTDIO)
SetupIORedirection(arguments.stdio, launch_info);

launch_info.SetDetachOnError(arguments.detachOnError);
launch_info.SetShellExpandArguments(arguments.shellExpandArguments);

Expand Down
3 changes: 2 additions & 1 deletion lldb/tools/lldb-dap/Protocol/ProtocolRequests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,8 @@ bool fromJSON(const json::Value &Params, LaunchRequestArguments &LRA,
O.mapOptional("disableSTDIO", LRA.disableSTDIO) &&
O.mapOptional("shellExpandArguments", LRA.shellExpandArguments) &&
O.mapOptional("runInTerminal", LRA.console) &&
O.mapOptional("console", LRA.console) && parseEnv(Params, LRA.env, P);
O.mapOptional("console", LRA.console) &&
O.mapOptional("stdio", LRA.stdio) && parseEnv(Params, LRA.env, P);
}

bool fromJSON(const json::Value &Params, AttachRequestArguments &ARA,
Expand Down
2 changes: 2 additions & 0 deletions lldb/tools/lldb-dap/Protocol/ProtocolRequests.h
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,8 @@ struct LaunchRequestArguments {
/// terminal or external terminal.
Console console = eConsoleInternal;

std::vector<std::optional<std::string>> stdio;

/// @}
};
bool fromJSON(const llvm::json::Value &, LaunchRequestArguments &,
Expand Down
29 changes: 29 additions & 0 deletions lldb/tools/lldb-dap/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,34 @@ adds `FOO=1` and `bar` to the environment:
}
```

#### Launch in integrated terminal

This will launch process in IDE's integrated terminal.

```javascript
{
"type": "lldb-dap",
"request": "launch",
"name": "Debug",
"program": "/tmp/a.out",
"console": "integratedTerminal"
}
```

#### Setup IO redirection

This will launch process and connect `stdin` to `in.txt`, both of `stdout` and `stderr` to `out.txt`.

```javascript
{
"type": "lldb-dap",
"request": "launch",
"name": "Debug",
"program": "/tmp/a.out",
"stdio": ["in.txt", "out.txt"]
}
```

### Attaching to a process

When attaching to a process using LLDB, you can attach in multiple ways:
Expand Down Expand Up @@ -237,6 +265,7 @@ contain the following key/value pairs:
| **stopOnEntry** | boolean | | Whether to stop program immediately after launching.
| **runInTerminal** (deprecated) | boolean | | Launch the program inside an integrated terminal in the IDE. Useful for debugging interactive command line programs.
| **console** | string | | Specify where to launch the program: internal console (`internalConsole`), integrated terminal (`integratedTerminal`) or external terminal (`externalTerminal`). Supported from lldb-dap 21.0 version.
| **stdio** | [string] | | The stdio property specifies the redirection targets for the debuggee's stdio streams. A null value redirects a stream to the default debug terminal. String can be a path to file, named pipe or TTY device. If less than three values are provided, the list will be padded with the last value. Specifying more than three values will create additional file descriptors (4, 5, etc.). Supported from lldb-dap 22.0 version.
| **launchCommands** | [string] | | LLDB commands executed to launch the program.

For JSON configurations of `"type": "attach"`, the JSON configuration can contain
Expand Down
8 changes: 8 additions & 0 deletions lldb/tools/lldb-dap/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,14 @@
"description": "Specify where to launch the program: internal console, integrated terminal or external terminal.",
"default": "internalConsole"
},
"stdio": {
"type": "array",
"items": {
"type": "string"
},
"description": "The stdio property specifies the redirection targets for the debuggee's stdio streams. A null value redirects a stream to the default debug terminal. String can be a path to file, named pipe or TTY device. If less than three values are provided, the list will be padded with the last value. Specifying more than three values will create additional file descriptors (4, 5, etc.).",
"default": []
},
"timeout": {
"type": "number",
"description": "The time in seconds to wait for a program to stop at entry point when launching with \"launchCommands\". Defaults to 30 seconds."
Expand Down
Loading