Consultando o arquivo .Pdb
Um arquivo de banco de dados do programa (extensão. PDB) é um arquivo binário que contém o tipo e informações de depuração simbólicas reunidas no decorrer de compilação e vinculação do projeto. Um arquivo PDB é criado quando você compila um programa em C/C++ com /ZI ou /Zi ou um Visual Basic, Visual C#, ou JScript de programa com o /debug opção. Arquivos de objeto contêm referências para o arquivo. PDB para informações de depuração. Para obter mais informações sobre arquivos pdb, consulte [OBSOLETO] Arquivos de banco de dados de programa (C++). Um aplicativo de DIA pode usar as seguintes etapas gerais para obter detalhes sobre os vários símbolos, objetos e elementos de dados dentro de uma imagem executável.
Para consultar o arquivo. PDB
Adquirir uma fonte de dados, criando um 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." ); }
Chame IDiaDataSource::loadDataFromPdb ou IDiaDataSource::loadDataForExe para carregar as informações de depuração.
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" ); } }
Chame IDiaDataSource::openSession para abrir um IDiaSession para acessar as informações de depuração.
CComPtr<IDiaSession> psession; if ( FAILED( pSource->openSession( &psession ) ) ) { Fatal( "openSession" ); }
Use os métodos em IDiaSession para consultar os símbolos na fonte de dados.
CComPtr<IDiaSymbol> pglobal; if ( FAILED( psession->get_globalScope( &pglobal) ) ) { Fatal( "get_globalScope" ); }
Use o IDiaEnum* interfaces para enumerar e verificar por meio de símbolos ou outros elementos de informações de depuração.
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. }