Share via


Querying the .pdb File

[Note: This topic is pre-release documentation and is subject to change in future releases. Blank topics are included as placeholders.]

[このトピックはプレリリース版のため将来変更される可能性があります。また、プレースホルダとしてブランクのトピックが含まれています。]

A program database file (extension .pdb) is a binary file that contains type and symbolic debugging information gathered over the course of compiling and linking the project. A PDB file is created when you compile a C/C++ program with /ZI or /Zi or a Visual Basic, Visual C#, or JScript program with the /debug option. Object files contain references into the .pdb file for debugging information. For more information on pdb files, see PDB Files (C++). A DIA application can use the following general steps to obtain details about the various symbols, objects, and data elements within an executable image.

To query the .pdb file

  1. Acquire a data source by creating an IDiaDataSource interface.

    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. Call IDiaDataSource::loadDataFromPdb or IDiaDataSource::loadDataForExe to load the debugging information.

    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. Call IDiaDataSource::openSession to open an IDiaSession to gain access to the debugging information.

    CComPtr<
    IDiaSession> psession;
    if ( FAILED( pSource->
    openSession( &psession ) ) ) 
    {
        Fatal( "openSession" );
    }
    
  4. Use the methods in IDiaSession to query for the symbols in the data source.

        CComPtr<IDiaSymbol> pglobal;
        if ( FAILED( psession->
    get_globalScope( &pglobal) ) )
        {
            Fatal( "get_globalScope" );
        }
    
  5. Use the IDiaEnum* interfaces to enumerate and scan through the symbols or other elements of debug information.

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

See Also

IDiaDataSource