From 45b49995f31ac6ede197131aba95dca1cb5f32c0 Mon Sep 17 00:00:00 2001 From: Duncan Ogilvie Date: Mon, 12 Feb 2018 03:09:00 +0100 Subject: [PATCH] DBG: fall back to resolving modules exports when no symbol is found --- src/dbg/symbolsourcebase.h | 1 - src/dbg/symcache.cpp | 39 +++++++++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/dbg/symbolsourcebase.h b/src/dbg/symbolsourcebase.h index bda9326b..1e57b0d3 100644 --- a/src/dbg/symbolsourcebase.h +++ b/src/dbg/symbolsourcebase.h @@ -15,7 +15,6 @@ struct SymbolInfo String decoratedName; String undecoratedName; bool publicSymbol; - bool valid; }; struct LineInfo diff --git a/src/dbg/symcache.cpp b/src/dbg/symcache.cpp index 8e2cb226..fea385f1 100644 --- a/src/dbg/symcache.cpp +++ b/src/dbg/symcache.cpp @@ -2,15 +2,13 @@ #include "dbghelp_safe.h" #include "addrinfo.h" #include "threading.h" -#include "sortedlru.h" +#include -template +/*template using RangeMap = std::map; static RangeMap> symbolRange; -static std::unordered_map symbolName; - -static SortedLRU symbolCache; +static std::unordered_map symbolName;*/ bool SymbolFromAddressExact(duint address, SymbolInfo & symInfo) { @@ -21,11 +19,34 @@ bool SymbolFromAddressExact(duint address, SymbolInfo & symInfo) MODINFO* modInfo = ModInfoFromAddr(address); if(modInfo) { - if(modInfo->symbols->isOpen() == false) - return false; - duint rva = address - modInfo->base; - return modInfo->symbols->findSymbolExact(rva, symInfo); + + // search in symbols + if(modInfo->symbols->isOpen()) + { + if(modInfo->symbols->findSymbolExact(rva, symInfo)) + return true; + } + + // search in module exports + if(modInfo->exports.size()) + { + auto found = std::lower_bound(modInfo->exportsByRva.begin(), modInfo->exportsByRva.end(), rva, [&modInfo](size_t index, duint rva) + { + return modInfo->exports.at(index).rva < rva; + }); + found = found != modInfo->exportsByRva.end() && rva >= modInfo->exports.at(*found).rva ? found : modInfo->exportsByRva.end(); + if(found != modInfo->exportsByRva.end()) + { + auto & modExport = modInfo->exports.at(*found); + symInfo.va = modExport.rva + modInfo->base; + symInfo.size = 0; + symInfo.disp = 0; + symInfo.decoratedName = modExport.name; + symInfo.publicSymbol = true; + return true; + } + } } return false;