From 76fc97227784ad1e6ce3cbb5a55d36fef16af458 Mon Sep 17 00:00:00 2001
From: hjk <hjk121@nokiamail.com>
Date: Mon, 3 Jun 2013 14:27:53 +0200
Subject: [PATCH] Debugger: Add specific customization hook for dumper
 initialization

We need to distiguish between start of GDB itself (a.k.a .gdbinit-style
customization) and after the dumper machinery is initialized, which is
nowadays often delayed until the first stop hook.

Change-Id: I40f1e7225c2043b8bcb7d50eef948bb3c9162bb6
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@digia.com>
Reviewed-by: hjk <hjk121@nokiamail.com>
---
 share/qtcreator/dumper/gbridge.py           |  3 ++
 src/plugins/debugger/debuggeractions.cpp    |  5 +++
 src/plugins/debugger/debuggeractions.h      |  1 +
 src/plugins/debugger/gdb/gdbengine.cpp      |  7 ++++
 src/plugins/debugger/gdb/gdboptionspage.cpp | 38 ++++++++++++++++-----
 5 files changed, 45 insertions(+), 9 deletions(-)

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)
         "<b>Note:</b>This feature needs special support from the Linux "
         "distribution and GDB build and is not everywhere available.</p></body></html>"));
 
-    groupBoxStartupCommands = new QGroupBox(this);
-    groupBoxStartupCommands->setTitle(GdbOptionsPage::tr("Additional Startup Commands"));
-    groupBoxStartupCommands->setToolTip(GdbOptionsPage::tr(
-        "<html><head/><body><p>GDB commands entered here will be executed after "
-        "GDB has been started and the debugging helpers have been initialized.</p>"
-        "<p>You can add commands to load further debugging helpers here, or "
-        "modify existing ones.</p>"
+    QString howToUsePython = GdbOptionsPage::tr(
         "<p>To execute simple Python commands, prefix them with \"python\".</p>"
         "<p>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.</p>"
         "<p>To execute arbitrary Python scripts, "
-        "use <i>python execfile('/path/to/script.py')</i>.</p>"
-        "</body></html>"));
+        "use <i>python execfile('/path/to/script.py')</i>.</p>");
+
+    groupBoxStartupCommands = new QGroupBox(this);
+    groupBoxStartupCommands->setTitle(GdbOptionsPage::tr("Additional Startup Commands"));
+    groupBoxStartupCommands->setToolTip(GdbOptionsPage::tr(
+        "<html><head/><body><p>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.</p>%1"
+        "<body></html>").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(
+        "<html><head/><body><p>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.</p>"
+        "%1</body></html>").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);
-- 
GitLab