diff --git a/src/SeerBreakpointsBrowserWidget.cpp b/src/SeerBreakpointsBrowserWidget.cpp index 403548e..22b55b9 100644 --- a/src/SeerBreakpointsBrowserWidget.cpp +++ b/src/SeerBreakpointsBrowserWidget.cpp @@ -233,7 +233,7 @@ void SeerBreakpointsBrowserWidget::handleItemDoubleClicked (QTreeWidgetItem* ite int lineno = item->text(8).toInt(); emit selectedFile(item->text(6), item->text(7), lineno); - emit selectedAddress(item->text(4)); + emit maybeSelectedAddress(item->text(6), item->text(7), item->text(4)); } void SeerBreakpointsBrowserWidget::handleRefreshToolButton () { diff --git a/src/SeerBreakpointsBrowserWidget.h b/src/SeerBreakpointsBrowserWidget.h index 1cb940f..460c8c2 100644 --- a/src/SeerBreakpointsBrowserWidget.h +++ b/src/SeerBreakpointsBrowserWidget.h @@ -47,6 +47,7 @@ class SeerBreakpointsBrowserWidget : public QWidget, protected Ui::SeerBreakpoin void insertBreakpoint (QString breakpoint); void selectedFile (QString file, QString fullname, int lineno); void selectedAddress (QString address); + void maybeSelectedAddress (QString file, QString fullname, QString address); protected: void showEvent (QShowEvent* event); diff --git a/src/SeerEditorManagerWidget.cpp b/src/SeerEditorManagerWidget.cpp index 56f61f8..03457ab 100644 --- a/src/SeerEditorManagerWidget.cpp +++ b/src/SeerEditorManagerWidget.cpp @@ -32,6 +32,7 @@ SeerEditorManagerWidget::SeerEditorManagerWidget (QWidget* parent) : QWidget(par _editorTabSize = 4; _editorExternalEditorCommand = ""; _assemblyWidget = 0; + _showAssemblyTabOnStartupMode = "never"; _keepAssemblyTabOnTop = true; _showAddressColumn = true; _showOffsetColumn = false; @@ -176,6 +177,13 @@ void SeerEditorManagerWidget::deleteEntry (SeerEditorManagerEntries::iterator i) _entries.erase(i); } +void SeerEditorManagerWidget::maybeShowAssembly () { + + if (showAssemblyTabOnStartupMode() == "always") { + showAssembly(); + } +} + void SeerEditorManagerWidget::showAssembly () { // Create and show the assembly widget if it isn't already. @@ -202,6 +210,17 @@ bool SeerEditorManagerWidget::keepAssemblyTabOnTop () const { return _keepAssemblyTabOnTop; } +void SeerEditorManagerWidget::setShowAssemblyTabOnStartupMode (const QString& mode) { + + _showAssemblyTabOnStartupMode = mode; +} + +QString SeerEditorManagerWidget::showAssemblyTabOnStartupMode () const { + + return _showAssemblyTabOnStartupMode; +} + + void SeerEditorManagerWidget::setAssemblyShowAddressColumn (bool flag) { _showAddressColumn = flag; @@ -897,8 +916,6 @@ void SeerEditorManagerWidget::handleOpenAddress (const QString& address) { return; } - qDebug() << address; - // Get the AssemblyWidget so the address can be loaded. Return if there is no widget. SeerEditorWidgetAssembly* assemblyWidget = assemblyWidgetTab(); @@ -917,6 +934,34 @@ void SeerEditorManagerWidget::handleOpenAddress (const QString& address) { assemblyWidget->reloadRegisters(); } +void SeerEditorManagerWidget::handleMaybeOpenAddress (const QString& file, const QString& fullname, const QString& address) { + + // Must have a valid address. + if (address == "") { + return; + } + + // Don't open the assembly tab if told not to. + if (showAssemblyTabOnStartupMode() == "never") { + return; + } + + // Open the assembly tab. + if (showAssemblyTabOnStartupMode() == "always") { + handleOpenAddress(address); + return; + } + + // If the mode is 'auto', open the assembly tab if there's no source file for the address. + if (showAssemblyTabOnStartupMode() == "auto") { + if (file != "" && fullname != "") { + return; + } + + handleOpenAddress(address); + } +} + SeerEditorWidgetSource* SeerEditorManagerWidget::currentEditorWidgetTab () { QWidget* w = tabWidget->currentWidget(); diff --git a/src/SeerEditorManagerWidget.h b/src/SeerEditorManagerWidget.h index 4c39dbf..67c92ef 100644 --- a/src/SeerEditorManagerWidget.h +++ b/src/SeerEditorManagerWidget.h @@ -38,10 +38,13 @@ class SeerEditorManagerWidget : public QWidget, protected Ui::SeerEditorManagerW SeerEditorManagerEntries::const_iterator endEntry () const; void deleteEntry (SeerEditorManagerEntries::iterator i); + void maybeShowAssembly (); void showAssembly (); SeerEditorWidgetAssembly* assemblyWidgetTab (); void setKeepAssemblyTabOnTop (bool flag); bool keepAssemblyTabOnTop () const; + void setShowAssemblyTabOnStartupMode (const QString& mode); + QString showAssemblyTabOnStartupMode () const; void setAssemblyShowAddressColumn (bool flag); bool assemblyShowAddressColumn () const; void setAssemblyShowOffsetColumn (bool flag); @@ -77,6 +80,7 @@ class SeerEditorManagerWidget : public QWidget, protected Ui::SeerEditorManagerW void handleTabCurrentChanged (int index); void handleOpenFile (const QString& file, const QString& fullname, int lineno); void handleOpenAddress (const QString& address); + void handleMaybeOpenAddress (const QString& file, const QString& fullname, const QString& address); void handleInsertBreakpoint (QString breakpoint); void handleInsertPrintpoint (QString type, QString function, QString channel, QString parameters); void handleDeleteBreakpoints (QString breakpoints); @@ -152,6 +156,7 @@ class SeerEditorManagerWidget : public QWidget, protected Ui::SeerEditorManagerW QString _editorExternalEditorCommand; SeerEditorWidgetAssembly* _assemblyWidget; int _assemblyIndex; + QString _showAssemblyTabOnStartupMode; bool _keepAssemblyTabOnTop; bool _showAddressColumn; bool _showOffsetColumn; diff --git a/src/SeerGdbWidget.cpp b/src/SeerGdbWidget.cpp index 68afd14..3136389 100644 --- a/src/SeerGdbWidget.cpp +++ b/src/SeerGdbWidget.cpp @@ -78,7 +78,6 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { _gdbASyncMode = true; _gdbNonStopMode = false; _gdbServerDebug = false; - _assemblyShowAssemblyTabOnStartupMode = "never"; _assemblyDisassemblyFlavor = "att"; _gdbHandleTerminatingException = true; _gdbRandomizeStartAddress = false; @@ -264,6 +263,7 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { QObject::connect(stackManagerWidget->stackFramesBrowserWidget(), &SeerStackFramesBrowserWidget::selectedFrame, this, &SeerGdbWidget::handleGdbStackSelectFrame); QObject::connect(stackManagerWidget->stackFramesBrowserWidget(), &SeerStackFramesBrowserWidget::selectedFile, editorManagerWidget, &SeerEditorManagerWidget::handleOpenFile); QObject::connect(stackManagerWidget->stackFramesBrowserWidget(), &SeerStackFramesBrowserWidget::selectedAddress, editorManagerWidget, &SeerEditorManagerWidget::handleOpenAddress); + QObject::connect(stackManagerWidget->stackFramesBrowserWidget(), &SeerStackFramesBrowserWidget::maybeSelectedAddress, editorManagerWidget, &SeerEditorManagerWidget::handleMaybeOpenAddress); QObject::connect(stackManagerWidget->stackArgumentsBrowserWidget(), &SeerStackArgumentsBrowserWidget::refreshStackArguments, this, &SeerGdbWidget::handleGdbStackListArguments); QObject::connect(stackManagerWidget->stackArgumentsBrowserWidget(), &SeerStackArgumentsBrowserWidget::addVariableLoggerExpression, variableManagerWidget->variableLoggerBrowserWidget(), &SeerVariableLoggerBrowserWidget::addVariableExpression); QObject::connect(stackManagerWidget->stackArgumentsBrowserWidget(), &SeerStackArgumentsBrowserWidget::addVariableTrackerExpression, this, &SeerGdbWidget::handleGdbDataAddExpression); @@ -306,6 +306,7 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { QObject::connect(threadManagerWidget->threadFramesBrowserWidget(), &SeerThreadFramesBrowserWidget::refreshThreadFrames, this, &SeerGdbWidget::handleGdbThreadListFrames); QObject::connect(threadManagerWidget->threadFramesBrowserWidget(), &SeerThreadFramesBrowserWidget::selectedFile, editorManagerWidget, &SeerEditorManagerWidget::handleOpenFile); QObject::connect(threadManagerWidget->threadFramesBrowserWidget(), &SeerThreadFramesBrowserWidget::selectedAddress, editorManagerWidget, &SeerEditorManagerWidget::handleOpenAddress); + QObject::connect(threadManagerWidget->threadFramesBrowserWidget(), &SeerThreadFramesBrowserWidget::maybeSelectedAddress, editorManagerWidget, &SeerEditorManagerWidget::handleMaybeOpenAddress); QObject::connect(threadManagerWidget->threadFramesBrowserWidget(), &SeerThreadFramesBrowserWidget::selectedThread, this, &SeerGdbWidget::handleGdbThreadSelectId); QObject::connect(threadManagerWidget->threadFramesBrowserWidget(), &SeerThreadFramesBrowserWidget::nextThreadId, this, &SeerGdbWidget::handleGdbNextThreadId); QObject::connect(threadManagerWidget->threadFramesBrowserWidget(), &SeerThreadFramesBrowserWidget::stepThreadId, this, &SeerGdbWidget::handleGdbStepThreadId); @@ -344,6 +345,7 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { QObject::connect(_breakpointsBrowserWidget, &SeerBreakpointsBrowserWidget::addBreakpointCommands, this, &SeerGdbWidget::handleGdbBreakpointCommands); QObject::connect(_breakpointsBrowserWidget, &SeerBreakpointsBrowserWidget::selectedFile, editorManagerWidget, &SeerEditorManagerWidget::handleOpenFile); QObject::connect(_breakpointsBrowserWidget, &SeerBreakpointsBrowserWidget::selectedAddress, editorManagerWidget, &SeerEditorManagerWidget::handleOpenAddress); + QObject::connect(_breakpointsBrowserWidget, &SeerBreakpointsBrowserWidget::maybeSelectedAddress, editorManagerWidget, &SeerEditorManagerWidget::handleMaybeOpenAddress); QObject::connect(_watchpointsBrowserWidget, &SeerWatchpointsBrowserWidget::refreshWatchpointsList, this, &SeerGdbWidget::handleGdbGenericpointList); QObject::connect(_watchpointsBrowserWidget, &SeerWatchpointsBrowserWidget::deleteWatchpoints, this, &SeerGdbWidget::handleGdbWatchpointDelete); @@ -1170,9 +1172,7 @@ void SeerGdbWidget::handleGdbRunExecutable (const QString& breakMode, bool loadS handleGdbAssemblyDisassemblyFlavor(); // Set the disassembly flavor to use. handleGdbAssemblySymbolDemangling(); // Set the symbol demangling. - if (assemblyShowAssemblyTabOnStartupMode() == "always") { - editorManager()->showAssembly(); - } + editorManager()->maybeShowAssembly(); if (gdbHandleTerminatingException()) { handleGdbCommand("-gdb-set unwind-on-terminating-exception on"); // Turn on terminating exceptions when gdb calls the program's functions. @@ -1314,9 +1314,7 @@ void SeerGdbWidget::handleGdbAttachExecutable (bool loadSessionBreakpoints) { handleGdbAssemblyDisassemblyFlavor(); // Set the disassembly flavor to use. handleGdbAssemblySymbolDemangling(); // Set the symbol demangling. - if (assemblyShowAssemblyTabOnStartupMode() == "always") { - editorManager()->showAssembly(); - } + editorManager()->maybeShowAssembly(); if (gdbHandleTerminatingException()) { handleGdbCommand("-gdb-set unwind-on-terminating-exception on"); // Turn on terminating exceptions when gdb calls the program's functions. @@ -1432,9 +1430,7 @@ void SeerGdbWidget::handleGdbConnectExecutable (bool loadSessionBreakpoints) { handleGdbAssemblyDisassemblyFlavor(); // Set the disassembly flavor to use. handleGdbAssemblySymbolDemangling(); // Set the symbol demangling. - if (assemblyShowAssemblyTabOnStartupMode() == "always") { - editorManager()->showAssembly(); - } + editorManager()->maybeShowAssembly(); if (gdbHandleTerminatingException()) { handleGdbCommand("-gdb-set unwind-on-terminating-exception on"); // Turn on terminating exceptions when gdb calls the program's functions. @@ -1543,9 +1539,7 @@ void SeerGdbWidget::handleGdbRRExecutable (bool loadSessionBreakpoints) { handleGdbAssemblyDisassemblyFlavor(); // Set the disassembly flavor to use. handleGdbAssemblySymbolDemangling(); // Set the symbol demangling. - if (assemblyShowAssemblyTabOnStartupMode() == "always") { - editorManager()->showAssembly(); - } + editorManager()->maybeShowAssembly(); if (gdbHandleTerminatingException()) { handleGdbCommand("-gdb-set unwind-on-terminating-exception on"); // Turn on terminating exceptions when gdb calls the program's functions. @@ -1652,9 +1646,7 @@ void SeerGdbWidget::handleGdbCoreFileExecutable () { handleGdbAssemblyDisassemblyFlavor(); // Set the disassembly flavor to use. handleGdbAssemblySymbolDemangling(); // Set the symbol demangling. - if (assemblyShowAssemblyTabOnStartupMode() == "always") { - editorManager()->showAssembly(); - } + editorManager()->maybeShowAssembly(); } setNewExecutableFlag(false); @@ -4027,12 +4019,12 @@ const QStringList& SeerGdbWidget::sourceIgnoreFilePatterns () const { void SeerGdbWidget::setAssemblyShowAssemblyTabOnStartupMode (const QString& mode) { - _assemblyShowAssemblyTabOnStartupMode = mode; + editorManager()->setShowAssemblyTabOnStartupMode(mode); } QString SeerGdbWidget::assemblyShowAssemblyTabOnStartupMode () const { - return _assemblyShowAssemblyTabOnStartupMode; + return editorManager()->showAssemblyTabOnStartupMode(); } void SeerGdbWidget::setAssemblyKeepAssemblyTabOnTop (bool flag) { diff --git a/src/SeerGdbWidget.h b/src/SeerGdbWidget.h index 12cef54..392f1f7 100644 --- a/src/SeerGdbWidget.h +++ b/src/SeerGdbWidget.h @@ -438,7 +438,6 @@ class SeerGdbWidget : public QWidget, protected Ui::SeerGdbWidgetForm { QString _gdbRecordDirection; QString _gdbRemoteTargetType; QString _gdbArchitectureType; - QString _assemblyShowAssemblyTabOnStartupMode; QString _assemblyDisassemblyFlavor; QString _assemblySymbolDemangling; QString _assemblyRegisterFormat; diff --git a/src/SeerStackFramesBrowserWidget.cpp b/src/SeerStackFramesBrowserWidget.cpp index 2432c43..04f0a67 100644 --- a/src/SeerStackFramesBrowserWidget.cpp +++ b/src/SeerStackFramesBrowserWidget.cpp @@ -137,11 +137,7 @@ void SeerStackFramesBrowserWidget::handleText (const QString& text) { } // Automatically bring up the assembly for the first frame. - if (firstFrameLevel != "") { - if (firstFrameAddr != "") { - emit selectedAddress(firstFrameAddr); - } - } + emit maybeSelectedAddress(firstLiveFrameFile, firstLiveFrameFullname, firstFrameAddr); } // Select the first frame level. @@ -215,7 +211,7 @@ void SeerStackFramesBrowserWidget::handleItemClicked (QTreeWidgetItem* item, int // Select address if we can. if (item->text(5) != "") { - emit selectedAddress(item->text(5)); + emit maybeSelectedAddress(item->text(2), item->text(4), item->text(5)); } } diff --git a/src/SeerStackFramesBrowserWidget.h b/src/SeerStackFramesBrowserWidget.h index e75aefa..88e5fe9 100644 --- a/src/SeerStackFramesBrowserWidget.h +++ b/src/SeerStackFramesBrowserWidget.h @@ -30,6 +30,7 @@ class SeerStackFramesBrowserWidget : public QWidget, protected Ui::SeerStackFram void refreshStackFrames (); void selectedFile (QString file, QString fullname, int lineno); void selectedAddress (QString address); + void maybeSelectedAddress (QString file, QString fullname, QString address); void selectedFrame (int frameno); protected: diff --git a/src/SeerThreadFramesBrowserWidget.cpp b/src/SeerThreadFramesBrowserWidget.cpp index 5b874ca..7afc314 100644 --- a/src/SeerThreadFramesBrowserWidget.cpp +++ b/src/SeerThreadFramesBrowserWidget.cpp @@ -237,8 +237,6 @@ void SeerThreadFramesBrowserWidget::handleItemClicked (QTreeWidgetItem* item, in int lineno = item->text(6).toInt(); - //qDebug() << "Emit selectedFile and selectedFrame"; - // Select thread. emit selectedThread(item->text(1).toInt()); @@ -249,7 +247,7 @@ void SeerThreadFramesBrowserWidget::handleItemClicked (QTreeWidgetItem* item, in // Select address if we can. if (item->text(11) != "") { - emit selectedAddress(item->text(11)); + emit maybeSelectedAddress(item->text(5), item->text(7), item->text(11)); } } } diff --git a/src/SeerThreadFramesBrowserWidget.h b/src/SeerThreadFramesBrowserWidget.h index 246820f..cfd57c9 100644 --- a/src/SeerThreadFramesBrowserWidget.h +++ b/src/SeerThreadFramesBrowserWidget.h @@ -36,6 +36,7 @@ class SeerThreadFramesBrowserWidget : public QWidget, protected Ui::SeerThreadFr void refreshThreadIds (); void selectedFile (QString file, QString fullname, int lineno); void selectedAddress (QString address); + void maybeSelectedAddress (QString file, QString fullname, QString address); void selectedFrame (int frameno); void selectedThread (int threadid); void nextThreadId (int threadid);