Skip to content

Commit 677a5a5

Browse files
committed
DBG+GUI: added AddrInfo format string in CPUArgumentWidget
1 parent 714583f commit 677a5a5

File tree

5 files changed

+61
-73
lines changed

5 files changed

+61
-73
lines changed

src/dbg/debugger.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -281,13 +281,13 @@ static void printSoftBpInfo(const BREAKPOINT & bp)
281281
bptype = "UD2";
282282
else if((titantype & UE_BREAKPOINT_TYPE_LONG_INT3) == UE_BREAKPOINT_TYPE_LONG_INT3)
283283
bptype = "LONG INT3";
284-
const char* symbolicname = SymGetSymbolicName(bp.addr);
285-
if(symbolicname)
284+
auto symbolicname = SymGetSymbolicName(bp.addr);
285+
if(symbolicname.length())
286286
{
287287
if(*bp.name)
288-
dprintf("%s breakpoint \"%s\" at %s (" fhex ")!\n", bptype, bp.name, symbolicname, bp.addr);
288+
dprintf("%s breakpoint \"%s\" at %s (" fhex ")!\n", bptype, bp.name, symbolicname.c_str(), bp.addr);
289289
else
290-
dprintf("%s breakpoint at %s (" fhex ")!\n", bptype, symbolicname, bp.addr);
290+
dprintf("%s breakpoint at %s (" fhex ")!\n", bptype, symbolicname.c_str(), bp.addr);
291291
}
292292
else
293293
{
@@ -332,13 +332,13 @@ static void printHwBpInfo(const BREAKPOINT & bp)
332332
bptype = "write";
333333
break;
334334
}
335-
const char* symbolicname = SymGetSymbolicName(bp.addr);
336-
if(symbolicname)
335+
auto symbolicname = SymGetSymbolicName(bp.addr);
336+
if(symbolicname.length())
337337
{
338338
if(*bp.name)
339-
dprintf("Hardware breakpoint (%s%s) \"%s\" at %s (" fhex ")!\n", bpsize, bptype, bp.name, symbolicname, bp.addr);
339+
dprintf("Hardware breakpoint (%s%s) \"%s\" at %s (" fhex ")!\n", bpsize, bptype, bp.name, symbolicname.c_str(), bp.addr);
340340
else
341-
dprintf("Hardware breakpoint (%s%s) at %s (" fhex ")!\n", bpsize, bptype, symbolicname, bp.addr);
341+
dprintf("Hardware breakpoint (%s%s) at %s (" fhex ")!\n", bpsize, bptype, symbolicname.c_str(), bp.addr);
342342
}
343343
else
344344
{
@@ -368,12 +368,12 @@ static void printMemBpInfo(const BREAKPOINT & bp, const void* ExceptionAddress)
368368
break;
369369
}
370370
auto symbolicname = SymGetSymbolicName(bp.addr);
371-
if(symbolicname)
371+
if(symbolicname.length())
372372
{
373373
if(*bp.name)
374-
dprintf("Memory breakpoint%s \"%s\" at %s (" fhex ", " fhex ")!\n", bptype, bp.name, symbolicname, bp.addr, ExceptionAddress);
374+
dprintf("Memory breakpoint%s \"%s\" at %s (" fhex ", " fhex ")!\n", bptype, bp.name, symbolicname.c_str(), bp.addr, ExceptionAddress);
375375
else
376-
dprintf("Memory breakpoint%s at %s (" fhex ", " fhex ")!\n", bptype, symbolicname, bp.addr, ExceptionAddress);
376+
dprintf("Memory breakpoint%s at %s (" fhex ", " fhex ")!\n", bptype, symbolicname.c_str(), bp.addr, ExceptionAddress);
377377
}
378378
else
379379
{

src/dbg/stringformat.cpp

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "stringformat.h"
22
#include "value.h"
3-
#include "disasm_helper.h"
3+
#include "symbolinfo.h"
44

55
namespace ValueType
66
{
@@ -11,43 +11,51 @@ namespace ValueType
1111
UnsignedDecimal,
1212
Hex,
1313
Pointer,
14-
String
14+
String,
15+
AddrInfo
1516
};
1617
}
1718

1819
static String printValue(FormatValueType value, ValueType::ValueType type)
1920
{
2021
duint valuint = 0;
21-
auto validval = valfromstring(value, &valuint);
22-
char result[deflen] = "???";
23-
switch(type)
22+
char string[MAX_STRING_SIZE] = "";
23+
String result = "???";
24+
if(valfromstring(value, &valuint))
2425
{
25-
case ValueType::Unknown:
26-
break;
27-
case ValueType::SignedDecimal:
28-
if(validval)
29-
sprintf_s(result, "%" fext "d", valuint);
30-
break;
31-
case ValueType::UnsignedDecimal:
32-
if(validval)
33-
sprintf_s(result, "%" fext "u", valuint);
34-
break;
35-
case ValueType::Hex:
36-
if(validval)
37-
sprintf_s(result, "%" fext "X", valuint);
38-
break;
39-
case ValueType::Pointer:
40-
if(validval)
41-
sprintf_s(result, fhex, valuint);
42-
break;
43-
case ValueType::String:
44-
if(validval)
26+
switch(type)
27+
{
28+
case ValueType::Unknown:
29+
break;
30+
case ValueType::SignedDecimal:
31+
result = StringUtils::sprintf("%" fext "d", valuint);
32+
break;
33+
case ValueType::UnsignedDecimal:
34+
result = StringUtils::sprintf("%" fext "u", valuint);
35+
break;
36+
case ValueType::Hex:
37+
result = StringUtils::sprintf("%" fext "X", valuint);
38+
break;
39+
case ValueType::Pointer:
40+
result = StringUtils::sprintf(fhex, valuint);
41+
break;
42+
case ValueType::String:
43+
if(DbgGetStringAt(valuint, string))
44+
result = string;
45+
break;
46+
case ValueType::AddrInfo:
4547
{
46-
char string[MAX_STRING_SIZE] = "";
48+
auto symbolic = SymGetSymbolicName(valuint);
49+
result = StringUtils::sprintf(fhex, valuint);
4750
if(DbgGetStringAt(valuint, string))
48-
strcpy_s(result, _TRUNCATE, string);
51+
result += " " + String(string);
52+
else if(symbolic.length())
53+
result += " " + symbolic;
4954
}
5055
break;
56+
default:
57+
break;
58+
}
5159
}
5260
return result;
5361
}
@@ -75,6 +83,9 @@ static const char* getArgExpressionType(const String & formatString, ValueType::
7583
case 'x':
7684
type = ValueType::Hex;
7785
break;
86+
case 'a':
87+
type = ValueType::AddrInfo;
88+
break;
7889
default: //invalid format
7990
return nullptr;
8091
}

src/dbg/symbolinfo.cpp

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -225,51 +225,28 @@ bool SymAddrFromName(const char* Name, duint* Address)
225225
return true;
226226
}
227227

228-
const char* SymGetSymbolicName(duint Address)
228+
String SymGetSymbolicName(duint Address)
229229
{
230230
//
231231
// This resolves an address to a module and symbol:
232232
// [modname.]symbolname
233233
//
234234
char label[MAX_SYM_NAME];
235+
char modname[MAX_MODULE_SIZE];
236+
auto hasModule = ModNameFromAddr(Address, modname, false);
235237

236238
// User labels have priority, but if one wasn't found,
237239
// default to a symbol lookup
238-
if(!LabelGet(Address, label))
240+
if(!DbgGetLabelAt(Address, SEG_DEFAULT, label))
239241
{
240-
char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(char)];
241-
242-
PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer;
243-
symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
244-
symbol->MaxNameLen = MAX_LABEL_SIZE;
245-
246-
// Perform a symbol lookup
247-
DWORD64 displacement = 0;
248-
249-
if(!SafeSymFromAddr(fdProcessInfo->hProcess, (DWORD64)Address, &displacement, symbol))
250-
return nullptr;
251-
252-
// If the symbol wasn't at offset 0 (start from the beginning) ignore it
253-
if(displacement != 0)
254-
return nullptr;
255-
256-
// Terminate the string for sanity
257-
symbol->Name[symbol->MaxNameLen - 1] = '\0';
258-
259-
if(!bUndecorateSymbolNames || !SafeUnDecorateSymbolName(symbol->Name, label, MAX_SYM_NAME, UNDNAME_COMPLETE))
260-
strcpy_s(label, symbol->Name);
242+
if(hasModule)
243+
return StringUtils::sprintf("%s." fhex, modname, Address);
244+
return "";
261245
}
262246

263-
// TODO: FIXME: STATIC VARIABLE
264-
static char symbolicname[MAX_MODULE_SIZE + MAX_SYM_NAME];
265-
char modname[MAX_MODULE_SIZE];
266-
267-
if(ModNameFromAddr(Address, modname, false))
268-
sprintf_s(symbolicname, "%s.%s", modname, label);
269-
else
270-
sprintf_s(symbolicname, "<%s>", label);
271-
272-
return symbolicname;
247+
if(hasModule)
248+
return StringUtils::sprintf("<%s.%s>", modname, label);
249+
return StringUtils::sprintf("<%s>", label);
273250
}
274251

275252
bool SymGetSourceLine(duint Cip, char* FileName, int* Line)

src/dbg/symbolinfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ bool SymGetModuleList(std::vector<SYMBOLMODULEINFO>* List);
99
void SymUpdateModuleList();
1010
void SymDownloadAllSymbols(const char* SymbolStore);
1111
bool SymAddrFromName(const char* Name, duint* Address);
12-
const char* SymGetSymbolicName(duint Address);
12+
String SymGetSymbolicName(duint Address);
1313

1414
/**
1515
\brief Gets the source code file name and line from an address.

src/gui/Src/Gui/CPUArgumentWidget.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class CPUArgumentWidget : public QWidget
2323
{
2424
if(format.length())
2525
return format;
26-
return QString("%1 {p:%1}").arg(expression);
26+
return QString("%1 {a:%1}").arg(expression);
2727
}
2828

2929
static QString defaultArgName(const QString & name, int argN)

0 commit comments

Comments
 (0)