Как отлаживать мой Startup.cs в докере в VsCode (отладчик подключается слишком поздно)

Мне удалось отладить приложение asp .net core 3.1 в дистрибутиве Ubuntu WSL-2 (в Windows 10), используя файл для создания докеров, благодаря этому Руководство по сравнению с кодом

Но учитывая, что мы запускаем контейнер с помощью команды docker-compose up, а затем подключаем отладчик, все точки останова, установленные в Program.cs или Startup.cs, не срабатывают. Действительно, приложение уже обработало эти файлы, когда я вручную подключаю отладчик, уже слишком поздно. Все остальные точки останова (в контроллерах или фоновом процессе...) срабатывают корректно.

При отладке того же проекта с помощью Visual Studio 2019 Community все мои точки останова срабатывают, даже те, что находятся в Program.cs или Startup.cs, что здесь является ожидаемым поведением.

Что я делаю не так ?

Точка останова l.44 никогда не достигается Точка останова l.44 никогда не достигается

  • docker-compose.debug.yml (запущен docker-compose -f "docker-compose.debug.yml" up -d --build)
version: '3.7'

services:
  myapp:
    image: myapp
    container_name: myapp
    build:
      context: .
      dockerfile: src/MyApp/src/Dockerfile
    ports:
      - "60713:80"
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=http://+:80
    volumes:
      - ~/.vsdbg:/remote_debugger:rw
networks:
    default:
      external:
         name: mynetwork
  • запуск.json
{
   "version": "0.2.0",
   "configurations": [
       {
           "name": "Docker .NET Core Attach (Preview)",
           "containerName": "myapp",
           "type": "docker",
           "request": "attach",
           "platform": "netCore",
           "sourceFileMap": {
               "/src": "${workspaceFolder}"
           }
       }
]
}

Действительно, если я запускаю отладчик кода VS до того, как контейнер будет запущен, я получаю следующее сообщение об ошибке

Error: Process 'docker exec -i "myapp...' exited with code 1
Error: Error: No such container: myapp

person Cladoo    schedule 27.10.2020    source источник
comment
Я раньше не использовал Docker, но работает ли печально известный Thread.Sleep() в данном случае как обходной путь?   -  person Cardi DeMonaco Jr    schedule 27.10.2020
comment
@CardiDeMonacoJr: конечно, это возможно, но это недопустимое решение, то есть изменение кода в соответствии с требованиями отладчика.   -  person Cladoo    schedule 30.10.2020


Ответы (1)


Я открыл выпуск на Github и получил ответы:

  1. От Брэндона Ватерлоо [MSFT]

Прямо сейчас наша единственная поддерживаемая история для этого — запустить его вручную, а затем прикрепить. У нас возникла проблема с добавлением реальной отладки компоновки (microsoft/vscode-docker#840) ...

  1. От Грегга Мискелли

... единственный способ отладить код запуска — добавить что-то вроде: while (!Debugger.IsAttached) { Thread.Sleep(100); } в начало вашего кода запуска, чтобы он не продолжался, пока не будет подключен отладчик

Итак, в заключение, пока Microsoft не предоставит решение в VSCode или через специальное расширение, одно из решений — добавить некоторый код ожидания:

public static IHostBuilder CreateHostBuilder(string[] args)
{
    if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == Environments.Development)
    {
        while (!Debugger.IsAttached) { Thread.Sleep(100); }
    }  

Теперь точки останова в Startup.cs правильно срабатывают введите здесь описание изображения

person Cladoo    schedule 04.11.2020