Программно присоединить отладчик к процессу, выполняющемуся в Docker-контейнере - PullRequest
2 голосов
/ 08 октября 2019

Вопрос

Как мне программно присоединить процесс .NET Core, выполняющийся в контейнере Docker на моей локальной машине?

В частности, у меня есть интеграционный тесткоторый запускает набор Docker-контейнеров. Я хочу прикрепить отладчик к процессу внутри одного из этих контейнеров. Я знаю контейнер и процесс, поэтому все, что я ищу, - это механизм, позволяющий фактически подключить отладчик программным образом, чтобы при отладке интеграционного теста я мог выполнять отладку прямо в своем приложении.

Справочная информация

В Visual Studio 2019 можно присоединить отладчик к процессу, выполняющемуся внутри контейнера Docker.

При запуске контейнера подключите дополнительный том, содержащий vsdbg (например, %USERPROFILE%\vsdbg\vs2017u5) as /remote_debugger.

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

Затем можно подключить отладчик, используя Debug -> Attach to Process...: Attach to docker process

Возможные варианты

Iподозреваю, что я могу сделать это, используя EnvDTE (согласно этому ответу) , но я надеялся на более простой механизм, если он есть, поскольку решения на основе EnvDTE часто являются головной болью при обслуживании.

1 Ответ

2 голосов
/ 10 октября 2019

Вы можете использовать комбинацию этих шагов отладки для настройки launch.json, которую будет поддерживать хост Адаптер отладки .

Вам необходимо будет использовать EnvDTE для вызова команды DebugAdapterHost.Launch, так как вы, вероятно, не хотите вмешательства пользователя. В этой статье MSDN показано, как получить CommandWindow в Visual Studio, чтобы вы могли отправить команду.

Шаги: 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
    }
  ]
}

Используйте эту команду для вызова вашего launch.json файла:

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

Получить окно команд из 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);
...