Skip to content

Commit

Permalink
Deduplicate the code for editing a breakpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
mrexodia committed Mar 7, 2024
1 parent 3cc080c commit 5a08d29
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 100 deletions.
62 changes: 3 additions & 59 deletions src/gui/Src/Gui/BreakpointsView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -631,66 +631,13 @@ void BreakpointsView::editBreakpointSlot()
if(!isValidBp())
return;
const auto & bp = selectedBp();
if(bp.type == bp_dll)
if(bp.type == bp_dll || bp.type == bp_exception)
{
Breakpoints::editBP(bp_dll, bp.module, this);
}
else if(bp.active || bp.type == bp_exception)
{
Breakpoints::editBP(bp.type, ToPtrString(bp.addr), this);
Breakpoints::editBP(bp.type, bp.module, bp.addr, this);
}
else
{
QString addrText = QString().sprintf("\"%s\":$%X", bp.module, bp.addr);
EditBreakpointDialog dialog(this, bp);
if(dialog.exec() != QDialog::Accepted)
return;
auto exec = [](const QString & command)
{
DbgCmdExecDirect(command);
};
const auto & newBp = dialog.getBp();
switch(bp.type)
{
case bp_normal:
exec(QString("SetBreakpointName %1, \"%2\"").arg(addrText).arg(newBp.name));
exec(QString("SetBreakpointCondition %1, \"%2\"").arg(addrText).arg(newBp.breakCondition));
exec(QString("SetBreakpointLog %1, \"%2\"").arg(addrText).arg(newBp.logText));
exec(QString("SetBreakpointLogCondition %1, \"%2\"").arg(addrText).arg(newBp.logCondition));
exec(QString("SetBreakpointCommand %1, \"%2\"").arg(addrText).arg(newBp.commandText));
exec(QString("SetBreakpointCommandCondition %1, \"%2\"").arg(addrText).arg(newBp.commandCondition));
exec(QString("ResetBreakpointHitCount %1, %2").arg(addrText).arg(ToPtrString(newBp.hitCount)));
exec(QString("SetBreakpointFastResume %1, %2").arg(addrText).arg(newBp.fastResume));
exec(QString("SetBreakpointSilent %1, %2").arg(addrText).arg(newBp.silent));
exec(QString("SetBreakpointSingleshoot %1, %2").arg(addrText).arg(newBp.singleshoot));
break;
case bp_hardware:
exec(QString("SetHardwareBreakpointName %1, \"%2\"").arg(addrText).arg(newBp.name));
exec(QString("SetHardwareBreakpointCondition %1, \"%2\"").arg(addrText).arg(newBp.breakCondition));
exec(QString("SetHardwareBreakpointLog %1, \"%2\"").arg(addrText).arg(newBp.logText));
exec(QString("SetHardwareBreakpointLogCondition %1, \"%2\"").arg(addrText).arg(newBp.logCondition));
exec(QString("SetHardwareBreakpointCommand %1, \"%2\"").arg(addrText).arg(newBp.commandText));
exec(QString("SetHardwareBreakpointCommandCondition %1, \"%2\"").arg(addrText).arg(newBp.commandCondition));
exec(QString("ResetHardwareBreakpointHitCount %1, %2").arg(addrText).arg(ToPtrString(newBp.hitCount)));
exec(QString("SetHardwareBreakpointFastResume %1, %2").arg(addrText).arg(newBp.fastResume));
exec(QString("SetHardwareBreakpointSilent %1, %2").arg(addrText).arg(newBp.silent));
exec(QString("SetHardwareBreakpointSingleshoot %1, %2").arg(addrText).arg(newBp.singleshoot));
break;
case bp_memory:
exec(QString("SetMemoryBreakpointName %1, \"\"%2\"\"").arg(addrText).arg(newBp.name));
exec(QString("SetMemoryBreakpointCondition %1, \"%2\"").arg(addrText).arg(newBp.breakCondition));
exec(QString("SetMemoryBreakpointLog %1, \"%2\"").arg(addrText).arg(newBp.logText));
exec(QString("SetMemoryBreakpointLogCondition %1, \"%2\"").arg(addrText).arg(newBp.logCondition));
exec(QString("SetMemoryBreakpointCommand %1, \"%2\"").arg(addrText).arg(newBp.commandText));
exec(QString("SetMemoryBreakpointCommandCondition %1, \"%2\"").arg(addrText).arg(newBp.commandCondition));
exec(QString("ResetMemoryBreakpointHitCount %1, %2").arg(addrText).arg(ToPtrString(newBp.hitCount)));
exec(QString("SetMemoryBreakpointFastResume %1, %2").arg(addrText).arg(newBp.fastResume));
exec(QString("SetMemoryBreakpointSilent %1, %2").arg(addrText).arg(newBp.silent));
exec(QString("SetMemoryBreakpointSingleshoot %1, %2").arg(addrText).arg(newBp.singleshoot));
break;
default:
break;
}
Breakpoints::editBP(bp.type, bp.active ? QString() : bp.module, bp.addr, this);
}
}

Expand Down Expand Up @@ -720,9 +667,6 @@ void BreakpointsView::resetHitCountBreakpointSlot()
return QString("invalid");
}
}());
QString cmd;

DbgCmdExecDirect(cmd);
}
}

Expand Down
92 changes: 55 additions & 37 deletions src/gui/Src/Utils/Breakpoints.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,20 +217,33 @@ bool Breakpoints::BPTrival(BPXTYPE type, duint va)
bp.silent;
}

bool Breakpoints::editBP(BPXTYPE type, const QString & addrText, QWidget* widget, const QString & createCommand)
bool Breakpoints::editBP(BPXTYPE type, const QString & module, duint address, QWidget* widget, const QString & createCommand)
{
QString addrText;
BP_REF ref;
switch(type)
{
case bp_dll:
DbgFunctions()->BpRefDll(&ref, addrText.toUtf8().constData());
addrText = module;
DbgFunctions()->BpRefDll(&ref, module.toUtf8().constData());
break;
case bp_exception:
DbgFunctions()->BpRefException(&ref, (duint)addrText.toULongLong(nullptr, 16));
addrText = ToHexString(address);
DbgFunctions()->BpRefException(&ref, address);
break;
default:
if(!DbgFunctions()->BpRefVa(&ref, type, (duint)addrText.toULongLong(nullptr, 16)))
return false;
if(!module.isEmpty())
{
addrText = QString("\"%1\":$%2").arg(module).arg(ToHexString(address));
if(!DbgFunctions()->BpRefRva(&ref, type, module.toUtf8().constData(), address))
return false;
}
else
{
addrText = ToHexString(address);
if(!DbgFunctions()->BpRefVa(&ref, type, address))
return false;
}
break;
}

Expand All @@ -242,11 +255,16 @@ bool Breakpoints::editBP(BPXTYPE type, const QString & addrText, QWidget* widget
bp.type = type;
if(type == bp_dll)
{
bp.module = addrText;
bp.module = module;
}
else if(type == bp_exception)
{
bp.addr = address;
}
else
{
bp.addr = (duint)addrText.toULongLong(nullptr, 16);
bp.module = module;
bp.addr = address;
}
}
else if(!found)
Expand Down Expand Up @@ -278,65 +296,65 @@ bool Breakpoints::editBP(BPXTYPE type, const QString & addrText, QWidget* widget
switch(type)
{
case bp_normal:
exec(QString("SetBreakpointName %1, \"%2\"").arg(addrText).arg(bp.name));
exec(QString("SetBreakpointCondition %1, \"%2\"").arg(addrText).arg(bp.breakCondition));
exec(QString("SetBreakpointLog %1, \"%2\"").arg(addrText).arg(bp.logText));
exec(QString("SetBreakpointLogCondition %1, \"%2\"").arg(addrText).arg(bp.logCondition));
exec(QString("SetBreakpointName %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.name)));
exec(QString("SetBreakpointCondition %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.breakCondition)));
exec(QString("SetBreakpointLog %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.logText)));
exec(QString("SetBreakpointLogCondition %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.logCondition)));
exec(QString("SetBreakpointLogFile %1, \"%2\"").arg(addrText).arg(bp.logFile));
exec(QString("SetBreakpointCommand %1, \"%2\"").arg(addrText).arg(bp.commandText));
exec(QString("SetBreakpointCommandCondition %1, \"%2\"").arg(addrText).arg(bp.commandCondition));
exec(QString("SetBreakpointCommand %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.commandText)));
exec(QString("SetBreakpointCommandCondition %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.commandCondition)));
exec(QString("ResetBreakpointHitCount %1, %2").arg(addrText).arg(ToPtrString(bp.hitCount)));
exec(QString("SetBreakpointFastResume %1, %2").arg(addrText).arg(bp.fastResume));
exec(QString("SetBreakpointSilent %1, %2").arg(addrText).arg(bp.silent));
exec(QString("SetBreakpointSingleshoot %1, %2").arg(addrText).arg(bp.singleshoot));
break;
case bp_hardware:
exec(QString("SetHardwareBreakpointName %1, \"%2\"").arg(addrText).arg(bp.name));
exec(QString("SetHardwareBreakpointCondition %1, \"%2\"").arg(addrText).arg(bp.breakCondition));
exec(QString("SetHardwareBreakpointLog %1, \"%2\"").arg(addrText).arg(bp.logText));
exec(QString("SetHardwareBreakpointLogCondition %1, \"%2\"").arg(addrText).arg(bp.logCondition));
exec(QString("SetHardwareBreakpointName %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.name)));
exec(QString("SetHardwareBreakpointCondition %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.breakCondition)));
exec(QString("SetHardwareBreakpointLog %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.logText)));
exec(QString("SetHardwareBreakpointLogCondition %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.logCondition)));
exec(QString("SetHardwareBreakpointLogFile %1, \"%2\"").arg(addrText).arg(bp.logFile));
exec(QString("SetHardwareBreakpointCommand %1, \"%2\"").arg(addrText).arg(bp.commandText));
exec(QString("SetHardwareBreakpointCommandCondition %1, \"%2\"").arg(addrText).arg(bp.commandCondition));
exec(QString("SetHardwareBreakpointCommand %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.commandText)));
exec(QString("SetHardwareBreakpointCommandCondition %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.commandCondition)));
exec(QString("ResetHardwareBreakpointHitCount %1, %2").arg(addrText).arg(ToPtrString(bp.hitCount)));
exec(QString("SetHardwareBreakpointFastResume %1, %2").arg(addrText).arg(bp.fastResume));
exec(QString("SetHardwareBreakpointSilent %1, %2").arg(addrText).arg(bp.silent));
exec(QString("SetHardwareBreakpointSingleshoot %1, %2").arg(addrText).arg(bp.singleshoot));
break;
case bp_memory:
exec(QString("SetMemoryBreakpointName %1, \"\"%2\"\"").arg(addrText).arg(bp.name));
exec(QString("SetMemoryBreakpointCondition %1, \"%2\"").arg(addrText).arg(bp.breakCondition));
exec(QString("SetMemoryBreakpointLog %1, \"%2\"").arg(addrText).arg(bp.logText));
exec(QString("SetMemoryBreakpointLogCondition %1, \"%2\"").arg(addrText).arg(bp.logCondition));
exec(QString("SetMemoryBreakpointName %1, \"\"%2\"\"").arg(addrText).arg(DbgCmdEscape(bp.name)));
exec(QString("SetMemoryBreakpointCondition %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.breakCondition)));
exec(QString("SetMemoryBreakpointLog %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.logText)));
exec(QString("SetMemoryBreakpointLogCondition %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.logCondition)));
exec(QString("SetMemoryBreakpointLogFile %1, \"%2\"").arg(addrText).arg(bp.logFile));
exec(QString("SetMemoryBreakpointCommand %1, \"%2\"").arg(addrText).arg(bp.commandText));
exec(QString("SetMemoryBreakpointCommandCondition %1, \"%2\"").arg(addrText).arg(bp.commandCondition));
exec(QString("SetMemoryBreakpointCommand %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.commandText)));
exec(QString("SetMemoryBreakpointCommandCondition %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.commandCondition)));
exec(QString("ResetMemoryBreakpointHitCount %1, %2").arg(addrText).arg(ToPtrString(bp.hitCount)));
exec(QString("SetMemoryBreakpointFastResume %1, %2").arg(addrText).arg(bp.fastResume));
exec(QString("SetMemoryBreakpointSilent %1, %2").arg(addrText).arg(bp.silent));
exec(QString("SetMemoryBreakpointSingleshoot %1, %2").arg(addrText).arg(bp.singleshoot));
break;
case bp_dll:
exec(QString("SetLibrarianBreakpointName \"%1\", \"\"%2\"\"").arg(addrText).arg(bp.name));
exec(QString("SetLibrarianBreakpointCondition \"%1\", \"%2\"").arg(addrText).arg(bp.breakCondition));
exec(QString("SetLibrarianBreakpointLog \"%1\", \"%2\"").arg(addrText).arg(bp.logText));
exec(QString("SetLibrarianBreakpointLogCondition \"%1\", \"%2\"").arg(addrText).arg(bp.logCondition));
exec(QString("SetLibrarianBreakpointName \"%1\", \"\"%2\"\"").arg(addrText).arg(DbgCmdEscape(bp.name)));
exec(QString("SetLibrarianBreakpointCondition \"%1\", \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.breakCondition)));
exec(QString("SetLibrarianBreakpointLog \"%1\", \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.logText)));
exec(QString("SetLibrarianBreakpointLogCondition \"%1\", \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.logCondition)));
exec(QString("SetLibrarianBreakpointLogFile \"%1\", \"%2\"").arg(addrText).arg(bp.logFile));
exec(QString("SetLibrarianBreakpointCommand \"%1\", \"%2\"").arg(addrText).arg(bp.commandText));
exec(QString("SetLibrarianBreakpointCommandCondition \"%1\", \"%2\"").arg(addrText).arg(bp.commandCondition));
exec(QString("SetLibrarianBreakpointCommand \"%1\", \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.commandText)));
exec(QString("SetLibrarianBreakpointCommandCondition \"%1\", \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.commandCondition)));
exec(QString("ResetLibrarianBreakpointHitCount \"%1\", %2").arg(addrText).arg(ToPtrString(bp.hitCount)));
exec(QString("SetLibrarianBreakpointFastResume \"%1\", %2").arg(addrText).arg(bp.fastResume));
exec(QString("SetLibrarianBreakpointSilent \"%1\", %2").arg(addrText).arg(bp.silent));
exec(QString("SetLibrarianBreakpointSingleshoot \"%1\", %2").arg(addrText).arg(bp.singleshoot));
break;
case bp_exception:
exec(QString("SetExceptionBreakpointName %1, \"%2\"").arg(addrText).arg(bp.name));
exec(QString("SetExceptionBreakpointCondition %1, \"%2\"").arg(addrText).arg(bp.breakCondition));
exec(QString("SetExceptionBreakpointLog %1, \"%2\"").arg(addrText).arg(bp.logText));
exec(QString("SetExceptionBreakpointLogCondition %1, \"%2\"").arg(addrText).arg(bp.logCondition));
exec(QString("SetExceptionBreakpointName %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.name)));
exec(QString("SetExceptionBreakpointCondition %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.breakCondition)));
exec(QString("SetExceptionBreakpointLog %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.logText)));
exec(QString("SetExceptionBreakpointLogCondition %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.logCondition)));
exec(QString("SetExceptionBreakpointLogFile %1, \"%2\"").arg(addrText).arg(bp.logFile));
exec(QString("SetExceptionBreakpointCommand %1, \"%2\"").arg(addrText).arg(bp.commandText));
exec(QString("SetExceptionBreakpointCommandCondition %1, \"%2\"").arg(addrText).arg(bp.commandCondition));
exec(QString("SetExceptionBreakpointCommand %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.commandText)));
exec(QString("SetExceptionBreakpointCommandCondition %1, \"%2\"").arg(addrText).arg(DbgCmdEscape(bp.commandCondition)));
exec(QString("ResetExceptionBreakpointHitCount %1, %2").arg(addrText).arg(ToPtrString(bp.hitCount)));
exec(QString("SetExceptionBreakpointFastResume %1, %2").arg(addrText).arg(bp.fastResume));
exec(QString("SetExceptionBreakpointSilent %1, %2").arg(addrText).arg(bp.silent));
Expand Down
2 changes: 1 addition & 1 deletion src/gui/Src/Utils/Breakpoints.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,5 @@ class Breakpoints
static void toggleBPByDisabling(const Data & bp);
static BPXSTATE BPState(BPXTYPE type, duint va);
static bool BPTrival(BPXTYPE type, duint va);
static bool editBP(BPXTYPE type, const QString & addrText, QWidget* widget, const QString & createCommand = QString());
static bool editBP(BPXTYPE type, const QString & module, duint address, QWidget* widget, const QString & createCommand = QString());
};
6 changes: 3 additions & 3 deletions src/gui/Src/Utils/CommonActions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -358,16 +358,16 @@ void CommonActions::editSoftBpActionSlot()
BPXTYPE bpType = DbgGetBpxTypeAt(selection);
if((bpType & bp_hardware) == bp_hardware)
{
Breakpoints::editBP(bp_hardware, ToHexString(selection), widgetparent());
Breakpoints::editBP(bp_hardware, QString(), selection, widgetparent());
}
else if((bpType & bp_normal) == bp_normal)
{
Breakpoints::editBP(bp_normal, ToHexString(selection), widgetparent());
Breakpoints::editBP(bp_normal, QString(), selection, widgetparent());
}
else
{
auto createCommand = QString("bp %1").arg(ToHexString(selection));
Breakpoints::editBP(bp_normal, ToHexString(selection), widgetparent(), createCommand);
Breakpoints::editBP(bp_normal, QString(), selection, widgetparent(), createCommand);
}
}

Expand Down

0 comments on commit 5a08d29

Please sign in to comment.