diff options
author | hjk <[email protected]> | 2012-06-06 16:08:59 +0200 |
---|---|---|
committer | hjk <[email protected]> | 2012-06-08 12:40:08 +0200 |
commit | 92c7dce14f4ba1ffd5f5c63f5268238a4cf57a5a (patch) | |
tree | 53761a7007e4f74d0bff40002e6979106e4cad59 /src/plugins/debugger | |
parent | 79de09f2663f818bb07c24752e6520b19b28e6ec (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.cpp | 72 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/coregdbadapter.h | 11 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/gdbengine.cpp | 16 | ||||
-rw-r--r-- | src/plugins/debugger/moduleshandler.cpp | 28 | ||||
-rw-r--r-- | src/plugins/debugger/moduleshandler.h | 2 |
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 §ion, 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; |