mirror of
https://github.com/epasveer/seer.git
synced 2026-08-29 16:40:42 +08:00
Add support for stepping through all threads or a selected thread.
This commit is contained in:
+14
-2
@@ -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
@@ -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{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user