1

VC++ ソース コードを処理するツールを構築しています。このためには、コードで使用されるローカル変数名とその型を含むシンボルのリストを取得する必要があります。Visual C++ 2010 には、オブジェクト ブラウザーがシンボルをすばやく検索できるようにする .bsc ファイルが既に用意されていることを知っています。しかし、これはインタラクティブなツールです。ファイル内のシンボルのリストを取得する必要があります。独自の VC++ ソース コードで使用されているシンボルのリストをプログラムで取得できるツールはありますか?

Microsoft が提供する Debug Interface Access SDK を試してみました。これにより、使用されているローカル変数の名前の .pdb ファイルを読み取ることができます。しかし、ソース コードで使用されている正確な型名も取得したいと考えています。例えば

MYTYPE dwordVar;

DIA SDK では、ローカル変数の名前である文字列「dwordVar」を取得できます。しかし、型名が「MYTYPE」であるとは言えません。MYTYPE が実際に表すもの (unsigned long など) しかわかりません。ただし、シンボル「MYTYPE」ではありません。

Visual C++ がこの機能を提供していない場合、この機能をサポートするサード パーティ ツールはありますか?

4

1 に答える 1

1

このプログラムの実験:

typedef unsigned long MYTYPE;

int wmain(int argc, wchar_t *argv[])
{
    MYTYPE test = 99LU;
}

DIA SDKとDbgHelpSymTagBaseTypeはどちらも、のタイプシンボルのシンタイプに対して16()を返しますtest。タイプシンボルがTypedefシンボル(17 / )であると便利ですが、ローカル変数のタイプを宣言する際にソースファイルがまたはタイプ名をSymTagTypedef使用したかどうかをPDB自体が記録しない可能性があります。typedef

考えられる回避策の1つSymTagTypedefは、グローバルスコープシンボルの子を列挙しstd::multimap、タイプのタイプIDからtypedef名前を作成することです。次に、ローカル変数ごとに、マルチマップにデータシンボルのタイプID(を介して取得IDiaSymbol::get_typeId)のエントリが含まれている場合は、メソッドを使用しIDiaSession::findLinesてデータシンボルが宣言されている行を特定し、それらの行でtypedef名前を検索します。文字列。検索前に前処理を実行する可能性があります。

于 2011-08-28T20:26:08.903 に答える