C++ 使用getSymbolsByAddr在DIA SDK中迭代符号
目标:我试图列出pdb文件中包含的所有函数的地址 当前方法:我找到了DIA SDK,正在修改dia2dump示例: 我添加了一个新功能:C++ 使用getSymbolsByAddr在DIA SDK中迭代符号,c++,debug-symbols,pdb-files,dia-sdk,C++,Debug Symbols,Pdb Files,Dia Sdk,目标:我试图列出pdb文件中包含的所有函数的地址 当前方法:我找到了DIA SDK,正在修改dia2dump示例: 我添加了一个新功能: bool DumpFunctionsNm(IDiaSession *pSession) { IDiaEnumSymbolsByAddr *pEnumSymbolsByAddr; IDiaSymbol *pSymbol = (IDiaSymbol *) malloc(sizeof(IDiaSymbol)*2); ULONG celt = 0;
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
我这样搜寻,发现我并不孤单:
我无法让调试器进入msdia140.dll,因此我不知道到底出了什么问题。我还没有找到任何人成功地使用了
penumsymbolbybyaddr->Next
功能 如果忘记初始化迭代器,请使用IDiaEnumSymbolsByAddr::symbolByAddr()。如果生成第一个符号,则调用Next()移动到下一个符号。只需按照中显示的代码段进行操作:
:“通过按图像节号和偏移量执行查找来定位枚举器。”听起来您必须在使用枚举器之前初始化它,方法是在迭代剩余符号之前调用
symbolByAddr
接口函数。我相信代码正在泄漏COM对象,无论是失败还是成功IDiaEnumSymbolsByAddr
和IDiaSymbol
应该是Release()
d。不幸的是,MSDN决定使用smartpointer库,而不是直接用C提供示例代码。@IInspectable是的,我的原始代码被截断了(Release()
s位于部分)
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;
}