Итерация по символам в DIA SDK с помощью getSymbolsByAddr

ЦЕЛЬЯ пытаюсь перечислить адреса всех функций, содержащихся в файле 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.

Так или иначе, где-то есть пустое почтение. Когда я бегу с отладчиком, я могу убедиться, что pEnumSymbolsByAddr не NULL и указатели передаются pEnumSymbolsByAddr->Next не NULL.

Я искал ТАК и обнаружил, что я не одинок: Почему происходит сбой IDiaEnumSymbolsByAddr :: Next?

Я не могу заставить отладчик зайти внутрь msdia140.dll, поэтому я не знаю, что именно не так. Я еще не нашел никого, кто успешно использовал pEnumSymbolsByAddr->Next функция.

2

Решение

Вы забыли инициализировать итератор, используйте IDiaEnumSymbolsByAddr :: symbolByAddr (). Это производит первый символ, вызовите Next (), чтобы перейти к следующему. Просто следуйте за фрагментом, показанным в Статья MSDN:

bool DumpFunctionsNm(IDiaSession *pSession) {
IDiaEnumSymbolsByAddr *pEnumSymbolsByAddr;
IDiaSymbol *pSymbol;
ULONG celt = 0;
wprintf(L"NM style output enabled\n");
if (FAILED(pSession->getSymbolsByAddr(&pEnumSymbolsByAddr))) {
return false;
}
if (FAILED(pEnumSymbolsByAddr->symbolByAddr(1, 0, &pSymbol))) {
pEnumSymbolsByAddr->Release();
return false;
}
do {
// Do something with symbol...
printf("iteration\n");
pSymbol->Release();

if (FAILED(pEnumSymbolsByAddr->Next(1, &pSymbol, &celt))) {
pEnumSymbolsByAddr->Release();
return false;
}
} while (celt == 1);
pEnumSymbolsByAddr->Release();
return true;
}
1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector