Поделиться через


Запрос PDB-файла

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

Запрос PDB-файла

  1. Получите источник данных, создав интерфейс 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." );
    }
    
  2. Вызовите 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" );
        }
    }
    
  3. Вызовите IDiaDataSource::openSession, чтобы открыть IDiaSession, чтобы получить доступ к сведениям об отладке.

    CComPtr<IDiaSession> psession;
    if ( FAILED( pSource->openSession( &psession ) ) )
    {
        Fatal( "openSession" );
    }
    
  4. Используйте методы для IDiaSession запроса символов в источнике данных.

    CComPtr<IDiaSymbol> pglobal;
    if ( FAILED( psession->get_globalScope( &pglobal) ) )
    {
        Fatal( "get_globalScope" );
    }
    
  5. 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.
    }
    

См. также