以编程方式将调试器附加到在 Docker 容器内运行的进程

3

问题

如何在本地机器上以编程方式附加到运行在Docker容器内的.NET Core进程?

具体而言,我有一个集成测试,在测试中运行一组Docker容器。我想要附加调试器到其中一个容器内部的进程。我知道这个容器和进程,所以我需要一个机制来以编程方式实际附加调试器,这样当我调试我的集成测试时,我可以直接调试我的应用程序。

背景

在Visual Studio 2019中,可以将调试器附加到运行在Docker容器内的进程。

当您启动容器时,请将附加了vsdbg的额外卷(例如%USERPROFILE%\vsdbg\vs2017u5)挂载为/remote_debugger

docker run -v "$($env:USERPROFILE)\vsdbg\vs2017u5:/remote_debugger:rw"

您可以使用 调试(Debug) -> 附加到进程(Attach to Process)… 来附加调试器: Attach to docker process

可能的选项

我怀疑可以使用 EnvDTE(如此答案所述) 来完成,但我希望有更简单的机制,如果有的话,因为基于 EnvDTE 的解决方案通常会带来维护上的麻烦。

进一步的研究让我相信 Debug Adapter Host 是显示 UI 的组件,我希望我可以通过编程来使用它。 - RB.
1
不熟悉那个主题,但我正在尝试联系一些有经验的人来帮忙 :) - LoLance
嗨RB,根据皮尔森的回答,您可能需要在此过程中使用EnvDTE,如果它解决了您的问题,您可以考虑将其标记为答案。感谢皮尔森! - LoLance
1个回答

3
您可以使用这些离线调试步骤的组合来设置一个launch.json,使Debug Adapter主机支持它。
由于您可能不想要用户干预,因此需要使用EnvDTE调用DebugAdapterHost.Launch命令。 此MSDN文章展示了如何在Visual Studio中获取CommandWindow以便发送该命令。
步骤如下: 1. 创建一个像下面这样的launch.json文件:
{
  // NOTE: replace 'my_container_name' with the name of the container you want to connect to
  "version": "0.2.0",
  "adapter": "docker.exe",
  "adapterArgs": "exec -i my_container_name /remote_debugger/vsdbg --interpreter=vscode",
  "configurations": [
    {
      "name": ".NET Core Docker Attach",
      "type": "coreclr",
      "request": "attach",
      // replace with the process id you want to attach to. You can find this by running 'pidof' in the container
      // ex: `docker exec -it my_container_name pidof dotnet`
      "processId": 93
    }
  ]
}
  1. 使用以下命令调用您的launch.json文件:

    DebugAdapterHost.Launch /LaunchJson:"<path-to-the-launch.json-file-you-saved>" /EngineGuid:541B8A8A-6081-4506-9F0A-1CE771DEBC04

  2. 从DTE(快速而简单的代码示例)获取命令窗口:

DTE dte = (DTE)Package.GetGlobalService(typeof(SDTE));
Window window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindCommandWindow);
window.Activate();

CommandWindow commandWindow = window.Object as CommandWindow;

string command = "DebugAdapterHost.Launch " + 
                 "/LaunchJson:\"path/to/launch.json\" " + 
                 "/EngineGuid:541B8A8A-6081-4506-9F0A-1CE771DEBC04";

commandWindow.SendInput(command, true);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接