summaryrefslogtreecommitdiff
path: root/src/plugins/debugger
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@digia.com>2013-11-22 09:11:51 +0100
committerEike Ziller <eike.ziller@digia.com>2013-11-22 09:11:51 +0100
commit559e66cb353c510c2d624d60a6d28a37fa66dcb0 (patch)
treee8cf129eaafdd6167e62427f8aa5ec3a2321b7b5 /src/plugins/debugger
parent759fd36a1eebb6af878b95484e9dc2ef91b90580 (diff)
parentcf3a9b019204e734324f9eedd128f2547e4a2e79 (diff)
downloadqt-creator-559e66cb353c510c2d624d60a6d28a37fa66dcb0.tar.gz
Merge remote-tracking branch 'origin/3.0'
Diffstat (limited to 'src/plugins/debugger')
-rw-r--r--src/plugins/debugger/debuggerstartparameters.h2
-rw-r--r--src/plugins/debugger/gdb/gdbengine.cpp7
-rw-r--r--src/plugins/debugger/lldb/lldbengine.cpp26
-rw-r--r--src/plugins/debugger/lldb/lldbengine.h1
-rw-r--r--src/plugins/debugger/threadshandler.cpp98
-rw-r--r--src/plugins/debugger/threadshandler.h10
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