.Pdb ファイルの照会
プログラム データベース ファイル (拡張子 .pdb) は、プロジェクトのコンパイルおよびリンク中に収集された型情報とシンボリック デバッグ情報を含むバイナリ ファイルです。 PDB ファイルは、/ZI または /Zi を使用して C/C++ プログラムをコンパイルするか、/debug オプションを使用して Visual Basic、Visual C#、または JScript プログラムをコンパイルすると作成されます。 オブジェクト ファイルには、デバッグ情報の .pdb ファイルへの参照が含まれています。 pdb ファイルの詳細については、PDB ファイルに関する記事を参照してください。 DIA アプリケーションでは、次の一般的な手順を使用して、実行可能イメージ内のさまざまなシンボル、オブジェクト、データ要素の詳細を取得できます。
.pdb ファイルに対してクエリを実行するには
IDiaDataSource インターフェイスを作成して、データ ソースを取得します。
CComPtr<IDiaDataSource> pSource; hr = CoCreateInstance( CLSID_DiaSource, NULL, CLSCTX_INPROC_SERVER, __uuidof( IDiaDataSource ), (void **) &pSource); if (FAILED(hr)) { Fatal("Could not CoCreate CLSID_DiaSource. Register msdia80.dll." ); }
IDiaDataSource::loadDataFromPdb または IDiaDataSource::loadDataForExe を呼び出して、デバッグ情報を読み込みます。
wchar_t wszFilename[ _MAX_PATH ]; mbstowcs( wszFilename, szFilename, sizeof( wszFilename )/sizeof( wszFilename[0] ) ); if ( FAILED( pSource->loadDataFromPdb( wszFilename ) ) ) { if ( FAILED( pSource->loadDataForExe( wszFilename, NULL, NULL ) ) ) { Fatal( "loadDataFromPdb/Exe" ); } }
IDiaDataSource::openSession を呼び出して IDiaSession を開き、デバッグ情報にアクセスできるようにします。
CComPtr<IDiaSession> psession; if ( FAILED( pSource->openSession( &psession ) ) ) { Fatal( "openSession" ); }
IDiaSession
のメソッドを使用して、データ ソース内のシンボルのクエリを実行します。CComPtr<IDiaSymbol> pglobal; if ( FAILED( psession->get_globalScope( &pglobal) ) ) { Fatal( "get_globalScope" ); }
IDiaEnum*
インターフェイスを使用して、デバッグ情報のシンボルや他の要素を列挙して調べます。CComPtr<IDiaEnumTables> pTables; if ( FAILED( psession->getEnumTables( &pTables ) ) ) { Fatal( "getEnumTables" ); } CComPtr< IDiaTable > pTable; while ( SUCCEEDED( hr = pTables->Next( 1, &pTable, &celt ) ) && celt == 1 ) { // Do something with each IDiaTable. }