__declspec(noinline) bool CanSymbolizeAddress(DWORD64 addr) { static const int MAX_SYM_LEN = 512; char buf[sizeof(SYMBOL_INFO) + MAX_SYM_LEN * sizeof(char)]; SYMBOL_INFO *symInfo = (SYMBOL_INFO*)buf; memset(buf, 0, sizeof(buf)); symInfo->SizeOfStruct = sizeof(SYMBOL_INFO); symInfo->MaxNameLen = MAX_SYM_LEN; DWORD64 symDisp = 0; BOOL ok = _SymFromAddr(GetCurrentProcess(), addr, &symDisp, symInfo); return ok && symInfo->Name[0]; }
static void GetAddressInfo(str::Str<char>& s, DWORD64 addr) { static const int MAX_SYM_LEN = 512; char buf[sizeof(SYMBOL_INFO) + MAX_SYM_LEN * sizeof(char)]; SYMBOL_INFO *symInfo = (SYMBOL_INFO*)buf; memset(buf, 0, sizeof(buf)); symInfo->SizeOfStruct = sizeof(SYMBOL_INFO); symInfo->MaxNameLen = MAX_SYM_LEN; DWORD64 symDisp = 0; char *symName = nullptr; BOOL ok = _SymFromAddr(GetCurrentProcess(), addr, &symDisp, symInfo); if (ok) symName = &(symInfo->Name[0]); char module[MAX_PATH] = { 0 }; DWORD section; DWORD_PTR offset; if (GetAddrInfo((void*)addr, module, sizeof(module), section, offset)) { str::ToLower(module); const char *moduleShort = path::GetBaseName(module); AppendAddress(s, addr); s.AppendFmt(" %02X:", section); AppendAddress(s, offset); s.AppendFmt(" %s", moduleShort); if (symName) { s.AppendFmt("!%s+0x%x", symName, (int)symDisp); } else if (symDisp != 0) { s.AppendFmt("+0x%x", (int)symDisp); } IMAGEHLP_LINE64 line; line.SizeOfStruct = sizeof(IMAGEHLP_LINE64); DWORD disp; if (_SymGetLineFromAddr64(GetCurrentProcess(), addr, &disp, &line)) { s.AppendFmt(" %s+%d", line.FileName, line.LineNumber); } } else { AppendAddress(s, addr); } s.Append("\r\n"); }