Używanie zapytań dotyczących pliku .Pdb

Plik bazy danych programu (rozszerzenie .pdb) to plik binarny zawierający informacje o typie i debugowaniu symbolicznym zebrane w trakcie kompilowania i łączenia projektu. Plik PDB jest tworzony podczas kompilowania programu C/C++ za pomocą / ZI lub /Zi lub Visual Basic, Visual C# lub programu JScript z opcją /debug . Pliki obiektów zawierają odwołania do pliku .pdb na potrzeby debugowania informacji. Aby uzyskać więcej informacji na temat plików pdb, zobacz Pliki PDB. Aplikacja DIA może wykonać następujące ogólne kroki, aby uzyskać szczegółowe informacje o różnych symbolach, obiektach i elementach danych w obrazie wykonywalnym.

Aby wysłać zapytanie do pliku .pdb

  1. Uzyskaj źródło danych, tworząc interfejs 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. Wywołaj metodę IDiaDataSource::loadDataFromPdb lub IDiaDataSource::loadDataForExe , aby załadować informacje debugowania.

    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. Wywołaj metodę IDiaDataSource::openSession, aby otworzyć IDiaSession w celu uzyskania dostępu do informacji debugowania.

    CComPtr<IDiaSession> psession;
    if ( FAILED( pSource->openSession( &psession ) ) )
    {
        Fatal( "openSession" );
    }
    
  4. Użyj metod w pliku IDiaSession , aby wykonywać zapytania dotyczące symboli w źródle danych.

    CComPtr<IDiaSymbol> pglobal;
    if ( FAILED( psession->get_globalScope( &pglobal) ) )
    {
        Fatal( "get_globalScope" );
    }
    
  5. IDiaEnum* Użyj interfejsów, aby wyliczyć i przeskanować symbole lub inne elementy informacji debugowania.

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

Zobacz też