From a0734f9f880fe1a7b77d29defac6b43f0c7b6c4e Mon Sep 17 00:00:00 2001 From: Ernie Pasveer Date: Sun, 25 Sep 2022 11:32:08 -0500 Subject: [PATCH] Add Help for Variable/Register browser. --- CHANGELOG.md | 1 + src/SeerStackFramesBrowserWidget.cpp | 4 +- src/SeerStackFramesBrowserWidget.h | 2 +- src/SeerVariableManagerWidget.cpp | 22 +++++- src/SeerVariableManagerWidget.h | 1 + src/resource.qrc | 1 + .../help/VariableRegisterInfoBrowser.md | 78 +++++++++++++++++++ 7 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 src/resources/help/VariableRegisterInfoBrowser.md diff --git a/CHANGELOG.md b/CHANGELOG.md index c226fcb..d9ebab8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ - (see gdb's schedule-multiple mode) * Add Help to Thread/Process browser. * Add Help to Stack Frame browser. +* Add Help to Variable/Register browser. * Add Help to Struct Visualizer. * Add RMB menu to progress indicator to select indicator type. diff --git a/src/SeerStackFramesBrowserWidget.cpp b/src/SeerStackFramesBrowserWidget.cpp index 79dae6b..f2762f3 100644 --- a/src/SeerStackFramesBrowserWidget.cpp +++ b/src/SeerStackFramesBrowserWidget.cpp @@ -27,7 +27,7 @@ SeerStackFramesBrowserWidget::SeerStackFramesBrowserWidget (QWidget* parent) : Q stackTreeWidget->clear(); // Connect things. - QObject::connect(stackTreeWidget, &QTreeWidget::itemDoubleClicked, this, &SeerStackFramesBrowserWidget::handleItemDoubleClicked); + QObject::connect(stackTreeWidget, &QTreeWidget::itemClicked, this, &SeerStackFramesBrowserWidget::handleItemClicked); QObject::connect(stackTreeWidget, &QTreeWidget::itemEntered, this, &SeerStackFramesBrowserWidget::handleItemEntered); } @@ -168,7 +168,7 @@ void SeerStackFramesBrowserWidget::refresh () { emit refreshStackFrames(); } -void SeerStackFramesBrowserWidget::handleItemDoubleClicked (QTreeWidgetItem* item, int column) { +void SeerStackFramesBrowserWidget::handleItemClicked (QTreeWidgetItem* item, int column) { Q_UNUSED(column); diff --git a/src/SeerStackFramesBrowserWidget.h b/src/SeerStackFramesBrowserWidget.h index 663844f..d6c8dde 100644 --- a/src/SeerStackFramesBrowserWidget.h +++ b/src/SeerStackFramesBrowserWidget.h @@ -18,7 +18,7 @@ class SeerStackFramesBrowserWidget : public QWidget, protected Ui::SeerStackFram void refresh (); protected slots: - void handleItemDoubleClicked (QTreeWidgetItem* item, int column); + void handleItemClicked (QTreeWidgetItem* item, int column); void handleItemEntered (QTreeWidgetItem* item, int column); signals: diff --git a/src/SeerVariableManagerWidget.cpp b/src/SeerVariableManagerWidget.cpp index 08d9eb0..7f17133 100644 --- a/src/SeerVariableManagerWidget.cpp +++ b/src/SeerVariableManagerWidget.cpp @@ -1,4 +1,6 @@ #include "SeerVariableManagerWidget.h" +#include "SeerHelpPageWidget.h" +#include "QHContainerWidget.h" #include #include #include @@ -25,10 +27,21 @@ SeerVariableManagerWidget::SeerVariableManagerWidget (QWidget* parent) : QWidget QToolButton* refreshToolButton = new QToolButton(tabWidget); refreshToolButton->setIcon(QIcon(":/seer/resources/RelaxLightIcons/view-refresh.svg")); refreshToolButton->setToolTip("Refresh the variable/register information."); - tabWidget->setCornerWidget(refreshToolButton, Qt::TopRightCorner); + + QToolButton* helpToolButton = new QToolButton(tabWidget); + helpToolButton->setIcon(QIcon(":/seer/resources/RelaxLightIcons/help-about.svg")); + helpToolButton->setToolTip("Help on variable/register information."); + + QHContainerWidget* hcontainer = new QHContainerWidget(this); + hcontainer->setSpacing(3); + hcontainer->addWidget(refreshToolButton); + hcontainer->addWidget(helpToolButton); + + tabWidget->setCornerWidget(hcontainer, Qt::TopRightCorner); // Connect things. QObject::connect(refreshToolButton, &QToolButton::clicked, this, &SeerVariableManagerWidget::handleRefreshToolButtonClicked); + QObject::connect(helpToolButton, &QToolButton::clicked, this, &SeerVariableManagerWidget::handleHelpToolButtonClicked); } SeerVariableManagerWidget::~SeerVariableManagerWidget () { @@ -52,3 +65,10 @@ void SeerVariableManagerWidget::handleRefreshToolButtonClicked () { registerValuesBrowserWidget()->refresh(); } +void SeerVariableManagerWidget::handleHelpToolButtonClicked () { + + SeerHelpPageWidget* help = new SeerHelpPageWidget; + help->loadFile(":/seer/resources/help/VariableRegisterInfoBrowser.md"); + help->show(); +} + diff --git a/src/SeerVariableManagerWidget.h b/src/SeerVariableManagerWidget.h index 3568b47..9fd68a0 100644 --- a/src/SeerVariableManagerWidget.h +++ b/src/SeerVariableManagerWidget.h @@ -24,6 +24,7 @@ class SeerVariableManagerWidget : public QWidget, protected Ui::SeerVariableMana public slots: private slots: void handleRefreshToolButtonClicked (); + void handleHelpToolButtonClicked (); private: SeerVariableTrackerBrowserWidget* _variableTrackerBrowserWidget; diff --git a/src/resource.qrc b/src/resource.qrc index 7a3271a..b1d096d 100644 --- a/src/resource.qrc +++ b/src/resource.qrc @@ -53,6 +53,7 @@ resources/help/ThreadProcessInfoBrowser.md resources/help/StructVisualizer.md resources/help/StackInfoBrowser.md + resources/help/VariableRegisterInfoBrowser.md diff --git a/src/resources/help/VariableRegisterInfoBrowser.md b/src/resources/help/VariableRegisterInfoBrowser.md new file mode 100644 index 0000000..b850517 --- /dev/null +++ b/src/resources/help/VariableRegisterInfoBrowser.md @@ -0,0 +1,78 @@ +## Variable/Register Info Browser + +### Introduction + +The Variable/Register Info browser is a simple, but quick, method of viewing the values of the program's variables. + +Seer presents this information in three tabs: + +* Logger +* Tracker +* Registers + +### Logger +The logger is a simple method for printing the value of a variable. There is an entry field to manually enter the name of the variable. The variable must be part of the active stack frame, as selected by the Stack Info browser. + +This information is shown for each variable. +``` + Column Description + --------------- ---------------------------------------------- + Timestamp When the variable was logged. + Name The name of the variable. + Value The value of the variable. +``` + +The easiest method for logging a variable is to double-click the variable text in the code editor. When doing this, a key modifier (shift and/or ctrl) can be used to prepend a '*' and/or '&' to the variable. This will better handle pointers and references. +``` + Double-Click + Modifier Description Example + ------------ ------------------------------------ ----------------------- + None No modifier is prepended to variable 'argc' + Shift Key Prepend '&' to variable '&argc' + Ctrl Key Prepend '*' to variable '*argc' + Ctrl+Shift Prepend '*&' to variable '*&argc' +``` + +There are buttons to clear some or all entries in the logger. + +### Tracker +The tracker is a method to watch several variables at a time. Manually enter a list of variable names. Their values will be updated in the Logger display at each stopping point (after a 'step' or 'next' or a breakpoint) is reached. + +The variable must be part of the active stack frame, as selected by the Stack Info browser. + +There are buttons to clear some or all variables in the tracker. + + +### Registers +Registers is a view of the program's register values. The register values are updated at each stopping point (after a 'step' or 'next' or a breakpoint) is reached. + +This information is shown for each register. +``` + Column Description + --------------- ---------------------------------------------- + Name The name of the register. + Value The value of the register. +``` + +The register value can be printed in multiple formats. +``` + Format Description + --------------- ------------------------------------------------------------ + Natural Print using a format that's best for the register's purpose. + Hex Print in hex. + Octal Print in octal. + Binary Print in binary. + Decimal Print in decimal. + Raw Print in the raw form. +``` + +Register values can be modified. Double-click on a Value column for a register will allow the value to be edited and changed. Using a RMB on a register will bring up a menu to change the register value as well. This second method can better handle resisters that have 'union' like properties (eg: xmm0 with xmm0.v8_bfloat16, xmm0.v4_float, etc...) where the register name needs to be modified slightly to include the 'union' field name. + +### References + +Consult these gdb references + +1. [Link](https://sourceware.org/gdb/onlinedocs/gdb/Registers.html) Viewing/setting register values. + + +