使用 getSymbolsByAddr 遍历 DIA SDK 中的符号
Iterating through Symbols in DIA SDK with getSymbolsByAddr
GOAL: 我试图列出 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 并且传递给 pEnumSymbolsByAddr->Next
的指针不为 NULL。
我搜索了SO,发现我并不孤单:Why does IDiaEnumSymbolsByAddr::Next crash?
我无法让调试器进入 msdia140.dll,所以我不知道到底出了什么问题。我还没有找到成功使用 pEnumSymbolsByAddr->Next
函数的人。
您忘记初始化迭代器,请使用 IDiaEnumSymbolsByAddr::symbolByAddr()。生成第一个符号,调用 Next() 移动到下一个。只需按照 MSDN article:
中显示的代码段
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;
}
GOAL: 我试图列出 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 并且传递给 pEnumSymbolsByAddr->Next
的指针不为 NULL。
我搜索了SO,发现我并不孤单:Why does IDiaEnumSymbolsByAddr::Next crash?
我无法让调试器进入 msdia140.dll,所以我不知道到底出了什么问题。我还没有找到成功使用 pEnumSymbolsByAddr->Next
函数的人。
您忘记初始化迭代器,请使用 IDiaEnumSymbolsByAddr::symbolByAddr()。生成第一个符号,调用 Next() 移动到下一个。只需按照 MSDN article:
中显示的代码段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;
}