Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
PDBCopy предоставляет параметры -f и -F, чтобы удалить произвольный набор публичных символов из сокращенного файла символов, оставляя только те символы, к которым аудитории необходимо иметь доступ для выполнения отладки.
Часто используется PDBCopy, чтобы создать специальную версию файла символов для использования корпорацией Майкрософт в программе "Анализ аварийного сбоя в Интернете" (OCA). OCA может назначать определенные функции как инертные, что означает, что если функция найдена в трассировке стека, она игнорируется. Как правило, функция будет объявлена инертной, если это просто оболочка или сквозная функция, которая не выполняет значительных вычислений. Если такая функция найдена в стеке в анализе сбоев, можно предположить, что эта функция не была в ошибке, и в большинстве случаев она передает недопустимые или поврежденные данные, полученные из подпрограмм ранее в стеке. Игнорируя такие функции, OCA может лучше определить фактическую причину ошибки или повреждения.
Естественно, любая функция, которую вы хотите объявить "inert", должна быть включена в общедоступную таблицу символов файла символов, используемого OCA. Однако это не единственные функции, которые необходимо включить, как показано в следующем примере.
Предположим, что вы напишете драйвер Windows и используете PDBCopy для удаления всех открытых символов из файла символов, за исключением FunctionOne и FunctionSix, двух инертных функций. Ваше ожидание заключается в том, что если FunctionOne или FunctionSix обнаружены в стеке после сбоя, OCA будет их игнорировать. Если в стеке находится любая другая часть драйвера, корпорация Майкрософт предоставит вам соответствующий адрес памяти, и вы можете использовать адрес для отладки драйвера.
Предположим, что ваш драйвер занимает память в следующем расположении:
Адрес | Содержимое памяти |
---|---|
0x1000 |
Базовый адрес модуля |
0x2000 |
Начало functionOne |
0x203F |
Конец FunctionOne |
0x3000 |
Начало functionSix |
0x305F |
Конец FunctionSix |
0x7FFF |
Конец модуля в памяти |
Если отладчик находит адрес в стеке, он выбирает символ со следующим нижним адресом. Так как общедоступная таблица символов содержит адрес каждого символа, но нет сведений о размере, отладчику не удается узнать, попадает ли адрес в границы любого определенного символа.
Таким образом, если ошибка возникает в адресе 0x2031, отладчик, запущенный Microsoft OCA, правильно определяет ошибку как в FunctionOne. Так как это инертная функция, отладчик продолжает ходить по стеку, чтобы найти причину сбоя.
Однако если ошибка возникает в 0x2052, отладчик всё ещё сопоставляет этот адрес с FunctionOne, несмотря на то, что он выходит за пределы фактического конца этой функции (0x203F).
Следовательно, необходимо включить в файл с удалёнными символами не только функции, которые вы хотите открыть, но и символы, следующие непосредственно за этими функциями. В этом примере вы хотите предоставить FunctionOne, FunctionTwo, FunctionSix и FunctionSeven:
Адрес | Содержимое памяти |
---|---|
0x1000 |
Базовый адрес модуля |
0x2000 |
Начало functionOne |
0x203F |
Конец FunctionOne |
0x2040 |
Начало FunctionTwo |
0x3000 |
Начало FunctionSix |
0x305F |
Конец FunctionSix |
0x3060 |
Начало FunctionSeven |
0x7FFF |
Конец модуля в памяти |
Если включить все четыре из этих функций в файл символов с полосатым символом, анализ Microsoft OCA не будет ошибочно рассматривать адрес 0x2052 как часть FunctionOne. В этом примере предполагается, что этот адрес является частью FunctionTwo, но это не важно, так как вы не зарегистрировали FunctionTwo с OCA в качестве инертной функции. Важно то, что адрес 0x2052 распознается как не впадающий в функцию инертности, поэтому OCA распознает это как значимую ошибку в драйвере и может сообщить вам об ошибке.
Если вы не хотите публиковать имена функций, следующих за каждой инертной функцией, вы можете вставить неотложные функции в код после каждой инертной функции, чтобы имена этих функций могли быть включены в общедоступный файл символов. Убедитесь, что эти добавленные функции действительно следуют функциям инертного типа в адресном пространстве двоичного файла, так как некоторые подпрограммы оптимизации могут изменить это или даже полностью удалить некоторые функции.