diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h index 1d45cceaf824cc0299eb1c3b7ed84f6cd938e8ba..5c2070bd8dabd82aa4cde319169da6efa43bf341 100644 --- a/src/plugins/debugger/debuggerconstants.h +++ b/src/plugins/debugger/debuggerconstants.h @@ -237,6 +237,7 @@ enum ModelRoles // Modules RequestReloadModulesRole, + RequestExamineModulesRole, RequestModuleSymbolsRole, RequestAllSymbolsRole, RequestOpenFileRole, diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index 33293a2c2efa02117169565fac9b4c34c40c9040..fc8448fbcc2b54cf33edb65bc739053e071abeed 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -136,6 +136,7 @@ public: virtual void activateFrame(int index) { Q_UNUSED(index); } virtual void reloadModules() {} + virtual void examineModules() {} virtual void loadSymbols(const QString &moduleName) { Q_UNUSED(moduleName); } virtual void loadAllSymbols() {} diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 616aed00d6aba4803c297f14af48b0ad32a06f56..0f08f312ccf549033500848024b1e2a5b8c104c7 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2672,6 +2672,27 @@ void GdbEngine::handleModulesList(const GdbResponse &response) } +void GdbEngine::examineModules() +{ + foreach (Module module, modulesHandler()->modules()) { + if (module.symbolsType == Module::UnknownType) { + QProcess proc; + qDebug() << _("objdump -h \"%1\"").arg(module.moduleName); + proc.start(_("objdump -h \"%1\"").arg(module.moduleName)); + if (!proc.waitForStarted()) + continue; + if (!proc.waitForFinished()) + continue; + QByteArray ba = proc.readAllStandardOutput(); + if (ba.contains(".gdb_index")) + module.symbolsType = Module::FastSymbols; + else + module.symbolsType = Module::PlainSymbols; + modulesHandler()->updateModule(module.moduleName, module); + } + } +} + ////////////////////////////////////////////////////////////////////// // // Source files specific stuff diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 37f9eccd05c17e929a8ee04f728a4b65ef4d2550..f75ccf3a10b123831051afc9c3fd09afd5bb38c2 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -368,6 +368,7 @@ private: ////////// View & Data Stuff ////////// virtual void loadAllSymbols(); virtual void requestModuleSymbols(const QString &moduleName); virtual void reloadModules(); + virtual void examineModules(); void reloadModulesInternal(); void handleModulesList(const GdbResponse &response); diff --git a/src/plugins/debugger/moduleshandler.cpp b/src/plugins/debugger/moduleshandler.cpp index f813c1643b722331e57e21be965049c4001dc2cd..26c8faf6df2dd1e6188e1b5a25b804630f93e5af 100644 --- a/src/plugins/debugger/moduleshandler.cpp +++ b/src/plugins/debugger/moduleshandler.cpp @@ -70,9 +70,10 @@ public: bool setData(const QModelIndex &index, const QVariant &value, int role); void clearModel(); - void addModule(const Module &m); + void addModule(const Module &module); void removeModule(const QString &moduleName); - void setModules(const Modules &m); + void setModules(const Modules &modules); + void updateModule(const QString &moduleName, const Module &module); const Modules &modules() const { return m_modules; } @@ -167,6 +168,10 @@ bool ModulesModel::setData(const QModelIndex &index, const QVariant &value, int m_engine->reloadModules(); return true; + case RequestExamineModulesRole: + m_engine->examineModules(); + return true; + case RequestModuleSymbolsRole: m_engine->loadSymbols(value.toString()); return true; @@ -216,12 +221,19 @@ void ModulesModel::removeModule(const QString &moduleName) { const int index = indexOfModule(moduleName); QTC_ASSERT(index != -1, return); - beginRemoveRows(QModelIndex(), index, index); m_modules.removeAt(index); endRemoveRows(); } +void ModulesModel::updateModule(const QString &moduleName, const Module &module) +{ + const int index = indexOfModule(moduleName); + QTC_ASSERT(index != -1, return); + m_modules[index] = module; + reset(); +} + ////////////////////////////////////////////////////////////////// // // ModulesHandler @@ -255,6 +267,11 @@ void ModulesHandler::removeModule(const QString &moduleName) m_model->removeModule(moduleName); } +void ModulesHandler::updateModule(const QString &moduleName, const Module &module) +{ + m_model->updateModule(moduleName, module); +} + void ModulesHandler::setModules(const Modules &modules) { m_model->setModules(modules); diff --git a/src/plugins/debugger/moduleshandler.h b/src/plugins/debugger/moduleshandler.h index 78fa67cba52e098347fb41ac45a3233cfa21dda1..4517320054e8c8489454a45b8a95608e749669bb 100644 --- a/src/plugins/debugger/moduleshandler.h +++ b/src/plugins/debugger/moduleshandler.h @@ -110,6 +110,7 @@ public: void setModules(const Modules &modules); void addModule(const Module &module); void removeModule(const QString &moduleName); + void updateModule(const QString &moduleName, const Module &module); Modules modules() const; void removeAll(); diff --git a/src/plugins/debugger/moduleswindow.cpp b/src/plugins/debugger/moduleswindow.cpp index cb821f7bd6dd041fb81ae934133bf29fdb9b08e6..509af16db11a2220d8f562564f4da1329d447450 100644 --- a/src/plugins/debugger/moduleswindow.cpp +++ b/src/plugins/debugger/moduleswindow.cpp @@ -107,35 +107,55 @@ void ModulesWindow::contextMenuEvent(QContextMenuEvent *ev) model()->data(index, EngineCapabilitiesRole).toInt(); QMenu menu; - QAction *act0 = new QAction(tr("Update Module List"), &menu); - act0->setEnabled(enabled && (capabilities & ReloadModuleCapability)); - QAction *act3 = new QAction(tr("Show Source Files for Module \"%1\"").arg(name), &menu); - act3->setEnabled(enabled && (capabilities & ReloadModuleCapability)); - QAction *act4 = new QAction(tr("Load Symbols for All Modules"), &menu); - act4->setEnabled(enabled && (capabilities & ReloadModuleSymbolsCapability)); - QAction *act5 = 0; - QAction *act6 = 0; - QAction *act7 = 0; + + QAction *actUpdateModuleList + = new QAction(tr("Update Module List"), &menu); + actUpdateModuleList + ->setEnabled(enabled && (capabilities & ReloadModuleCapability)); + + QAction *actShowSourceFiles + = new QAction(tr("Show Source Files for Module \"%1\"").arg(name), &menu); + actShowSourceFiles + ->setEnabled(enabled && (capabilities & ReloadModuleCapability)); + + QAction *actLoadSymbolsForAllModules + = new QAction(tr("Load Symbols for All Modules"), &menu); + actLoadSymbolsForAllModules + -> setEnabled(enabled && (capabilities & ReloadModuleSymbolsCapability)); + + QAction *actExamineAllModules + = new QAction(tr("Examine All Modules"), &menu); + actExamineAllModules + -> setEnabled(enabled && (capabilities & ReloadModuleSymbolsCapability)); + + QAction *actLoadSymbolsForModule = 0; + QAction *actEditFile = 0; + QAction *actShowSymbols = 0; if (name.isEmpty()) { - act5 = new QAction(tr("Load Symbols for Module"), &menu); - act5->setEnabled(false); - act6 = new QAction(tr("Edit File"), &menu); - act6->setEnabled(false); - act7 = new QAction(tr("Show Symbols"), &menu); - act7->setEnabled(false); + actLoadSymbolsForModule = new QAction(tr("Load Symbols for Module"), &menu); + actLoadSymbolsForModule->setEnabled(false); + actEditFile = new QAction(tr("Edit File"), &menu); + actEditFile->setEnabled(false); + actShowSymbols = new QAction(tr("Show Symbols"), &menu); + actShowSymbols->setEnabled(false); } else { - act5 = new QAction(tr("Load Symbols for Module \"%1\"").arg(name), &menu); - act5->setEnabled(capabilities & ReloadModuleSymbolsCapability); - act6 = new QAction(tr("Edit File \"%1\"").arg(name), &menu); - act7 = new QAction(tr("Show Symbols in File \"%1\"").arg(name), &menu); + actLoadSymbolsForModule + = new QAction(tr("Load Symbols for Module \"%1\"").arg(name), &menu); + actLoadSymbolsForModule + ->setEnabled(capabilities & ReloadModuleSymbolsCapability); + actEditFile + = new QAction(tr("Edit File \"%1\"").arg(name), &menu); + actShowSymbols + = new QAction(tr("Show Symbols in File \"%1\"").arg(name), &menu); } - menu.addAction(act0); - //menu.addAction(act3); // FIXME - menu.addAction(act4); - menu.addAction(act5); - menu.addAction(act6); - //menu.addAction(act7); // FIXME + menu.addAction(actUpdateModuleList); + //menu.addAction(actShowSourceFiles); // FIXME + menu.addAction(actLoadSymbolsForAllModules); + menu.addAction(actExamineAllModules); + menu.addAction(actLoadSymbolsForModule); + menu.addAction(actEditFile); + //menu.addAction(actShowSymbols); // FIXME menu.addSeparator(); QAction *actAdjustColumnWidths = menu.addAction(tr("Adjust Column Widths to Contents")); @@ -148,21 +168,23 @@ void ModulesWindow::contextMenuEvent(QContextMenuEvent *ev) QAction *act = menu.exec(ev->globalPos()); - if (act == act0) { + if (act == actUpdateModuleList) { setModelData(RequestReloadModulesRole); } else if (act == actAdjustColumnWidths) { resizeColumnsToContents(); } else if (act == actAlwaysAdjustColumnWidth) { setAlwaysResizeColumnsToContents(!m_alwaysResizeColumnsToContents); - //} else if (act == act3) { + //} else if (act == actShowSourceFiles) { // emit displaySourceRequested(name); - } else if (act == act4) { + } else if (act == actLoadSymbolsForAllModules) { setModelData(RequestAllSymbolsRole); - } else if (act == act5) { + } else if (act == actExamineAllModules) { + setModelData(RequestExamineModulesRole); + } else if (act == actLoadSymbolsForModule) { setModelData(RequestModuleSymbolsRole, name); - } else if (act == act6) { + } else if (act == actEditFile) { setModelData(RequestOpenFileRole, name); - } else if (act == act7) { + } else if (act == actShowSymbols) { setModelData(RequestModuleSymbolsRole, name); } }