Partager via


Interrogation du fichier .Pdb

Un fichier de base de données de programme (extension .pdb) est un fichier binaire qui contient des informations de type et de débogage symboliques collectées au cours de la compilation et de la liaison du projet. Un fichier PDB est créé lorsque vous compilez un programme C/C++ avec /ZI ou /Zi, ou un programme Visual Basic, Visual C# ou JScript avec l’option /debug. Les fichiers objet contiennent des références dans le fichier .pdb pour les informations de débogage. Pour plus d’informations sur les fichiers pdb, consultez Fichiers PDB. Une application DIA peut utiliser les étapes générales suivantes pour obtenir des détails sur les différents symboles, objets et éléments de données dans une image exécutable.

Pour interroger le fichier .pdb

  1. Acquérir une source de données en créant une interface 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. Appelez IDiaDataSource::loadDataFromPdb ou IDiaDataSource::loadDataForExe pour charger les informations de débogage.

    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. Appelez IDiaDataSource::openSession pour ouvrir une session IDiaSession afin d’accéder aux informations de débogage.

    CComPtr<IDiaSession> psession;
    if ( FAILED( pSource->openSession( &psession ) ) )
    {
        Fatal( "openSession" );
    }
    
  4. Utilisez les méthodes dans IDiaSession pour rechercher les symboles dans la source de données.

    CComPtr<IDiaSymbol> pglobal;
    if ( FAILED( psession->get_globalScope( &pglobal) ) )
    {
        Fatal( "get_globalScope" );
    }
    
  5. Utilisez les interfaces IDiaEnum* pour énumérer et analyser les symboles ou d’autres éléments d’informations de débogage.

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

Voir aussi