aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/debugger
diff options
context:
space:
mode:
authorhjk <[email protected]>2012-06-06 16:08:59 +0200
committerhjk <[email protected]>2012-06-08 12:40:08 +0200
commit92c7dce14f4ba1ffd5f5c63f5268238a4cf57a5a (patch)
tree53761a7007e4f74d0bff40002e6979106e4cad59 /src/plugins/debugger
parent79de09f2663f818bb07c24752e6520b19b28e6ec (diff)
debugger: more elf shuffling
Also distinguish between debuglink and buildid. Change-Id: I1b55d1df42576c004050d319f46fb8c2ced9c85f Reviewed-by: hjk <[email protected]>
Diffstat (limited to 'src/plugins/debugger')
-rw-r--r--src/plugins/debugger/gdb/coregdbadapter.cpp72
-rw-r--r--src/plugins/debugger/gdb/coregdbadapter.h11
-rw-r--r--src/plugins/debugger/gdb/gdbengine.cpp16
-rw-r--r--src/plugins/debugger/moduleshandler.cpp28
-rw-r--r--src/plugins/debugger/moduleshandler.h2
5 files changed, 89 insertions, 40 deletions
diff --git a/src/plugins/debugger/gdb/coregdbadapter.cpp b/src/plugins/debugger/gdb/coregdbadapter.cpp
index 28849732e48..69a8de24213 100644
--- a/src/plugins/debugger/gdb/coregdbadapter.cpp
+++ b/src/plugins/debugger/gdb/coregdbadapter.cpp
@@ -39,12 +39,16 @@
#include "gdbmi.h"
#include "gdbengine.h"
-#include <utils/qtcassert.h>
+#include <utils/consoleprocess.h>
#include <utils/elfreader.h>
+#include <utils/qtcassert.h>
+#include <utils/qtcprocess.h>
#include <QDir>
#include <QFileInfo>
#include <QMessageBox>
+#include <QProcess>
+#include <QTemporaryFile>
using namespace Utils;
@@ -61,28 +65,37 @@ namespace Internal {
//
///////////////////////////////////////////////////////////////////////
-static QByteArray coreName(const DebuggerStartParameters &sp)
-{
- QFileInfo fi(sp.coreFile);
- return fi.absoluteFilePath().toLocal8Bit();
-}
-
CoreGdbAdapter::CoreGdbAdapter(GdbEngine *engine)
- : AbstractGdbAdapter(engine),
- m_executable(startParameters().executable),
- m_coreName(coreName(startParameters()))
+ : AbstractGdbAdapter(engine)
{}
+CoreGdbAdapter::~CoreGdbAdapter()
+{
+ if (false && !m_tempCoreName.isEmpty()) {
+ QFile tmpFile(m_tempCoreName);
+ tmpFile.remove();
+ }
+}
+
void CoreGdbAdapter::startAdapter()
{
QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state());
showMessage(_("TRYING TO START ADAPTER"));
+ const DebuggerStartParameters &sp = startParameters();
+ m_executable = sp.executable;
+ QFileInfo fi(sp.coreFile);
+ m_coreName = fi.absoluteFilePath();
+
+ unpackCoreIfNeeded();
+}
+
+void CoreGdbAdapter::continueAdapterStart()
+{
if (m_executable.isEmpty()) {
// Read executable from core.
- ElfReader reader(m_coreName);
- QByteArray data = reader.readSection("note0");
- m_executable = QByteArray(data.data() + 0x40);
+ ElfReader reader(coreFileName());
+ m_executable = reader.readCoreName();
// Strip off command line arguments. FIXME: make robust.
int idx = m_executable.indexOf(QLatin1Char(' '));
@@ -128,14 +141,15 @@ void CoreGdbAdapter::setupInferior()
void CoreGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response)
{
QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state());
+ QString core = coreFileName();
if (response.resultClass == GdbResultDone) {
showMessage(tr("Symbols found."), StatusBar);
- m_engine->postCommand("target core " + m_coreName,
+ m_engine->postCommand("target core " + core.toLocal8Bit(),
CB(handleTargetCore));
return;
}
QString msg = tr("No symbols found in core file <i>%1</i>.")
- .arg(startParameters().coreFile);
+ .arg(core);
msg += _(" ");
msg += tr("This can be caused by a path length limitation in the "
"core file.");
@@ -195,14 +209,34 @@ void CoreGdbAdapter::interruptInferior()
QTC_CHECK(false);
}
-void CoreGdbAdapter::shutdownInferior()
+void CoreGdbAdapter::shutdownAdapter()
{
- m_engine->notifyInferiorShutdownOk();
+ m_engine->notifyAdapterShutdownOk();
}
-void CoreGdbAdapter::shutdownAdapter()
+void CoreGdbAdapter::unpackCoreIfNeeded()
{
- m_engine->notifyAdapterShutdownOk();
+ if (!m_coreName.endsWith(QLatin1String(".lzo"))) {
+ continueAdapterStart();
+ return;
+ }
+
+ {
+ QString pattern = QDir::tempPath() + QLatin1String("/tmpcore-XXXXXX");
+ QTemporaryFile tmp(pattern, this);
+ tmp.open();
+ m_tempCoreName = tmp.fileName();
+ }
+
+ QProcess *process = new QProcess(this);
+ process->setWorkingDirectory(QDir::tempPath());
+ process->start("/usr/bin/lzop", QStringList() << "-o" << m_tempCoreName << "-x" << m_coreName);
+ connect(process, SIGNAL(finished(int)), SLOT(continueAdapterStart()));
+}
+
+QString CoreGdbAdapter::coreFileName() const
+{
+ return m_tempCoreName.isEmpty() ? m_coreName : m_tempCoreName;
}
} // namespace Internal
diff --git a/src/plugins/debugger/gdb/coregdbadapter.h b/src/plugins/debugger/gdb/coregdbadapter.h
index 3aaa47e72dd..039c3881a2e 100644
--- a/src/plugins/debugger/gdb/coregdbadapter.h
+++ b/src/plugins/debugger/gdb/coregdbadapter.h
@@ -51,6 +51,7 @@ class CoreGdbAdapter : public AbstractGdbAdapter
public:
explicit CoreGdbAdapter(GdbEngine *engine);
+ ~CoreGdbAdapter();
private:
DumperHandling dumperHandling() const { return DumperNotAvailable; }
@@ -61,7 +62,6 @@ private:
void setupInferior();
void runEngine();
void interruptInferior();
- void shutdownInferior();
void shutdownAdapter();
Q_SLOT void loadSymbolsForStack();
@@ -69,15 +69,18 @@ private:
AbstractGdbProcess *gdbProc() { return &m_gdbProc; }
- //void handleTemporaryDetach(const GdbResponse &response);
- //void handleTemporaryTargetCore(const GdbResponse &response);
void handleFileExecAndSymbols(const GdbResponse &response);
void handleTargetCore(const GdbResponse &response);
void handleModulesList(const GdbResponse &response);
+ void unpackCoreIfNeeded();
+ QString coreFileName() const;
+ Q_SLOT void continueAdapterStart();
+ QString coreName() const;
QString m_executable;
- const QByteArray m_coreName;
+ QString m_coreName;
LocalGdbProcess m_gdbProc;
+ QString m_tempCoreName;
};
} // namespace Internal
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index a3d89f6dc24..89659c94a5b 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -3518,7 +3518,7 @@ void GdbEngine::examineModules()
{
ModulesHandler *handler = modulesHandler();
foreach (Module module, handler->modules()) {
- if (module.sections.symbolsType == UnknownSymbols)
+ if (module.elfData.symbolsType == UnknownSymbols)
handler->updateModule(module);
}
}
@@ -5364,7 +5364,7 @@ void GdbEngine::checkForReleaseBuild()
{
QString binary = startParameters().executable;
ElfReader reader(binary);
- ElfHeaders sections = reader.readHeaders();
+ ElfData elfData = reader.readHeaders();
QString error = reader.errorString();
showMessage(_("EXAMINING ") + binary);
@@ -5385,11 +5385,11 @@ void GdbEngine::checkForReleaseBuild()
}
QSet<QByteArray> seen;
- foreach (const ElfHeader &section, sections.headers) {
- msg.append(section.name);
+ foreach (const ElfSectionHeader &header, elfData.sectionHeaders) {
+ msg.append(header.name);
msg.append(' ');
- if (interesting.contains(section.name))
- seen.insert(section.name);
+ if (interesting.contains(header.name))
+ seen.insert(header.name);
}
showMessage(_(msg));
@@ -5398,12 +5398,12 @@ void GdbEngine::checkForReleaseBuild()
return;
}
- if (sections.headers.isEmpty()) {
+ if (elfData.sectionHeaders.isEmpty()) {
showMessage(_("NO SECTION HEADERS FOUND. IS THIS AN EXECUTABLE?"));
return;
}
- if (sections.indexOf(".debug_info") >= 0)
+ if (elfData.indexOf(".debug_info") >= 0)
return;
QString warning;
diff --git a/src/plugins/debugger/moduleshandler.cpp b/src/plugins/debugger/moduleshandler.cpp
index 794472b1e91..a4e9c1eba02 100644
--- a/src/plugins/debugger/moduleshandler.cpp
+++ b/src/plugins/debugger/moduleshandler.cpp
@@ -113,6 +113,14 @@ QVariant ModulesModel::data(const QModelIndex &index, int role) const
case 1:
if (role == Qt::DisplayRole)
return module.modulePath;
+ if (role == Qt::ToolTipRole) {
+ QString msg;
+ if (!module.elfData.buildId.isEmpty())
+ msg += QString::fromLatin1("Build Id: " + module.elfData.buildId);
+ if (!module.elfData.debugLink.isEmpty())
+ msg += QString::fromLatin1("Debug Link: " + module.elfData.debugLink);
+ return msg;
+ }
break;
case 2:
if (role == Qt::DisplayRole)
@@ -124,7 +132,7 @@ QVariant ModulesModel::data(const QModelIndex &index, int role) const
break;
case 3:
if (role == Qt::DisplayRole)
- switch (module.sections.symbolsType) {
+ switch (module.elfData.symbolsType) {
case UnknownSymbols:
return ModulesHandler::tr("unknown");
case NoSymbols:
@@ -133,11 +141,13 @@ QVariant ModulesModel::data(const QModelIndex &index, int role) const
return ModulesHandler::tr("plain");
case FastSymbols:
return ModulesHandler::tr("fast");
- case SeparateSymbols:
- return ModulesHandler::tr("separate");
+ case LinkedSymbols:
+ return ModulesHandler::tr("debuglnk");
+ case BuildIdSymbols:
+ return ModulesHandler::tr("buildid");
}
else if (role == Qt::ToolTipRole)
- switch (module.sections.symbolsType) {
+ switch (module.elfData.symbolsType) {
case UnknownSymbols:
return ModulesHandler::tr(
"It is unknown whether this module contains debug "
@@ -158,7 +168,8 @@ QVariant ModulesModel::data(const QModelIndex &index, int role) const
"This module contains debug information.\nStepping "
"into the module or setting breakpoints by file and "
"is expected to work.");
- case SeparateSymbols:
+ case LinkedSymbols:
+ case BuildIdSymbols:
return ModulesHandler::tr(
"This module does not contains debug information "
"itself, but contains a reference to external "
@@ -220,16 +231,17 @@ void ModulesModel::updateModule(const Module &module)
{
const int row = indexOfModule(module.modulePath);
ElfReader reader(module.modulePath);
- ElfHeaders sections = reader.readHeaders();
+ ElfData elfData = reader.readHeaders();
+
if (row == -1) {
const int n = m_modules.size();
beginInsertRows(QModelIndex(), n, n);
m_modules.push_back(module);
- m_modules.back().sections = sections;
+ m_modules.back().elfData = elfData;
endInsertRows();
} else {
m_modules[row] = module;
- m_modules[row].sections = sections;
+ m_modules[row].elfData = elfData;
dataChanged(index(row, 0, QModelIndex()), index(row, 4, QModelIndex()));
}
}
diff --git a/src/plugins/debugger/moduleshandler.h b/src/plugins/debugger/moduleshandler.h
index 029fa5673a2..f128a7e3f46 100644
--- a/src/plugins/debugger/moduleshandler.h
+++ b/src/plugins/debugger/moduleshandler.h
@@ -90,7 +90,7 @@ public:
quint64 startAddress;
quint64 endAddress;
- Utils::ElfHeaders sections;
+ Utils::ElfData elfData;
};
typedef QVector<Module> Modules;