Decoder::decoder_status Decoder::decode(address addr, char *buf, int buflen, int *offset) { assert(_initialized, "Decoder not yet initialized"); if (_pfnSymGetSymFromAddr64 != NULL) { PIMAGEHLP_SYMBOL64 pSymbol; char symbolInfo[MAX_PATH + sizeof(IMAGEHLP_SYMBOL64)]; pSymbol = (PIMAGEHLP_SYMBOL64)symbolInfo; pSymbol->MaxNameLength = MAX_PATH; pSymbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); DWORD64 displacement; if (_pfnSymGetSymFromAddr64(::GetCurrentProcess(), (DWORD64)addr, &displacement, pSymbol)) { if (buf != NULL) { if (!demangle(pSymbol->Name, buf, buflen)) { jio_snprintf(buf, buflen, "%s", pSymbol->Name); } } if (offset != NULL) *offset = (int)displacement; return no_error; } } return helper_not_found; }
bool WindowsDecoder::decode(address addr, char *buf, int buflen, int* offset, const char* modulepath) { if (_pfnSymGetSymFromAddr64 != NULL) { PIMAGEHLP_SYMBOL64 pSymbol; char symbolInfo[MAX_PATH + sizeof(IMAGEHLP_SYMBOL64)]; pSymbol = (PIMAGEHLP_SYMBOL64)symbolInfo; pSymbol->MaxNameLength = MAX_PATH; pSymbol->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); DWORD64 displacement; if (_pfnSymGetSymFromAddr64(::GetCurrentProcess(), (DWORD64)addr, &displacement, pSymbol)) { if (buf != NULL) { if (demangle(pSymbol->Name, buf, buflen)) { jio_snprintf(buf, buflen, "%s", pSymbol->Name); } } if(offset != NULL) *offset = (int)displacement; return true; } } if (buf != NULL && buflen > 0) buf[0] = '\0'; if (offset != NULL) *offset = -1; return false; }