Files
seer/src/SeerDebugDialog.cpp
T

444 lines
14 KiB
C++
Raw Normal View History

2021-09-01 13:58:59 -05:00
#include "SeerDebugDialog.h"
#include "SeerExecutableFilterProxyModel.h"
#include "SeerDirectoryFilterProxyModel.h"
#include "SeerSlashProcDialog.h"
2021-09-01 13:58:59 -05:00
#include <QtWidgets/QFileDialog>
#include <QtCore/QDir>
#include <QtCore/QDebug>
2022-05-02 19:57:17 -05:00
#include <QtGlobal>
2021-09-01 13:58:59 -05:00
SeerDebugDialog::SeerDebugDialog (QWidget* parent) : QDialog(parent) {
// Set up the UI.
setupUi(this);
_runModeButtonGroup = new QButtonGroup(this); // ID's 1 thru 4.
2022-07-30 12:02:52 -05:00
_runModeButtonGroup->addButton(runProgramRadioButton, 1); // "run" or "start". See breakpointMode().
2021-09-01 13:58:59 -05:00
_runModeButtonGroup->addButton(attachProgramRadioButton, 2); // "attach"
_runModeButtonGroup->addButton(connectProgramRadioButton, 3); // "connect"
_runModeButtonGroup->addButton(loadCoreRadioButton, 4); // "corefile"
// Setup the widgets
setExecutableName("");
setExecutableSymbolName("");
2021-09-01 13:58:59 -05:00
setExecutableArguments("");
setBreakpointsFilename("");
2021-09-01 13:58:59 -05:00
setExecutableWorkingDirectory(QDir::currentPath());
2022-07-30 12:02:52 -05:00
setBreakpointMode("none");
setBreakpointFunctionName("");
setShowAssemblyTab(false);
setRandomizeStartAddress(false);
setNonStopMode(false);
2021-09-01 13:58:59 -05:00
setAttachPid(0);
setConnectHostPort("");
setCoreFilename("");
// Connect things.
QObject::connect(executableNameToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleExecutableNameToolButton);
QObject::connect(executableSymbolNameToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleExecutableSymbolNameToolButton);
2021-09-01 13:58:59 -05:00
QObject::connect(executableWorkingDirectoryToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleExecutableWorkingDirectoryToolButton);
QObject::connect(loadBreakpointsFilenameToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleLoadBreakpointsFilenameToolButton);
2021-09-01 13:58:59 -05:00
QObject::connect(loadCoreFilenameToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleLoadCoreFilenameToolButton);
QObject::connect(breakpointInFunctionLineEdit, &QLineEdit::textChanged, this, &SeerDebugDialog::handleBreakpointInFunctionLineEdit);
QObject::connect(attachProgramPidToolButton, &QToolButton::clicked, this, &SeerDebugDialog::handleProgramPidToolButton);
2022-05-02 19:57:17 -05:00
2022-10-02 10:35:30 -05:00
#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
2022-04-28 20:20:37 -05:00
QObject::connect(_runModeButtonGroup, QOverload<int>::of(&QButtonGroup::idClicked), this, &SeerDebugDialog::handleRunModeChanged);
2022-05-02 19:57:17 -05:00
#else
QObject::connect(_runModeButtonGroup, QOverload<int>::of(&QButtonGroup::buttonClicked), this, &SeerDebugDialog::handleRunModeChanged);
#endif
2021-09-01 13:58:59 -05:00
// Set initial run mode.
handleRunModeChanged(-1);
}
SeerDebugDialog::~SeerDebugDialog () {
}
void SeerDebugDialog::setExecutableName (const QString& executableName) {
executableNameLineEdit->setText(executableName);
}
QString SeerDebugDialog::executableName () const {
2023-01-08 12:35:47 -06:00
if (executableNameLineEdit->isEnabled()) {
return executableNameLineEdit->text();
}
return "";
2021-09-01 13:58:59 -05:00
}
void SeerDebugDialog::setExecutableSymbolName (const QString& executableSymbolName) {
executableSymbolNameLineEdit->setText(executableSymbolName);
}
QString SeerDebugDialog::executableSymbolName () const {
2023-01-08 12:35:47 -06:00
if (executableSymbolNameLineEdit->isEnabled()) {
return executableSymbolNameLineEdit->text();
}
return "";
}
2021-09-01 13:58:59 -05:00
void SeerDebugDialog::setExecutableWorkingDirectory (const QString& executableWorkingDirectory) {
executableWorkingDirectoryLineEdit->setText(executableWorkingDirectory);
}
QString SeerDebugDialog::executableWorkingDirectory () const {
2023-01-08 12:35:47 -06:00
if (executableWorkingDirectoryLineEdit->isEnabled()) {
return executableWorkingDirectoryLineEdit->text();
}
return "";
2021-09-01 13:58:59 -05:00
}
void SeerDebugDialog::setExecutableArguments (const QString& executableArguments) {
runProgramArgumentsLineEdit->setText(executableArguments);
}
QString SeerDebugDialog::executableArguments () const {
return runProgramArgumentsLineEdit->text();
}
void SeerDebugDialog::setBreakpointsFilename (const QString& breakpointsFilename) {
loadBreakpointsFilenameLineEdit->setText(breakpointsFilename);
}
QString SeerDebugDialog::breakpointsFilename () const {
return loadBreakpointsFilenameLineEdit->text();
}
2022-07-30 12:02:52 -05:00
void SeerDebugDialog::setBreakpointMode (const QString& mode) {
if (mode == "none") {
noBreakpointRadioButton->setChecked(true);
return;
}else if (mode == "inmain") {
breakpointInMainRadioButton->setChecked(true);
return;
}else if (mode == "infunction") {
breakpointInFunctionRadioButton->setChecked(true);
return;
}
noBreakpointRadioButton->setChecked(true);
}
QString SeerDebugDialog::breakpointMode () const {
if (noBreakpointRadioButton->isChecked()) {
return "none";
}else if (breakpointInMainRadioButton->isChecked()) {
return "inmain";
}else if (breakpointInFunctionRadioButton->isChecked()) {
return "infunction";
}
return "none";
2021-09-01 13:58:59 -05:00
}
2022-07-30 12:02:52 -05:00
void SeerDebugDialog::setBreakpointFunctionName (const QString& nameoraddress) {
breakpointInFunctionLineEdit->setText(nameoraddress);
}
QString SeerDebugDialog::breakpointFunctionName () const {
return breakpointInFunctionLineEdit->text();
}
void SeerDebugDialog::setShowAssemblyTab (bool flag) {
showAsseblyTabCheckBox->setChecked(flag);
}
bool SeerDebugDialog::showAssemblyTab () const {
return showAsseblyTabCheckBox->isChecked();
}
void SeerDebugDialog::setRandomizeStartAddress (bool flag) {
randomizeStartAddressCheckBox->setChecked(flag);
}
bool SeerDebugDialog::randomizeStartAddress () const {
return randomizeStartAddressCheckBox->isChecked();
2021-09-01 13:58:59 -05:00
}
void SeerDebugDialog::setNonStopMode (bool flag) {
nonStopModeCheckBox->setChecked(flag);
}
bool SeerDebugDialog::nonStopMode () const {
return nonStopModeCheckBox->isChecked();
}
2021-09-01 13:58:59 -05:00
void SeerDebugDialog::setCoreFilename (const QString& coreFilename) {
loadCoreFilenameLineEdit->setText(coreFilename);
}
QString SeerDebugDialog::coreFilename () const {
return loadCoreFilenameLineEdit->text();
}
void SeerDebugDialog::setAttachPid (int pid) {
if (pid < 1) {
attachProgramPidLineEdit->clear();
}else{
attachProgramPidLineEdit->setText(QString::number(pid));
}
}
int SeerDebugDialog::attachPid () const {
return attachProgramPidLineEdit->text().toInt();
}
void SeerDebugDialog::setConnectHostPort (const QString& connectHostPort) {
connectProgramHostPortLineEdit->setText(connectHostPort);
}
QString SeerDebugDialog::connectHostPort () const {
return connectProgramHostPortLineEdit->text();
}
2022-04-16 10:35:32 -05:00
void SeerDebugDialog::setConnectSerialBaud (int connectBaudRate) {
if (connectBaudRate < 1) {
connectProgramBaudLineEdit->setText("");
}else{
connectProgramBaudLineEdit->setText(QString::number(connectBaudRate));
}
}
int SeerDebugDialog::connectSerialBaud () const {
if (connectProgramBaudLineEdit->text() == "") {
return -1;
}else{
return connectProgramBaudLineEdit->text().toInt();
}
2021-09-01 13:58:59 -05:00
}
2022-04-16 10:35:32 -05:00
void SeerDebugDialog::setConnectSerialParity (const QString& connectParity) {
connectProgramParityComboBox->setCurrentText(connectParity);
}
QString SeerDebugDialog::connectSerialParity () const {
return connectProgramParityComboBox->currentText();
2021-09-01 13:58:59 -05:00
}
void SeerDebugDialog::setLaunchMode (const QString& mode) {
if (mode == "start") {
runProgramRadioButton->click();
2022-07-30 12:02:52 -05:00
setBreakpointMode("inmain");
2021-09-01 13:58:59 -05:00
}else if (mode == "run") {
runProgramRadioButton->click();
2022-07-30 12:02:52 -05:00
setBreakpointMode("none");
2021-09-01 13:58:59 -05:00
}else if (mode == "attach") {
attachProgramRadioButton->click();
}else if (mode == "connect") {
connectProgramRadioButton->click();
}else if (mode == "corefile") {
loadCoreRadioButton->click();
}else if (mode == "") {
runProgramRadioButton->click();
2022-07-30 12:02:52 -05:00
setBreakpointMode("none");
2021-09-01 13:58:59 -05:00
}else{
2022-04-16 10:35:32 -05:00
qWarning() << "Unknown launch mode of:" << mode;
2021-09-01 13:58:59 -05:00
}
}
QString SeerDebugDialog::launchMode () {
if (_runModeButtonGroup->checkedId() == 1) {
2022-07-30 12:02:52 -05:00
if (breakpointMode() == "inmain") {
2021-09-01 13:58:59 -05:00
return "start";
2022-07-30 12:02:52 -05:00
}else if (breakpointMode() == "infunction") {
return "run";
}else if (breakpointMode() == "none") {
return "run";
2021-09-01 13:58:59 -05:00
}else{
return "run";
}
}else if (_runModeButtonGroup->checkedId() == 2) {
return "attach";
}else if (_runModeButtonGroup->checkedId() == 3) {
return "connect";
}else if (_runModeButtonGroup->checkedId() == 4) {
return "corefile";
}
2022-04-16 10:35:32 -05:00
qWarning() << "Unknown launch mode of:" << _runModeButtonGroup->checkedId();
2021-09-01 13:58:59 -05:00
return "";
}
void SeerDebugDialog::handleExecutableNameToolButton () {
2022-01-20 09:03:39 -06:00
QString name = QFileDialog::getOpenFileName(this, "Select an Executable to debug.", executableName(), "", nullptr, QFileDialog::DontUseNativeDialog);
2021-09-01 13:58:59 -05:00
if (name != "") {
setExecutableName(name);
}
}
void SeerDebugDialog::handleExecutableSymbolNameToolButton () {
QString name = QFileDialog::getOpenFileName(this, "Select a Symbol File for the executable.", executableSymbolName(), "", nullptr, QFileDialog::DontUseNativeDialog);
if (name != "") {
setExecutableSymbolName(name);
}
}
2021-09-01 13:58:59 -05:00
void SeerDebugDialog::handleExecutableWorkingDirectoryToolButton () {
2022-01-20 09:03:39 -06:00
QString name = QFileDialog::getExistingDirectory(this, "Select a Working Directory to run in.", executableWorkingDirectory(), QFileDialog::ShowDirsOnly|QFileDialog::DontUseNativeDialog);
2021-09-01 13:58:59 -05:00
if (name != "") {
setExecutableWorkingDirectory(name);
}
}
void SeerDebugDialog::handleLoadBreakpointsFilenameToolButton () {
QString name = QFileDialog::getOpenFileName(this, "Select a breakpoints file to load.", breakpointsFilename(), "Breakpoints (*.brk);;All files (*.*)", nullptr, QFileDialog::DontUseNativeDialog);
if (name != "") {
setBreakpointsFilename(name);
}
}
void SeerDebugDialog::handleBreakpointInFunctionLineEdit () {
breakpointInFunctionRadioButton->setChecked(true);
}
2021-09-01 13:58:59 -05:00
void SeerDebugDialog::handleLoadCoreFilenameToolButton () {
2022-01-20 09:03:39 -06:00
QString name = QFileDialog::getOpenFileName(this, "Select a core file to debug.", coreFilename(), "Core Files (core core.*)", nullptr, QFileDialog::DontUseNativeDialog);
2021-09-01 13:58:59 -05:00
if (name != "") {
setCoreFilename(name);
}
}
void SeerDebugDialog::handleProgramPidToolButton () {
SeerSlashProcDialog dlg(this);
// Execute the dialog and get the result.
if (dlg.exec()) {
setAttachPid(dlg.selectedPid());
}
}
2021-09-01 13:58:59 -05:00
void SeerDebugDialog::handleRunModeChanged (int id) {
//
// Disable all imprortant widgets.
//
2023-01-08 12:35:47 -06:00
// ID == 1 RUN/START
executableNameLineEdit->setEnabled(false);
executableSymbolNameLineEdit->setEnabled(false);
executableWorkingDirectoryLineEdit->setEnabled(false);
runProgramArgumentsLabel->setEnabled(false);
2021-09-01 13:58:59 -05:00
runProgramArgumentsLineEdit->setEnabled(false);
loadBreakpointsFilenameLabel->setEnabled(false);
loadBreakpointsFilenameLineEdit->setEnabled(false);
loadBreakpointsFilenameToolButton->setEnabled(false);
noBreakpointRadioButton->setEnabled(false);
2022-07-30 12:02:52 -05:00
breakpointInMainRadioButton->setEnabled(false);
breakpointInFunctionRadioButton->setEnabled(false);
breakpointInFunctionLineEdit->setEnabled(false);
showAsseblyTabCheckBox->setEnabled(false);
randomizeStartAddressCheckBox->setEnabled(false);
nonStopModeCheckBox->setEnabled(false);
2021-09-01 13:58:59 -05:00
2023-01-08 12:35:47 -06:00
// ID == 2 ATTACH
attachProgramPidLabel->setEnabled(false);
2021-09-01 13:58:59 -05:00
attachProgramPidLineEdit->setEnabled(false);
attachProgramPidToolButton->setEnabled(false);
2021-09-01 13:58:59 -05:00
2023-01-08 12:35:47 -06:00
// ID == 3 CONNECT
connectProgramHostPortLabel->setEnabled(false);
2021-09-01 13:58:59 -05:00
connectProgramHostPortLineEdit->setEnabled(false);
connectProgramSerialLabel->setEnabled(false);
2022-04-16 10:35:32 -05:00
connectProgramBaudLineEdit->setEnabled(false);
connectProgramParityLabel->setEnabled(false);
2022-04-16 10:35:32 -05:00
connectProgramParityComboBox->setEnabled(false);
2021-09-01 13:58:59 -05:00
2023-01-08 12:35:47 -06:00
// ID == 4 CORE
loadCoreFilenameLabel->setEnabled(false);
2021-09-01 13:58:59 -05:00
loadCoreFilenameLineEdit->setEnabled(false);
loadCoreFilenameToolButton->setEnabled(false);
2021-09-01 13:58:59 -05:00
//
// Enable the newly selected one.
//
2023-01-08 12:35:47 -06:00
// ID == 1 RUN/START
2021-09-01 13:58:59 -05:00
if (id == 1) {
2023-01-08 12:35:47 -06:00
executableNameLineEdit->setEnabled(true);
executableSymbolNameLineEdit->setEnabled(true);
executableWorkingDirectoryLineEdit->setEnabled(true);
runProgramArgumentsLabel->setEnabled(true);
2021-09-01 13:58:59 -05:00
runProgramArgumentsLineEdit->setEnabled(true);
loadBreakpointsFilenameLabel->setEnabled(true);
loadBreakpointsFilenameLineEdit->setEnabled(true);
loadBreakpointsFilenameToolButton->setEnabled(true);
noBreakpointRadioButton->setEnabled(true);
2022-07-30 12:02:52 -05:00
breakpointInMainRadioButton->setEnabled(true);
breakpointInFunctionRadioButton->setEnabled(true);
breakpointInFunctionLineEdit->setEnabled(true);
showAsseblyTabCheckBox->setEnabled(true);
randomizeStartAddressCheckBox->setEnabled(true);
nonStopModeCheckBox->setEnabled(true);
2021-09-01 13:58:59 -05:00
}
2023-01-08 12:35:47 -06:00
// ID == 2 ATTACH
2021-09-01 13:58:59 -05:00
if (id == 2) {
2023-01-08 12:35:47 -06:00
executableNameLineEdit->setEnabled(true);
executableSymbolNameLineEdit->setEnabled(true);
attachProgramPidLabel->setEnabled(true);
2021-09-01 13:58:59 -05:00
attachProgramPidLineEdit->setEnabled(true);
attachProgramPidToolButton->setEnabled(true);
2021-09-01 13:58:59 -05:00
}
2023-01-08 12:35:47 -06:00
// ID == 3 CONNECT
2021-09-01 13:58:59 -05:00
if (id == 3) {
2023-01-08 12:35:47 -06:00
executableSymbolNameLineEdit->setEnabled(true);
connectProgramHostPortLabel->setEnabled(true);
2021-09-01 13:58:59 -05:00
connectProgramHostPortLineEdit->setEnabled(true);
connectProgramSerialLabel->setEnabled(true);
2022-04-16 10:35:32 -05:00
connectProgramBaudLineEdit->setEnabled(true);
connectProgramParityLabel->setEnabled(true);
2022-04-16 10:35:32 -05:00
connectProgramParityComboBox->setEnabled(true);
2021-09-01 13:58:59 -05:00
}
2023-01-08 12:35:47 -06:00
// ID == 4 CORE
2021-09-01 13:58:59 -05:00
if (id == 4) {
2023-01-08 12:35:47 -06:00
executableSymbolNameLineEdit->setEnabled(true);
connectProgramHostPortLabel->setEnabled(true);
loadCoreFilenameLabel->setEnabled(true);
2021-09-01 13:58:59 -05:00
loadCoreFilenameLineEdit->setEnabled(true);
loadCoreFilenameToolButton->setEnabled(true);
2021-09-01 13:58:59 -05:00
}
}