Querying the .Pdb File
Note
This article applies to Visual Studio 2015. If you're looking for the latest Visual Studio documentation, see Visual Studio documentation. We recommend upgrading to the latest version of Visual Studio. Download it here
A program database file (extension .pdb) is a binary file that contains type and symbolic debugging information gathered over the course of compiling and linking the project. A PDB file is created when you compile a C/C++ program with /ZI or /Zi or a Visual Basic, Visual C#, or JScript program with the /debug option. Object files contain references into the .pdb file for debugging information. For more information on pdb files, see PDB Files. A DIA application can use the following general steps to obtain details about the various symbols, objects, and data elements within an executable image.
To query the .pdb file
Acquire a data source by creating an IDiaDataSource interface.
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." ); }
Call IDiaDataSource::loadDataFromPdb or IDiaDataSource::loadDataForExe to load the debugging information.
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" ); } }
Call IDiaDataSource::openSession to open an IDiaSession to gain access to the debugging information.
CComPtr<IDiaSession> psession; if ( FAILED( pSource->openSession( &psession ) ) ) { Fatal( "openSession" ); }
Use the methods in
IDiaSession
to query for the symbols in the data source.CComPtr<IDiaSymbol> pglobal; if ( FAILED( psession->get_globalScope( &pglobal) ) ) { Fatal( "get_globalScope" ); }
Use the
IDiaEnum*
interfaces to enumerate and scan through the symbols or other elements of debug information.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. }