1
0
Fork 0

DBG+GUI: added AddrInfo format string in CPUArgumentWidget

This commit is contained in:
mrexodia 2016-05-29 04:40:19 +02:00
parent 714583f1c2
commit 677a5a5f35
5 changed files with 61 additions and 73 deletions

View File

@ -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
{

View File

@ -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;
}

View File

@ -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)

View File

@ -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.

View File

@ -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)