diff --git a/src/dbg/debugger.cpp b/src/dbg/debugger.cpp index d327519f..03feaefa 100644 --- a/src/dbg/debugger.cpp +++ b/src/dbg/debugger.cpp @@ -281,13 +281,13 @@ static void printSoftBpInfo(const BREAKPOINT & bp) bptype = "UD2"; else if((titantype & UE_BREAKPOINT_TYPE_LONG_INT3) == UE_BREAKPOINT_TYPE_LONG_INT3) bptype = "LONG INT3"; - const char* symbolicname = SymGetSymbolicName(bp.addr); - if(symbolicname) + auto symbolicname = SymGetSymbolicName(bp.addr); + if(symbolicname.length()) { if(*bp.name) - dprintf("%s breakpoint \"%s\" at %s (" fhex ")!\n", bptype, bp.name, symbolicname, bp.addr); + dprintf("%s breakpoint \"%s\" at %s (" fhex ")!\n", bptype, bp.name, symbolicname.c_str(), bp.addr); else - dprintf("%s breakpoint at %s (" fhex ")!\n", bptype, symbolicname, bp.addr); + dprintf("%s breakpoint at %s (" fhex ")!\n", bptype, symbolicname.c_str(), bp.addr); } else { @@ -332,13 +332,13 @@ static void printHwBpInfo(const BREAKPOINT & bp) bptype = "write"; break; } - const char* symbolicname = SymGetSymbolicName(bp.addr); - if(symbolicname) + auto symbolicname = SymGetSymbolicName(bp.addr); + if(symbolicname.length()) { if(*bp.name) - dprintf("Hardware breakpoint (%s%s) \"%s\" at %s (" fhex ")!\n", bpsize, bptype, bp.name, symbolicname, bp.addr); + dprintf("Hardware breakpoint (%s%s) \"%s\" at %s (" fhex ")!\n", bpsize, bptype, bp.name, symbolicname.c_str(), bp.addr); else - dprintf("Hardware breakpoint (%s%s) at %s (" fhex ")!\n", bpsize, bptype, symbolicname, bp.addr); + dprintf("Hardware breakpoint (%s%s) at %s (" fhex ")!\n", bpsize, bptype, symbolicname.c_str(), bp.addr); } else { @@ -368,12 +368,12 @@ static void printMemBpInfo(const BREAKPOINT & bp, const void* ExceptionAddress) break; } auto symbolicname = SymGetSymbolicName(bp.addr); - if(symbolicname) + if(symbolicname.length()) { if(*bp.name) - dprintf("Memory breakpoint%s \"%s\" at %s (" fhex ", " fhex ")!\n", bptype, bp.name, symbolicname, bp.addr, ExceptionAddress); + dprintf("Memory breakpoint%s \"%s\" at %s (" fhex ", " fhex ")!\n", bptype, bp.name, symbolicname.c_str(), bp.addr, ExceptionAddress); else - dprintf("Memory breakpoint%s at %s (" fhex ", " fhex ")!\n", bptype, symbolicname, bp.addr, ExceptionAddress); + dprintf("Memory breakpoint%s at %s (" fhex ", " fhex ")!\n", bptype, symbolicname.c_str(), bp.addr, ExceptionAddress); } else { diff --git a/src/dbg/stringformat.cpp b/src/dbg/stringformat.cpp index f4f3b2f0..7c7b9a7b 100644 --- a/src/dbg/stringformat.cpp +++ b/src/dbg/stringformat.cpp @@ -1,6 +1,6 @@ #include "stringformat.h" #include "value.h" -#include "disasm_helper.h" +#include "symbolinfo.h" namespace ValueType { @@ -11,43 +11,51 @@ namespace ValueType UnsignedDecimal, Hex, Pointer, - String + String, + AddrInfo }; } static String printValue(FormatValueType value, ValueType::ValueType type) { duint valuint = 0; - auto validval = valfromstring(value, &valuint); - char result[deflen] = "???"; - switch(type) + char string[MAX_STRING_SIZE] = ""; + String result = "???"; + if(valfromstring(value, &valuint)) { - case ValueType::Unknown: - break; - case ValueType::SignedDecimal: - if(validval) - sprintf_s(result, "%" fext "d", valuint); - break; - case ValueType::UnsignedDecimal: - if(validval) - sprintf_s(result, "%" fext "u", valuint); - break; - case ValueType::Hex: - if(validval) - sprintf_s(result, "%" fext "X", valuint); - break; - case ValueType::Pointer: - if(validval) - sprintf_s(result, fhex, valuint); - break; - case ValueType::String: - if(validval) + switch(type) { - char string[MAX_STRING_SIZE] = ""; + case ValueType::Unknown: + break; + case ValueType::SignedDecimal: + result = StringUtils::sprintf("%" fext "d", valuint); + break; + case ValueType::UnsignedDecimal: + result = StringUtils::sprintf("%" fext "u", valuint); + break; + case ValueType::Hex: + result = StringUtils::sprintf("%" fext "X", valuint); + break; + case ValueType::Pointer: + result = StringUtils::sprintf(fhex, valuint); + break; + case ValueType::String: if(DbgGetStringAt(valuint, string)) - strcpy_s(result, _TRUNCATE, string); + result = string; + break; + case ValueType::AddrInfo: + { + auto symbolic = SymGetSymbolicName(valuint); + result = StringUtils::sprintf(fhex, valuint); + if(DbgGetStringAt(valuint, string)) + result += " " + String(string); + else if(symbolic.length()) + result += " " + symbolic; } break; + default: + break; + } } return result; } @@ -75,6 +83,9 @@ static const char* getArgExpressionType(const String & formatString, ValueType:: case 'x': type = ValueType::Hex; break; + case 'a': + type = ValueType::AddrInfo; + break; default: //invalid format return nullptr; } diff --git a/src/dbg/symbolinfo.cpp b/src/dbg/symbolinfo.cpp index 8c2d0a85..578f8c29 100644 --- a/src/dbg/symbolinfo.cpp +++ b/src/dbg/symbolinfo.cpp @@ -225,51 +225,28 @@ bool SymAddrFromName(const char* Name, duint* Address) return true; } -const char* SymGetSymbolicName(duint Address) +String SymGetSymbolicName(duint Address) { // // This resolves an address to a module and symbol: // [modname.]symbolname // char label[MAX_SYM_NAME]; + char modname[MAX_MODULE_SIZE]; + auto hasModule = ModNameFromAddr(Address, modname, false); // User labels have priority, but if one wasn't found, // default to a symbol lookup - if(!LabelGet(Address, label)) + if(!DbgGetLabelAt(Address, SEG_DEFAULT, label)) { - char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(char)]; - - PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer; - symbol->SizeOfStruct = sizeof(SYMBOL_INFO); - symbol->MaxNameLen = MAX_LABEL_SIZE; - - // Perform a symbol lookup - DWORD64 displacement = 0; - - if(!SafeSymFromAddr(fdProcessInfo->hProcess, (DWORD64)Address, &displacement, symbol)) - return nullptr; - - // If the symbol wasn't at offset 0 (start from the beginning) ignore it - if(displacement != 0) - return nullptr; - - // Terminate the string for sanity - symbol->Name[symbol->MaxNameLen - 1] = '\0'; - - if(!bUndecorateSymbolNames || !SafeUnDecorateSymbolName(symbol->Name, label, MAX_SYM_NAME, UNDNAME_COMPLETE)) - strcpy_s(label, symbol->Name); + if(hasModule) + return StringUtils::sprintf("%s." fhex, modname, Address); + return ""; } - // TODO: FIXME: STATIC VARIABLE - static char symbolicname[MAX_MODULE_SIZE + MAX_SYM_NAME]; - char modname[MAX_MODULE_SIZE]; - - if(ModNameFromAddr(Address, modname, false)) - sprintf_s(symbolicname, "%s.%s", modname, label); - else - sprintf_s(symbolicname, "<%s>", label); - - return symbolicname; + if(hasModule) + return StringUtils::sprintf("<%s.%s>", modname, label); + return StringUtils::sprintf("<%s>", label); } bool SymGetSourceLine(duint Cip, char* FileName, int* Line) diff --git a/src/dbg/symbolinfo.h b/src/dbg/symbolinfo.h index f2df1256..60a6bd2e 100644 --- a/src/dbg/symbolinfo.h +++ b/src/dbg/symbolinfo.h @@ -9,7 +9,7 @@ bool SymGetModuleList(std::vector* List); void SymUpdateModuleList(); void SymDownloadAllSymbols(const char* SymbolStore); bool SymAddrFromName(const char* Name, duint* Address); -const char* SymGetSymbolicName(duint Address); +String SymGetSymbolicName(duint Address); /** \brief Gets the source code file name and line from an address. diff --git a/src/gui/Src/Gui/CPUArgumentWidget.h b/src/gui/Src/Gui/CPUArgumentWidget.h index eb9bfc70..6dcc4ea3 100644 --- a/src/gui/Src/Gui/CPUArgumentWidget.h +++ b/src/gui/Src/Gui/CPUArgumentWidget.h @@ -23,7 +23,7 @@ public: { if(format.length()) return format; - return QString("%1 {p:%1}").arg(expression); + return QString("%1 {a:%1}").arg(expression); } static QString defaultArgName(const QString & name, int argN)