From 68fd64dbc0cb5f1f7cd722f7414fafa54dca0c2c Mon Sep 17 00:00:00 2001 From: Ernie Pasveer Date: Sat, 15 Mar 2025 10:29:09 -0500 Subject: [PATCH] Add 'gdbserver debug' button in Connect launch tab. --- CHANGELOG.md | 2 ++ src/SeerDebugDialog.cpp | 13 +++++++ src/SeerDebugDialog.h | 2 ++ src/SeerDebugDialog.ui | 48 ++++++++++++++++++++------ src/SeerGdbWidget.cpp | 16 +++++++++ src/SeerGdbWidget.h | 4 +++ src/SeerMainWindow.cpp | 10 ++++++ src/SeerMainWindow.h | 2 ++ src/resources/help/ConnectDebugMode.md | 1 + tests/hellogdbserver/project.seer | 5 ++- 10 files changed, 89 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1212d2..759689e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ * Connect mode to a gdb server now supports 'remote' and 'extended-remote'. * Connect mode's 'pre' commands are executed before the 'target connect'. * Optionally add a timestamp to the Seer and Gdb log widgets. +* Add 'gdbserver debug' checkbox to Connect launch tab. For showing + gdb and gdbserver communication debug information in gdb tab. ## [2.5] - 2024-12-24 * Console now supports a subset of ANSI color codes. diff --git a/src/SeerDebugDialog.cpp b/src/SeerDebugDialog.cpp index 0642df3..c3d0a2b 100644 --- a/src/SeerDebugDialog.cpp +++ b/src/SeerDebugDialog.cpp @@ -287,6 +287,14 @@ QString SeerDebugDialog::connectRemoteTargetType () const { return connectRemoteTargetTypeCombo->currentText(); } +void SeerDebugDialog::setConnectGdbserverDebug (bool enable) { + connectGdbserverDebugCheckBox->setChecked(enable); +} + +bool SeerDebugDialog::connectGdbserverDebug () const { + return connectGdbserverDebugCheckBox->isChecked(); +} + void SeerDebugDialog::setRRTraceDirectory (const QString& rrTraceDirectory) { rrTraceDirectoryLineEdit->setText(rrTraceDirectory); } @@ -623,6 +631,10 @@ void SeerDebugDialog::loadProject (const QString& filename, bool notify) { connectRemoteTargetTypeCombo->setCurrentText(connectModeJson["targettype"].toString()); } + if (connectModeJson.contains("gdbserverdebug")) { + connectGdbserverDebugCheckBox->setChecked(connectModeJson["gdbserverdebug"].toBool()); + } + setLaunchMode("connect"); } @@ -736,6 +748,7 @@ void SeerDebugDialog::handleSaveProjectToolButton () { modeJson["gdbserver"] = connectProgramHostPortLineEdit->text(); modeJson["targettype"] = connectRemoteTargetTypeCombo->currentText(); + modeJson["gdbserverdebug"] = connectGdbserverDebugCheckBox->isChecked(); seerProjectJson["connectmode"] = modeJson; } diff --git a/src/SeerDebugDialog.h b/src/SeerDebugDialog.h index 54efaaf..131d477 100644 --- a/src/SeerDebugDialog.h +++ b/src/SeerDebugDialog.h @@ -56,6 +56,8 @@ class SeerDebugDialog : public QDialog, protected Ui::SeerDebugDialogForm { QString connectHostPort () const; void setConnectRemoteTargetType (const QString& type); QString connectRemoteTargetType () const; + void setConnectGdbserverDebug (bool enable); + bool connectGdbserverDebug () const; // Connectect to a RR server. "rr". diff --git a/src/SeerDebugDialog.ui b/src/SeerDebugDialog.ui index 08308d5..5a7b836 100644 --- a/src/SeerDebugDialog.ui +++ b/src/SeerDebugDialog.ui @@ -7,14 +7,14 @@ 0 0 619 - 845 + 856 Select Executable to Debug - - + + Executable Name @@ -72,7 +72,7 @@ - + Symbol File Name @@ -130,7 +130,7 @@ - + @@ -176,7 +176,7 @@ - + @@ -227,7 +227,7 @@ - 1 + 2 @@ -593,7 +593,7 @@ Connect - + @@ -703,8 +703,34 @@ - 468 - 17 + 308 + 23 + + + + + + + + Enable debug communication between gdb and the gdbserver. + + + Gdbserver debug + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 408 + 23 @@ -975,7 +1001,7 @@ - + Qt::Horizontal diff --git a/src/SeerGdbWidget.cpp b/src/SeerGdbWidget.cpp index 0a454bd..69946d5 100644 --- a/src/SeerGdbWidget.cpp +++ b/src/SeerGdbWidget.cpp @@ -59,6 +59,7 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { _gdbArguments = "--interpreter=mi"; _gdbASyncMode = true; _gdbNonStopMode = false; + _gdbServerDebug = false; _assemblyShowAssemblyTabOnStartup = false; _assemblyDisassemblyFlavor = "att"; _gdbHandleTerminatingException = true; @@ -618,6 +619,16 @@ bool SeerGdbWidget::gdbNonStopMode () const { return _gdbNonStopMode; } +void SeerGdbWidget::setGdbServerDebug (bool flag) { + + _gdbServerDebug = flag; +} + +bool SeerGdbWidget::gdbServerDebug () const { + + return _gdbServerDebug; +} + void SeerGdbWidget::setGdbHandleTerminatingException (bool flag) { _gdbHandleTerminatingException = flag; @@ -1213,6 +1224,11 @@ void SeerGdbWidget::handleGdbConnectExecutable () { // Load any 'pre' commands. if (newExecutableFlag() == true) { + if (gdbServerDebug()) { + handleGdbCommand("-gdb-set debug remote 1"); // Turn on gdbserver debug + }else{ + handleGdbCommand("-gdb-set debug remote 0"); + } handleGdbExecutablePreCommands(); // Run any 'pre' commands before program is loaded. } diff --git a/src/SeerGdbWidget.h b/src/SeerGdbWidget.h index d4a6ecb..2cb0715 100644 --- a/src/SeerGdbWidget.h +++ b/src/SeerGdbWidget.h @@ -92,6 +92,9 @@ class SeerGdbWidget : public QWidget, protected Ui::SeerGdbWidgetForm { void setGdbNonStopMode (bool flag); bool gdbNonStopMode () const; + void setGdbServerDebug (bool flag); + bool gdbServerDebug () const; + void setGdbHandleTerminatingException (bool flag); bool gdbHandleTerminatingException () const; @@ -381,6 +384,7 @@ class SeerGdbWidget : public QWidget, protected Ui::SeerGdbWidgetForm { QString _gdbRRGdbArguments; bool _gdbASyncMode; bool _gdbNonStopMode; + bool _gdbServerDebug; bool _gdbHandleTerminatingException; bool _gdbRandomizeStartAddress; bool _gdbEnablePrettyPrinting; diff --git a/src/SeerMainWindow.cpp b/src/SeerMainWindow.cpp index 982f3c2..7706b67 100644 --- a/src/SeerMainWindow.cpp +++ b/src/SeerMainWindow.cpp @@ -350,6 +350,14 @@ QString SeerMainWindow::executableConnectRemoteTargetType () const { return gdbWidget->gdbRemoteTargetType(); } +void SeerMainWindow::setExecutableConnectGdbserverDebug (bool enable) { + gdbWidget->setGdbServerDebug(enable); +} + +bool SeerMainWindow::executableConnectGdbserverDebug () const { + return gdbWidget->gdbServerDebug(); +} + void SeerMainWindow::setExecutableRRTraceDirectory (const QString& executableRRTraceDirectory) { gdbWidget->setExecutableRRTraceDirectory(executableRRTraceDirectory); } @@ -534,6 +542,7 @@ void SeerMainWindow::handleFileDebug () { dlg.setAttachPid(executablePid()); dlg.setConnectHostPort(executableConnectHostPort()); dlg.setConnectRemoteTargetType(executableConnectRemoteTargetType()); + dlg.setConnectGdbserverDebug(executableConnectGdbserverDebug()); dlg.setRRTraceDirectory(executableRRTraceDirectory()); dlg.setCoreFilename(executableCoreFilename()); dlg.setPreGdbCommands(executablePreGdbCommands()); @@ -568,6 +577,7 @@ void SeerMainWindow::handleFileDebug () { setExecutablePid(dlg.attachPid()); setExecutableConnectHostPort(dlg.connectHostPort()); setExecutableConnectRemoteTargetType(dlg.connectRemoteTargetType()); + setExecutableConnectGdbserverDebug(dlg.connectGdbserverDebug()); setExecutableRRTraceDirectory(dlg.rrTraceDirectory()); setExecutableCoreFilename(dlg.coreFilename()); setExecutablePreGdbCommands(dlg.preGdbCommands()); diff --git a/src/SeerMainWindow.h b/src/SeerMainWindow.h index 4c55b85..4c65976 100644 --- a/src/SeerMainWindow.h +++ b/src/SeerMainWindow.h @@ -47,6 +47,8 @@ class SeerMainWindow : public QMainWindow, protected Ui::SeerMainWindowForm { const QString& executableConnectHostPort () const; void setExecutableConnectRemoteTargetType (const QString& type); QString executableConnectRemoteTargetType () const; + void setExecutableConnectGdbserverDebug (bool enable); + bool executableConnectGdbserverDebug () const; void setExecutableRRTraceDirectory (const QString& executableRRTraceDirectory); const QString& executableRRTraceDirectory () const; void setExecutableCoreFilename (const QString& executableCoreFilename); diff --git a/src/resources/help/ConnectDebugMode.md b/src/resources/help/ConnectDebugMode.md index 504bf17..a72d9c5 100644 --- a/src/resources/help/ConnectDebugMode.md +++ b/src/resources/help/ConnectDebugMode.md @@ -16,6 +16,7 @@ In this mode, Seer needs: * Remote target type when connecting to the gdbserver. * 'extended-remote' (default) * 'remote' (sometimes required if gdbserver doesn't support all commands) +* Optional enabling of gdb and gdbserver debug communication (set debug remote 1). See the gdb tab for output. * Optional gdb commands to execute before and after Seer connects to the gdbserver ### What can you do? diff --git a/tests/hellogdbserver/project.seer b/tests/hellogdbserver/project.seer index 4581b47..ae24ae8 100644 --- a/tests/hellogdbserver/project.seer +++ b/tests/hellogdbserver/project.seer @@ -2,6 +2,7 @@ "seerproject": { "connectmode": { "gdbserver": ":1234", + "gdbserverdebug": true, "targettype": "extended-remote" }, "executable": "/nas/erniep/Development/seer/tests/hellogdbserver/hellogdbserver", @@ -11,9 +12,7 @@ "" ], "pregdbcommands": [ - "set debug remote 1", - "set remotelogfile /tmp/gdb-remote-log.txt", - "set debug timestamp" + "" ], "symbolfile": "/nas/erniep/Development/seer/tests/hellogdbserver/hellogdbserver_sym", "workingdirectory": ""