Condividi tramite


Ricerche nel file PDB

Un file di database di programma (estensione pdb) è un file binario che contiene informazioni di debug di tipo e simbolico raccolte durante la compilazione e il collegamento del progetto. Un file PDB viene creato quando si compila un programma C/C++ con /ZI o /Zi o un programma Visual Basic, Visual C#o JScript con l'opzione /debug. I file oggetto contengono riferimenti al file con estensione pdb per le informazioni di debug. Per altre informazioni sui file pdb, vedere File PDB. Un'applicazione DIA può usare i passaggi generali seguenti per ottenere informazioni dettagliate sui vari simboli, oggetti ed elementi di dati all'interno di un'immagine eseguibile.

Per eseguire una query sul file con estensione pdb

  1. Acquisire un'origine dati creando un'interfaccia 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. Chiamare IDiaDataSource::loadDataFromPdb o IDiaDataSource::loadDataForExe per caricare le informazioni di debug.

    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. Chiama IDiaDataSource::openSession per aprire una IDiaSession per ottenere l'accesso alle informazioni di debug.

    CComPtr<IDiaSession> psession;
    if ( FAILED( pSource->openSession( &psession ) ) )
    {
        Fatal( "openSession" );
    }
    
  4. Utilizzare i metodi in IDiaSession per eseguire query sui simboli nell'origine dati.

    CComPtr<IDiaSymbol> pglobal;
    if ( FAILED( psession->get_globalScope( &pglobal) ) )
    {
        Fatal( "get_globalScope" );
    }
    
  5. Usare le IDiaEnum* interfacce per enumerare e analizzare i simboli o altri elementi delle informazioni di debug.

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

Vedi anche