From 721870ac0e34ccf576214d176ceab8c423078940 Mon Sep 17 00:00:00 2001 From: mandlebro Date: Sun, 28 Oct 2018 13:13:45 +0000 Subject: [PATCH] Fix emulation not working after a debugging session --- src/core/Cutter.cpp | 56 +++++++++++++++++++++------------ src/core/Cutter.h | 1 + src/widgets/MemoryMapWidget.cpp | 3 ++ 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/core/Cutter.cpp b/src/core/Cutter.cpp index a13aada2..7c7b0985 100644 --- a/src/core/Cutter.cpp +++ b/src/core/Cutter.cpp @@ -1123,6 +1123,7 @@ void CutterCore::startDebug() if (!currentlyDebugging) { offsetPriorDebugging = getOffset(); } + currentlyOpenFile = getConfig("file.path"); cmd("ood"); emit registersChanged(); if (!currentlyDebugging) { @@ -1141,8 +1142,7 @@ void CutterCore::startEmulation() offsetPriorDebugging = getOffset(); } // clear registers, init esil state, stack, progcounter at current seek - cmd("ar0; aei; aeim; aeip"); - emit registersChanged(); + cmd("aei; aeim; aeip"); if (!currentlyDebugging || !currentlyEmulating) { // prevent register flags from appearing during debug/emul setConfig("asm.flags", false); @@ -1153,6 +1153,7 @@ void CutterCore::startEmulation() emit changeDebugView(); emit flagsChanged(); } + emit registersChanged(); emit stackChanged(); emit refreshCodeViews(); } @@ -1188,7 +1189,16 @@ void CutterCore::stopDebug() cmd(QString("dp- %1; o %2; .ar-").arg(QString::number(currentlyAttachedToPID), currentlyOpenFile)); currentlyAttachedToPID = -1; } else { - cmd("dk 9; oo; .ar-"); + cmd(QString("dk 9; e cfg.debug=false; o %1; .ar-").arg(currentlyOpenFile)); + // close ptrace file descriptors left open + QJsonArray openFilesArray = cmdj("oj").array();; + for (QJsonValue value : openFilesArray) { + QJsonObject openFile = value.toObject(); + QString URI = openFile["uri"].toString(); + if (URI.contains("ptrace")) { + cmd("o-" + QString::number(openFile["fd"].toInt())); + } + } } seekAndShow(offsetPriorDebugging); setConfig("asm.flags", true); @@ -1199,6 +1209,13 @@ void CutterCore::stopDebug() } } +void CutterCore::syncAndSeekProgramCounter() +{ + QString programCounterValue = cmd("dr?`drn PC`").trimmed(); + seekAndShow(programCounterValue); + emit registersChanged(); +} + void CutterCore::continueDebug() { if (currentlyDebugging) { @@ -1221,6 +1238,7 @@ void CutterCore::continueUntilDebug(QString offset) cmd("dcu " + offset); } emit registersChanged(); + emit stackChanged(); emit refreshCodeViews(); } } @@ -1233,9 +1251,7 @@ void CutterCore::continueUntilCall() } else { cmd("dcc"); } - QString programCounterValue = cmd("dr?`drn PC`").trimmed(); - seekAndShow(programCounterValue); - emit registersChanged(); + syncAndSeekProgramCounter(); } } @@ -1247,29 +1263,31 @@ void CutterCore::continueUntilSyscall() } else { cmd("dcs"); } - QString programCounterValue = cmd("dr?`drn PC`").trimmed(); - seekAndShow(programCounterValue); - emit registersChanged(); + syncAndSeekProgramCounter(); } } void CutterCore::stepDebug() { if (currentlyDebugging) { - cmdEsil("ds"); - QString programCounterValue = cmd("dr?`drn PC`").trimmed(); - seekAndShow(programCounterValue); - emit registersChanged(); + if (currentlyEmulating) { + cmdEsil("aes"); + } else { + cmd("ds"); + } + syncAndSeekProgramCounter(); } } void CutterCore::stepOverDebug() { if (currentlyDebugging) { - cmdEsil("dso"); - QString programCounterValue = cmd("dr?`drn PC`").trimmed(); - seekAndShow(programCounterValue); - emit registersChanged(); + if (currentlyEmulating) { + cmdEsil("aeso"); + } else { + cmd("dso"); + } + syncAndSeekProgramCounter(); } } @@ -1277,9 +1295,7 @@ void CutterCore::stepOutDebug() { if (currentlyDebugging) { cmd("dsf"); - QString programCounterValue = cmd("dr?`drn PC`").trimmed(); - seekAndShow(programCounterValue); - emit registersChanged(); + syncAndSeekProgramCounter(); } } diff --git a/src/core/Cutter.h b/src/core/Cutter.h index 656aee09..72c2766a 100644 --- a/src/core/Cutter.h +++ b/src/core/Cutter.h @@ -227,6 +227,7 @@ public: void startEmulation(); void attachDebug(int pid); void stopDebug(); + void syncAndSeekProgramCounter(); void continueDebug(); void continueUntilCall(); void continueUntilSyscall(); diff --git a/src/widgets/MemoryMapWidget.cpp b/src/widgets/MemoryMapWidget.cpp index 389b4458..039aeef6 100644 --- a/src/widgets/MemoryMapWidget.cpp +++ b/src/widgets/MemoryMapWidget.cpp @@ -139,6 +139,9 @@ void MemoryMapWidget::refreshMemoryMap() return; } + if (Core()->currentlyEmulating) { + return; + } memoryModel->beginResetModel(); memoryMaps = Core()->getMemoryMap(); memoryModel->endResetModel();