diff options
author | hjk <hjk121@nokiamail.com> | 2014-02-10 13:53:24 +0100 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2014-02-10 16:34:41 +0100 |
commit | 74aa5e998f491a4d3751f78c9e337a3b07523cfd (patch) | |
tree | 30351b7a2099cffcbd3a5e4da3202a6e0821458e | |
parent | 49871ea23657e5bf45a550cd7e595ac7bb4d6f49 (diff) | |
download | qt-creator-74aa5e998f491a4d3751f78c9e337a3b07523cfd.tar.gz |
Debugger: Update executable filename from core if possible
Task-number: QTCREATORBUG-10219
Change-Id: Ib17c23c7e8bfdad4f1dbcaf7757fdb130fba2abf
Reviewed-by: Christian Stenger <christian.stenger@digia.com>
Reviewed-by: hjk <hjk121@nokiamail.com>
-rw-r--r-- | src/plugins/debugger/gdb/coregdbadapter.cpp | 11 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/coregdbadapter.h | 3 | ||||
-rw-r--r-- | src/plugins/debugger/loadcoredialog.cpp | 19 | ||||
-rw-r--r-- | src/plugins/debugger/loadcoredialog.h | 1 |
4 files changed, 25 insertions, 9 deletions
diff --git a/src/plugins/debugger/gdb/coregdbadapter.cpp b/src/plugins/debugger/gdb/coregdbadapter.cpp index 7d9140d98b..1f9930c7c9 100644 --- a/src/plugins/debugger/gdb/coregdbadapter.cpp +++ b/src/plugins/debugger/gdb/coregdbadapter.cpp @@ -89,20 +89,19 @@ void GdbCoreEngine::setupEngine() unpackCoreIfNeeded(); } -QString GdbCoreEngine::readExecutableNameFromCore(bool *isCore) +QString readExecutableNameFromCore(const QString &debuggerCommand, const QString &coreFile, bool *isCore) { #if 0 ElfReader reader(coreFileName()); return QString::fromLocal8Bit(reader.readCoreName(isCore)); #else - const DebuggerStartParameters &sp = startParameters(); QStringList args; args.append(QLatin1String("-nx")); args.append(QLatin1String("-batch")); args.append(QLatin1String("-c")); - args.append(coreFileName()); + args.append(coreFile); QProcess proc; - proc.start(sp.debuggerCommand, args); + proc.start(debuggerCommand, args); if (proc.waitForFinished()) { QByteArray ba = proc.readAllStandardOutput(); // Core was generated by `/data/dev/creator-2.6/bin/qtcreator'. @@ -134,7 +133,9 @@ void GdbCoreEngine::continueSetupEngine() if (isCore && m_executable.isEmpty()) { // Read executable from core. isCore = false; - m_executable = readExecutableNameFromCore(&isCore); + m_executable = readExecutableNameFromCore( + startParameters().debuggerCommand, + coreFileName(), &isCore); if (isCore) { // Strip off command line arguments. FIXME: make robust. diff --git a/src/plugins/debugger/gdb/coregdbadapter.h b/src/plugins/debugger/gdb/coregdbadapter.h index af1a45c309..81a4ac9ce0 100644 --- a/src/plugins/debugger/gdb/coregdbadapter.h +++ b/src/plugins/debugger/gdb/coregdbadapter.h @@ -43,6 +43,8 @@ namespace Internal { // /////////////////////////////////////////////////////////////////////// +QString readExecutableNameFromCore(const QString &cmd, const QString &coreFile, bool *isCore); + class GdbCoreEngine : public GdbEngine { Q_OBJECT @@ -63,7 +65,6 @@ private: void handleRoundTrip(const GdbResponse &response); void unpackCoreIfNeeded(); QString coreFileName() const; - QString readExecutableNameFromCore(bool *isCore); QString coreName() const; private slots: diff --git a/src/plugins/debugger/loadcoredialog.cpp b/src/plugins/debugger/loadcoredialog.cpp index 63408b7505..06682a16f9 100644 --- a/src/plugins/debugger/loadcoredialog.cpp +++ b/src/plugins/debugger/loadcoredialog.cpp @@ -31,6 +31,8 @@ #include "debuggerstartparameters.h" #include "debuggerdialogs.h" +#include "debuggerkitinformation.h" +#include "gdb/coregdbadapter.h" #include <projectexplorer/kitinformation.h> #include <projectexplorer/projectexplorerconstants.h> @@ -265,9 +267,9 @@ AttachCoreDialog::AttachCoreDialog(QWidget *parent) formLayout->setHorizontalSpacing(6); formLayout->setVerticalSpacing(6); formLayout->addRow(tr("Kit:"), d->kitChooser); - formLayout->addRow(tr("&Executable:"), d->localExecFileName); formLayout->addRow(d->forceLocalLabel, d->forceLocalCheckBox); formLayout->addRow(tr("Core file:"), coreLayout); + formLayout->addRow(tr("&Executable:"), d->localExecFileName); formLayout->addRow(tr("Override &start script:"), d->overrideStartScriptFileName); QFrame *line = new QFrame(this); @@ -291,9 +293,9 @@ AttachCoreDialog::~AttachCoreDialog() int AttachCoreDialog::exec() { connect(d->selectRemoteCoreButton, SIGNAL(clicked()), SLOT(selectRemoteCoreFile())); - connect(d->remoteCoreFileName, SIGNAL(textChanged(QString)), SLOT(changed())); + connect(d->remoteCoreFileName, SIGNAL(textChanged(QString)), SLOT(coreFileChanged(QString))); connect(d->localExecFileName, SIGNAL(changed(QString)), SLOT(changed())); - connect(d->localCoreFileName, SIGNAL(changed(QString)), SLOT(changed())); + connect(d->localCoreFileName, SIGNAL(changed(QString)), SLOT(coreFileChanged(QString))); connect(d->forceLocalCheckBox, SIGNAL(stateChanged(int)), SLOT(changed())); connect(d->kitChooser, SIGNAL(currentIndexChanged(int)), SLOT(changed())); connect(d->buttonBox, SIGNAL(rejected()), SLOT(reject())); @@ -317,6 +319,17 @@ bool AttachCoreDialog::useLocalCoreFile() const return isLocalKit() || d->forceLocalCheckBox->isChecked(); } +void AttachCoreDialog::coreFileChanged(const QString &core) +{ + Kit *k = d->kitChooser->currentKit(); + QTC_ASSERT(k, return); + FileName cmd = DebuggerKitInformation::debuggerCommand(k); + bool isCore = false; + QString exe = readExecutableNameFromCore(cmd.toString(), core, &isCore); + d->localExecFileName->setFileName(FileName::fromString(exe)); + changed(); +} + void AttachCoreDialog::changed() { bool isValid = d->kitChooser->currentKit() && d->localExecFileName->isValid(); diff --git a/src/plugins/debugger/loadcoredialog.h b/src/plugins/debugger/loadcoredialog.h index e910218eb2..bdcfe73584 100644 --- a/src/plugins/debugger/loadcoredialog.h +++ b/src/plugins/debugger/loadcoredialog.h @@ -69,6 +69,7 @@ public: private slots: void changed(); + void coreFileChanged(const QString &core); void selectRemoteCoreFile(); private: |