VS2012: точка останова в файле ntdll.dll при запуске отладки без дополнительной информации

Иногда, когда я запускаю/отлаживаю свое приложение в режиме отладки, используя VS2012, я получаю диалог:

< blahblah.exe > вызвало точку останова.

В нем нет другой информации, поэтому я попал в брейк, чтобы посмотреть, что происходит. О, но тогда я получаю "wntdll.pdb не загружен" и никакой другой информации о проблеме. Стек вызовов указывает на ntdll.dll, и, похоже, мое приложение еще не приступило к исполнению еще на этом этапе.

Выбор продолжения в этой точке позволит приложению/отладчику продолжить работу как обычно.

Это происходит очень часто (около 7 запусков из 10). Я запускаю Windows 8 (64-разрядная версия) и Visual Studio 2012 с обновлением 1.

Раньше у меня были Windows 7 (64-разрядные) и VS2010, и я никогда не получал эту проблему. Этот конкретный проект был обновлен с версии, созданной в (2010), поэтому, возможно, эта часть проблемы.

Кто-нибудь сталкивался с этой проблемой раньше? Я не знаю, с чего начать искать причину. Хотя я использую 64-битную Windows, я должен упомянуть, что я строю 32-битное приложение.

Update: После включения Microsoft Symbol Servers здесь выглядит стек вызовов:

>   [email protected]()  Unknown
    [email protected]()    Unknown
    [email protected]()  Unknown
    [email protected]()   Unknown
    [email protected]()   Unknown

Я также должен добавить на всякий случай, что у меня определенно нет точек останова, установленных вручную в любом месте моего кода.

Ответ 1

Эта раздражающая проблема связана с ошибкой в ​​Visual Studio:

Что происходит, мы неправильно обрабатываем несколько загрузчиков событий прерывания от разных процессов одновременно. ОС запускает контрольную точку загрузчика после того, как процесс запущен и запущен, но до того, как какое-либо исполнение может быть выполнено для отладчиков, чтобы контрольные точки и другие действия. Обычно мы успешно игнорируем эти (по крайней мере, в одном случае запуска). Вы можете обойти это отключив "Разрыв всех процессов при разрыве одного процесса", checkbox в инструментах- > options- > отладчик. Также обратите внимание, что это не фатальная ошибка. Мы просто останавливаемся во внутреннем breakpiont, и вы можете просто нажмите F5, чтобы продолжить.

Это состояние гонки, поэтому нам нелегко будет отслеживать и использование нескольких запусков в VS довольно низкое, поэтому я собираюсь не исправлять это предполагая, что обходной путь выше будет достаточно хорошим, чтобы разблокировать вас и мы пересматриваем это, если увидим больше отчетов из дополнительных клиентов. Это разумно для вас?

Еще раз спасибо за отзывы.

Marc Paine Visual Studio Отладчик Инженерный менеджер

Источник: Microsoft Connect

Я следил за советом по отключению флажка "Перерыв всех процессов, когда один процесс ломается" в настройках отладчика Visual Studio, и это "удалило" проблему на данный момент.

Возможно, если мы сможем получить еще несколько человек, чтобы сообщить о той же проблеме/раздражении этой ошибки, Microsoft в конечном итоге исправит ее, как они предполагают.

Ответ 2

Если вы запускаете приложение под отладчиком, после запуска процесса появляется автоматическая точка останова. Эта точка останова дает вам возможность установить дополнительные точки останова до начала процесса. Если вам это не нравится, в отладчике обычно есть опция игнорировать начальную точку останова по умолчанию. Например, в cdb параметр -g.

Ответ 3

Я просто обнаружил, что сталкивался с подобной проблемой, хотя это был мой callstack:

ntdll.dll!LdrpDoDebuggerBreak()
ntdll.dll!LdrpInitializeProcess()
ntdll.dll!_LdrpInitialize() 
ntdll.dll!LdrInitializeThunk()

В моем случае у моего решения Visual Studio есть несколько проектов, причем три из этих проектов установлены в "Пуск" (и "Отладка" ) с помощью решения "Несколько проектов запуска".

Два из запущенных проектов - это (неуправляемый) С++, а один из них - С#. Я смог избавиться от этой контрольной точки запуска, открыв свойства проекта для проекта С# и включив "отладку собственного кода".

" Включить отладку собственного кода и

Изменить. По-видимому, это не полностью разрешило мою проблему, это только значительно уменьшило частоту ее возникновения. Тем не менее, я думаю, что такое же общее решение может по-прежнему его исправлять.

Один из других проектов в этом решении - это просто готовый двоичный файл, который запускается вручную, указывая двоичный файл как проект TargetPath.

Изменение страницы Debugger Type до Native Only на странице свойств проекта Debugging, похоже, тоже помогло.

Итак, изменение обоих из них, похоже, действительно решило проблему для меня.

Ответ 4

Сожалею! Я не знаю, как задать вопрос в этой теме, поэтому я публикую это как ответ. У меня похожая проблема при запуске VC++ 6.0 под Windows 10. Предложенный обходной путь не кажется полезным в моей ситуации, потому что указанные настройки, кажется, не существуют в Visual Studio 6.0. Любая помощь будет оценена. Спасибо!

Ответ 5

Посмотрите, включился ли вы в отладчик при первом случае исключения.

Вы можете видеть это в разделе "Отладка/Исключения...". Посмотрите, проверено ли какое-либо из ящиков. (По крайней мере, это было расположение меню в старых вариантах VS - у меня нет VS 2012 в настоящее время) Если включено, это приводит к тому, что отладчик прерывается, когда генерируется исключение, даже если приложение может быть правильно обработано. Если отключено, отладчик только ломается, когда исключение не обрабатывается. Если какие-либо исключения отмечены, попробуйте снять флажок и посмотреть, сохраняется ли это.