目標: pdb ファイルに含まれるすべての関数のアドレスを一覧表示しようとしています。
現在のアプローチ: DIA SDK を見つけ、dia2dump の例を変更しています: https://msdn.microsoft.com/en-us/library/hd8h6f46.aspx
新しい機能を追加しました:
bool DumpFunctionsNm(IDiaSession *pSession) {
IDiaEnumSymbolsByAddr *pEnumSymbolsByAddr;
IDiaSymbol *pSymbol = (IDiaSymbol *) malloc(sizeof(IDiaSymbol)*2);
ULONG celt = 0;
wprintf(L"NM style output enabled\n");
if (FAILED(pSession->getSymbolsByAddr(&pEnumSymbolsByAddr))){
return false;
}
while (SUCCEEDED(pEnumSymbolsByAddr->Next(1, &pSymbol, &celt)) && (celt == 1)) {
IDiaEnumSymbols *pEnumFunction;
printf("iteration\n");
}
...
しかし、(有効な pdb ファイルで) 実行するたびに、次の例外が発生します。
Exception thrown at 0x0FE1537B (msdia140.dll) in Dia2Dump.exe: 0xC0000005: Access violation reading location 0x00000000.
If there is a handler for this exception, the program may be safely continued.
それで、どういうわけか、どこかに NULL の参照があります。デバッガーで実行しているとき、それpEnumSymbolsByAddrが NULL ではなく、渡されるポインターが NULL でないことを確認できpEnumSymbolsByAddr->Nextます。
SO を検索したところ、私だけではないことがわかりました: IDiaEnumSymbolsByAddr::Next がクラッシュするのはなぜですか?
デバッガを msdia140.dll 内にステップインさせることができないため、正確に何が問題なのかわかりません。この機能をうまく使った人をまだ見つけていませんpEnumSymbolsByAddr->Next。