From 39818ec6c1f2cfc401888b6f23dba7ff776cf6ba Mon Sep 17 00:00:00 2001 From: Ernie Pasveer Date: Sun, 7 Nov 2021 13:53:46 -0600 Subject: [PATCH] Clean up some things for thread handling. --- src/SeerGdbWidget.cpp | 3 ++ src/SeerStackFramesBrowserWidget.cpp | 37 +++++++++------- src/SeerStackFramesBrowserWidget.ui | 14 +++--- src/SeerStackManagerWidget.cpp | 54 ++++++++++++++++++++++ src/SeerStackManagerWidget.h | 6 +++ src/SeerThreadFramesBrowserWidget.cpp | 64 +++++++++++++++------------ src/SeerThreadFramesBrowserWidget.ui | 46 +++++++++---------- 7 files changed, 149 insertions(+), 75 deletions(-) diff --git a/src/SeerGdbWidget.cpp b/src/SeerGdbWidget.cpp index 79e52a9..0afd491 100644 --- a/src/SeerGdbWidget.cpp +++ b/src/SeerGdbWidget.cpp @@ -78,6 +78,7 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, stackManagerWidget->stackFramesBrowserWidget(), &SeerStackFramesBrowserWidget::handleText); QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, stackManagerWidget->stackLocalsBrowserWidget(), &SeerStackLocalsBrowserWidget::handleText); QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, stackManagerWidget->stackArgumentsBrowserWidget(), &SeerStackArgumentsBrowserWidget::handleText); + QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, stackManagerWidget, &SeerStackManagerWidget::handleText); QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, threadManagerWidget->threadIdsBrowserWidget(), &SeerThreadIdsBrowserWidget::handleText); QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, threadManagerWidget->threadFramesBrowserWidget(), &SeerThreadFramesBrowserWidget::handleText); QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, _breakpointsBrowserWidget, &SeerBreakpointsBrowserWidget::handleText); @@ -111,6 +112,7 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { QObject::connect(stackManagerWidget->stackFramesBrowserWidget(), &SeerStackFramesBrowserWidget::selectedFrame, this, &SeerGdbWidget::handleGdbStackSelectFrame); QObject::connect(stackManagerWidget->stackArgumentsBrowserWidget(), &SeerStackArgumentsBrowserWidget::refreshStackArguments, this, &SeerGdbWidget::handleGdbStackListArguments); QObject::connect(stackManagerWidget->stackFramesBrowserWidget(), &SeerStackFramesBrowserWidget::selectedFile, editorManagerWidget, &SeerEditorManagerWidget::handleOpenFile); + QObject::connect(stackManagerWidget, &SeerStackManagerWidget::refreshThreadFrames, this, &SeerGdbWidget::handleGdbThreadListFrames); QObject::connect(variableManagerWidget->variableTrackerBrowserWidget(), &SeerVariableTrackerBrowserWidget::refreshVariableTrackerValues, this, &SeerGdbWidget::handleGdbDataListExpressions); QObject::connect(variableManagerWidget->variableTrackerBrowserWidget(), &SeerVariableTrackerBrowserWidget::refreshVariableTrackerNames, this, &SeerGdbWidget::handleGdbDataListValues); @@ -149,6 +151,7 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { QObject::connect(this, &SeerGdbWidget::stoppingPointReached, variableManagerWidget->variableTrackerBrowserWidget(), &SeerVariableTrackerBrowserWidget::handleStoppingPointReached); QObject::connect(this, &SeerGdbWidget::stoppingPointReached, _breakpointsBrowserWidget, &SeerBreakpointsBrowserWidget::handleStoppingPointReached); QObject::connect(this, &SeerGdbWidget::stoppingPointReached, _watchpointsBrowserWidget, &SeerWatchpointsBrowserWidget::handleStoppingPointReached); + QObject::connect(this, &SeerGdbWidget::stoppingPointReached, stackManagerWidget, &SeerStackManagerWidget::handleStoppingPointReached); QObject::connect(leftCenterRightSplitter, &QSplitter::splitterMoved, this, &SeerGdbWidget::handleSplitterMoved); QObject::connect(sourceLibraryVariableManagerSplitter, &QSplitter::splitterMoved, this, &SeerGdbWidget::handleSplitterMoved); diff --git a/src/SeerStackFramesBrowserWidget.cpp b/src/SeerStackFramesBrowserWidget.cpp index fdc5530..a79e67b 100644 --- a/src/SeerStackFramesBrowserWidget.cpp +++ b/src/SeerStackFramesBrowserWidget.cpp @@ -16,18 +16,13 @@ SeerStackFramesBrowserWidget::SeerStackFramesBrowserWidget (QWidget* parent) : Q stackTreeWidget->setMouseTracking(true); stackTreeWidget->setSortingEnabled(false); stackTreeWidget->resizeColumnToContents(0); // level - stackTreeWidget->resizeColumnToContents(1); // addr - stackTreeWidget->resizeColumnToContents(2); // func - stackTreeWidget->resizeColumnToContents(3); // file + stackTreeWidget->resizeColumnToContents(1); // func + stackTreeWidget->resizeColumnToContents(2); // file + stackTreeWidget->resizeColumnToContents(3); // line stackTreeWidget->resizeColumnToContents(4); // fullname - stackTreeWidget->resizeColumnToContents(5); // line + stackTreeWidget->resizeColumnToContents(5); // addr stackTreeWidget->resizeColumnToContents(6); // arch - /* - stackTreeWidget->setColumnHidden(1, true); // ??? Hide or have a config to hide/show columns. - stackTreeWidget->setColumnHidden(6, true); - */ - stackTreeWidget->clear(); // Connect things. @@ -83,16 +78,24 @@ void SeerStackFramesBrowserWidget::handleText (const QString& text) { //qDebug() << __PRETTY_FUNCTION__ << ":" << file_text << fullname_text; - // Add the frame to the tree. + // Create the item. QTreeWidgetItem* item = new QTreeWidgetItem; item->setText(0, level_text); - item->setText(1, addr_text); - item->setText(2, func_text); - item->setText(3, file_text); + item->setText(1, func_text); + item->setText(2, file_text); + item->setText(3, line_text); item->setText(4, fullname_text); - item->setText(5, line_text); + item->setText(5, addr_text); item->setText(6, arch_text); + // Enable/disable interaction with this row depending if there is a valid file and line number. + if (file_text != "" && fullname_text != "" && line_text != "") { + item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled); + }else{ + item->setFlags(Qt::NoItemFlags); + } + + // Add the frame to the tree. stackTreeWidget->addTopLevelItem(item); } } @@ -143,11 +146,11 @@ void SeerStackFramesBrowserWidget::handleItemDoubleClicked (QTreeWidgetItem* ite Q_UNUSED(column); - int lineno = item->text(5).toInt(); + int lineno = item->text(3).toInt(); //qDebug() << __PRETTY_FUNCTION__ << ":" << "Emit selectedFile and selectedFrame"; - emit selectedFile(item->text(3), item->text(4), lineno); + emit selectedFile(item->text(2), item->text(4), lineno); emit selectedFrame(item->text(0).toInt()); } @@ -155,7 +158,7 @@ void SeerStackFramesBrowserWidget::handleItemEntered (QTreeWidgetItem* item, int //qDebug() << __PRETTY_FUNCTION__ << ":" << item->text(0) << column; - item->setToolTip(0, item->text(0) + " : " + item->text(2) + " : " + item->text(3) + " : " + item->text(5)); + item->setToolTip(0, item->text(0) + " : " + item->text(1) + " : " + item->text(2) + " : " + item->text(3)); for (int i=1; icolumnCount(); i++) { // Copy tooltip to other columns. item->setToolTip(i, item->toolTip(0)); diff --git a/src/SeerStackFramesBrowserWidget.ui b/src/SeerStackFramesBrowserWidget.ui index 077f28a..cecc4ed 100644 --- a/src/SeerStackFramesBrowserWidget.ui +++ b/src/SeerStackFramesBrowserWidget.ui @@ -14,7 +14,7 @@ Form - + 7 @@ -24,11 +24,6 @@ Level - - - Address - - Function @@ -39,6 +34,11 @@ File + + + Line + + Fullname @@ -46,7 +46,7 @@ - Line + Address diff --git a/src/SeerStackManagerWidget.cpp b/src/SeerStackManagerWidget.cpp index 03bee61..67d15d9 100644 --- a/src/SeerStackManagerWidget.cpp +++ b/src/SeerStackManagerWidget.cpp @@ -1,4 +1,5 @@ #include "SeerStackManagerWidget.h" +#include "SeerUtl.h" #include #include #include @@ -51,5 +52,58 @@ void SeerStackManagerWidget::handleRefreshToolButtonClicked () { stackFramesBrowserWidget()->refresh(); stackArgumentsBrowserWidget()->refresh(); stackLocalsBrowserWidget()->refresh(); + + refresh(); } +void SeerStackManagerWidget::handleText (const QString& text) { + + // Don't do any work if the widget is hidden. + if (isHidden()) { + return; + } + + QApplication::setOverrideCursor(Qt::BusyCursor); + + if (text.startsWith("^done,thread-ids={")) { + + QString newtext = Seer::filterEscapes(text); // Filter escaped characters. + + // ^done,thread-ids={ + // thread-id=\"1\", + // thread-id=\"2\" + // }, + // current-thread-id=\"1\", + // number-of-threads=\"2\" + + QString currentthreadid_text = Seer::parseFirst(newtext, "current-thread-id=", '"', '"', false); + + groupBox->setTitle("Stack Info for Thread Id : " + currentthreadid_text); + + }else if (text.startsWith("^error,msg=\"No registers.\"")) { + + groupBox->setTitle("Stack Info"); + + }else{ + // Ignore others. + } + + QApplication::restoreOverrideCursor(); +} + +void SeerStackManagerWidget::handleStoppingPointReached () { + + // Don't do any work if the widget is hidden. + if (isHidden()) { + return; + } + + refresh(); +} + +void SeerStackManagerWidget::refresh () { + + emit refreshThreadFrames(); +} + + diff --git a/src/SeerStackManagerWidget.h b/src/SeerStackManagerWidget.h index f4fe3d7..ba5be55 100644 --- a/src/SeerStackManagerWidget.h +++ b/src/SeerStackManagerWidget.h @@ -21,7 +21,13 @@ class SeerStackManagerWidget : public QWidget, protected Ui::SeerStackManagerWid SeerStackLocalsBrowserWidget* stackLocalsBrowserWidget (); signals: + void refreshThreadFrames (); + public slots: + void handleText (const QString& text); + void handleStoppingPointReached (); + void refresh (); + private slots: void handleRefreshToolButtonClicked (); diff --git a/src/SeerThreadFramesBrowserWidget.cpp b/src/SeerThreadFramesBrowserWidget.cpp index cbd0dbe..e78c570 100644 --- a/src/SeerThreadFramesBrowserWidget.cpp +++ b/src/SeerThreadFramesBrowserWidget.cpp @@ -14,17 +14,17 @@ SeerThreadFramesBrowserWidget::SeerThreadFramesBrowserWidget (QWidget* parent) : threadTreeWidget->setMouseTracking(true); threadTreeWidget->setSortingEnabled(false); threadTreeWidget->resizeColumnToContents(0); // id - threadTreeWidget->resizeColumnToContents(1); // target-id - threadTreeWidget->resizeColumnToContents(2); // name - threadTreeWidget->resizeColumnToContents(3); // level - threadTreeWidget->resizeColumnToContents(4); // addr - threadTreeWidget->resizeColumnToContents(5); // func - threadTreeWidget->resizeColumnToContents(6); // args - threadTreeWidget->resizeColumnToContents(7); // file - threadTreeWidget->resizeColumnToContents(8); // fullname - threadTreeWidget->resizeColumnToContents(9); // line - threadTreeWidget->resizeColumnToContents(10); // arch - threadTreeWidget->resizeColumnToContents(11); // state + threadTreeWidget->resizeColumnToContents(1); // state + threadTreeWidget->resizeColumnToContents(2); // level + threadTreeWidget->resizeColumnToContents(3); // func + threadTreeWidget->resizeColumnToContents(4); // file + threadTreeWidget->resizeColumnToContents(5); // line + threadTreeWidget->resizeColumnToContents(6); // fullname + threadTreeWidget->resizeColumnToContents(7); // args + threadTreeWidget->resizeColumnToContents(8); // name + threadTreeWidget->resizeColumnToContents(9); // target-id + threadTreeWidget->resizeColumnToContents(10); // addr + threadTreeWidget->resizeColumnToContents(11); // arch threadTreeWidget->resizeColumnToContents(12); // core threadTreeWidget->clear(); @@ -121,22 +121,30 @@ void SeerThreadFramesBrowserWidget::handleText (const QString& text) { //qDebug() << __PRETTY_FUNCTION__ << ":" << file_text << fullname_text; - // Add the frame to the tree. + // Create the item. QTreeWidgetItem* item = new QTreeWidgetItem; item->setText(0, id_text); - item->setText(1, targetid_text); - item->setText(2, name_text); - item->setText(3, level_text); - item->setText(4, addr_text); - item->setText(5, func_text); - item->setText(6, args_text); - item->setText(7, file_text); - item->setText(8, fullname_text); - item->setText(9, line_text); - item->setText(10, arch_text); - item->setText(11, state_text); + item->setText(1, state_text); + item->setText(2, level_text); + item->setText(3, func_text); + item->setText(4, file_text); + item->setText(5, line_text); + item->setText(6, fullname_text); + item->setText(7, args_text); + item->setText(8, name_text); + item->setText(9, targetid_text); + item->setText(10, addr_text); + item->setText(11, arch_text); item->setText(12, core_text); + // Enable/disable interaction with this row depending if there is a valid file and line number. + if (file_text != "" && fullname_text != "" && line_text != "") { + item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled); + }else{ + item->setFlags(Qt::NoItemFlags); + } + + // Add the frame to the tree. threadTreeWidget->addTopLevelItem(item); } @@ -162,8 +170,8 @@ void SeerThreadFramesBrowserWidget::handleText (const QString& text) { threadTreeWidget->resizeColumnToContents(3); threadTreeWidget->resizeColumnToContents(4); threadTreeWidget->resizeColumnToContents(5); - //threadTreeWidget->resizeColumnToContents(6); // Don't resize. - threadTreeWidget->resizeColumnToContents(7); + threadTreeWidget->resizeColumnToContents(6); + //threadTreeWidget->resizeColumnToContents(7); // Don't resize args. threadTreeWidget->resizeColumnToContents(8); threadTreeWidget->resizeColumnToContents(9); threadTreeWidget->resizeColumnToContents(10); @@ -191,11 +199,11 @@ void SeerThreadFramesBrowserWidget::handleItemDoubleClicked (QTreeWidgetItem* it Q_UNUSED(column); - int lineno = item->text(9).toInt(); + int lineno = item->text(5).toInt(); //qDebug() << __PRETTY_FUNCTION__ << ":" << "Emit selectedFile and selectedFrame"; - emit selectedFile(item->text(7), item->text(8), lineno); + emit selectedFile(item->text(4), item->text(6), lineno); // Comment out this signal. The frame number is always 0 from gdb. Why? //emit selectedFrame(item->text(3).toInt()); @@ -205,7 +213,7 @@ void SeerThreadFramesBrowserWidget::handleItemEntered (QTreeWidgetItem* item, in //qDebug() << __PRETTY_FUNCTION__ << ":" << item->text(0) << column; - item->setToolTip(0, item->text(0) + " : " + item->text(11) + " : " + item->text(5) + " : " + item->text(7) + " : " + item->text(9)); + item->setToolTip(0, item->text(0) + " : " + item->text(1) + " : " + item->text(3) + " : " + item->text(4) + " : " + item->text(5)); for (int i=1; icolumnCount(); i++) { // Copy tooltip to other columns. item->setToolTip(i, item->toolTip(0)); diff --git a/src/SeerThreadFramesBrowserWidget.ui b/src/SeerThreadFramesBrowserWidget.ui index 8398b6d..8ef71ba 100644 --- a/src/SeerThreadFramesBrowserWidget.ui +++ b/src/SeerThreadFramesBrowserWidget.ui @@ -26,12 +26,7 @@ - Target Id - - - - - Name + State @@ -39,31 +34,16 @@ Level - - - Address - - Function - - - Arguments - - File - - - Fullname - - Line @@ -71,12 +51,32 @@ - Arch + Fullname - State + Arguments + + + + + Name + + + + + Target Id + + + + + Address + + + + + Arch