Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
последнее обновление:
- 27 мая 2007 г.
Вы достигаете интересной точки останова при отладке своего драйвера, только для того, чтобы отладчик приостанавливался на очень долгое время, пытаясь загрузить символы для драйверов, которыми вы не владеете, и которые даже не имеют значения для текущей задачи отладки. Что происходит?
По умолчанию символы загружаются отладчиком по мере их необходимости. (Это называется отложенной загрузкой символов или отложенной загрузкой символов.) Отладчик ищет символы всякий раз, когда выполняется команда, которая вызывает отображение символов. Это может произойти в точке останова, если вы задали переменную для отслеживания, которая недействительна в текущем контексте, например, параметр функции или локальная переменная, которые не существуют в текущем кадре стека, потому что они становятся недействительными при изменении контекста. Это также может произойти, если вы просто неправильно введите имя символа или выполните недопустимую команду отладчика, отладчик начинает искать соответствующий символ.
Почему это иногда занимает так много времени? Это зависит от того, является ли имя символа квалифицированным или неквалифицированным. Полное имя символа предшествует имени модуля, содержащего символ, например myModule!myVar. Неквалифицированное имя символа не указывает имя модуля, например myOtherVar.
В случае с полным именем отладчик ищет символ в определённом модуле и, если он ещё не загружен, загружает его (если модуль существует и содержит символ). Это происходит довольно быстро.
В случае неквалифицированного имени отладчик не знает, какой модуль содержит символ, поэтому он должен искать во всех модулях. Отладчик сначала проверяет все загруженные модули для символа, а затем, если он не может соответствовать символу в любом загруженном модуле, отладчик продолжает поиск, загружая все выгруженные модули, начиная с нижестоящего хранилища и заканчивая сервером символов, если вы используете один. Очевидно, что это может занять много времени.
Как предотвратить автоматическую загрузку для неквалифицированных символов
Параметр SYMOPT_NO_UNQUALIFIED_LOADS отключает или включает автоматическую загрузку модулей отладчика при поиске неквалифицированного символа. Если SYMOPT_NO_UNQUALIFIED_LOADS задан и отладчик пытается сопоставить неквалифицированный символ, он выполняет поиск только среди модулей, которые уже загружены, и останавливает поиск, если не может найти символ, не загружая модули, которые не были загружены. Этот параметр не влияет на поиск квалифицированных имен.
SYMOPT_NO_UNQUALIFIED_LOADS по умолчанию отключен. Чтобы активировать этот параметр, используйте параметр командной строки -snul или, пока отладчик работает, используйте .symopt+0x100 или .symopt-0x100, чтобы включить или отключить параметр соответственно.
Чтобы увидеть эффект SYMOPT_NO_UNQUALIFIED_LOADS, попробуйте выполнить эксперимент.
- Активируйте загрузку символов (SYMOPT_DEBUG) с помощью параметра командной строки -n или, если отладчик уже запущен, используйте .symopt+0x80000000 или командой расширения отладчика !sym noisy. SYMOPT_DEBUG указывает отладчику отображать сведения о поиске символов, например имя каждого модуля при его загрузке или сообщение об ошибке, если отладчик не может найти файл.
- Укажите отладчику оценить несуществующий символ (например, введите ?asdasdasd). Отладчик должен сообщать о многочисленных ошибках при поиске несуществующего символа.
- Активируйте SYMOPT_NO_UNQUALIFIED_LOADS с помощью .symopt+0x100.
- Повторите шаг 2. Отладчик должен выполнять поиск только загруженных модулей для несуществующего символа, и он должен завершить задачу гораздо быстрее.
- Чтобы отключить SYMOPT_DEBUG, используйте .symopt-0x80000000 или команду расширения отладчика !sym quiet.
Для управления загрузкой отладчика и использованием символов можно использовать ряд параметров. Полный список параметров символов и их использование см. в разделе "Настройка параметров символов" в интерактивной документации, предоставленной средствами отладки для Windows. Последняя версия пакета средств отладки для Windows доступна как бесплатная загрузка из Интернета или вы можете установить пакет из Windows DDK, пакета SDK платформы или компакт-диска диагностики поддержки клиентов.
Что делать?
- По возможности, чтобы ускорить поиск символов, используйте квалифицированные имена в точках останова и командах отладчика. Если вы хотите увидеть символ из известного модуля, присвойте ему имя модуля; Если вы не знаете, где находится символ, используйте неквалифицированное имя. Для локальных переменных и аргументов функций используйте $ в качестве имени модуля (например, $! MyVar).
- Чтобы диагностировать причины медленной загрузки символов, активируйте шумную загрузку символов (SYMOPT_DEBUG) с помощью параметра командной строки -n или, если отладчик уже запущен, используя .symopt+0x80000000 или команду !sym шумно расширения отладчика.
- Чтобы отладчик не искал символы в выгруженных модулях, активируйте SYMOPT_NO_UNQUALIFIED_LOADS параметром командной строки -snul или, если отладчик уже запущен, используйте .symopt+0x100.
- Чтобы явно загрузить модули, необходимые для вашей сессии отладки, используйте команды отладчика, такие как .reload или ld.
См. также
Скачайте WDK
Инструменты отладки для Windows