Debugger: Allow loading dumpers from a file directly

Instead of requiring the user to add the required python
code to load them manually let him specify a file directly.
This also makes the feature accessible to LLDB which needs
a slightly different syntax.

Task-number: QTCREATORBUG-12492
Change-Id: I12621b1cea2429476b0865bcbcb739a238dcf6af
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
hjk
2014-06-23 16:33:19 +02:00
parent a83548f189
commit fc46406fc8
5 changed files with 57 additions and 9 deletions

View File

@@ -404,7 +404,13 @@ DebuggerSettings::DebuggerSettings()
item = new SavedAction(this); item = new SavedAction(this);
item->setSettingsKey(debugModeGroup, QLatin1String("GdbCustomDumperCommands")); item->setSettingsKey(debugModeGroup, QLatin1String("GdbCustomDumperCommands"));
item->setDefaultValue(QString()); 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 = new SavedAction(this);
item->setSettingsKey(debugModeGroup, QLatin1String("GdbPostAttachCommands")); item->setSettingsKey(debugModeGroup, QLatin1String("GdbPostAttachCommands"));

View File

@@ -110,6 +110,8 @@ enum DebuggerActionCode
RegisterForPostMortem, RegisterForPostMortem,
AlwaysAdjustColumnWidths, AlwaysAdjustColumnWidths,
ExtraDumperFile, // For loading a file. Recommended.
ExtraDumperCommands, // To modify an existing setup.
// Cdb // Cdb
CdbAdditionalArguments, CdbAdditionalArguments,
@@ -126,7 +128,6 @@ enum DebuggerActionCode
LoadGdbDumpers, LoadGdbDumpers,
AttemptQuickStart, AttemptQuickStart,
GdbStartupCommands, GdbStartupCommands,
GdbCustomDumperCommands,
GdbPostAttachCommands, GdbPostAttachCommands,
GdbWatchdogTimeout, GdbWatchdogTimeout,
AutoEnrichParameters, AutoEnrichParameters,

View File

@@ -1735,12 +1735,25 @@ void GdbEngine::handlePythonSetup(const GdbResponse &response)
{ {
QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state());
if (response.resultClass == GdbResultDone) { 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()) { if (!commands.isEmpty()) {
postCommand(commands.toLocal8Bit()); postCommand(commands.toLocal8Bit());
postCommand("bbsetup"); needSetup = true;
} }
if (needSetup)
postCommand("bbsetup");
GdbMi data; GdbMi data;
data.fromStringMultiple(response.consoleStreamOutput); data.fromStringMultiple(response.consoleStreamOutput);
const GdbMi dumpers = data["dumpers"]; const GdbMi dumpers = data["dumpers"];

View File

@@ -41,6 +41,7 @@
#include <QDebug> #include <QDebug>
#include <QFormLayout> #include <QFormLayout>
#include <QLabel> #include <QLabel>
#include <QLineEdit>
#include <QSpinBox> #include <QSpinBox>
#include <QTextEdit> #include <QTextEdit>
@@ -63,7 +64,6 @@ public:
explicit GdbOptionsPageWidget(QWidget *parent = 0); explicit GdbOptionsPageWidget(QWidget *parent = 0);
QGroupBox *groupBoxGeneral; QGroupBox *groupBoxGeneral;
QLabel *labelGdbWatchdogTimeout;
QSpinBox *spinBoxGdbWatchdogTimeout; QSpinBox *spinBoxGdbWatchdogTimeout;
QCheckBox *checkBoxSkipKnownFrames; QCheckBox *checkBoxSkipKnownFrames;
QCheckBox *checkBoxUseMessageBoxForSignals; QCheckBox *checkBoxUseMessageBoxForSignals;
@@ -80,6 +80,7 @@ public:
QTextEdit *textEditPostAttachCommands; QTextEdit *textEditPostAttachCommands;
QGroupBox *groupBoxCustomDumperCommands; QGroupBox *groupBoxCustomDumperCommands;
QTextEdit *textEditCustomDumperCommands; QTextEdit *textEditCustomDumperCommands;
QLineEdit *extraDumperFile;
//QGroupBox *groupBoxPluginDebugging; //QGroupBox *groupBoxPluginDebugging;
//QRadioButton *radioButtonAllPluginBreakpoints; //QRadioButton *radioButtonAllPluginBreakpoints;
@@ -99,7 +100,7 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent)
groupBoxGeneral = new QGroupBox(this); groupBoxGeneral = new QGroupBox(this);
groupBoxGeneral->setTitle(GdbOptionsPage::tr("General")); groupBoxGeneral->setTitle(GdbOptionsPage::tr("General"));
labelGdbWatchdogTimeout = new QLabel(groupBoxGeneral); QLabel *labelGdbWatchdogTimeout = new QLabel(groupBoxGeneral);
labelGdbWatchdogTimeout->setText(GdbOptionsPage::tr("GDB timeout:")); labelGdbWatchdogTimeout->setText(GdbOptionsPage::tr("GDB timeout:"));
labelGdbWatchdogTimeout->setToolTip(GdbOptionsPage::tr( labelGdbWatchdogTimeout->setToolTip(GdbOptionsPage::tr(
"The number of seconds Qt Creator will wait before it terminates\n" "The number of seconds Qt Creator will wait before it terminates\n"
@@ -221,6 +222,10 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent)
textEditCustomDumperCommands->setAcceptRichText(false); textEditCustomDumperCommands->setAcceptRichText(false);
textEditCustomDumperCommands->setToolTip(groupBoxCustomDumperCommands->toolTip()); 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 = new QGroupBox(q);
groupBoxPluginDebugging->setTitle(GdbOptionsPage::tr( groupBoxPluginDebugging->setTitle(GdbOptionsPage::tr(
@@ -250,6 +255,7 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent)
VariableChooser::addVariableSupport(textEditCustomDumperCommands); VariableChooser::addVariableSupport(textEditCustomDumperCommands);
VariableChooser::addVariableSupport(textEditPostAttachCommands); VariableChooser::addVariableSupport(textEditPostAttachCommands);
VariableChooser::addVariableSupport(textEditStartupCommands); VariableChooser::addVariableSupport(textEditStartupCommands);
VariableChooser::addVariableSupport(extraDumperFile);
QFormLayout *formLayout = new QFormLayout(groupBoxGeneral); QFormLayout *formLayout = new QFormLayout(groupBoxGeneral);
formLayout->addRow(labelGdbWatchdogTimeout, spinBoxGdbWatchdogTimeout); formLayout->addRow(labelGdbWatchdogTimeout, spinBoxGdbWatchdogTimeout);
@@ -268,8 +274,9 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent)
QGridLayout *postAttachLayout = new QGridLayout(groupBoxPostAttachCommands); QGridLayout *postAttachLayout = new QGridLayout(groupBoxPostAttachCommands);
postAttachLayout->addWidget(textEditPostAttachCommands, 0, 0, 1, 1); postAttachLayout->addWidget(textEditPostAttachCommands, 0, 0, 1, 1);
QGridLayout *customDumperLayout = new QGridLayout(groupBoxCustomDumperCommands); QFormLayout *customDumperLayout = new QFormLayout(groupBoxCustomDumperCommands);
customDumperLayout->addWidget(textEditCustomDumperCommands, 0, 0, 1, 1); customDumperLayout->addRow(GdbOptionsPage::tr("Additional file:"), extraDumperFile);
customDumperLayout->addRow(textEditCustomDumperCommands);
//QHBoxLayout *horizontalLayout = new QHBoxLayout(); //QHBoxLayout *horizontalLayout = new QHBoxLayout();
//horizontalLayout->addItem(new QSpacerItem(10, 10, QSizePolicy::Preferred, QSizePolicy::Minimum)); //horizontalLayout->addItem(new QSpacerItem(10, 10, QSizePolicy::Preferred, QSizePolicy::Minimum));
@@ -292,7 +299,8 @@ GdbOptionsPageWidget::GdbOptionsPageWidget(QWidget *parent)
DebuggerCore *dc = debuggerCore(); DebuggerCore *dc = debuggerCore();
group.insert(dc->action(GdbStartupCommands), textEditStartupCommands); 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(GdbPostAttachCommands), textEditPostAttachCommands);
group.insert(dc->action(LoadGdbInit), checkBoxLoadGdbInit); group.insert(dc->action(LoadGdbInit), checkBoxLoadGdbInit);
group.insert(dc->action(LoadGdbDumpers), checkBoxLoadGdbDumpers); group.insert(dc->action(LoadGdbDumpers), checkBoxLoadGdbDumpers);

View File

@@ -275,6 +275,26 @@ void LldbEngine::setupInferior()
{ {
const DebuggerStartParameters &sp = startParameters(); 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; QString executable;
Utils::QtcProcess::Arguments args; Utils::QtcProcess::Arguments args;
Utils::QtcProcess::prepareCommand(QFileInfo(sp.executable).absoluteFilePath(), Utils::QtcProcess::prepareCommand(QFileInfo(sp.executable).absoluteFilePath(),