diff --git a/share/qtcreator/gdbmacros/pdumper.py b/share/qtcreator/gdbmacros/pdumper.py index 8ca75eb3353aeb587c2df0d89d80a9ab0d4295b0..96addcc951d2b9cc6f08f9407b45bdb62a9250d2 100644 --- a/share/qtcreator/gdbmacros/pdumper.py +++ b/share/qtcreator/gdbmacros/pdumper.py @@ -16,7 +16,12 @@ class qdebug: self.typeformats = typeformats self.individualformats = individualformats self.watchers = watchers - self.doit() + if self.options == "listmodules": + self.handleListModules() + elif self.options == "listsymbols": + self.handleListSymbols(expanded) + else: + self.handleListVars() def put(self, value): sys.stdout.write(value) @@ -90,6 +95,9 @@ class qdebug: return if str(value).startswith("<class '"): return + # FIXME: Should we? + if str(value).startswith("<enum-item "): + return self.put("{") self.putField("iname", iname) self.putName(name) @@ -146,13 +154,15 @@ class qdebug: pass elif tt == "function": pass + elif str(value).startswith("<enum-item "): + # FIXME: Having enums always shown like this is not nice. + self.putValue(str(value)[11:-1]) + self.putNumChild(0) else: v = str(value) p = v.find(" object at ") if p > 1: v = "@" + v[p + 11:-1] - elif v.startswith("<enum-item "): - v = v[11:-1] self.putValue(v) if self.isExpanded(iname): self.put("children=[") @@ -177,7 +187,7 @@ class qdebug: def warn(self, msg): self.putField("warning", msg) - def doit(self): + def handleListVars(self): # Trigger error to get a backtrace. frame = None #self.warn("frame: %s" % frame) @@ -207,3 +217,24 @@ class qdebug: n = n + 1 sys.stdout.flush() + + def handleListModules(self): + self.put("modules=["); + for name in sys.modules: + self.put("{") + self.putName(name) + self.putValue(sys.modules[name]) + self.put("},") + self.put("]") + sys.stdout.flush() + + def handleListSymbols(self, module): + #self.put("symbols=%s" % dir(sys.modules[module])) + self.put("symbols=["); + for name in sys.modules: + self.put("{") + self.putName(name) + #self.putValue(sys.modules[name]) + self.put("},") + self.put("]") + sys.stdout.flush() diff --git a/src/plugins/debugger/cdb/cdbdebugengine.cpp b/src/plugins/debugger/cdb/cdbdebugengine.cpp index cb7bbf55d403cf96db2e265352c7b58919286185..26eb61b118f13af56bb02d7e8f438d207da57cb1 100644 --- a/src/plugins/debugger/cdb/cdbdebugengine.cpp +++ b/src/plugins/debugger/cdb/cdbdebugengine.cpp @@ -1183,7 +1183,7 @@ void CdbDebugEngine::loadAllSymbols() qDebug() << Q_FUNC_INFO; } -QList<Symbol> CdbDebugEngine::moduleSymbols(const QString &moduleName) +void> CdbDebugEngine::requestModuleSymbols(const QString &moduleName) { QList<Symbol> rc; QString errorMessage; @@ -1199,7 +1199,7 @@ QList<Symbol> CdbDebugEngine::moduleSymbols(const QString &moduleName) } while (false); if (!success) warning(errorMessage); - return rc; + manager()->showModuleSymbols(moduleName, rc); } void CdbDebugEngine::reloadRegisters() diff --git a/src/plugins/debugger/cdb/cdbdebugengine.h b/src/plugins/debugger/cdb/cdbdebugengine.h index e15d5e93e13c66890c990a144db9a1a4e0e4ab48..452f8df87ff000ed52260aa87319598f98fd9548 100644 --- a/src/plugins/debugger/cdb/cdbdebugengine.h +++ b/src/plugins/debugger/cdb/cdbdebugengine.h @@ -95,7 +95,7 @@ public: virtual void reloadModules(); virtual void loadSymbols(const QString &moduleName); virtual void loadAllSymbols(); - virtual QList<Symbol> moduleSymbols(const QString &moduleName); + virtual void requestModuleSymbols(const QString &moduleName); virtual void reloadRegisters(); virtual void reloadSourceFiles(); diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index c6bf0494bd1c7d514bb8979e706324b3219b9c10..ac645e19c3f1765632b93e26fbbd39d6a1124751 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -98,6 +98,7 @@ #include <QtGui/QTextCursor> #include <QtGui/QToolButton> #include <QtGui/QToolTip> +#include <QtGui/QTreeWidget> #define DEBUG_STATE 1 #ifdef DEBUG_STATE @@ -460,8 +461,6 @@ void DebuggerManager::init() this, SLOT(loadAllSymbols())); connect(modulesView, SIGNAL(fileOpenRequested(QString)), this, SLOT(fileOpen(QString))); - connect(modulesView, SIGNAL(newDockRequested(QWidget*)), - this, SLOT(createNewDock(QWidget*))); // Source Files //d->m_sourceFilesHandler = new SourceFilesHandler; @@ -1214,10 +1213,31 @@ void DebuggerManager::loadSymbols(const QString &module) d->m_engine->loadSymbols(module); } -QList<Symbol> DebuggerManager::moduleSymbols(const QString &moduleName) +void DebuggerManager::requestModuleSymbols(const QString &moduleName) { - QTC_ASSERT(d->m_engine, return QList<Symbol>()); - return d->m_engine->moduleSymbols(moduleName); + QTC_ASSERT(d->m_engine, return); + d->m_engine->requestModuleSymbols(moduleName); +} + +void DebuggerManager::showModuleSymbols(const QString &moduleName, + const QList<Symbol> &symbols) +{ + QTC_ASSERT(d->m_engine, return); + QTreeWidget *w = new QTreeWidget; + w->setColumnCount(3); + w->setRootIsDecorated(false); + w->setAlternatingRowColors(true); + w->setSortingEnabled(true); + w->setHeaderLabels(QStringList() << tr("Symbol") << tr("Address") << tr("Code")); + w->setWindowTitle(tr("Symbols in \"%1\"").arg(moduleName)); + foreach (const Symbol &s, symbols) { + QTreeWidgetItem *it = new QTreeWidgetItem; + it->setData(0, Qt::DisplayRole, s.name); + it->setData(1, Qt::DisplayRole, s.address); + it->setData(2, Qt::DisplayRole, s.state); + w->addTopLevelItem(it); + } + createNewDock(w); } void DebuggerManager::executeStep() diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index e3793ed5e1c8591711fc514580b8a68a2a738fd4..9c2ee51f8765c7933196058efca66a52b2e9b969 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -329,7 +329,9 @@ private: public: // stuff in this block should be made private by moving it to // one of the interfaces - QList<Internal::Symbol> moduleSymbols(const QString &moduleName); + void requestModuleSymbols(const QString &moduleName); + void showModuleSymbols(const QString &moduleName, + const QList<Internal::Symbol> &symbols); signals: void debuggingFinished(); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 17ac63a1705524b35e2d356d0531df65aae3925b..58f01e7318b901096bb50c992d99bfa8abe0f37d 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2587,7 +2587,7 @@ void GdbEngine::loadAllSymbols() reloadModulesInternal(); } -QList<Symbol> GdbEngine::moduleSymbols(const QString &moduleName) +void GdbEngine::requestModuleSymbols(const QString &moduleName) { QList<Symbol> rc; bool success = false; @@ -2618,7 +2618,7 @@ QList<Symbol> GdbEngine::moduleSymbols(const QString &moduleName) } while (false); if (!success) qWarning("moduleSymbols: %s\n", qPrintable(errorMessage)); - return rc; + manager()->showModuleSymbols(moduleName, rc); } void GdbEngine::reloadModules() diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index b5950703f39fc93a2864b1454cb1d1f779dab8c4..b51c5ec3204f626a93874b7ca1bd016f427df78c 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -358,7 +358,7 @@ private: ////////// View & Data Stuff ////////// // virtual void loadSymbols(const QString &moduleName); virtual void loadAllSymbols(); - virtual QList<Symbol> moduleSymbols(const QString &moduleName); + virtual void requestModuleSymbols(const QString &moduleName); virtual void reloadModules(); void reloadModulesInternal(); void handleModulesList(const GdbResponse &response); diff --git a/src/plugins/debugger/idebuggerengine.h b/src/plugins/debugger/idebuggerengine.h index f093376325397069ee98c06ecaa20368dcf06988..b78824719051e228d7c9a606b66f175b9e19d7da 100644 --- a/src/plugins/debugger/idebuggerengine.h +++ b/src/plugins/debugger/idebuggerengine.h @@ -105,7 +105,7 @@ public: virtual void reloadModules() = 0; virtual void loadSymbols(const QString &moduleName) = 0; virtual void loadAllSymbols() = 0; - virtual QList<Symbol> moduleSymbols(const QString &moduleName) = 0; + virtual void requestModuleSymbols(const QString &moduleName) = 0; virtual void reloadRegisters() = 0; diff --git a/src/plugins/debugger/moduleshandler.cpp b/src/plugins/debugger/moduleshandler.cpp index dc7c1ac0c751bc2a96b56c2c30bb8538c256eacf..ea01954600f22c429e99d65a7ff31471ecc131e8 100644 --- a/src/plugins/debugger/moduleshandler.cpp +++ b/src/plugins/debugger/moduleshandler.cpp @@ -62,7 +62,7 @@ public: // QAbstractItemModel int columnCount(const QModelIndex &parent) const - { return parent.isValid() ? 0 : 4; } + { return parent.isValid() ? 0 : 5; } int rowCount(const QModelIndex &parent) const { return parent.isValid() ? 0 : m_modules.size(); } QModelIndex parent(const QModelIndex &) const { return QModelIndex(); } @@ -85,6 +85,7 @@ QVariant ModulesModel::headerData(int section, if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { static QString headers[] = { tr("Module name") + " ", + tr("Module path") + " ", tr("Symbols read") + " ", tr("Start address") + " ", tr("End address") + " " @@ -112,13 +113,17 @@ QVariant ModulesModel::data(const QModelIndex &index, int role) const break; case 1: if (role == Qt::DisplayRole) - return module.symbolsRead ? "yes" : "no"; + return module.modulePath; break; case 2: if (role == Qt::DisplayRole) - return module.startAddress; + return module.symbolsRead ? "yes" : "no"; break; case 3: + if (role == Qt::DisplayRole) + return module.startAddress; + break; + case 4: if (role == Qt::DisplayRole) return module.endAddress; break; diff --git a/src/plugins/debugger/moduleshandler.h b/src/plugins/debugger/moduleshandler.h index 249d6ca242e01b2449882ca82df9cea2c093886b..2d9f15db23a90b2aabaac3a164ae0ff565837ae0 100644 --- a/src/plugins/debugger/moduleshandler.h +++ b/src/plugins/debugger/moduleshandler.h @@ -78,6 +78,7 @@ public: public: QString moduleName; + QString modulePath; bool symbolsRead; QString startAddress; QString endAddress; diff --git a/src/plugins/debugger/moduleswindow.cpp b/src/plugins/debugger/moduleswindow.cpp index 4144f82563f1f80f499a609411eeacf6d508cf96..df427bafb805b149dd3d24de75acdc58c15691e4 100644 --- a/src/plugins/debugger/moduleswindow.cpp +++ b/src/plugins/debugger/moduleswindow.cpp @@ -175,6 +175,7 @@ void ModulesWindow::resizeColumnsToContents() resizeColumnToContents(0); resizeColumnToContents(1); resizeColumnToContents(2); + resizeColumnToContents(3); } void ModulesWindow::setAlwaysResizeColumnsToContents(bool on) @@ -186,6 +187,7 @@ void ModulesWindow::setAlwaysResizeColumnsToContents(bool on) header()->setResizeMode(1, mode); header()->setResizeMode(2, mode); header()->setResizeMode(3, mode); + header()->setResizeMode(4, mode); //setColumnHidden(3, true); } @@ -197,27 +199,8 @@ void ModulesWindow::setModel(QAbstractItemModel *model) void ModulesWindow::showSymbols(const QString &name) { - if (name.isEmpty()) - return; - QApplication::setOverrideCursor(Qt::WaitCursor); - const QList<Symbol> symbols = m_debuggerManager->moduleSymbols(name); - QApplication::restoreOverrideCursor(); - if (symbols.empty()) - return; - QTreeWidget *w = new QTreeWidget; - w->setColumnCount(3); - w->setRootIsDecorated(false); - w->setAlternatingRowColors(true); - w->setHeaderLabels(QStringList() << tr("Address") << tr("Code") << tr("Symbol")); - w->setWindowTitle(tr("Symbols in \"%1\"").arg(name)); - foreach (const Symbol &s, symbols) { - QTreeWidgetItem *it = new QTreeWidgetItem; - it->setData(0, Qt::DisplayRole, s.address); - it->setData(1, Qt::DisplayRole, s.state); - it->setData(2, Qt::DisplayRole, s.name); - w->addTopLevelItem(it); - } - emit newDockRequested(w); + if (!name.isEmpty()) + m_debuggerManager->requestModuleSymbols(name); } } // namespace Internal diff --git a/src/plugins/debugger/pdb/pdbengine.cpp b/src/plugins/debugger/pdb/pdbengine.cpp index 0fa670239e44480e4d02c3af92438bf63864bab3..49eb20a4ba92d7ce7d10756926e29bdda02f3998 100644 --- a/src/plugins/debugger/pdb/pdbengine.cpp +++ b/src/plugins/debugger/pdb/pdbengine.cpp @@ -394,13 +394,52 @@ void PdbEngine::loadAllSymbols() void PdbEngine::reloadModules() { + postCommand("qdebug('listmodules')", CB(handleListModules)); +} + +void PdbEngine::handleListModules(const PdbResponse &response) +{ + GdbMi out; + out.fromString(response.data.trimmed()); + QList<Module> modules; + foreach (const GdbMi &item, out.children()) { + Module module; + module.moduleName = _(item.findChild("name").data()); + QString path = _(item.findChild("value").data()); + int pos = path.indexOf(_("' from '")); + if (pos != -1) { + path = path.mid(pos + 8); + if (path.size() >= 2) + path.chop(2); + } else if (path.startsWith(_("<module '")) + && path.endsWith(_("' (built-in)>"))) { + path = _("(builtin)"); + } + module.modulePath = path; + modules.append(module); + } + manager()->modulesHandler()->setModules(modules); } -QList<Symbol> PdbEngine::moduleSymbols(const QString & /*moduleName*/) +void PdbEngine::requestModuleSymbols(const QString &moduleName) { - return QList<Symbol>(); + postCommand("qdebug('listsymbols','" + moduleName.toLatin1() + "')", + CB(handleListSymbols), moduleName); } +void PdbEngine::handleListSymbols(const PdbResponse &response) +{ + GdbMi out; + out.fromString(response.data.trimmed()); + QList<Symbol> symbols; + QString moduleName = response.cookie.toString(); + foreach (const GdbMi &item, out.children()) { + Symbol symbol; + symbol.name = _(item.findChild("name").data()); + symbols.append(symbol); + } + manager()->showModuleSymbols(moduleName, symbols); +} ////////////////////////////////////////////////////////////////////// // @@ -771,6 +810,11 @@ void PdbEngine::debugMessage(const QString &msg) showDebuggerOutput(LogDebug, msg); } +unsigned PdbEngine::debuggerCapabilities() const +{ + return ReloadModuleCapability; +} + IDebuggerEngine *createPdbEngine(DebuggerManager *manager) { return new PdbEngine(manager); diff --git a/src/plugins/debugger/pdb/pdbengine.h b/src/plugins/debugger/pdb/pdbengine.h index 2b1f9d12ffdfa5046cc3790ef27d3635eab7f874..9262b6a6fc48928577700e815e57f6a5adf7a3bf 100644 --- a/src/plugins/debugger/pdb/pdbengine.h +++ b/src/plugins/debugger/pdb/pdbengine.h @@ -94,7 +94,7 @@ private: void loadSymbols(const QString &moduleName); void loadAllSymbols(); - virtual QList<Symbol> moduleSymbols(const QString &moduleName); + void requestModuleSymbols(const QString &moduleName); void reloadModules(); void reloadRegisters() {} void reloadSourceFiles() {} @@ -107,6 +107,7 @@ private: private: void debugMessage(const QString &msg); QString errorMessage(QProcess::ProcessError error) const; + unsigned debuggerCapabilities() const; Q_SLOT void handlePdbFinished(int, QProcess::ExitStatus status); Q_SLOT void handlePdbError(QProcess::ProcessError error); @@ -135,6 +136,8 @@ private: void handleStop(const PdbResponse &response); void handleBacktrace(const PdbResponse &response); void handleListLocals(const PdbResponse &response); + void handleListModules(const PdbResponse &response); + void handleListSymbols(const PdbResponse &response); void handleLoadDumper(const PdbResponse &response); void handleBreakInsert(const PdbResponse &response); diff --git a/src/plugins/debugger/script/scriptengine.cpp b/src/plugins/debugger/script/scriptengine.cpp index 8b0566a999db7d79631ece0ce1d66eb8692d659a..3185c10d978b8eba211e22706c489a5c5b5e923e 100644 --- a/src/plugins/debugger/script/scriptengine.cpp +++ b/src/plugins/debugger/script/scriptengine.cpp @@ -448,9 +448,8 @@ void ScriptEngine::reloadModules() { } -QList<Symbol> ScriptEngine::moduleSymbols(const QString & /*moduleName*/) +void ScriptEngine::requestModuleSymbols(const QString & /*moduleName*/) { - return QList<Symbol>(); } diff --git a/src/plugins/debugger/script/scriptengine.h b/src/plugins/debugger/script/scriptengine.h index 22d28edaa697a07768ed09ec2d82ebc172c8e25a..e320c46c09f37d81a2cc6c9125b7a6deae2daa61 100644 --- a/src/plugins/debugger/script/scriptengine.h +++ b/src/plugins/debugger/script/scriptengine.h @@ -93,7 +93,7 @@ private: void loadSymbols(const QString &moduleName); void loadAllSymbols(); - virtual QList<Symbol> moduleSymbols(const QString &moduleName); + void requestModuleSymbols(const QString &moduleName); void reloadModules(); void reloadRegisters() {} void reloadSourceFiles() {}