QString org_blueberry_core_runtime_Activator::getPluginId(void *symbol)
{
  if (symbol == NULL) return QString();

  if (ctk::DebugSymInitialize())
  {
    std::vector<char> moduleBuffer(sizeof(IMAGEHLP_MODULE64));
    PIMAGEHLP_MODULE64 pModuleInfo = (PIMAGEHLP_MODULE64)&moduleBuffer.front();
    pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64);
    if (SymGetModuleInfo64(GetCurrentProcess(), (DWORD64)symbol, pModuleInfo))
    {
      QString pluginId = pModuleInfo->ModuleName;
      return pluginId.replace('_', '.');
    }
  }
  return QString();
}
示例#2
0
// --------------------------------------------------------------------------
std::string ctkBackTracePrivate::getSymbol(void* ptr) const
{
    if(ptr==0)
        return std::string();

    ctk::DebugSymInitialize();
    std::ostringstream ss;
    ss.imbue(std::locale::classic());
    ss << ptr;
    if(syms_ready)
    {
        DWORD64  dwDisplacement = 0;
        DWORD64  dwAddress = (DWORD64)ptr;

        std::vector<char> buffer(sizeof(SYMBOL_INFO) + MAX_SYM_NAME);
        PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)&buffer.front();

        pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
        pSymbol->MaxNameLen = MAX_SYM_NAME;

        if (SymFromAddr(hProcess, dwAddress, &dwDisplacement, pSymbol))
        {
            ss <<": " << pSymbol->Name << std::hex << " + 0x" << dwDisplacement;
        }
        else
        {
            ss << ": ???";
        }

        std::vector<char> moduleBuffer(sizeof(IMAGEHLP_MODULE64));
        PIMAGEHLP_MODULE64 pModuleInfo = (PIMAGEHLP_MODULE64)&moduleBuffer.front();
        pModuleInfo->SizeOfStruct = sizeof(IMAGEHLP_MODULE64);
        if (SymGetModuleInfo64(hProcess, pSymbol->ModBase, pModuleInfo))
        {
            ss << " in " << pModuleInfo->LoadedImageName;
        }
    }
    return ss.str();
}