Step by Step: 데이터베이스 파일(*.pdb) 쿼리하는 방법

소개

프로그램 데이터베이스 파일(*.pdb)은 프로젝트를 컴파일하고 링크하는 단계에서 수집된 타입정보와 디버깅에 필요한 다양한 심볼 정보를 저장하고 있는 이진 파일입니다. PDB 파일은 C/C++ 프로그램의 경우 컴파일 시 /ZI나 /Zi 옵션을 이용하여 생성할 수 있고, Visual Basic, Visual C#, Jscript의 경우 /debug 옵션을 이용하여 생성할 수 있습니다.

본 문서는 Visual C++와 DIA(Debugging Interface Access) SDK를 이용하여 pdb 파일의 내용을 읽고 정보를 조회하는 방법을 설명합니다.



방법

  1. 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. IDiaDataSource::loadDataFromPdb() 또는 IDiaDataSource::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. IDiaSessionmethod를 이용하여 로드된 디버깅 정보로부터 쿼리를 수행하세요.
    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.
    }

의견 보내기

의견 보내기
Microsoft 고객지원 사이트에서는 고객님의 소리를 귀담아 듣습니다. 아래 의견 보내기로 소중한 의견 보내주시기 바랍니다.
속성

문서 ID: 2461217 - 마지막 검토: 2014. 5. 26. - 수정: 1

피드백