Поделиться через


Использование PDBCopy

PDBCopy — это утилита командной строки, создающая облегчённый файл символов из полного файла символов. Другими словами, он принимает файл символов, содержащий как данные частного символа, так и общедоступную таблицу символов, и создает копию этого файла, содержащего только общедоступную таблицу символов. В зависимости от используемых параметров PDBCopy, файл без символов будет содержать либо всю таблицу открытых символов, либо указанное подмножество публичной таблицы символов.

Расположение PDBCopy в WDK см. в разделе "Установка " в разделе "Инструменты установки", включенные в средства отладки для Windows.

PDBCopy работает с любым файлом символов формата PDB (с расширением PDB), но не со старыми файлами символов формата (DBG).

Описание таблиц открытых символов и данных частных символов см. в разделе " Открытые и частные символы".

Удаление закрытых символов

Если вы хотите создать файл символов, содержащий только открытые символы и ни одного закрытого, используйте PDBCopy с тремя параметрами: путь и имя исходного файла символов, путь и имя нового файла символов и опция -p.

Например, следующая команда создает новый файл с именем publicsymbols.pdb, который содержит ту же общедоступную таблицу символов, что и mysymbols.pdb, но не содержит ни одного из данных закрытого символа:

pdbcopy mysymbols.pdb publicsymbols.pdb -p

Если mysymbols.pdb уже является файлом символов с удаленными данными, то символическое содержимое нового и старого файлов будет идентичным.

После выдачи этой команды необходимо переместить новый файл в новое расположение и переименовать его в исходное имя файла символов (в этом примере mysymbols.pdb), так как большинство отладочные программы и программы извлечения символов ищут символы на основе определенного имени файла. Кроме того, можно использовать то же имя файла для входного файла и выходного файла в командной строке PDBCopy, если указаны разные каталоги:

pdbcopy c:\dir1\mysymbols.pdb c:\dir2\mysymbols.pdb -p

Заметка Целевой файл не должен существовать до запуска PDBCopy. Если файл с этим именем существует, могут возникнуть различные ошибки.

Удаление закрытых символов и выбранных общедоступных символов

Если вы хотите не только удалить данные частного символа, но и уменьшить объем информации в таблице открытых символов, можно использовать параметр -f, чтобы указать список общедоступных символов, которые необходимо удалить.

В следующем примере показана эта процедура:

  1. Определите полные имена символов, включая их украшения, которые вы хотите удалить. Если вы не уверены в именах украшенных символов, вы можете использовать средство DBH для их определения. Дополнительные сведения см. в разделе "Определение украшений определенного символа". В этом примере предположим, что декорированные имена символов, которые вы хотите удалить: _myGlobal1 и _myGlobal2.

  2. Создайте текстовый файл, содержащий список символов, которые нужно удалить. Каждая строка в этом файле должна содержать имя одного символа, включая украшения, но не включая имена модулей. В этом примере файл будет содержать следующие две строки:

    _myGlobal1
    _myGlobal2
    

    Файлу можно дать любое имя, которое вы выберете. Предположим, что вы назовете этот файл listfile.txt и поместите его в каталог C:\Temp.

  3. Используйте следующую командную строку PDBCopy:

    pdbcopy OldPDB NewPDB -p -f:@TextFile
    

    Где OldPDB и NewPDB являются исходным файлом символов и новым файлом символов, а TextFile — это файл, созданный на шаге два. Параметр -f указывает, что некоторые открытые символы должны быть удалены, амперсанд (@) указывает, что эти символы перечислены в указанном текстовом файле.

    В текущем примере команда будет выглядеть следующим образом:

    pdbcopy c:\dir1\mysymbols.pdb c:\dir3\mysymbols.pdb -p -f:@c:\temp\listfile.txt
    

    При этом создается новый файл символов, C:\dir3\mysymbols.pdb, which does not contain any private symbols and does not contain the two global variables you listed in listfile.txt.

Как показано в этом примере, параметр -f PDBCopy удаляет определенный список открытых символов. Амперсанд (@) указывает, что эти символы перечислены в текстовом файле. Альтернативный метод — вывод списка всех символов в командной строке с помощью параметра -f без амперсанда. Таким образом, следующая командная строка эквивалентна примеру в приведенной выше процедуре:

pdbcopy c:\dir1\mysymbols.pdb c:\dir3\mysymbols.pdb -p -f:_myGlobal1 -f:_myGlobal2

Если вы не хотите удалить только один или два символа, проще использовать текстовый файл, чем перечислить их в командной строке.

Если вы хотите удалить большинство открытых символов из PDB-файла, вариант -F — самый простой метод. Хотя параметр -f требует перечисления этих общедоступных символов, которые вы хотите удалить, параметр -F требует, чтобы вывести список этих общедоступных символов, которые вы не хотите удалить. Все остальные открытые символы (а также все частные символы) будут удалены. Параметр -F поддерживает те же два синтаксического варианта, что и параметр -f: либо -F: за именем сохраненного символа, либо -F:@ с именем текстового файла, содержащего список сохраненных символов. В любом случае необходимо использовать декорированные имена символов.

Например, следующая команда удаляет все закрытые символы и почти все открытые символы, оставляя только символы _myFunction5 и _myGlobal7:

pdbcopy c:\dir1\mysymbols.pdb c:\dir3\mysymbols.pdb -p -F:_myFunction5 -F:_myGlobal7

При объединении нескольких экземпляров параметра -f в одной строке удаляются все указанные символы. При объединении нескольких экземпляров параметра -F в одной строке сохраняются все указанные символы, а все остальные символы удаляются. Невозможно объединить -f с -F.

Параметры -f и -F нельзя использовать без параметра -p, который удаляет все данные закрытых символов. Даже если исходный файл не содержит частных символов, необходимо включить параметр -p (хотя в этом случае он не действует).

Параметр -F нельзя использовать для предотвращения удаления данных частного символа. Если этот параметр используется с символом, не включенным в общедоступную таблицу символов, PDBCopy игнорирует его.

Файл.dll mspdb*

PDBCopy должен получить доступ к файлу Mspdb80.dll или файлу Mspdb60.dll для запуска. По умолчанию PDBCopy использует Mspdb80.dll, которая является версией, используемой Visual Studio .NET 2002 и более поздними версиями Visual Studio. Если символы были созданы с помощью Visual Studio 6.0 или более ранней версии, можно указать параметр командной строки -vc6, чтобы PDBCopy использовал Mspdb60.dll вместо этого, хотя это не обязательно. PDBCopy ищет соответствующий файл, даже если параметр -vc6 не используется. Эти файлы можно найти в рамках установки Visual Studio, пакета SDK для платформы или комплекта драйверов Windows (WDK).

Перед запуском PDBCopy убедитесь, что правильная версия mspdb*.dll файла доступна на компьютере и убедитесь, что его расположение является частью пути команды. Если это не так, следует использовать команду path, чтобы добавить это расположение в системный путь.

Подпись файла и индекс SymSrv

Каждый файл символов имеет фиксированную подпись, которая однозначно идентифицирует его. SymSrv использует сигнатуру для создания уникального значения индекса для файла. Если два файла имеют разное содержимое или время создания, они также будут иметь разные подписи и отдельные значения индекса SymSrv.

Файлы, созданные с помощью PDBCopy, являются исключением из правила уникальных значений индекса. Когда PDBCopy создает новый файл символов, он имеет то же значение сигнатуры и индекса SymSrv, что и старый файл. Эта функция позволяет заменить один файл другим, не изменяя поведение инструментов, связанных с символами.

Если новый файл должен иметь отдельную подпись и индекс SymSrv, используйте параметр -s. В большинстве случаев вы не хотите использовать этот параметр, так как наиболее распространенное использование PDBCopy заключается в создании измененного файла символов, который может заменить старый файл без возникновения несоответствия. Новая сигнатура может привести к тому, что SymSrv назначит новое значение индекса новому файлу, чем старому файлу, что предотвращает правильную замену старого файла.

Полный синтаксис командной строки см. в разделе "Параметры Command-Line PDBCopy".