diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp index 89901af73eab434b65f6aee6c1a95d4763fa18b5..976453e5d2704a56fffac927d64a26949b43a2c3 100644 --- a/src/plugins/debugger/debuggeractions.cpp +++ b/src/plugins/debugger/debuggeractions.cpp @@ -404,7 +404,13 @@ DebuggerSettings::DebuggerSettings() item = new SavedAction(this); item->setSettingsKey(debugModeGroup, QLatin1String("GdbCustomDumperCommands")); item->setDefaultValue(QString()); - insertItem(GdbCustomDumperCommands, item); + insertItem(ExtraDumperCommands, item); + item = new SavedAction(this); + + item = new SavedAction(this); + item->setSettingsKey(debugModeGroup, QLatin1String("ExtraDumperFile")); + item->setDefaultValue(QString()); + insertItem(ExtraDumperFile, item); item = new SavedAction(this); item->setSettingsKey(debugModeGroup, QLatin1String("GdbPostAttachCommands")); diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h index 5cf9a715505e613f96fe1d595735c1dff023ebbf..23156f7b52b3f24ac5e46e1b7e0ca54b5e2ccc73 100644 --- a/src/plugins/debugger/debuggeractions.h +++ b/src/plugins/debugger/debuggeractions.h @@ -110,6 +110,8 @@ enum DebuggerActionCode RegisterForPostMortem, AlwaysAdjustColumnWidths, + ExtraDumperFile, // For loading a file. Recommended. + ExtraDumperCommands, // To modify an existing setup. // Cdb CdbAdditionalArguments, @@ -126,7 +128,6 @@ enum DebuggerActionCode LoadGdbDumpers, AttemptQuickStart, GdbStartupCommands, - GdbCustomDumperCommands, GdbPostAttachCommands, GdbWatchdogTimeout, AutoEnrichParameters, diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 02c142415af12e13585af4d22e8aca81e657ff03..b201a1ec663b85f8409c509076215a0b0fbc6ebc 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -1735,12 +1735,25 @@ void GdbEngine::handlePythonSetup(const GdbResponse &response) { QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); if (response.resultClass == GdbResultDone) { - const QString commands = debuggerCore()->stringSetting(GdbCustomDumperCommands); + bool needSetup = false; + + const QString path = debuggerCore()->stringSetting(ExtraDumperFile); + if (!path.isEmpty()) { + QFileInfo fi(path); + postCommand("python sys.path.insert(1, '" + fi.absolutePath().toUtf8() + "')"); + postCommand("python from " + fi.baseName().toUtf8() + " import *"); + needSetup = true; + } + + const QString commands = debuggerCore()->stringSetting(ExtraDumperCommands); if (!commands.isEmpty()) { postCommand(commands.toLocal8Bit()); - postCommand("bbsetup"); + needSetup = true; } + if (needSetup) + postCommand("bbsetup"); + GdbMi data; data.fromStringMultiple(response.consoleStreamOutput); const GdbMi dumpers = data["dumpers"]; diff --git a/src/plugins/debugger/gdb/gdboptionspage.cpp b/src/plugins/debugger/gdb/gdboptionspage.cpp index 91a77399b85380d6ac0f9a8d9b6905bc1f97bb68..e8d914d34aa307ad3faefffb716d63d74e84b009 100644 --- a/src/plugins/debugger/gdb/gdboptionspage.cpp +++ b/src/plugins/debugger/gdb/gdboptionspage.cpp @@ -41,6 +41,7 @@ #include <QDebug> #include <QFormLayout> #include <QLabel> +#include <QLineEdit> #include <QSpinBox> #include <QTextEdit> @@ -63,7 +64,6 @@ public: explicit GdbOptionsPageWidget(QWidget *parent = 0); QGroupBox *groupBoxGeneral; - QLabel *labelGdbWatchdogTimeout; QSpinBox *spinBoxGdbWatchdogTimeout; QCheckBox *checkBoxSkipKnownFrames; QCheckBox *checkBoxUseMessageBoxForSignals; @@ -80,6 +80,7 @@ public: QTextEdit *textEditPostAttachCommands; QGroupBox *groupBoxCustomDumperCommands; QTextEdit *textEditCustomDumperCommands; + QLineEdit *extraDumperFile; //QGroupBox *groupBoxPluginDebugging; //QRadioButton *radioButtonAllPluginBreakpoints; @@ -99,7 +100,7 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent) groupBoxGeneral = new QGroupBox(this); groupBoxGeneral->setTitle(GdbOptionsPage::tr("General")); - labelGdbWatchdogTimeout = new QLabel(groupBoxGeneral); + QLabel *labelGdbWatchdogTimeout = new QLabel(groupBoxGeneral); labelGdbWatchdogTimeout->setText(GdbOptionsPage::tr("GDB timeout:")); labelGdbWatchdogTimeout->setToolTip(GdbOptionsPage::tr( "The number of seconds Qt Creator will wait before it terminates\n" @@ -221,6 +222,10 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent) textEditCustomDumperCommands->setAcceptRichText(false); textEditCustomDumperCommands->setToolTip(groupBoxCustomDumperCommands->toolTip()); + extraDumperFile = new QLineEdit(groupBoxCustomDumperCommands); + extraDumperFile->setToolTip(GdbOptionsPage::tr( + "Path to a Python file containing additional data dumpers.")); + /* groupBoxPluginDebugging = new QGroupBox(q); groupBoxPluginDebugging->setTitle(GdbOptionsPage::tr( @@ -250,6 +255,7 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent) VariableChooser::addVariableSupport(textEditCustomDumperCommands); VariableChooser::addVariableSupport(textEditPostAttachCommands); VariableChooser::addVariableSupport(textEditStartupCommands); + VariableChooser::addVariableSupport(extraDumperFile); QFormLayout *formLayout = new QFormLayout(groupBoxGeneral); formLayout->addRow(labelGdbWatchdogTimeout, spinBoxGdbWatchdogTimeout); @@ -268,8 +274,9 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent) QGridLayout *postAttachLayout = new QGridLayout(groupBoxPostAttachCommands); postAttachLayout->addWidget(textEditPostAttachCommands, 0, 0, 1, 1); - QGridLayout *customDumperLayout = new QGridLayout(groupBoxCustomDumperCommands); - customDumperLayout->addWidget(textEditCustomDumperCommands, 0, 0, 1, 1); + QFormLayout *customDumperLayout = new QFormLayout(groupBoxCustomDumperCommands); + customDumperLayout->addRow(GdbOptionsPage::tr("Additional file:"), extraDumperFile); + customDumperLayout->addRow(textEditCustomDumperCommands); //QHBoxLayout *horizontalLayout = new QHBoxLayout(); //horizontalLayout->addItem(new QSpacerItem(10, 10, QSizePolicy::Preferred, QSizePolicy::Minimum)); @@ -292,7 +299,8 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent) DebuggerCore *dc = debuggerCore(); group.insert(dc->action(GdbStartupCommands), textEditStartupCommands); - group.insert(dc->action(GdbCustomDumperCommands), textEditCustomDumperCommands); + group.insert(dc->action(ExtraDumperFile), extraDumperFile); + group.insert(dc->action(ExtraDumperCommands), textEditCustomDumperCommands); group.insert(dc->action(GdbPostAttachCommands), textEditPostAttachCommands); group.insert(dc->action(LoadGdbInit), checkBoxLoadGdbInit); group.insert(dc->action(LoadGdbDumpers), checkBoxLoadGdbDumpers); diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 24c791f2fb9cb410e8f54b902ebbe4cb33d255fc..90f18d631f3a5b953cd07a6f1cafe5e03832fe32 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -275,6 +275,26 @@ void LldbEngine::setupInferior() { const DebuggerStartParameters &sp = startParameters(); + const QString path = debuggerCore()->stringSetting(ExtraDumperFile); + if (!path.isEmpty()) { + QFileInfo fi(path); + + Command cmd1("executeDebuggerCommand"); + cmd1.arg("command", "python sys.path.insert(1, '" + fi.absolutePath().toUtf8() + "')"); + runCommand(cmd1); + + Command cmd2("executeDebuggerCommand"); + cmd2.arg("python from " + fi.baseName().toUtf8() + " import *"); + runCommand(cmd2); + } + + const QString commands = debuggerCore()->stringSetting(ExtraDumperCommands); + if (!commands.isEmpty()) { + Command cmd("executeDebuggerCommand"); + cmd.arg(commands.toUtf8()); + runCommand(cmd); + } + QString executable; Utils::QtcProcess::Arguments args; Utils::QtcProcess::prepareCommand(QFileInfo(sp.executable).absoluteFilePath(),