From b4ec0eb90fbbfe943cf085ea663bc8810676a729 Mon Sep 17 00:00:00 2001 From: Ernie Pasveer Date: Thu, 26 May 2022 21:32:07 -0500 Subject: [PATCH] checkpoint: asm viewer. --- src/CMakeLists.txt | 2 + src/SeerAsmWidget.cpp | 60 ++++++++++++++++++++++++++++++ src/SeerAsmWidget.h | 25 +++++++++++++ src/SeerAsmWidget.ui | 43 +++++++++++++++++++++ src/SeerGdbWidget.cpp | 12 ++++++ src/SeerGdbWidget.h | 1 + src/SeerMemoryVisualizerWidget.cpp | 11 ++++++ src/SeerMemoryVisualizerWidget.h | 2 + src/SeerMemoryVisualizerWidget.ui | 53 ++++++++++++++++++++++---- 9 files changed, 201 insertions(+), 8 deletions(-) create mode 100644 src/SeerAsmWidget.cpp create mode 100644 src/SeerAsmWidget.h create mode 100644 src/SeerAsmWidget.ui diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2c1eae7..59530e0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -47,6 +47,7 @@ set(HEADER_FILES SeerExecutableFilterProxyModel.h SeerGdbWidget.h SeerHexWidget.h + SeerAsmWidget.h SeerArrayWidget.h SeerLogWidget.h SeerMainWindow.h @@ -119,6 +120,7 @@ set(SOURCE_FILES SeerEditorWidgetSourceArea.cpp SeerGdbWidget.cpp SeerHexWidget.cpp + SeerAsmWidget.cpp SeerArrayWidget.cpp SeerLogWidget.cpp SeerMainWindow.cpp diff --git a/src/SeerAsmWidget.cpp b/src/SeerAsmWidget.cpp new file mode 100644 index 0000000..0a53b67 --- /dev/null +++ b/src/SeerAsmWidget.cpp @@ -0,0 +1,60 @@ +#include "SeerAsmWidget.h" +#include "SeerUtl.h" +#include + +SeerAsmWidget::SeerAsmWidget(QWidget* parent) : QWidget(parent) { + + // Construct the UI. + setupUi(this); + + // Setup the widgets + QFont font; + font.setFamily("monospace [Consolas]"); + font.setFixedPitch(true); + font.setStyleHint(QFont::TypeWriter); + + treeWidget->setFont(font); + treeWidget->setRootIsDecorated(false); + + // Connect things. +} + +SeerAsmWidget::~SeerAsmWidget() { +} + +void SeerAsmWidget::setData (const QString& data) { + + + // ^done,asm_insns=[ + // {address="0x000000000040093c",func-name="main()",offset="362",inst="mov $0x400aa9,%edi"}, + // {address="0x0000000000400941",func-name="main()",offset="367",inst="call 0x400680 "}, + // {address="0x0000000000400946",func-name="main()",offset="372",inst="mov -0x30(%rbp),%rax"} + // ] + + treeWidget->clear(); + + QString asm_insns_text = Seer::parseFirst(data, "asm_insns=", '[', ']', false); + + QStringList asm_list = Seer::parse(asm_insns_text, "", '{', '}', false); + + // Loop through the asm list. + for ( const auto& asm_text : asm_list ) { + + QString address_text = Seer::parseFirst(asm_text, "address=", '"', '"', false); + QString opcodes_text = Seer::parseFirst(asm_text, "opcodes=", '"', '"', false); + QString inst_text = Seer::parseFirst(asm_text, "inst=", '"', '"', false); + + // Add the file to the tree. + QTreeWidgetItem* item = new QTreeWidgetItem; + item->setText(0, address_text); + item->setText(1, opcodes_text); + item->setText(2, inst_text); + + treeWidget->addTopLevelItem(item); + } + + treeWidget->resizeColumnToContents(0); + treeWidget->resizeColumnToContents(1); + treeWidget->resizeColumnToContents(2); +} + diff --git a/src/SeerAsmWidget.h b/src/SeerAsmWidget.h new file mode 100644 index 0000000..355f29f --- /dev/null +++ b/src/SeerAsmWidget.h @@ -0,0 +1,25 @@ +#pragma once + +#include "ui_SeerAsmWidget.h" + +class SeerAsmWidget: public QWidget, protected Ui::SeerAsmWidgetForm { + + Q_OBJECT + + public: + + SeerAsmWidget(QWidget* parent = 0); + ~SeerAsmWidget(); + + signals: + + public slots: + void setData (const QString& data); + + protected: + + protected slots: + + private: +}; + diff --git a/src/SeerAsmWidget.ui b/src/SeerAsmWidget.ui new file mode 100644 index 0000000..46b18ac --- /dev/null +++ b/src/SeerAsmWidget.ui @@ -0,0 +1,43 @@ + + + SeerAsmWidgetForm + + + + 0 + 0 + 907 + 643 + + + + Form + + + + + + 3 + + + + Address + + + + + Op Codes + + + + + Instructions + + + + + + + + + diff --git a/src/SeerGdbWidget.cpp b/src/SeerGdbWidget.cpp index 20e123f..1b5adf0 100644 --- a/src/SeerGdbWidget.cpp +++ b/src/SeerGdbWidget.cpp @@ -1586,6 +1586,7 @@ void SeerGdbWidget::handleGdbMemoryAddExpression (QString expression) { QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, w, &SeerMemoryVisualizerWidget::handleText); QObject::connect(w, &SeerMemoryVisualizerWidget::evaluateVariableExpression, this, &SeerGdbWidget::handleGdbDataEvaluateExpression); QObject::connect(w, &SeerMemoryVisualizerWidget::evaluateMemoryExpression, this, &SeerGdbWidget::handleGdbMemoryEvaluateExpression); + QObject::connect(w, &SeerMemoryVisualizerWidget::evaluateAsmExpression, this, &SeerGdbWidget::handleGdbAsmEvaluateExpression); // Tell the visualizer what variable to use. w->setVariableName(expression); @@ -1621,6 +1622,17 @@ void SeerGdbWidget::handleGdbMemoryEvaluateExpression (int expressionid, QString handleGdbCommand(QString::number(expressionid) + "-data-read-memory-bytes " + address + " " + QString::number(count)); } +void SeerGdbWidget::handleGdbAsmEvaluateExpression (int expressionid, QString address, int count, int mode) { + + // -data-disassemble -s $pc -e "$pc + 96" -- 2 + + if (executableLaunchMode() == "") { + return; + } + + handleGdbCommand(QString("%1-data-disassemble -s \"%2\" -e \"%3\" -- %4").arg(expressionid).arg(address).arg(address + " + " + QString::number(count)).arg(mode)); +} + void SeerGdbWidget::handleGdbArrayEvaluateExpression (int expressionid, QString address, int count) { if (executableLaunchMode() == "") { diff --git a/src/SeerGdbWidget.h b/src/SeerGdbWidget.h index 928ed43..f526d90 100644 --- a/src/SeerGdbWidget.h +++ b/src/SeerGdbWidget.h @@ -183,6 +183,7 @@ class SeerGdbWidget : public QWidget, protected Ui::SeerGdbWidgetForm { void handleGdbMemoryAddExpression (QString expression); void handleGdbArrayAddExpression (QString expression); void handleGdbMemoryEvaluateExpression (int expressionid, QString address, int count); + void handleGdbAsmEvaluateExpression (int expressionid, QString address, int count, int mode); void handleGdbArrayEvaluateExpression (int expressionid, QString address, int count); void handleGdbMemoryVisualizer (); void handleGdbArrayVisualizer (); diff --git a/src/SeerMemoryVisualizerWidget.cpp b/src/SeerMemoryVisualizerWidget.cpp index 54018cd..898dd60 100644 --- a/src/SeerMemoryVisualizerWidget.cpp +++ b/src/SeerMemoryVisualizerWidget.cpp @@ -15,6 +15,7 @@ SeerMemoryVisualizerWidget::SeerMemoryVisualizerWidget (QWidget* parent) : QWidg // Init variables. _variableId = Seer::createID(); // Create two id's for queries. _memoryId = Seer::createID(); + _asmId = Seer::createID(); // Set up UI. setupUi(this); @@ -185,6 +186,15 @@ void SeerMemoryVisualizerWidget::handleText (const QString& text) { } } + }else if (text.contains(QRegExp("^([0-9]+)\\^done,asm_insns="))) { + + QString id_text = text.section('^', 0,0); + + if (id_text.toInt() == _asmId) { + + memoryAsmEditor->setData(text); + } + }else if (text.contains(QRegExp("^([0-9]+)\\^error,msg="))) { // 12^error,msg="No symbol \"return\" in current context." @@ -239,6 +249,7 @@ void SeerMemoryVisualizerWidget::handleRefreshButton () { } emit evaluateMemoryExpression(_memoryId, variableAddressLineEdit->text(), nbytes); + emit evaluateAsmExpression(_asmId, variableAddressLineEdit->text(), nbytes, 2); } void SeerMemoryVisualizerWidget::handleVariableNameLineEdit () { diff --git a/src/SeerMemoryVisualizerWidget.h b/src/SeerMemoryVisualizerWidget.h index 4da2c04..7e3d78e 100644 --- a/src/SeerMemoryVisualizerWidget.h +++ b/src/SeerMemoryVisualizerWidget.h @@ -19,6 +19,7 @@ class SeerMemoryVisualizerWidget : public QWidget, protected Ui::SeerMemoryVisua signals: void evaluateVariableExpression (int expressionid, QString expression); void evaluateMemoryExpression (int expressionid, QString address, int count); + void evaluateAsmExpression (int expressionid, QString address, int count, int mode); public slots: void handleText (const QString& text); @@ -40,5 +41,6 @@ class SeerMemoryVisualizerWidget : public QWidget, protected Ui::SeerMemoryVisua private: int _variableId; int _memoryId; + int _asmId; }; diff --git a/src/SeerMemoryVisualizerWidget.ui b/src/SeerMemoryVisualizerWidget.ui index 4a7e948..6d778b4 100644 --- a/src/SeerMemoryVisualizerWidget.ui +++ b/src/SeerMemoryVisualizerWidget.ui @@ -6,8 +6,8 @@ 0 0 - 834 - 657 + 798 + 683 @@ -173,13 +173,44 @@ - - - - 0 - 100 - + + + 0 + + + Memory + + + + + + + 0 + 100 + + + + + + + + + Disassembly + + + + + + + 0 + 100 + + + + + + @@ -191,6 +222,12 @@
SeerHexWidget.h
1 + + SeerAsmWidget + QWidget +
SeerAsmWidget.h
+ 1 +