查询 .Pdb 文件
程序数据库文件(扩展名 .pdb)是一个二进制文件,包含了在编译和链接项目的过程中收集的类型和符号调试信息。 当你用 /ZI 或 /Zi 编译 C/C++ 程序,或用 /debug 选项编译 Visual Basic、Visual C# 或 JScript 程序时,会创建一个 PDB 文件。 对于调试信息,对象文件包含对 .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. }