Pipe transport

Pipe transport allows communication through a pipe program to a remote shell. For example, ssh on Linux. With the introduction of Visual Studio Code Remote Development pipe transport is relevant primarily for IoT scenarios.

How-To

pipeTransport is an option within the launch.json file. The structure looks as follows:

"pipeTransport": {
    "pipeCwd": "/usr/bin",
    "pipeProgram": "/usr/bin/ssh",
    "pipeArgs": [
        "-pw",
        "<password>",
        "user@10.10.10.10"
    ],
    "debuggerPath": "/usr/bin/gdb"
},

The pipeArgs can be any set of arguments necessary to set up and authenticate the pipe connection. In the example, a password is used but you can also use an SSH key.

You may also need to add a sourceFileMap to map the path of where the code exists on the remote shell to where it is locally:

"sourceFileMap": {
    // "remote": "local"
    "/home/user/src": "/src/projectA/src"
}

Attach

You can also use the above pipeTransport block to attach to a remote process. In the attach case, you need to specify a processId. The extension can query processes from the remote machine. To do this, change processId": "${command:pickProcess} to processId": "${command:pickRemoteProcess}. The pipeTransport settings will be used to query the processes on the remote machine. Then select the process from the dropdown list. As with launch, you may need to configure sourceFileMap.

Docker example

The pipeTransport can also be used to debug a process in a Docker container. For an attach, launch.json will include:

"pipeTransport": {
    "pipeCwd": "${workspaceFolder}",
    "pipeProgram": "docker",
    "pipeArgs": [
        "exec",
        "-i",
        "hello_gdb",
        "sh",
        "-c"
    ],
    "debuggerPath": "/usr/bin/gdb"
},

Where hello_gdb is the name of your container.

Launch process by starting a container and then using the same pipeTransport to launch additional processes in the container. See this launch.json for a full example.