From f8ac84570ff4c6325d8bea0ac79f8810634fb9d5 Mon Sep 17 00:00:00 2001 From: Ernie Pasveer Date: Fri, 27 Jan 2023 18:52:15 +0000 Subject: [PATCH] Added Help for Debug Dialog. --- src/SeerDebugDialog.cpp | 79 ++++++++-------------- src/SeerDebugDialog.h | 5 +- src/SeerDebugDialog.ui | 2 +- src/SeerHelpPageDialog.cpp | 27 ++++++-- src/SeerHelpPageDialog.h | 3 + src/SeerHelpPageDialog.ui | 88 ++++++++++++------------- src/resource.qrc | 3 + src/resources/help/AttachDebugMode.md | 23 +++++++ src/resources/help/ConnectDebugMode.md | 31 +++++++++ src/resources/help/CorefileDebugMode.md | 2 +- src/resources/help/RunDebugMode.md | 25 +++++++ 11 files changed, 186 insertions(+), 102 deletions(-) create mode 100644 src/resources/help/AttachDebugMode.md create mode 100644 src/resources/help/ConnectDebugMode.md create mode 100644 src/resources/help/RunDebugMode.md diff --git a/src/SeerDebugDialog.cpp b/src/SeerDebugDialog.cpp index 85faf2f..5bc2cb2 100644 --- a/src/SeerDebugDialog.cpp +++ b/src/SeerDebugDialog.cpp @@ -37,7 +37,10 @@ SeerDebugDialog::SeerDebugDialog (QWidget* parent) : QDialog(parent) { QObject::connect(loadCoreFilenameToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleLoadCoreFilenameToolButton); QObject::connect(breakpointInFunctionLineEdit, &QLineEdit::textChanged, this, &SeerDebugDialog::handleBreakpointInFunctionLineEdit); QObject::connect(attachProgramPidToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleProgramPidToolButton); - QObject::connect(helpCoreToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleHelpCoreToolButtonClicked); + QObject::connect(helpRunToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleHelpRunToolButtonClicked); + QObject::connect(helpAttachToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleHelpAttachToolButtonClicked); + QObject::connect(helpConnectToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleHelpConnectToolButtonClicked); + QObject::connect(helpCorefileToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleHelpCorefileToolButtonClicked); #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) QObject::connect(runModeTabWidget, &QTabWidget::currentChanged, this, &SeerDebugDialog::handleRunModeChanged); @@ -343,34 +346,6 @@ void SeerDebugDialog::handleRunModeChanged (int id) { executableWorkingDirectoryLineEdit->setEnabled(false); executableWorkingDirectoryToolButton->setEnabled(false); - // ID == 0 RUN/START - runProgramArgumentsLabel->setEnabled(false); - runProgramArgumentsLineEdit->setEnabled(false); - loadBreakpointsFilenameLabel->setEnabled(false); - loadBreakpointsFilenameLineEdit->setEnabled(false); - loadBreakpointsFilenameToolButton->setEnabled(false); - noBreakpointRadioButton->setEnabled(false); - breakpointInMainRadioButton->setEnabled(false); - breakpointInFunctionRadioButton->setEnabled(false); - breakpointInFunctionLineEdit->setEnabled(false); - showAsseblyTabCheckBox->setEnabled(false); - randomizeStartAddressCheckBox->setEnabled(false); - nonStopModeCheckBox->setEnabled(false); - - // ID == 1 ATTACH - attachProgramPidLabel->setEnabled(false); - attachProgramPidLineEdit->setEnabled(false); - attachProgramPidToolButton->setEnabled(false); - - // ID == 2 CONNECT - connectProgramHostPortLabel->setEnabled(false); - connectProgramHostPortLineEdit->setEnabled(false); - - // ID == 3 CORE - loadCoreFilenameLabel->setEnabled(false); - loadCoreFilenameLineEdit->setEnabled(false); - loadCoreFilenameToolButton->setEnabled(false); - // // Enable the newly selected one. // @@ -383,18 +358,6 @@ void SeerDebugDialog::handleRunModeChanged (int id) { executableSymbolNameToolButton->setEnabled(true); executableWorkingDirectoryLineEdit->setEnabled(true); executableWorkingDirectoryToolButton->setEnabled(true); - runProgramArgumentsLabel->setEnabled(true); - runProgramArgumentsLineEdit->setEnabled(true); - loadBreakpointsFilenameLabel->setEnabled(true); - loadBreakpointsFilenameLineEdit->setEnabled(true); - loadBreakpointsFilenameToolButton->setEnabled(true); - noBreakpointRadioButton->setEnabled(true); - breakpointInMainRadioButton->setEnabled(true); - breakpointInFunctionRadioButton->setEnabled(true); - breakpointInFunctionLineEdit->setEnabled(true); - showAsseblyTabCheckBox->setEnabled(true); - randomizeStartAddressCheckBox->setEnabled(true); - nonStopModeCheckBox->setEnabled(true); } // ID == 1 ATTACH @@ -403,30 +366,46 @@ void SeerDebugDialog::handleRunModeChanged (int id) { executableNameToolButton->setEnabled(true); executableSymbolNameLineEdit->setEnabled(true); executableSymbolNameToolButton->setEnabled(true); - attachProgramPidLabel->setEnabled(true); - attachProgramPidLineEdit->setEnabled(true); - attachProgramPidToolButton->setEnabled(true); } // ID == 2 CONNECT if (id == 2) { executableSymbolNameLineEdit->setEnabled(true); executableSymbolNameToolButton->setEnabled(true); - connectProgramHostPortLabel->setEnabled(true); - connectProgramHostPortLineEdit->setEnabled(true); } // ID == 3 CORE if (id == 3) { executableSymbolNameLineEdit->setEnabled(true); executableSymbolNameToolButton->setEnabled(true); - loadCoreFilenameLabel->setEnabled(true); - loadCoreFilenameLineEdit->setEnabled(true); - loadCoreFilenameToolButton->setEnabled(true); } } -void SeerDebugDialog::handleHelpCoreToolButtonClicked () { +void SeerDebugDialog::handleHelpRunToolButtonClicked () { + + SeerHelpPageDialog* help = new SeerHelpPageDialog(this); + help->loadFile(":/seer/resources/help/RunDebugMode.md"); + help->show(); + help->raise(); +} + +void SeerDebugDialog::handleHelpAttachToolButtonClicked () { + + SeerHelpPageDialog* help = new SeerHelpPageDialog(this); + help->loadFile(":/seer/resources/help/AttachDebugMode.md"); + help->show(); + help->raise(); +} + +void SeerDebugDialog::handleHelpConnectToolButtonClicked () { + + SeerHelpPageDialog* help = new SeerHelpPageDialog(this); + help->loadFile(":/seer/resources/help/ConnectDebugMode.md"); + help->show(); + help->raise(); +} + +void SeerDebugDialog::handleHelpCorefileToolButtonClicked () { SeerHelpPageDialog* help = new SeerHelpPageDialog(this); help->loadFile(":/seer/resources/help/CorefileDebugMode.md"); diff --git a/src/SeerDebugDialog.h b/src/SeerDebugDialog.h index b050204..9d7e0ac 100644 --- a/src/SeerDebugDialog.h +++ b/src/SeerDebugDialog.h @@ -67,7 +67,10 @@ class SeerDebugDialog : public QDialog, protected Ui::SeerDebugDialogForm { void handleRunModeChanged (int id); private slots: - void handleHelpCoreToolButtonClicked (); + void handleHelpRunToolButtonClicked (); + void handleHelpAttachToolButtonClicked (); + void handleHelpConnectToolButtonClicked (); + void handleHelpCorefileToolButtonClicked (); protected: void writeSettings (); diff --git a/src/SeerDebugDialog.ui b/src/SeerDebugDialog.ui index eda219f..c6efed8 100644 --- a/src/SeerDebugDialog.ui +++ b/src/SeerDebugDialog.ui @@ -655,7 +655,7 @@ - + Help for Corefile launch method. diff --git a/src/SeerHelpPageDialog.cpp b/src/SeerHelpPageDialog.cpp index c7eb028..094a12d 100644 --- a/src/SeerHelpPageDialog.cpp +++ b/src/SeerHelpPageDialog.cpp @@ -18,12 +18,9 @@ SeerHelpPageDialog::SeerHelpPageDialog(QDialog* parent) : QDialog(parent) { textBrowser->setOpenExternalLinks(true); - QAbstractButton* printToolButton = new QToolButton; - printToolButton->setIcon(QIcon(":/seer/resources/RelaxLightIcons/document-print.svg")); - - buttonBox->addButton(printToolButton, QDialogButtonBox::NoRole); - // Connect things. + QObject::connect(printToolButton, &QToolButton::clicked, this, &SeerHelpPageDialog::handlePrintToolButton); + QObject::connect(okPushButton, &QPushButton::clicked, this, &SeerHelpPageDialog::handleOkPushButton); // Restore window settings. readSettings(); @@ -57,6 +54,26 @@ void SeerHelpPageDialog::loadText (const QString& text) { textBrowser->moveCursor(QTextCursor::Start); } +void SeerHelpPageDialog::handlePrintToolButton () { + + QPrinter printer; + + QPrintDialog* dlg = new QPrintDialog(&printer, this); + + if (dlg->exec() != QDialog::Accepted) { + return; + } + + QTextDocument* document = textBrowser->document(); + + document->print(&printer); +} + +void SeerHelpPageDialog::handleOkPushButton () { + + done(QDialog::Accepted); +} + void SeerHelpPageDialog::writeSettings() { QSettings settings; diff --git a/src/SeerHelpPageDialog.h b/src/SeerHelpPageDialog.h index 917441d..80c3b40 100644 --- a/src/SeerHelpPageDialog.h +++ b/src/SeerHelpPageDialog.h @@ -22,6 +22,9 @@ class SeerHelpPageDialog: public QDialog, protected Ui::SeerHelpPageDialogForm { void resizeEvent (QResizeEvent* event); protected slots: + void handlePrintToolButton (); + void handleOkPushButton (); + private: }; diff --git a/src/SeerHelpPageDialog.ui b/src/SeerHelpPageDialog.ui index 2df9df0..416f9dc 100644 --- a/src/SeerHelpPageDialog.ui +++ b/src/SeerHelpPageDialog.ui @@ -13,7 +13,7 @@ Dialog - + @@ -27,52 +27,52 @@ - - - Qt::Horizontal - - - QDialogButtonBox::Ok - - + + + + + Print Help page. + + + + + + + :/seer/resources/RelaxLightIcons/document-print.svg:/seer/resources/RelaxLightIcons/document-print.svg + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Dismiss Help page. + + + OK + + + + - - - - buttonBox - accepted() - SeerHelpPageDialogForm - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - SeerHelpPageDialogForm - reject() - - - 316 - 260 - - - 286 - 274 - - - - + + + + diff --git a/src/resource.qrc b/src/resource.qrc index f50f1a4..2dc6ef1 100644 --- a/src/resource.qrc +++ b/src/resource.qrc @@ -62,6 +62,9 @@ resources/help/CodeManager.md resources/help/BreakpointGdbSeerManager.md resources/help/MainWindow.md + resources/help/RunDebugMode.md + resources/help/AttachDebugMode.md + resources/help/ConnectDebugMode.md resources/help/CorefileDebugMode.md diff --git a/src/resources/help/AttachDebugMode.md b/src/resources/help/AttachDebugMode.md new file mode 100644 index 0000000..1644c86 --- /dev/null +++ b/src/resources/help/AttachDebugMode.md @@ -0,0 +1,23 @@ +## Attach debug mode + +### Introduction + +This mode allows Seer to debug a locally running process by attaching to the PID. + +### Requirements +In this mode, Seer needs: + +* The executable +* Optional symbol file if the executable doesn't have debug information +* The PID of the process. + +### What can you do? +In this mode, Seer will attach to the process and immediately interrupt it with a SIGINT. +Seer will show the source and line number where the program was interrupted. The program's stack and threads are shown. + +From this point, you can debug the process as normal (stepping and setting breakpoints, etc...) + +### References + + + diff --git a/src/resources/help/ConnectDebugMode.md b/src/resources/help/ConnectDebugMode.md new file mode 100644 index 0000000..acac8bb --- /dev/null +++ b/src/resources/help/ConnectDebugMode.md @@ -0,0 +1,31 @@ +## Connect debug mode + +### Introduction + +This mode allows Seer to a local or remote process that was started with gdbserver (or other gdb servers). + +Typically, the gdbserver starts the process and interrupts it before anything happens. It then waits for +something to connect to it. When Seer connects with it, the process is ready to continue executing. + + +### Requirements +In this mode, Seer needs: + +* Optional symbol file if the executable doesn't have debug information +* How to look for the gdbserver (machine and port) +* Optional gdb commands to execute before and after Seer connects to the gdbserver. + +### What can you do? +In this mode, Seer will connect to the process via the gdbserver. Typically you set breakpoints first then +tell the process to continue. From this point, you can debug the process as normal (stepping and setting breakpoints, etc...) + + +### References + +Check references for gdbserver and other gdb servers. + +* gdbserver +* valgrind vgdb +* servers for embedded development + + diff --git a/src/resources/help/CorefileDebugMode.md b/src/resources/help/CorefileDebugMode.md index 3339d9b..ea38f35 100644 --- a/src/resources/help/CorefileDebugMode.md +++ b/src/resources/help/CorefileDebugMode.md @@ -5,7 +5,7 @@ This mode allows Seer to debug corefiles. Corefiles are files that are the state of a process that exits unexepectedly via a signal (SIGTERM, SIGSEGV, etc...) -### Needed files +### Requirements In this mode, Seer needs: * The executable diff --git a/src/resources/help/RunDebugMode.md b/src/resources/help/RunDebugMode.md new file mode 100644 index 0000000..5339fbf --- /dev/null +++ b/src/resources/help/RunDebugMode.md @@ -0,0 +1,25 @@ +## Run debug mode + +### Introduction +This mode allows Seer to debug a program by starting the program itself. This is the most typical +way of using Seer. + +### Requirements +In this mode, Seer needs: + +* The executable +* Optional symbol file if the executable doesn't have debug information +* Optional working directory to run the program from +* Arguments to run the program with +* Various Seer/gdb options to start the program by + +### What can you do? +If 'start' is selected, the program is started and breaks in 'main'. + +If 'run' is selected, the program is started and executes without any breakpoints unless they are +specified in the optional breakpoint file. + +From this point, you can debug the process as normal (stepping and setting breakpoints, etc...) + +### References +