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

另請參閱