查询 .Pdb 文件
程序数据库文件 (扩展名为 .pdb) 是包含在编译和链接的项目中和符号调试信息收集的类型的二进制文件。 ,在使用编译 /ZI 的 c. /C C++ 程序或 /Zi 或 Visual Basic、 Visual C#或 JScript 程序与 /debug 选项时, PDB 文件中创建。 对象文件包含对调试信息的 .pdb 文件。 有关 pdb 文件的更多信息,请参见 [OBSOLETE] 程序数据库文件 (C++)。 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. }