Предотвращение поиска отладчиком ненужных символов

Последнее обновление:

  • 27 мая 2007 г.

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

По умолчанию символы загружаются отладчиком по мере необходимости. (Это называется отложенной загрузкой символов или отложенной загрузкой символов.) Отладчик ищет символы при каждом выполнении команды, вызывающей отображение символов. Это может произойти в точке останова, если задана переменная watch, недопустимая в текущем контексте, например параметр функции или локальная переменная, которая не существует в текущем кадре стека, так как они становятся недопустимыми при изменении контекста. Это также может произойти, если вы просто неправильно ввели имя символа или выполните недопустимую команду отладчика— отладчик начинает искать соответствующий символ.

Почему это иногда занимает так много времени? Это зависит от того, является ли имя символа квалифицированным или неквалифицированным. Полное имя символа предшествует имени модуля, содержащего символ, например myModule!myVar. Неквалифицированные символьные имена не указывают имя модуля, например myOtherVar.

В случае с полным именем отладчик ищет символ в указанном модуле и, если модуль еще не загружен, загружает модуль (при условии, что модуль существует и содержит символ). Это происходит довольно быстро.

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

Как предотвратить автоматическую загрузку неквалифицированных символов

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

SYMOPT_NO_UNQUALIFIED_LOADS по умолчанию отключен. Чтобы активировать этот параметр, используйте параметр командной строки -snul или во время работы отладчика используйте .symopt+0x100 или .symopt-0x100 , чтобы включить или отключить параметр соответственно.

Чтобы увидеть эффект SYMOPT_NO_UNQUALIFIED_LOADS, попробуйте выполнить следующий эксперимент:

  1. Активируйте загрузку символов с шумом (SYMOPT_DEBUG) с помощью параметра командной строки -n или, если отладчик уже запущен, используйте .symopt+0x80000000 или команду расширения отладчика !sym noisy . SYMOPT_DEBUG указывает отладчику отобразить сведения о поиске символов, такие как имя каждого модуля при загрузке или сообщение об ошибке, если отладчику не удается найти файл.
  2. Укажите отладчику вычисление несуществующего символа (например, введите ?asdasdasd). При поиске несуществующего символа отладчик должен сообщать о многочисленных ошибках.
  3. Активируйте SYMOPT_NO_UNQUALIFIED_LOADS с помощью SYMOPT+0x100.
  4. Повторите шаг 2. Отладчик должен искать несуществующий символ только в загруженных модулях и выполнять задачу гораздо быстрее.
  5. Чтобы отключить SYMOPT_DEBUG, используйте .symopt-0x80000000 или команду расширения отладчика !sym quiet .

Существует ряд параметров для управления загрузкой и использованием символов в отладчике. Полный список параметров символов и способы их использования см. в разделе Настройка параметров символов в веб-документации, предоставляемой средствами отладки для Windows. Последний выпуск пакета средств отладки для Windows доступен в виде бесплатной загрузки из Интернета или с компакт-диска windows DDK, пакета SDK для платформы или диагностики службы поддержки клиентов.

Что следует сделать?

  • Чтобы ускорить поиск символов, по возможности используйте полные имена в точках останова и командах отладчика. Если вы хотите увидеть символ из известного модуля, квалифицируйте его именем модуля; Если вы не знаете, где находится символ, используйте неполное имя. Для локальных переменных и аргументов функций используйте $ в качестве имени модуля (например, $! MyVar).
  • Чтобы диагностировать причины медленной загрузки символов, активируйте шумную загрузку символов (SYMOPT_DEBUG) с помощью параметра командной строки -n или, если отладчик уже запущен, с помощью .symopt+0x80000000 или команды расширения отладчика !sym noisy .
  • Чтобы отладчик не искал символы в выгруженных модулях, активируйте SYMOPT_NO_UNQUALIFIED_LOADS с помощью параметра командной строки -snul или, если отладчик уже запущен, с помощью SYMOPT+0x100.
  • Чтобы явно загрузить модули, необходимые для сеанса отладки, используйте команды отладчика, такие как .reload или ld.

См. также раздел

Скачивание WDK

Средства отладки для Windows

начало работы с помощью отладки Windows