Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用getSymbolsByAddr在DIA SDK中迭代符号_C++_Debug Symbols_Pdb Files_Dia Sdk - Fatal编程技术网

C++ 使用getSymbolsByAddr在DIA SDK中迭代符号

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;

目标:我试图列出pdb文件中包含的所有函数的地址

当前方法:我找到了DIA SDK,正在修改dia2dump示例:

我添加了一个新功能:

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;
}