Freigeben über


Abfragen der PDB-Datei

Eine Programmdatenbankdatei (Erweiterung „.pdb“) ist eine Binärdatei, die Typ- und symbolische Debuginformationen enthält, die während des Kompilierens und Verknüpfens des Projekts gesammelt wurden. Eine PDB-Datei wird erstellt, wenn Sie ein C/C++-Programm mit /ZI oder /Zi oder ein Visual Basic-, Visual C#- oder JScript-Programm mit der Option /debug kompilieren. Objektdateien enthalten für Debuginformationen Verweise in die PDB-Datei. Weitere Informationen zu PDB-Dateien finden Sie unter PDB-Dateien. Eine DIA-Anwendung kann die folgenden allgemeinen Schritte verwenden, um Details zu den verschiedenen Symbolen, Objekten und Datenelementen in einem ausführbaren Image abzurufen.

So fragen Sie die PDB-Datei ab

  1. Rufen Sie eine Datenquelle ab, indem Sie eine IDiaDataSource-Schnittstelle erstellen.

    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. Rufen Sie IDiaDataSource::loadDataFromPdb oder IDiaDataSource::loadDataForExe auf, um die Debuginformationen zu laden.

    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. Rufen Sie IDiaDataSource::openSession auf, um eine IDiaSession zu öffnen, um Zugriff auf die Debuginformationen zu erhalten.

    CComPtr<IDiaSession> psession;
    if ( FAILED( pSource->openSession( &psession ) ) )
    {
        Fatal( "openSession" );
    }
    
  4. Verwenden Sie die Methoden in IDiaSession, um die Symbole in der Datenquelle abzufragen.

    CComPtr<IDiaSymbol> pglobal;
    if ( FAILED( psession->get_globalScope( &pglobal) ) )
    {
        Fatal( "get_globalScope" );
    }
    
  5. Verwenden Sie die IDiaEnum*-Schnittstellen, um die Symbole oder andere Elemente mit Debuginformationen aufzulisten und zu durchsuchen.

    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.
    }
    

Weitere Informationen