DBG+GUI: added AddrInfo format string in CPUArgumentWidget
This commit is contained in:
parent
714583f1c2
commit
677a5a5f35
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -9,7 +9,7 @@ bool SymGetModuleList(std::vector<SYMBOLMODULEINFO>* 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.
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue