summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhjk <hjk121@nokiamail.com>2014-02-10 13:53:24 +0100
committerhjk <hjk121@nokiamail.com>2014-02-10 16:34:41 +0100
commit74aa5e998f491a4d3751f78c9e337a3b07523cfd (patch)
tree30351b7a2099cffcbd3a5e4da3202a6e0821458e
parent49871ea23657e5bf45a550cd7e595ac7bb4d6f49 (diff)
downloadqt-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.cpp11
-rw-r--r--src/plugins/debugger/gdb/coregdbadapter.h3
-rw-r--r--src/plugins/debugger/loadcoredialog.cpp19
-rw-r--r--src/plugins/debugger/loadcoredialog.h1
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: