Remote debugging .NET Core process sử dụng VSCode

Kịch bản là bạn có một ứng dụng .NET core chạy ở trên một server nào đó cần debug. Bạn có trong tay source code (tất nhiên) và khả năng access vào server. Lưu ý server ở đây bao gồm cả docker.

Step 1: Chuẩn bị: target machine: cài đặt vsdbg

Với linux server:

curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg

Với docker, có thể mount vsdbg đã cài sẵn trên máy, lưu ý cần đảm bảo cùng nền tảng để vsdbg của bạn có thể chạy trong docker container

# file docker-compose.override.yml
target:
  volumes:
    - <path-to-local-vsdbg-dir>:/vsdbg

Step 2: cài đặt pipe program

Với linux server: cài ssh

Với docker, bạn cần có docker client, tất nhiên là đã có.

Step 3: Tạo launch task cho vscode:

Mở file .vscode/launch.json, và thêm cấu hình:

    {
      "name": ".NET Core Remote Attach",
      "type": "coreclr",
      "request": "attach",
      "pipeTransport": {
        "pipeCwd": "${workspaceFolder}",
        "pipeProgram": "ssh", // <1>
        "pipeArgs": [
          "[email protected]" // <2>
          // "chỗ này có thể thêm các tham số của ssh"
        ],
        "quoteArgs": false,
        "debuggerPath": "/vsdbg/vsdbg" // <3>
      },
      "processId": "${command:pickRemoteProcess}", // <4>
      "justMyCode": false, // <5>
      "sourceFileMap": {
        "/": "${workspaceFolder}" // <6>
      }
    }

Các vị trí thú vị theo thứ tự xuất hiện:

Ví dụ 1 task hoàn chỉnh cho docker

{
    "name": ".NET Core Attach",
    "type": "coreclr",
    "request": "attach",
    "processId": "1",
    "justMyCode": false,
    "pipeTransport": {
        "pipeCwd": "${workspaceFolder}",
        "pipeProgram": "docker",
        "pipeArgs": [
            "exec -i compose1_emailing-api_1"
        ],
        "quoteArgs": false,
        "debuggerPath": "/vsdbg/vsdbg"
    },
    "sourceFileMap": {
        "/": "${workspaceFolder}"
    }
}

docker-compose.override.yml nếu cần cài thêm utility ps để pickRemoteProcess

emailing-api:
  # ...
  volumes:
    - ./.vscode/vsdbg:/vsdbg

  entrypoint: /bin/bash -c "/bin/bash -c \"$${@}\""
  command: |
    /bin/bash -c "
      apt update
      apt install procps -y
      dotnet Emailing.Api.dll
    "

Happy debugging 🤘

Screenshot from 2018-11-08 10-37-58