diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index 79cc59c601084665030664abf25e0b8b49514ef9..27109f952e87e4296aa9857343e39ffbe57c5e20 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -262,6 +262,8 @@ 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 //m_sourceFilesHandler = new SourceFilesHandler; @@ -508,6 +510,16 @@ void DebuggerManager::createDockWidgets() m_watchDock = createDockForWidget(localsAndWatchers); } +void DebuggerManager::createNewDock(QWidget *widget) +{ + QDockWidget *dockWidget = new QDockWidget(widget->windowTitle(), m_mainWindow); + dockWidget->setObjectName(widget->windowTitle()); + dockWidget->setFeatures(QDockWidget::DockWidgetClosable); + dockWidget->setWidget(widget); + m_mainWindow->addDockWidget(Qt::TopDockWidgetArea, dockWidget); + dockWidget->show(); +} + QDockWidget *DebuggerManager::createDockForWidget(QWidget *widget) { QDockWidget *dockWidget = new QDockWidget(widget->windowTitle(), m_mainWindow); diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index af89e332b45895dddcc503605142b985c42ad566..d5c463eea2d04b92531013386abe6c54451306a9 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -294,6 +294,7 @@ private slots: void showDebuggerOutput(const QString &prefix, const QString &msg); void showDebuggerInput(const QString &prefix, const QString &msg); void showApplicationOutput(const QString &data); + void showWidgetInDock(QWidget *dock); void reloadDisassembler(); void disassemblerDockToggled(bool on); @@ -402,6 +403,7 @@ private: void init(); void setDebuggerType(DebuggerType type); QDockWidget *createDockForWidget(QWidget *widget); + Q_SLOT void createNewDock(QWidget *widget); void shutdown(); diff --git a/src/plugins/debugger/moduleswindow.cpp b/src/plugins/debugger/moduleswindow.cpp index c8e7e41625e755d86d1b63d2a870f0f2d4a70fb8..c580cfd1815dd586b6500b1442de976a2b5f2494 100644 --- a/src/plugins/debugger/moduleswindow.cpp +++ b/src/plugins/debugger/moduleswindow.cpp @@ -30,13 +30,23 @@ #include "moduleswindow.h" #include "moduleshandler.h" // for model roles -#include <QAction> -#include <QDebug> -#include <QHeaderView> -#include <QMenu> -#include <QResizeEvent> -#include <QToolButton> +#include <QtCore/QDebug> +#include <QtCore/QProcess> +#include <QtCore/QRegExp> +#include <QtGui/QAction> +#include <QtGui/QHeaderView> +#include <QtGui/QMenu> +#include <QtGui/QResizeEvent> +#include <QtGui/QToolButton> +#include <QtGui/QTreeWidget> + + +/////////////////////////////////////////////////////////////////////////// +// +// ModulesWindow +// +/////////////////////////////////////////////////////////////////////////// using Debugger::Internal::ModulesWindow; @@ -93,20 +103,28 @@ void ModulesWindow::contextMenuEvent(QContextMenuEvent *ev) QAction *act4 = new QAction(tr("Load symbols for all modules"), &menu); QAction *act5 = 0; QAction *act6 = 0; + QAction *act7 = 0; if (name.isEmpty()) { act5 = new QAction(tr("Load symbols for module"), &menu); act6 = new QAction(tr("Edit file"), &menu); + act7 = new QAction(tr("Show symbols"), &menu); } else { act5 = new QAction(tr("Load symbols for module \"%1\"").arg(name), &menu); act6 = new QAction(tr("Edit file \"%1\"").arg(name), &menu); + act7 = new QAction(tr("Show symbols in file \"%1\"").arg(name), &menu); } act5->setDisabled(name.isEmpty()); act6->setDisabled(name.isEmpty()); + act7->setDisabled(name.isEmpty()); + #ifndef Q_OS_LINUX + act7->setDisabled(true)l + #endif menu.addAction(act0); menu.addAction(act4); menu.addAction(act5); menu.addAction(act6); + menu.addAction(act7); menu.addSeparator(); menu.addAction(act1); menu.addAction(act2); @@ -127,6 +145,8 @@ void ModulesWindow::contextMenuEvent(QContextMenuEvent *ev) emit loadSymbolsRequested(name); else if (act == act6) emit fileOpenRequested(name); + else if (act == act7) + showSymbols(name); } void ModulesWindow::resizeColumnsToContents() @@ -154,3 +174,32 @@ void ModulesWindow::setModel(QAbstractItemModel *model) setAlwaysResizeColumnsToContents(true); } +void ModulesWindow::showSymbols(const QString &name) +{ + if (name.isEmpty()) + return; + QProcess proc; + proc.start("nm", QStringList() << "-D" << name); + proc.waitForFinished(); + QTreeWidget *w = new QTreeWidget; + w->setColumnCount(3); + w->setRootIsDecorated(false); + w->setAlternatingRowColors(true); + //w->header()->hide(); + w->setHeaderLabels(QStringList() << tr("Address") << tr("Code") << tr("Symbol")); + w->setWindowTitle(tr("Symbols in \"%1\"").arg(name)); + QString contents = QString::fromLocal8Bit(proc.readAllStandardOutput()); + QRegExp re("([0-9a-f]+)?\\s+([^\\s]+)\\s+([^\\s]+)"); + foreach (QString line, contents.split('\n')) { + if (re.indexIn(line) != -1) { + QTreeWidgetItem *it = new QTreeWidgetItem; + it->setData(0, Qt::DisplayRole, re.cap(1)); + it->setData(1, Qt::DisplayRole, re.cap(2)); + it->setData(2, Qt::DisplayRole, re.cap(3)); + w->addTopLevelItem(it); + } else { + qDebug() << "UNHANDLED LINE" << line; + } + } + emit newDockRequested(w); +} diff --git a/src/plugins/debugger/moduleswindow.h b/src/plugins/debugger/moduleswindow.h index a2686141961787c5d22157a999768cd933b74be6..36377fb58eeb657f5c742020391627a8be70ff0a 100644 --- a/src/plugins/debugger/moduleswindow.h +++ b/src/plugins/debugger/moduleswindow.h @@ -48,11 +48,13 @@ signals: void loadSymbolsRequested(const QString &modulesName); void loadAllSymbolsRequested(); void fileOpenRequested(QString); + void newDockRequested(QWidget *w); public slots: void resizeColumnsToContents(); void setAlwaysResizeColumnsToContents(bool on); void moduleActivated(const QModelIndex &); + void showSymbols(const QString &name); private: void resizeEvent(QResizeEvent *ev);