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

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

запустил точку останова.

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

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

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

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

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

обновление: После включения серверов символов Microsoft стек вызовов выглядит следующим образом:

>   ntdll.dll!_LdrpDoDebuggerBreak@0()  Unknown
    ntdll.dll!_LdrpInitializeProcess@8()    Unknown
    ntdll.dll!__LdrpInitialize@8()  Unknown
    ntdll.dll!_LdrpInitialize@8()   Unknown
    ntdll.dll!_LdrInitializeThunk@8()   Unknown

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

4 ответов


эта досадная проблема связана с ошибкой в Visual Studio:

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

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

еще раз спасибо за обратную связь.

Marc Paine Visual Studio Debugger Engineering Manager

источник: Microsoft Connect

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

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


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


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

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

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

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

"Enable native code debugging" checkbox

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

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

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

"Native Only" Debugger type

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


посмотрите, включили ли вы взлом отладчика при исключениях первого шанса.

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