查询 .Pdb 文件

程序数据库文件(扩展名 .pdb)是一个二进制文件,包含了在编译和链接项目的过程中收集的类型和符号调试信息。 当你用 /ZI 或 /Zi 编译 C/C++ 程序,或用 /debug 选项编译 Visual Basic、Visual C# 或 JScript 程序时,会创建一个 PDB 文件。 对于调试信息,对象文件包含对 .pdb 文件的引用。 有关 pdb 文件的详细信息,请参阅 PDB 文件。 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::loadDataFromPdbIDiaDataSource::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.
    }
    

另请参阅