次の方法で共有


PDBCopy の使用

PDBCopy は、完全なシンボル ファイルから不要な情報を取り除いたシンボル ファイル (ストリップド シンボル ファイル) を作成するためのコマンドライン ツールです。 つまり、プライベート シンボル データとパブリック シンボル テーブルの両方を含むシンボル ファイルを受け取り、パブリック シンボル テーブルのみを含むそのファイルのコピーを作成します。 使用する PDBCopy のオプションに応じて、ストリップド シンボル ファイルには、パブリック シンボル テーブル全体、またはパブリック シンボル テーブルの指定されたサブセットが含まれます。

WDK 内の PDBCopy の場所については、「Windows 用デバッグ ツールに含まれるツール」の「インストール ディレクトリ」を参照してください。

PDBCopy は、PDB 形式のシンボル ファイル (ファイル名拡張子が .pdb) に対応していますが、古い形式のシンボル ファイル (ファイル名拡張子が .dbg ) には対応していません。

パブリック シンボル テーブルとプライベート シンボル データの説明については、「パブリック シンボルとプライベート シンボル」を参照してください。

プライベート シンボルの削除

パブリック シンボルのみを含み、プライベート シンボルをまったく含まない、ストリップド シンボル ファイルを作成する場合は、PDBCopy の使用時に 3 つのパラメーターとして、元のシンボル ファイルのパスと名前、新しいシンボル ファイルのパスと名前、そして -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. 削除するシンボルのリストを含むテキスト ファイルを作成します。 このファイルの各行には、修飾子を含むシンボルの名前を 1 つずつ含める必要がありますが、モジュール名は含めないでください。 この例では、ファイルには次の 2 行が含まれています。

    _myGlobal1
    _myGlobal2
    

    ファイルには任意の名前を付けることができます。 このファイルに listfile.txt という名前を付け、そのファイルをディレクトリ C:\Temp に置くとします。

  3. 次の PDBCopy コマンド ラインを使用します。

    pdbcopy OldPDB NewPDB -p -f:@TextFile
    

    ここで、OldPDBNewPDB は元のシンボル ファイルと新しいシンボル ファイルで、TextFile は手順 2 で作成したファイルです。 -f オプションは、特定のパブリック シンボルが削除されることを示し、アンパサンド ( @ ) は、指定したテキスト ファイルにこれらのシンボルが一覧指定されていることを示します。

    この例では、コマンドは次のようになります。

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

    これにより、新しいシンボル ファイル C:\dir3\mysymbols.pdb が作成されます。このファイルにはプライベート シンボルは含まれず、listfile.txt に一覧指定した 2 つのグローバル変数も含まれません。

この例に示すように、PDBCopy の -f オプションはパブリック シンボルの特定のリストを削除します。 アンパサンド ( @ ) は、これらのシンボルがテキスト ファイルに一覧指定されていることを示します。 別の方法として、アンパサンドなしで -f オプションを使用して、コマンド ラインですべてのシンボルを一覧指定することもできます。 したがって、上記の手順の例に相当するコマンド ラインは次のようになります。

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

1 つまたは 2 つのシンボルのみを削除する場合を除き、コマンド ラインにシンボルを一覧指定するよりもテキスト ファイルを使用する方が簡単です。

.pdb ファイルからパブリック シンボルの大半を削除する場合は、-F オプションが最も簡単な方法です。 -f オプションでは、削除するパブリック シンボルを一覧指定する必要がありますが、-F オプションでは、削除しないパブリック シンボルを一覧指定する必要があります。 他のすべてのパブリック シンボル (およびすべてのプライベート シンボル) が削除されます。 -F オプションは -f オプションと同様に 2 種類の構文をサポートしています。1 つ目は -F: に続けて、保持するシンボルの名前を指定する構文、2 つ目は -F:@ に続けて、保持するシンボルのリストを含むテキスト ファイルの名前を指定する構文です。 いずれの場合も、修飾されたシンボル名を使用する必要があります。

たとえば、次のコマンドはすべてのプライベート シンボルとほぼすべてのパブリック シンボルを削除し、_myFunction5_myGlobal7 というシンボルのみを残します。

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

1 行に -f オプションを複数回指定すると、指定したすべてのシンボルが削除されます。 同様に、-F オプションを一行に複数組み合わせると、指定したすべてのシンボルが保持され、その他のシンボルはすべて削除されます。 -f と -F を組み合わせることはできません。

-f と -F オプションは -p オプションなしでは使用できません。-p オプションはプライベート シンボル データをすべて削除するためのものです。 元のファイルにプライベート シンボルが含まれていない場合でも、-p オプションを指定する必要がありますが、この場合は効果がありません。

-F オプションでは、プライベート シンボル データが削除されないようにすることはできません。 パブリック シンボル テーブルに含まれていないシンボルをこのオプションで指定しても、PDBCopy はそのシンボルを無視します。

mspdb*.dll ファイル

PDBCopy を実行するには、Mspdb80.dll ファイルまたは Mspdb60.dll ファイルにアクセスする必要があります。 既定では、PDBCopy は Visual Studio .NET 2002 以降のバージョンで使用される Mspdb80.dll を使用します。 シンボルが Visual Studio 6.0 以前のバージョンでビルドされている場合、-vc6 コマンド ラインオプションを指定して、PDBCopy が Mspdb60.dll を使用するように指定できますが、これは必須ではありません。 -vc6 オプションを指定しない場合でも、PDBCopy は適切なファイルを見つけることができます。 これらのファイルは、Visual Studio、Platform SDK、または Windows Driver Kit (WDK) のインストール場所にあります。

PDBCopy を実行する前に、適切なバージョンの mspdb*.dll ファイルがコンピューターにアクセス可能であり、その場所がコマンド パスの一部であることを確認してください。 そうでない場合は、path コマンドを使用して、この場所をコマンド パスに追加する必要があります。

ファイル署名と SymSrv インデックス

各シンボル ファイルには、それぞれを一意に識別する固定署名があります。 SymSrv はこの署名を使用して、ファイルに対して一意なインデックス値を生成します。 2 つのファイルの内容が異なったり、作成時刻が異なったりすると、署名も異なり、SymSrv のインデックス値も異なります。

PDBCopy で作成されたファイルは、一意のインデックス値の規則の例外です。 PDBCopy が新しいシンボル ファイルを作成すると、そのファイルには古いファイルと同じ署名と SymSrv のインデックス値が含まれます。 この機能を使用すると、シンボル関連のツールの振る舞いを変えることなく、あるファイルを別のファイルに置き換えることができます。

新しいファイルに独自の署名や SymSrv のインデックスが必要な場合は、-s オプションを使用します。 しかし、ほとんどの場合、このオプションを使用する必要はありません。なぜなら、PDBCopy を使用する最も一般的な目的は、変更したシンボル ファイルで古いファイルを置き換えても、不一致が生じないようにすることであるためです。 新しい署名により、SymSrv が新しいファイルに古いファイルとは異なるインデックス値を割り当てることがあり、新しいファイルで古いファイルを適切に置き換えることができなくなります。

完全なコマンド ライン構文については、「PDBCopy コマンドライン オプション」を参照してください。