Вопрос или проблема
Моя компания предоставляет нам новые виртуальные машины для разработки на .NET, и я пытаюсь их настроить. Проблема в том, что отладчик dotnet, похоже, не работает, и я не могу понять, почему.
Некоторые характеристики:
ОС: Windows 10 22H2
VS: Visual Studio Professional 2022 17.8.3, установлены рабочие нагрузки для разработки на c# и c++, а также MAUI
sdk dotnet: 8.0.100 и 8.0.403
Когда я создаю любой проект на c#, например простое консольное приложение Hello World!
, проект компилируется правильно, оно запускается, однако точки останова не срабатывают. После запуска точки останова будут деактивированы и появится сообщение об ошибке: “Точка останова в данный момент не будет сработана. Символы для этого документа не были загружены.”
Я также пробовал строить и отлаживать из Visual Studio Code, используя CLI dotnet. Точки останова показывают то же сообщение об ошибке.
Сообщение об ошибке обычно означает, что файл .pdb не найден, однако, проверяя файловую систему, файл .pdb находится рядом с .exe файлом. Еще страннее, если я открываю окно Debug->Windows->Modules, когда приложение запущено, там не появляются никакие модули. Окно модулей просто пустое.
Я многократно проверял, что нахожусь в режиме отладки. Я пробовал собирать с AnyCpu, X64 и X86, ничего не изменилось.
Я проверил, что оптимизация кода выключена (даже для Release).
Я включил “Подавить оптимизацию JIT при загрузке модуля”, но это не помогло.
Я пробовал “Включить только мой код”, ни одно из условий не сработало.
Я попробовал Clean->Rebuild, пробовал удалить папки obj и bin, пробовал удалить папку .vs. Я пробовал перезапустить Visual Studio и перезагрузить виртуальную машину. Ничто из этого не помогло.
Я пробовал создавать проекты на дисках C и D. Никакой разницы.
Я пробовал изменять символы отладки в свойствах проекта->Сборка->Общие. Никакой разницы.
Debugger.IsAttached
возвращает false. Debugger.Launch()
и Debugger.Break()
завершают приложение с кодом ошибки, который сообщает, что отладчик не найден ((процесс 8476) завершился с кодом -2147483645.).
Я должен упомянуть, что Visual Studio выглядит так, будто отладчик начался, диагностические инструменты появляются, и я могу “отсоединить” отладчик и так далее.
Я пробовал включить смешанный режим отладки через свойства отладки->Включить отладку нативного кода. Если это установить в true, то в окне модулей нативные модули загружаются правильно. Поскольку я включил загрузку символов с серверов символов, их символы загружаются с сообщением: “Символы загружены без информации о исходниках”.
Однако у управляемых символов есть некоторые проблемы. Прежде всего, они отображают сообщение об ошибке: “Модуль не был загружен по адресу загрузки по умолчанию”. Что касается символов, то говорится: “Нативный отладчик пропустил загрузку символов для управляемого модуля.” Кнопка Загрузить символы отсутствует. Я не знаю, что происходит, но мне кажется, что нативный отладчик запустился правильно, однако управляемый отладчик нет.
Если я изменяю код, он компилируется, и я вижу изменения в запущенном приложении.
Ответ или решение
Конечно, давайте рассмотрим данную проблему с отладчиком .NET, которая возникает при попытке установить точки останова в простом консольном приложении на новых виртуальных машинах.
Проблема с отладчиком .NET: Точки останова не срабатывают
Введение
Вы описали ситуацию, в которой отладчик Visual Studio не может активировать точки останова, даже для простейшего приложения "Hello World". Вы упомянули несколько важных деталей о среде разработки, установленных версиях SDK и операционной системе. Давайте последовательно проанализируем возможные причины и способы их решения.
1. Настройки сборки
Первым шагом стоит убедиться, что проект действительно собирается в режиме отладки. Для этого:
- Откройте свойства проекта и убедитесь, что выбран режим Debug.
- Убедитесь, что опция Optimize Code отключена (даже для режима Release, если его затрагиваете).
- Проверьте настройки платформы (x86, x64, Any CPU) и убедитесь, что вы запускаете проект в той же конфигурации.
2. Наличие отладочных символов (.pdb файлов)
Проблема "Точка останова не может быть активирована. Символы для этого документа не загружены" часто связана с отсутствием или неверной загрузкой файлов .pdb. Вы отметили, что .pdb файлы находятся в папке с исполняемым файлом, однако:
- Убедитесь, что в панели инструментов выключены все опции кэширования символов. В разделе Tools > Options > Debugging проверьте, включена ли опция Enable Just My Code.
- Вы можете также попробовать временно отключить опцию Enable Source Link support, если она активирована.
3. Проверка загрузки модулей
Как вы отметили, окно Modules остается пустым, что указывает на возможные проблемы со связкой отладчика и загружаемыми модулями:
- Проверьте наличие ошибок во вкладке Output во время запуска приложения, чтобы увидеть возможные предупреждения о загруженных модулях или отладочных символах.
- Если вы хотите использовать смешанную отладку (включая нативный код), убедитесь, что в ваших настройках включена опция Enable Native Code Debugging.
4. Проверка работы с платформами и конфигурациями
Если проблема возникает как в Visual Studio, так и в Visual Studio Code, есть смысл проверить не только конфигурацию проекта, но и общесистемные настройки:
- Убедитесь, что установлены последние обновления Visual Studio и среды разработки .NET SDK.
- Если вы используете виртуальные машины, проверьте, работают ли все компоненты без ограничений, которые могут нарушить взаимодействие отладчика и приложения.
5. Устранение ошибок с загрузкой символов
Обратите внимание на сообщения о том, что "модуль не загрузился по адресу по умолчанию." Это может быть признаком проблем с адресацией модулей или неправильной конфигурации среды. Попробуйте следующее:
- Очистите кэш символов. Зайдите в Tools > Options > Debugging > Symbols и проверьте или очистите пути к символам.
- Убедитесь также, что у вашей виртуальной машины достаточно ресурсов и настроек, чтобы выполнять отладку.
Заключение
Если все вышеперечисленные шаги не помогли, рекомендуется обратиться к документации на сайте Microsoft или на форумах сообщества разработчиков .NET. Возможны аппаратные или сетевые ограничения, особенно в виртуальных машинах, которые могут ограничивать доступ к отладочным компонентам и символам.
Если у вас возникнут дополнительные вопросы или потребуется помощь с конкретной настройкой, не стесняйтесь задавать их. Удачи в отладке вашего приложения.