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


Использование 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 — это файл, созданный на шаге 2. Параметр -f указывает, что некоторые открытые символы должны быть удалены, а амперсанд ( @ ) указывает, что эти символы перечислены в указанном текстовом файле.

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

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

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

Как показано в этом примере, параметр PDBCopy -f удаляет определенный список открытых символов. Амперсанд ( @ ) указывает, что эти символы перечислены в текстовом файле. Альтернативный метод — вывод списка всех символов в командной строке с помощью параметра -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 игнорирует его.

Файл mspdb*.dll

Для запуска 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.