Запрос PDB-файла
Файл базы данных программы (расширение PDB) — это двоичный файл, содержащий сведения о типе и символьной отладке, собранные в ходе компиляции и связывания проекта. PDB-файл создается при компиляции программы C/C++ с помощью /ZI или /Zi или Visual Basic, Visual C# или программы JScript с параметром /debug. Файлы объектов содержат ссылки на PDB-файл для отладки информации. Дополнительные сведения о PDB-файлах см. в разделе PDB Files. Приложение 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. }