diff --git a/share/qtcreator/dumper/gbridge.py b/share/qtcreator/dumper/gbridge.py index 189c8325e91..19cb82149e3 100644 --- a/share/qtcreator/dumper/gbridge.py +++ b/share/qtcreator/dumper/gbridge.py @@ -382,6 +382,9 @@ def registerDumper(function): def bbsetup(args = ''): global qqDumpers, qqFormats, qqEditable, typeCache + qqDumpers = {} + qqFormats = {} + qqEditable = {} typeCache = {} module = sys.modules[__name__] diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp index c84ca969a64..c0422178856 100644 --- a/src/plugins/debugger/debuggeractions.cpp +++ b/src/plugins/debugger/debuggeractions.cpp @@ -447,6 +447,11 @@ DebuggerSettings::DebuggerSettings(QSettings *settings) insertItem(GdbStartupCommands, item); item = new SavedAction(this); + item->setSettingsKey(debugModeGroup, QLatin1String("GdbCustomDumperCommands")); + item->setDefaultValue(QString()); + insertItem(GdbCustomDumperCommands, item); + item = new SavedAction(this); + item->setSettingsKey(debugModeGroup, QLatin1String("GdbPostAttachCommands")); item->setDefaultValue(QString()); insertItem(GdbPostAttachCommands, item); diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h index d98423a76ca..2abc5dddf40 100644 --- a/src/plugins/debugger/debuggeractions.h +++ b/src/plugins/debugger/debuggeractions.h @@ -130,6 +130,7 @@ 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 f7fdc827fbc..bdacb767080 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -1854,6 +1854,12 @@ void GdbEngine::handleHasPython(const GdbResponse &response) void GdbEngine::handlePythonSetup(const GdbResponse &response) { if (response.resultClass == GdbResultDone) { + const QString commands = debuggerCore()->stringSetting(GdbCustomDumperCommands); + if (!commands.isEmpty()) { + postCommand(commands.toLocal8Bit()); + postCommand("bbsetup"); + } + postCommand("python qqStringCutOff = " + debuggerCore()->action(MaximalStringLength)->value().toByteArray(), ConsoleCommand|NonCriticalResponse); @@ -4972,6 +4978,7 @@ void GdbEngine::tryLoadPythonDumpers() postCommand("python execfile('" + dumperSourcePath + "gbridge.py')", ConsoleCommand, CB(handlePythonSetup)); + } void GdbEngine::reloadDebuggingHelpers() diff --git a/src/plugins/debugger/gdb/gdboptionspage.cpp b/src/plugins/debugger/gdb/gdboptionspage.cpp index e65711ab1eb..f88f592d953 100644 --- a/src/plugins/debugger/gdb/gdboptionspage.cpp +++ b/src/plugins/debugger/gdb/gdboptionspage.cpp @@ -72,6 +72,8 @@ public: QTextEdit *textEditStartupCommands; QGroupBox *groupBoxPostAttachCommands; QTextEdit *textEditPostAttachCommands; + QGroupBox *groupBoxCustomDumperCommands; + QTextEdit *textEditCustomDumperCommands; //QGroupBox *groupBoxPluginDebugging; //QRadioButton *radioButtonAllPluginBreakpoints; @@ -167,20 +169,21 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent) "Note:This feature needs special support from the Linux " "distribution and GDB build and is not everywhere available.

")); - groupBoxStartupCommands = new QGroupBox(this); - groupBoxStartupCommands->setTitle(GdbOptionsPage::tr("Additional Startup Commands")); - groupBoxStartupCommands->setToolTip(GdbOptionsPage::tr( - "

GDB commands entered here will be executed after " - "GDB has been started and the debugging helpers have been initialized.

" - "

You can add commands to load further debugging helpers here, or " - "modify existing ones.

" + QString howToUsePython = GdbOptionsPage::tr( "

To execute simple Python commands, prefix them with \"python\".

" "

To execute sequences of Python commands spanning multiple lines " "prepend the block with \"python\" on a separate line, and append " "\"end\" on a separate line.

" "

To execute arbitrary Python scripts, " - "use python execfile('/path/to/script.py').

" - "")); + "use python execfile('/path/to/script.py').

"); + + groupBoxStartupCommands = new QGroupBox(this); + groupBoxStartupCommands->setTitle(GdbOptionsPage::tr("Additional Startup Commands")); + groupBoxStartupCommands->setToolTip(GdbOptionsPage::tr( + "

GDB commands entered here will be executed after " + "GDB has been started, but before the debugged program is started or " + "attached, and before the debugging helpers are initialized.

%1" + "").arg(howToUsePython)); textEditStartupCommands = new QTextEdit(groupBoxStartupCommands); textEditStartupCommands->setAcceptRichText(false); @@ -199,6 +202,18 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent) textEditPostAttachCommands->setAcceptRichText(false); textEditPostAttachCommands->setToolTip(groupBoxPostAttachCommands->toolTip()); + groupBoxCustomDumperCommands = new QGroupBox(this); + groupBoxCustomDumperCommands->setTitle(GdbOptionsPage::tr("Debugging Helper Customization")); + groupBoxCustomDumperCommands->setToolTip(GdbOptionsPage::tr( + "

GDB commands entered here will be executed after " + "Qt Creator's debugging helpers have been loaded and fully initialized. " + "You can load additional debugging helpers or modify existing ones here.

" + "%1").arg(howToUsePython)); + + textEditCustomDumperCommands = new QTextEdit(groupBoxStartupCommands); + textEditCustomDumperCommands->setAcceptRichText(false); + textEditCustomDumperCommands->setToolTip(groupBoxStartupCommands->toolTip()); + /* groupBoxPluginDebugging = new QGroupBox(q); groupBoxPluginDebugging->setTitle(GdbOptionsPage::tr( @@ -242,6 +257,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); + //QHBoxLayout *horizontalLayout = new QHBoxLayout(); //horizontalLayout->addItem(new QSpacerItem(10, 10, QSizePolicy::Preferred, QSizePolicy::Minimum)); //horizontalLayout->addWidget(labelSelectedPluginBreakpoints); @@ -251,6 +269,7 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent) gridLayout->addWidget(groupBoxGeneral, 0, 0, 2, 1); gridLayout->addWidget(groupBoxStartupCommands, 0, 1, 1, 1); gridLayout->addWidget(groupBoxPostAttachCommands, 1, 1, 1, 1); + gridLayout->addWidget(groupBoxCustomDumperCommands, 2, 1, 1, 1); //gridLayout->addWidget(groupBoxStartupCommands, 0, 1, 1, 1); //gridLayout->addWidget(radioButtonAllPluginBreakpoints, 0, 0, 1, 1); @@ -262,6 +281,7 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent) DebuggerCore *dc = debuggerCore(); group.insert(dc->action(GdbStartupCommands), textEditStartupCommands); + group.insert(dc->action(GdbCustomDumperCommands), textEditCustomDumperCommands); group.insert(dc->action(GdbPostAttachCommands), textEditPostAttachCommands); group.insert(dc->action(LoadGdbInit), checkBoxLoadGdbInit); group.insert(dc->action(LoadGdbDumpers), checkBoxLoadGdbDumpers);