Add support for stepping through all threads or a selected thread.

This commit is contained in:
Ernie Pasveer
2022-09-17 09:14:46 -05:00
parent 2ce231bf20
commit 65ef10f10f
7 changed files with 181 additions and 25 deletions
+14 -2
View File
@@ -2,8 +2,20 @@
# Seer Change Log
## [1.11beta] - 2022-XX-22
* .
- .
* Thread/Process manager.
- Add a fork/vfork mode. Follow:
- Parent process.
- Child process.
- Both (switchable via thread manager)
- (see gdb's follow-fork-mode and detach-on-fork modes)
- Add thread execution mode. Execute:
- Selected thread only.
- All threads
- (see gdb's scheduler-locking mode)
- Add multi-process execution mode.
- Execute selected process.
- Execute all processes.
- (see gdb's schedule-multiple mode)
## [1.10] - 2022-09-22
* New Struct Visualizer.
+23 -3
View File
@@ -205,6 +205,8 @@ 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::selectedThread, this, &SeerGdbWidget::handleGdbThreadSelectId);
QObject::connect(threadManagerWidget, &SeerThreadManagerWidget::schedulerLockingModeChanged, this, &SeerGdbWidget::handleGdbSchedulerLockingMode);
QObject::connect(threadManagerWidget, &SeerThreadManagerWidget::scheduleMultipleModeChanged, this, &SeerGdbWidget::handleGdbScheduleMultipleMode);
QObject::connect(threadManagerWidget, &SeerThreadManagerWidget::forkFollowsModeChanged, this, &SeerGdbWidget::handleGdbForkFollowMode);
QObject::connect(_breakpointsBrowserWidget, &SeerBreakpointsBrowserWidget::refreshBreakpointsList, this, &SeerGdbWidget::handleGdbGenericpointList);
@@ -2500,19 +2502,37 @@ void SeerGdbWidget::setAssemblySymbolDemagling (const QString& onoff) {
}
}
void SeerGdbWidget::handleGdbSchedulerLockingMode (QString mode) {
if (executableLaunchMode() == "") {
return;
}
handleGdbCommand(QString("-gdb-set scheduler-locking %1").arg(mode));
}
void SeerGdbWidget::handleGdbScheduleMultipleMode (QString mode) {
if (executableLaunchMode() == "") {
return;
}
handleGdbCommand(QString("-gdb-set schedule-multiple %1").arg(mode));
}
void SeerGdbWidget::handleGdbForkFollowMode (QString mode) {
if (executableLaunchMode() == "") {
return;
}
if (mode == "Parent") {
if (mode == "parent") {
handleGdbCommand("-gdb-set follow-fork-mode parent");
handleGdbCommand("-gdb-set detach-on-fork on");
}else if (mode == "Child") {
}else if (mode == "child") {
handleGdbCommand("-gdb-set follow-fork-mode child");
handleGdbCommand("-gdb-set detach-on-fork on");
}else if (mode == "Both") {
}else if (mode == "both") {
handleGdbCommand("-gdb-set follow-fork-mode parent");
handleGdbCommand("-gdb-set detach-on-fork off");
}else{
+2
View File
@@ -247,6 +247,8 @@ class SeerGdbWidget : public QWidget, protected Ui::SeerGdbWidgetForm {
void handleGdbSaveBreakpoints ();
void handleGdbAssemblyDisassemblyFlavor ();
void handleGdbAssemblySymbolDemangling ();
void handleGdbSchedulerLockingMode (QString mode);
void handleGdbScheduleMultipleMode (QString mode);
void handleGdbForkFollowMode (QString mode);
void handleGdbProcessFinished (int exitCode, QProcess::ExitStatus exitStatus);
+4 -4
View File
@@ -176,11 +176,11 @@ void SeerThreadFramesBrowserWidget::handleText (const QString& text) {
threadTreeWidget->resizeColumnToContents(0);
threadTreeWidget->resizeColumnToContents(1);
threadTreeWidget->resizeColumnToContents(2);
threadTreeWidget->resizeColumnToContents(3);
threadTreeWidget->resizeColumnToContents(4);
//threadTreeWidget->resizeColumnToContents(3); // Don't resize.
//threadTreeWidget->resizeColumnToContents(4); // Don't resize.
threadTreeWidget->resizeColumnToContents(5);
threadTreeWidget->resizeColumnToContents(6);
//threadTreeWidget->resizeColumnToContents(7); // Don't resize args.
//threadTreeWidget->resizeColumnToContents(6); // Don't resize.
//threadTreeWidget->resizeColumnToContents(7); // Don't resize.
threadTreeWidget->resizeColumnToContents(8);
threadTreeWidget->resizeColumnToContents(9);
threadTreeWidget->resizeColumnToContents(10);
+38 -2
View File
@@ -26,8 +26,10 @@ SeerThreadManagerWidget::SeerThreadManagerWidget (QWidget* parent) : QWidget(par
tabWidget->setCornerWidget(refreshToolButton, Qt::TopRightCorner);
// Connect things.
QObject::connect(refreshToolButton, &QToolButton::clicked, this, &SeerThreadManagerWidget::handleRefreshToolButtonClicked);
QObject::connect(forkFollowsComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &SeerThreadManagerWidget::handleForkFollowComboBox);
QObject::connect(refreshToolButton, &QToolButton::clicked, this, &SeerThreadManagerWidget::handleRefreshToolButtonClicked);
QObject::connect(schedulerLockingComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &SeerThreadManagerWidget::handleSchedulerLockingComboBox);
QObject::connect(scheduleMultipleComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &SeerThreadManagerWidget::handleScheduleMultipleComboBox);
QObject::connect(forkFollowsComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &SeerThreadManagerWidget::handleForkFollowComboBox);
}
SeerThreadManagerWidget::~SeerThreadManagerWidget () {
@@ -41,6 +43,26 @@ SeerThreadFramesBrowserWidget* SeerThreadManagerWidget::threadFramesBrowserWidge
return _threadFramesBrowserWidget;
}
void SeerThreadManagerWidget::setSchedulerLockingMode (const QString& mode) {
schedulerLockingComboBox->setCurrentText(mode);
}
QString SeerThreadManagerWidget::schedulerLockingMode () const {
return schedulerLockingComboBox->currentText();
}
void SeerThreadManagerWidget::setScheduleMultipleMode (const QString& mode) {
scheduleMultipleComboBox->setCurrentText(mode);
}
QString SeerThreadManagerWidget::scheduleMultipleMode () const {
return scheduleMultipleComboBox->currentText();
}
void SeerThreadManagerWidget::setForkFollowsMode (const QString& mode) {
forkFollowsComboBox->setCurrentText(mode);
@@ -57,6 +79,20 @@ void SeerThreadManagerWidget::handleRefreshToolButtonClicked () {
threadIdsBrowserWidget()->refresh();
}
void SeerThreadManagerWidget::handleSchedulerLockingComboBox (int index) {
Q_UNUSED(index);
emit schedulerLockingModeChanged(schedulerLockingComboBox->currentText());
}
void SeerThreadManagerWidget::handleScheduleMultipleComboBox (int index) {
Q_UNUSED(index);
emit scheduleMultipleModeChanged(scheduleMultipleComboBox->currentText());
}
void SeerThreadManagerWidget::handleForkFollowComboBox (int index) {
Q_UNUSED(index);
+10 -1
View File
@@ -19,16 +19,25 @@ class SeerThreadManagerWidget : public QWidget, protected Ui::SeerThreadManagerW
SeerThreadFramesBrowserWidget* threadFramesBrowserWidget ();
signals:
void schedulerLockingModeChanged (const QString& mode);
void scheduleMultipleModeChanged (const QString& mode);
void forkFollowsModeChanged (const QString& mode);
public slots:
void setSchedulerLockingMode (const QString& mode);
QString schedulerLockingMode () const;
void setScheduleMultipleMode (const QString& mode);
QString scheduleMultipleMode () const;
void setForkFollowsMode (const QString& mode);
QString forkFollowsMode () const;
private slots:
void handleRefreshToolButtonClicked ();
void handleSchedulerLockingComboBox (int index);
void handleScheduleMultipleComboBox (int index);
void handleForkFollowComboBox (int index);
private:
+90 -13
View File
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>854</width>
<width>748</width>
<height>571</height>
</rect>
</property>
@@ -25,50 +25,127 @@
<property name="title">
<string>Thread/Process Info</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QDetachTabWidget" name="tabWidget">
<property name="currentIndex">
<number>-1</number>
</property>
</widget>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="schedulerLockingLabel">
<property name="text">
<string>Scheduler locking:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="schedulerLockingComboBox">
<property name="toolTip">
<string>Set the scheduler locking mode.</string>
</property>
<item>
<property name="text">
<string>replay</string>
</property>
</item>
<item>
<property name="text">
<string>off</string>
</property>
</item>
<item>
<property name="text">
<string>on</string>
</property>
</item>
<item>
<property name="text">
<string>step</string>
</property>
</item>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="scheduleMultipleLabel">
<property name="toolTip">
<string/>
</property>
<property name="text">
<string>Schedule multiple:</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QComboBox" name="scheduleMultipleComboBox">
<property name="toolTip">
<string>Set the mode for allowing threads of multiple processes to be resumed when an execution command is issued.</string>
</property>
<item>
<property name="text">
<string>off</string>
</property>
</item>
<item>
<property name="text">
<string>on</string>
</property>
</item>
</widget>
</item>
<item row="0" column="4">
<spacer name="horizontalSpacer_1">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>288</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QLabel" name="forkFollowsLabel">
<property name="text">
<string>Fork follows:</string>
</property>
</widget>
</item>
<item>
<item row="1" column="1">
<widget class="QComboBox" name="forkFollowsComboBox">
<property name="toolTip">
<string>Set the debugger response to a program call of fork or vfork.</string>
</property>
<item>
<property name="text">
<string>Parent</string>
<string>parent</string>
</property>
</item>
<item>
<property name="text">
<string>Child</string>
<string>child</string>
</property>
</item>
<item>
<property name="text">
<string>Both</string>
<string>both</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<item row="1" column="2" colspan="3">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<width>508</width>
<height>20</height>
</size>
</property>