Abfragen der PDB-Datei
Eine Programmdatenbankdatei (Erweiterung „.pdb“) ist eine Binärdatei, die Typ- und symbolische Debuginformationen enthält, die während des Kompilierens und Verknüpfens des Projekts gesammelt wurden. Eine PDB-Datei wird erstellt, wenn Sie ein C/C++-Programm mit /ZI oder /Zi oder ein Visual Basic-, Visual C#- oder JScript-Programm mit der Option /debug kompilieren. Objektdateien enthalten für Debuginformationen Verweise in die PDB-Datei. Weitere Informationen zu PDB-Dateien finden Sie unter PDB-Dateien. Eine DIA-Anwendung kann die folgenden allgemeinen Schritte verwenden, um Details zu den verschiedenen Symbolen, Objekten und Datenelementen in einem ausführbaren Image abzurufen.
So fragen Sie die PDB-Datei ab
Rufen Sie eine Datenquelle ab, indem Sie eine IDiaDataSource-Schnittstelle erstellen.
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." ); }
Rufen Sie IDiaDataSource::loadDataFromPdb oder IDiaDataSource::loadDataForExe auf, um die Debuginformationen zu laden.
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" ); } }
Rufen Sie IDiaDataSource::openSession auf, um eine IDiaSession zu öffnen, um Zugriff auf die Debuginformationen zu erhalten.
CComPtr<IDiaSession> psession; if ( FAILED( pSource->openSession( &psession ) ) ) { Fatal( "openSession" ); }
Verwenden Sie die Methoden in
IDiaSession
, um die Symbole in der Datenquelle abzufragen.CComPtr<IDiaSymbol> pglobal; if ( FAILED( psession->get_globalScope( &pglobal) ) ) { Fatal( "get_globalScope" ); }
Verwenden Sie die
IDiaEnum*
-Schnittstellen, um die Symbole oder andere Elemente mit Debuginformationen aufzulisten und zu durchsuchen.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. }