diff options
author | Eike Ziller <eike.ziller@digia.com> | 2013-11-22 09:11:51 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@digia.com> | 2013-11-22 09:11:51 +0100 |
commit | 559e66cb353c510c2d624d60a6d28a37fa66dcb0 (patch) | |
tree | e8cf129eaafdd6167e62427f8aa5ec3a2321b7b5 /src/plugins/debugger | |
parent | 759fd36a1eebb6af878b95484e9dc2ef91b90580 (diff) | |
parent | cf3a9b019204e734324f9eedd128f2547e4a2e79 (diff) | |
download | qt-creator-559e66cb353c510c2d624d60a6d28a37fa66dcb0.tar.gz |
Merge remote-tracking branch 'origin/3.0'
Diffstat (limited to 'src/plugins/debugger')
-rw-r--r-- | src/plugins/debugger/debuggerstartparameters.h | 2 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/gdbengine.cpp | 7 | ||||
-rw-r--r-- | src/plugins/debugger/lldb/lldbengine.cpp | 26 | ||||
-rw-r--r-- | src/plugins/debugger/lldb/lldbengine.h | 1 | ||||
-rw-r--r-- | src/plugins/debugger/threadshandler.cpp | 98 | ||||
-rw-r--r-- | src/plugins/debugger/threadshandler.h | 10 |
6 files changed, 92 insertions, 52 deletions
diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h index 2b46a94b93..f928fd40e3 100644 --- a/src/plugins/debugger/debuggerstartparameters.h +++ b/src/plugins/debugger/debuggerstartparameters.h @@ -64,6 +64,7 @@ public: attachPID(-1), useTerminal(false), breakOnMain(false), + continueAfterAttach(false), multiProcess(false), languages(AnyLanguage), qmlServerAddress(QLatin1String("127.0.0.1")), @@ -102,6 +103,7 @@ public: qint64 attachPID; bool useTerminal; bool breakOnMain; + bool continueAfterAttach; bool multiProcess; DebuggerLanguages languages; diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index ae83e0801f..882dfaac9d 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -3603,6 +3603,7 @@ void GdbEngine::handleStackSelectThread(const GdbResponse &) void GdbEngine::reloadFullStack() { PENDING_DEBUG("RELOAD FULL STACK"); + resetLocation(); postCommand("-stack-list-frames", Discardable, CB(handleStackListFrames), QVariant::fromValue<StackCookie>(StackCookie(true, true))); } @@ -4307,10 +4308,8 @@ void GdbEngine::assignValueInDebugger(const WatchData *data, + value.toString().toUtf8().toHex(); postCommand(cmd, Discardable, CB(handleVarAssign)); } else { - postCommand("-var-delete assign"); - postCommand("-var-create assign * " + expression.toLatin1()); - postCommand("-var-assign assign " + - GdbMi::escapeCString(value.toString().toLatin1()), + postCommand("set variable (" + expression.toLatin1() + ")=" + + GdbMi::escapeCString(value.toString().toLatin1()), Discardable, CB(handleVarAssign)); } } diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 7e740f0bd8..c2c7b69141 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -83,7 +83,7 @@ static QByteArray tooltipIName(const QString &exp) /////////////////////////////////////////////////////////////////////// LldbEngine::LldbEngine(const DebuggerStartParameters &startParameters) - : DebuggerEngine(startParameters) + : DebuggerEngine(startParameters), m_continueAtNextSpontaneousStop(false) { m_lastAgentId = 0; m_lastToken = 0; @@ -197,13 +197,19 @@ void LldbEngine::setupInferior() cmd.arg("executable", QFileInfo(sp.executable).absoluteFilePath()); cmd.arg("startMode", sp.startMode); // directly relying on this is brittle wrt. insertions, so check it here cmd.arg("processArgs", sp.processArgs); - cmd.arg("attachPid", ((sp.startMode == AttachCrashedExternal || sp.startMode == AttachExternal) - ? sp.attachPID : 0)); + + QTC_CHECK(!sp.attachPID || (sp.startMode == AttachCrashedExternal + || sp.startMode == AttachExternal)); + cmd.arg("attachPid", sp.attachPID); cmd.arg("sysRoot", sp.sysRoot); cmd.arg("remoteChannel", ((sp.startMode == AttachToRemoteProcess || sp.startMode == AttachToRemoteServer) ? sp.remoteChannel : QString())); cmd.arg("platform", sp.platform); + QTC_CHECK(!sp.continueAfterAttach || (sp.startMode == AttachToRemoteProcess + || sp.startMode == AttachExternal + || sp.startMode == AttachToRemoteServer)); + m_continueAtNextSpontaneousStop = false; runCommand(cmd); updateLocals(); // update display options } @@ -1014,9 +1020,13 @@ void LldbEngine::refreshState(const GdbMi &reportedState) notifyInferiorRunOk(); else if (newState == "inferiorrunfailed") notifyInferiorRunFailed(); - else if (newState == "stopped") + else if (newState == "stopped") { notifyInferiorSpontaneousStop(); - else if (newState == "inferiorstopok") + if (m_continueAtNextSpontaneousStop) { + m_continueAtNextSpontaneousStop = false; + continueInferior(); + } + } else if (newState == "inferiorstopok") notifyInferiorStopOk(); else if (newState == "inferiorstopfailed") notifyInferiorStopFailed(); @@ -1028,9 +1038,11 @@ void LldbEngine::refreshState(const GdbMi &reportedState) notifyEngineRunFailed(); else if (newState == "inferiorsetupok") notifyInferiorSetupOk(); - else if (newState == "enginerunandinferiorrunok") + else if (newState == "enginerunandinferiorrunok") { + if (startParameters().continueAfterAttach) + m_continueAtNextSpontaneousStop = true; notifyEngineRunAndInferiorRunOk(); - else if (newState == "enginerunandinferiorstopok") + } else if (newState == "enginerunandinferiorstopok") notifyEngineRunAndInferiorStopOk(); else if (newState == "inferiorshutdownok") notifyInferiorShutdownOk(); diff --git a/src/plugins/debugger/lldb/lldbengine.h b/src/plugins/debugger/lldb/lldbengine.h index 22d05cb293..dc4e174768 100644 --- a/src/plugins/debugger/lldb/lldbengine.h +++ b/src/plugins/debugger/lldb/lldbengine.h @@ -201,6 +201,7 @@ private: // FIXME: Make generic. int m_lastAgentId; int m_lastToken; + int m_continueAtNextSpontaneousStop; QMap<QPointer<DisassemblerAgent>, int> m_disassemblerAgents; QMap<QPointer<MemoryAgent>, int> m_memoryAgents; QHash<int, QPointer<QObject> > m_memoryAgentTokens; diff --git a/src/plugins/debugger/threadshandler.cpp b/src/plugins/debugger/threadshandler.cpp index 4996d34752..63b1e1375e 100644 --- a/src/plugins/debugger/threadshandler.cpp +++ b/src/plugins/debugger/threadshandler.cpp @@ -36,12 +36,11 @@ #include <utils/qtcassert.h> #include <QDebug> -#include <QSortFilterProxyModel> namespace Debugger { namespace Internal { -void mergeThreadData(ThreadData &data, const ThreadData &other) +static void mergeThreadData(ThreadData &data, const ThreadData &other) { if (!other.core.isEmpty()) data.core = other.core; @@ -67,6 +66,40 @@ void mergeThreadData(ThreadData &data, const ThreadData &other) data.lineNumber = other.lineNumber; } +static QVariant threadPart(const ThreadData &thread, int column) +{ + switch (column) { + case ThreadData::IdColumn: + return thread.id.raw(); + case ThreadData::FunctionColumn: + return thread.function; + case ThreadData::FileColumn: + return thread.fileName.isEmpty() ? thread.module : thread.fileName; + case ThreadData::LineColumn: + return thread.lineNumber >= 0 + ? QString::number(thread.lineNumber) : QString(); + case ThreadData::AddressColumn: + return thread.address > 0 + ? QLatin1String("0x") + QString::number(thread.address, 16) + : QString(); + case ThreadData::CoreColumn: + return thread.core; + case ThreadData::StateColumn: + return thread.state; + case ThreadData::TargetIdColumn: + if (thread.targetId.startsWith(QLatin1String("Thread "))) + return thread.targetId.mid(7); + return thread.targetId; + case ThreadData::NameColumn: + return thread.name; + case ThreadData::DetailsColumn: + return thread.details; + case ThreadData::ComboNameColumn: + return QString::fromLatin1("#%1 %2").arg(thread.id.raw()).arg(thread.name); + } + return QVariant(); +} + //////////////////////////////////////////////////////////////////////// // // ThreadsHandler @@ -137,8 +170,6 @@ ThreadsHandler::ThreadsHandler() { m_resetLocationScheduled = false; setObjectName(QLatin1String("ThreadsModel")); - m_proxyModel = new QSortFilterProxyModel(this); - m_proxyModel->setSourceModel(this); } int ThreadsHandler::currentThreadIndex() const @@ -168,35 +199,7 @@ QVariant ThreadsHandler::data(const QModelIndex &index, int role) const switch (role) { case Qt::DisplayRole: - switch (index.column()) { - case ThreadData::IdColumn: - return thread.id.raw(); - case ThreadData::FunctionColumn: - return thread.function; - case ThreadData::FileColumn: - return thread.fileName.isEmpty() ? thread.module : thread.fileName; - case ThreadData::LineColumn: - return thread.lineNumber >= 0 - ? QString::number(thread.lineNumber) : QString(); - case ThreadData::AddressColumn: - return thread.address > 0 - ? QLatin1String("0x") + QString::number(thread.address, 16) - : QString(); - case ThreadData::CoreColumn: - return thread.core; - case ThreadData::StateColumn: - return thread.state; - case ThreadData::TargetIdColumn: - if (thread.targetId.startsWith(QLatin1String("Thread "))) - return thread.targetId.mid(7); - return thread.targetId; - case ThreadData::NameColumn: - return thread.name; - case ThreadData::DetailsColumn: - return thread.details; - case ThreadData::ComboNameColumn: - return QString::fromLatin1("#%1 %2").arg(thread.id.raw()).arg(thread.name); - } + return threadPart(thread, index.column()); case Qt::ToolTipRole: return threadToolTip(thread); case Qt::DecorationRole: @@ -250,6 +253,33 @@ Qt::ItemFlags ThreadsHandler::flags(const QModelIndex &index) const return stopped ? QAbstractTableModel::flags(index) : Qt::ItemFlags(0); } +struct Sorter +{ + Sorter(int column, Qt::SortOrder order) + : m_column(column), m_order(order) + {} + + bool operator()(const ThreadData &t1, const ThreadData &t2) const + { + const QVariant v1 = threadPart(t1, m_column); + const QVariant v2 = threadPart(t2, m_column); + if (v1 == v2) + return false; + // FIXME: Use correct toXXX(); + return (v1.toString() < v2.toString()) ^ (m_order == Qt::DescendingOrder); + } + + int m_column; + Qt::SortOrder m_order; +}; + +void ThreadsHandler::sort(int column, Qt::SortOrder order) +{ + layoutAboutToBeChanged(); + qSort(m_threads.begin(), m_threads.end(), Sorter(column, order)); + layoutChanged(); +} + ThreadId ThreadsHandler::currentThread() const { return m_currentId; @@ -490,7 +520,7 @@ void ThreadsHandler::resetLocation() QAbstractItemModel *ThreadsHandler::model() { - return m_proxyModel; + return this; } } // namespace Internal diff --git a/src/plugins/debugger/threadshandler.h b/src/plugins/debugger/threadshandler.h index 1bf9ef6da9..30f458ee36 100644 --- a/src/plugins/debugger/threadshandler.h +++ b/src/plugins/debugger/threadshandler.h @@ -30,14 +30,10 @@ #ifndef THREADSHANDLER_H #define THREADSHANDLER_H -#include <QAbstractTableModel> -#include <QIcon> - #include "threaddata.h" -QT_BEGIN_NAMESPACE -class QSortFilterProxyModel; -QT_END_NAMESPACE +#include <QAbstractTableModel> +#include <QIcon> //////////////////////////////////////////////////////////////////////// // @@ -92,6 +88,7 @@ private: QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex &index) const; + void sort(int, Qt::SortOrder); void updateThreadBox(); void threadDataChanged(ThreadId id); @@ -101,7 +98,6 @@ private: const QIcon m_emptyIcon; bool m_resetLocationScheduled; - QSortFilterProxyModel *m_proxyModel; }; } // namespace Internal |