如何将VS Code调试器附加到在Docker容器中运行的.NET Core监视进程

时间:2019-08-10 15:52:20

标签: docker .net-core visual-studio-code

我有一个.NET Core应用程序在Docker容器中运行,作为组合配置的一部分。该应用程序使用dotnet watch run运行。我已经在launch.json中进行了以下启动配置:

@properties = Property.where(address: [@request.address])

当我运行调试任务时,将显示进程选择器。但是,我似乎无法选择出现的任何过程。可用过程的列表包括:

"configurations": [
    {
        "name": ".NET Core Docker Attach",
        "type": "coreclr",
        "request": "attach",
        "processId": "${command:pickRemoteProcess}",
        "pipeTransport": {
            "pipeProgram": "docker",
            "pipeArgs": [ "exec", "-i", "taskservice" ],
            "debuggerPath": "/vsdbg/vsdbg",
            "pipeCwd": "${workspaceRoot}",
            "quoteArgs": false
        }
    }
]

我想第一个是正确的选择。如果选择它,则会收到错误:dotnet 1 dotnet watrch run dotnet <defunct> 216 dotnet <defunct> 71 ...

有人对此有任何经验并知道我可能做错了吗?

1 个答案:

答案 0 :(得分:0)

看来dotnet watch产生了几个其他过程来监视文件,重建程序集并最终重新运行所生成的程序集。您必须附加到实际运行该已生成程序集的子进程。它看起来应该如下所示:

dotnet exec yourapp.dll

其中yourapp.dll是由正在监视的项目构建的程序集。作为参考,以下是导致我不得不附加到程序集的过程(首先是我的docker entrypoint shell脚本和foo.csproj输出MyApp.dll):

bin/sh -c /bin/bash ./entrypoint.sh
dotnet watch -p foo/foo.csproj run
/usr/share/dotnet/dotnet /usr/share/dotnet/sdk/2.2.401/DotnetTools/dotnet-watch/2.2.0/tools/netcoreapp2.2/any/dotnet-watch.dll -p foo/foo.csproj run
/usr/share/dotnet/dotnet run
dot`net exec /app/foo/MyApp.dll