Pipe transport

Pipe transport allows communication through a pipe program to a remote shell. An example on Linux would be ssh. 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 drop-down 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": "${workspaceRoot}",
    "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.