2009-02-25 09:15:00 +01:00
|
|
|
/**************************************************************************
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
|
|
|
** This file is part of Qt Creator
|
|
|
|
**
|
2011-01-11 16:28:15 +01:00
|
|
|
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2011-04-13 08:42:33 +02:00
|
|
|
** Contact: Nokia Corporation (info@qt.nokia.com)
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** GNU Lesser General Public License Usage
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2011-04-13 08:42:33 +02:00
|
|
|
** This file may be used under the terms of the GNU Lesser General Public
|
|
|
|
** License version 2.1 as published by the Free Software Foundation and
|
|
|
|
** appearing in the file LICENSE.LGPL included in the packaging of this file.
|
|
|
|
** Please review the following information to ensure the GNU Lesser General
|
|
|
|
** Public License version 2.1 requirements will be met:
|
|
|
|
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2010-12-17 16:01:08 +01:00
|
|
|
** In addition, as a special exception, Nokia gives you certain additional
|
2011-04-13 08:42:33 +02:00
|
|
|
** rights. These rights are described in the Nokia Qt LGPL Exception
|
2010-12-17 16:01:08 +01:00
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
**
|
2011-04-13 08:42:33 +02:00
|
|
|
** Other Usage
|
|
|
|
**
|
|
|
|
** Alternatively, this file may be used in accordance with the terms and
|
|
|
|
** conditions contained in a signed written agreement between you and Nokia.
|
|
|
|
**
|
2010-12-17 16:01:08 +01:00
|
|
|
** If you have questions regarding the use of this file, please contact
|
|
|
|
** Nokia at qt-info@nokia.com.
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
**************************************************************************/
|
2008-12-02 15:08:31 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#ifndef DEBUGGER_GDBENGINE_H
|
|
|
|
#define DEBUGGER_GDBENGINE_H
|
|
|
|
|
2010-06-16 11:08:54 +02:00
|
|
|
#include "debuggerengine.h"
|
2010-06-30 14:39:41 +02:00
|
|
|
|
|
|
|
#include "stackframe.h"
|
2009-04-29 14:15:09 +02:00
|
|
|
#include "watchutils.h"
|
2009-02-20 12:33:16 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <QtCore/QByteArray>
|
2010-11-02 16:14:00 +01:00
|
|
|
#include <QtCore/QProcess>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <QtCore/QHash>
|
|
|
|
#include <QtCore/QMap>
|
2010-04-08 16:55:25 +02:00
|
|
|
#include <QtCore/QMultiMap>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <QtCore/QObject>
|
|
|
|
#include <QtCore/QPoint>
|
2009-09-21 11:09:38 +02:00
|
|
|
#include <QtCore/QSet>
|
2009-01-15 14:47:14 +01:00
|
|
|
#include <QtCore/QTextCodec>
|
2009-07-06 11:37:21 +02:00
|
|
|
#include <QtCore/QTime>
|
2010-11-16 12:42:57 +01:00
|
|
|
#include <QtCore/QTimer>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <QtCore/QVariant>
|
|
|
|
|
|
|
|
|
|
|
|
namespace Debugger {
|
|
|
|
namespace Internal {
|
|
|
|
|
2009-09-21 11:09:38 +02:00
|
|
|
class AbstractGdbAdapter;
|
2010-05-05 12:49:08 +02:00
|
|
|
class AbstractGdbProcess;
|
2009-09-24 11:16:00 +02:00
|
|
|
class GdbResponse;
|
2008-12-02 12:01:29 +01:00
|
|
|
class GdbMi;
|
2011-02-11 15:00:13 +01:00
|
|
|
class GdbToolTipContext;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-09-23 15:28:50 +02:00
|
|
|
class WatchData;
|
2010-04-12 12:01:40 +02:00
|
|
|
class DisassemblerAgentCookie;
|
2010-11-24 15:55:09 +01:00
|
|
|
class DisassemblerLines;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-09-23 15:28:50 +02:00
|
|
|
class AttachGdbAdapter;
|
|
|
|
class CoreGdbAdapter;
|
2010-05-05 12:49:08 +02:00
|
|
|
class LocalPlainGdbAdapter;
|
|
|
|
class RemoteGdbServerAdapter;
|
2009-09-23 15:28:50 +02:00
|
|
|
class TrkGdbAdapter;
|
2009-09-23 09:54:21 +02:00
|
|
|
|
2009-04-07 16:39:17 +02:00
|
|
|
enum DebuggingHelperState
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
2009-04-07 16:39:17 +02:00
|
|
|
DebuggingHelperUninitialized,
|
|
|
|
DebuggingHelperLoadTried,
|
|
|
|
DebuggingHelperAvailable,
|
2010-12-16 12:05:48 +01:00
|
|
|
DebuggingHelperUnavailable
|
2008-12-02 12:01:29 +01:00
|
|
|
};
|
|
|
|
|
2010-04-12 12:01:40 +02:00
|
|
|
|
2011-04-08 15:24:23 +02:00
|
|
|
/* This is only used with Mac gdb since 2.2
|
|
|
|
*
|
|
|
|
* "Custom dumper" is a library compiled against the current
|
|
|
|
* Qt containing functions to evaluate values of Qt classes
|
|
|
|
* (such as QString, taking pointers to their addresses).
|
|
|
|
* The library must be loaded into the debuggee.
|
|
|
|
* It provides a function that takes input from an input buffer
|
|
|
|
* and some parameters and writes output into an output buffer.
|
|
|
|
* Parameter 1 is the protocol:
|
|
|
|
* 1) Query. Fills output buffer with known types, Qt version and namespace.
|
|
|
|
* This information is parsed and stored by this class (special type
|
|
|
|
* enumeration).
|
|
|
|
* 2) Evaluate symbol, taking address and some additional parameters
|
|
|
|
* depending on type. */
|
|
|
|
|
|
|
|
class DumperHelper
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
enum Type {
|
|
|
|
UnknownType,
|
|
|
|
SupportedType, // A type that requires no special handling by the dumper
|
|
|
|
// Below types require special handling
|
|
|
|
QAbstractItemType,
|
|
|
|
QObjectType, QWidgetType, QObjectSlotType, QObjectSignalType,
|
|
|
|
QVectorType, QMapType, QMultiMapType, QMapNodeType, QStackType,
|
|
|
|
StdVectorType, StdDequeType, StdSetType, StdMapType, StdStackType,
|
|
|
|
StdStringType
|
|
|
|
};
|
|
|
|
|
|
|
|
// Type/Parameter struct required for building a value query
|
|
|
|
struct TypeData {
|
|
|
|
TypeData();
|
|
|
|
void clear();
|
|
|
|
|
|
|
|
Type type;
|
|
|
|
bool isTemplate;
|
|
|
|
QByteArray tmplate;
|
|
|
|
QByteArray inner;
|
|
|
|
};
|
|
|
|
|
|
|
|
DumperHelper();
|
|
|
|
void clear();
|
|
|
|
|
|
|
|
double dumperVersion() const { return m_dumperVersion; }
|
|
|
|
|
|
|
|
int typeCount() const;
|
|
|
|
// Look up a simple, non-template type
|
|
|
|
Type simpleType(const QByteArray &simpleType) const;
|
|
|
|
// Look up a (potentially) template type and fill parameter struct
|
|
|
|
TypeData typeData(const QByteArray &typeName) const;
|
|
|
|
Type type(const QByteArray &typeName) const;
|
|
|
|
|
|
|
|
int qtVersion() const;
|
|
|
|
QByteArray qtVersionString() const;
|
|
|
|
QByteArray qtNamespace() const;
|
|
|
|
void setQtNamespace(const QByteArray &ba)
|
|
|
|
{ if (!ba.isEmpty()) m_qtNamespace = ba; }
|
|
|
|
|
|
|
|
// Complete parse of "query" (protocol 1) response from debuggee buffer.
|
|
|
|
// 'data' excludes the leading indicator character.
|
|
|
|
bool parseQuery(const GdbMi &data);
|
|
|
|
// Sizes can be added as the debugger determines them
|
|
|
|
void addSize(const QByteArray &type, int size);
|
|
|
|
|
|
|
|
// Determine the parameters required for an "evaluate" (protocol 2) call
|
|
|
|
void evaluationParameters(const WatchData &data,
|
|
|
|
const TypeData &td,
|
|
|
|
QByteArray *inBuffer,
|
|
|
|
QList<QByteArray> *extraParameters) const;
|
|
|
|
|
|
|
|
QString toString(bool debug = false) const;
|
|
|
|
|
|
|
|
static QString msgDumperOutdated(double requiredVersion, double currentVersion);
|
|
|
|
|
|
|
|
private:
|
|
|
|
typedef QMap<QString, Type> NameTypeMap;
|
|
|
|
typedef QMap<QByteArray, int> SizeCache;
|
|
|
|
|
|
|
|
// Look up a simple (namespace) type
|
|
|
|
QByteArray evaluationSizeofTypeExpression(const QByteArray &typeName) const;
|
|
|
|
|
|
|
|
NameTypeMap m_nameTypeMap;
|
|
|
|
SizeCache m_sizeCache;
|
|
|
|
|
|
|
|
// The initial dumper query function returns sizes of some special
|
|
|
|
// types to aid CDB since it cannot determine the size of classes.
|
|
|
|
// They are not complete (std::allocator<X>).
|
|
|
|
enum SpecialSizeType { IntSize, PointerSize, StdAllocatorSize,
|
|
|
|
QSharedPointerSize, QSharedDataPointerSize,
|
|
|
|
QWeakPointerSize, QPointerSize,
|
|
|
|
QListSize, QLinkedListSize, QVectorSize, QQueueSize,
|
|
|
|
SpecialSizeCount };
|
|
|
|
|
|
|
|
// Resolve name to enumeration or SpecialSizeCount (invalid)
|
|
|
|
SpecialSizeType specialSizeType(const QByteArray &type) const;
|
|
|
|
|
|
|
|
int m_specialSizes[SpecialSizeCount];
|
|
|
|
|
|
|
|
typedef QMap<QByteArray, QByteArray> ExpressionCache;
|
|
|
|
ExpressionCache m_expressionCache;
|
|
|
|
int m_qtVersion;
|
|
|
|
double m_dumperVersion;
|
|
|
|
QByteArray m_qtNamespace;
|
|
|
|
|
|
|
|
void setQClassPrefixes(const QByteArray &qNamespace);
|
|
|
|
|
|
|
|
QByteArray m_qPointerPrefix;
|
|
|
|
QByteArray m_qSharedPointerPrefix;
|
|
|
|
QByteArray m_qSharedDataPointerPrefix;
|
|
|
|
QByteArray m_qWeakPointerPrefix;
|
|
|
|
QByteArray m_qListPrefix;
|
|
|
|
QByteArray m_qLinkedListPrefix;
|
|
|
|
QByteArray m_qVectorPrefix;
|
|
|
|
QByteArray m_qQueuePrefix;
|
|
|
|
};
|
|
|
|
|
2010-09-14 08:34:07 +02:00
|
|
|
class GdbEngine : public Debugger::DebuggerEngine
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
2011-01-12 12:10:12 +01:00
|
|
|
GdbEngine(const DebuggerStartParameters &startParameters,
|
|
|
|
DebuggerEngine *masterEngine);
|
2008-12-02 12:01:29 +01:00
|
|
|
~GdbEngine();
|
2010-07-15 16:43:56 +02:00
|
|
|
AbstractGdbAdapter *gdbAdapter() const { return m_gdbAdapter; }
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
private:
|
2009-10-07 17:36:44 +02:00
|
|
|
friend class AbstractGdbAdapter;
|
2010-05-05 12:49:08 +02:00
|
|
|
friend class AbstractPlainGdbAdapter;
|
2009-09-23 15:28:50 +02:00
|
|
|
friend class AttachGdbAdapter;
|
|
|
|
friend class CoreGdbAdapter;
|
2010-05-05 12:49:08 +02:00
|
|
|
friend class LocalPlainGdbAdapter;
|
2009-10-07 10:25:26 +02:00
|
|
|
friend class TermGdbAdapter;
|
2010-05-05 12:49:08 +02:00
|
|
|
friend class RemoteGdbServerAdapter;
|
|
|
|
friend class RemotePlainGdbAdapter;
|
2009-09-23 15:28:50 +02:00
|
|
|
friend class TrkGdbAdapter;
|
2011-02-07 14:26:34 +01:00
|
|
|
friend class CodaGdbAdapter;
|
2009-09-11 12:30:53 +02:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
private: ////////// General Interface //////////
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-07-08 18:10:50 +02:00
|
|
|
virtual void setupEngine();
|
|
|
|
virtual void setupInferior();
|
|
|
|
virtual void runEngine();
|
|
|
|
|
2010-02-05 10:23:55 +01:00
|
|
|
virtual unsigned debuggerCapabilities() const;
|
2011-02-28 10:58:21 +01:00
|
|
|
virtual bool canWatchWidgets() const;
|
2009-10-15 12:32:49 +02:00
|
|
|
virtual void detachDebugger();
|
2010-07-09 17:07:59 +02:00
|
|
|
virtual void shutdownEngine();
|
|
|
|
virtual void shutdownInferior();
|
2010-08-11 09:46:39 +02:00
|
|
|
virtual void notifyInferiorSetupFailed();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2011-02-16 12:41:06 +01:00
|
|
|
virtual bool acceptsDebuggerCommands() const;
|
2009-10-15 12:32:49 +02:00
|
|
|
virtual void executeDebuggerCommand(const QString &command);
|
2010-09-01 17:36:09 +02:00
|
|
|
virtual QByteArray qtNamespace() const { return m_dumperHelper.qtNamespace(); }
|
2011-01-17 15:11:11 +01:00
|
|
|
virtual void setQtNamespace(const QByteArray &ns)
|
|
|
|
{ return m_dumperHelper.setQtNamespace(ns); }
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
private: ////////// General State //////////
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
DebuggerStartMode startMode() const;
|
2010-09-23 11:15:56 +02:00
|
|
|
Q_SLOT void reloadLocals();
|
2009-08-12 10:51:25 +02:00
|
|
|
|
2009-10-30 16:42:33 +01:00
|
|
|
bool m_registerNamesListed;
|
2009-08-14 13:04:05 +02:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
private: ////////// Gdb Process Management //////////
|
2009-01-27 15:53:50 +01:00
|
|
|
|
2010-06-14 13:17:54 +02:00
|
|
|
AbstractGdbAdapter *createAdapter();
|
2009-10-26 11:55:02 +01:00
|
|
|
bool startGdb(const QStringList &args = QStringList(),
|
|
|
|
const QString &settingsIdHint = QString());
|
2009-10-20 11:02:16 +02:00
|
|
|
void handleInferiorShutdown(const GdbResponse &response);
|
|
|
|
void handleGdbExit(const GdbResponse &response);
|
2010-12-10 12:41:44 +01:00
|
|
|
void handleRemoteSetupDone(int gdbServerPort, int qmlPort);
|
|
|
|
void handleRemoteSetupFailed(const QString &message);
|
2011-03-21 15:04:31 +01:00
|
|
|
void handleNamespaceExtraction(const GdbResponse &response);
|
2009-10-20 11:02:16 +02:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
void handleAdapterStarted();
|
2010-07-09 17:07:59 +02:00
|
|
|
void defaultInferiorShutdown(const char *cmd);
|
2010-07-15 13:23:44 +02:00
|
|
|
void loadPythonDumpers();
|
2010-09-23 14:58:45 +02:00
|
|
|
void pythonDumpersFailed();
|
2010-07-08 18:10:50 +02:00
|
|
|
|
2010-07-08 12:41:26 +02:00
|
|
|
// Something went wrong with the adapter *before* adapterStarted() was emitted.
|
|
|
|
// Make sure to clean up everything before emitting this signal.
|
2010-03-03 18:08:18 +01:00
|
|
|
void handleAdapterStartFailed(const QString &msg,
|
|
|
|
const QString &settingsIdHint = QString());
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-07-08 12:41:26 +02:00
|
|
|
// This triggers the initial breakpoint synchronization and causes
|
2010-07-08 18:10:50 +02:00
|
|
|
// finishInferiorSetup() being called once done.
|
2009-10-19 19:04:01 +02:00
|
|
|
void handleInferiorPrepared();
|
2010-07-08 18:10:50 +02:00
|
|
|
// This notifies the base of a successful inferior setup.
|
|
|
|
void finishInferiorSetup();
|
2009-10-19 19:04:01 +02:00
|
|
|
|
2010-07-08 12:41:26 +02:00
|
|
|
// The adapter is still running just fine, but it failed to acquire a debuggee.
|
2010-07-09 17:07:59 +02:00
|
|
|
void notifyInferiorSetupFailed(const QString &msg);
|
|
|
|
|
|
|
|
void notifyAdapterShutdownOk();
|
|
|
|
void notifyAdapterShutdownFailed();
|
2009-10-15 12:32:49 +02:00
|
|
|
|
2010-07-08 12:41:26 +02:00
|
|
|
// Something went wrong with the adapter *after* adapterStarted() was emitted.
|
|
|
|
// Make sure to clean up everything before emitting this signal.
|
2009-10-15 12:32:49 +02:00
|
|
|
void handleAdapterCrashed(const QString &msg);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-07-08 12:41:26 +02:00
|
|
|
private slots:
|
|
|
|
void handleGdbFinished(int, QProcess::ExitStatus status);
|
|
|
|
void handleGdbError(QProcess::ProcessError error);
|
|
|
|
void readGdbStandardOutput();
|
|
|
|
void readGdbStandardError();
|
|
|
|
void readDebugeeOutput(const QByteArray &data);
|
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
private:
|
|
|
|
QTextCodec *m_outputCodec;
|
|
|
|
QTextCodec::ConverterState m_outputCodecState;
|
|
|
|
|
|
|
|
QByteArray m_inbuffer;
|
2009-10-27 12:05:03 +01:00
|
|
|
bool m_busy;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
AbstractGdbAdapter *m_gdbAdapter;
|
|
|
|
|
2010-05-19 12:00:01 +02:00
|
|
|
// Name of the convenience variable containing the last
|
|
|
|
// known function return value.
|
|
|
|
QByteArray m_resultVarName;
|
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
private: ////////// Gdb Command Management //////////
|
|
|
|
|
2010-03-03 18:08:18 +01:00
|
|
|
public: // Otherwise the Qt flag macros are unhappy.
|
2009-05-04 18:30:22 +02:00
|
|
|
enum GdbCommandFlag {
|
|
|
|
NoFlags = 0,
|
2010-03-03 18:08:18 +01:00
|
|
|
// The command needs a stopped inferior.
|
2010-12-16 12:05:48 +01:00
|
|
|
NeedsStop = 1,
|
2010-03-03 18:08:18 +01:00
|
|
|
// No need to wait for the reply before continuing inferior.
|
|
|
|
Discardable = 2,
|
|
|
|
// Trigger watch model rebuild when no such commands are pending anymore.
|
|
|
|
RebuildWatchModel = 4,
|
2010-03-02 18:02:30 +01:00
|
|
|
WatchUpdate = Discardable | RebuildWatchModel,
|
2010-06-28 14:55:19 +02:00
|
|
|
// We can live without receiving an answer.
|
2010-03-03 18:08:18 +01:00
|
|
|
NonCriticalResponse = 8,
|
|
|
|
// Callback expects GdbResultRunning instead of GdbResultDone.
|
|
|
|
RunRequest = 16,
|
|
|
|
// Callback expects GdbResultExit instead of GdbResultDone.
|
|
|
|
ExitRequest = 32,
|
|
|
|
// Auto-set inferior shutdown related states.
|
|
|
|
LosesChild = 64,
|
|
|
|
// Trigger breakpoint model rebuild when no such commands are pending anymore.
|
|
|
|
RebuildBreakpointModel = 128,
|
2010-04-09 14:53:45 +02:00
|
|
|
// This command needs to be send immediately.
|
|
|
|
Immediate = 256,
|
2010-06-28 14:53:31 +02:00
|
|
|
// This is a command that needs to be wrapped into -interpreter-exec console
|
2010-12-16 12:05:48 +01:00
|
|
|
ConsoleCommand = 512
|
2009-05-04 18:30:22 +02:00
|
|
|
};
|
|
|
|
Q_DECLARE_FLAGS(GdbCommandFlags, GdbCommandFlag)
|
2009-10-15 12:32:49 +02:00
|
|
|
private:
|
2009-05-04 18:30:22 +02:00
|
|
|
|
2009-09-21 11:09:38 +02:00
|
|
|
typedef void (GdbEngine::*GdbCommandCallback)
|
2009-09-24 11:16:00 +02:00
|
|
|
(const GdbResponse &response);
|
2009-09-21 11:09:38 +02:00
|
|
|
typedef void (AbstractGdbAdapter::*AdapterCallback)
|
2009-09-24 11:16:00 +02:00
|
|
|
(const GdbResponse &response);
|
2009-05-04 18:30:22 +02:00
|
|
|
|
|
|
|
struct GdbCommand
|
|
|
|
{
|
2009-09-21 11:09:38 +02:00
|
|
|
GdbCommand()
|
|
|
|
: flags(0), callback(0), adapterCallback(0), callbackName(0)
|
|
|
|
{}
|
2009-05-04 18:30:22 +02:00
|
|
|
|
|
|
|
int flags;
|
|
|
|
GdbCommandCallback callback;
|
2009-09-21 11:09:38 +02:00
|
|
|
AdapterCallback adapterCallback;
|
2009-05-04 18:30:22 +02:00
|
|
|
const char *callbackName;
|
2010-01-05 16:51:55 +01:00
|
|
|
QByteArray command;
|
2009-05-04 18:30:22 +02:00
|
|
|
QVariant cookie;
|
2009-07-06 11:37:21 +02:00
|
|
|
QTime postTime;
|
2009-05-04 18:30:22 +02:00
|
|
|
};
|
|
|
|
|
2010-03-03 18:08:18 +01:00
|
|
|
// Type and cookie are sender-internal data, opaque for the "event
|
2008-12-02 12:01:29 +01:00
|
|
|
// queue". resultNeeded == true increments m_pendingResults on
|
2009-09-24 11:45:08 +02:00
|
|
|
// send and decrements on receipt, effectively preventing
|
2008-12-02 12:01:29 +01:00
|
|
|
// watch model updates before everything is finished.
|
2009-09-21 11:09:38 +02:00
|
|
|
void flushCommand(const GdbCommand &cmd);
|
2010-01-05 16:51:55 +01:00
|
|
|
void postCommand(const QByteArray &command,
|
2009-05-05 11:16:54 +02:00
|
|
|
GdbCommandFlags flags,
|
|
|
|
GdbCommandCallback callback = 0,
|
|
|
|
const char *callbackName = 0,
|
|
|
|
const QVariant &cookie = QVariant());
|
2010-01-05 16:51:55 +01:00
|
|
|
void postCommand(const QByteArray &command,
|
2009-05-05 11:16:54 +02:00
|
|
|
GdbCommandCallback callback = 0,
|
|
|
|
const char *callbackName = 0,
|
|
|
|
const QVariant &cookie = QVariant());
|
2010-01-05 16:51:55 +01:00
|
|
|
void postCommand(const QByteArray &command,
|
2009-09-21 11:09:38 +02:00
|
|
|
AdapterCallback callback,
|
|
|
|
const char *callbackName,
|
|
|
|
const QVariant &cookie = QVariant());
|
2010-01-05 16:51:55 +01:00
|
|
|
void postCommand(const QByteArray &command,
|
2009-09-21 17:35:19 +02:00
|
|
|
GdbCommandFlags flags,
|
|
|
|
AdapterCallback callback,
|
|
|
|
const char *callbackName,
|
|
|
|
const QVariant &cookie = QVariant());
|
2009-09-21 11:09:38 +02:00
|
|
|
void postCommandHelper(const GdbCommand &cmd);
|
2009-11-02 16:40:16 +01:00
|
|
|
void flushQueuedCommands();
|
2009-11-03 14:56:27 +01:00
|
|
|
Q_SLOT void commandTimeout();
|
2008-12-02 12:01:29 +01:00
|
|
|
void setTokenBarrier();
|
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
QHash<int, GdbCommand> m_cookieForToken;
|
2009-12-11 16:59:34 +01:00
|
|
|
int commandTimeoutTime() const;
|
2010-11-16 12:42:57 +01:00
|
|
|
QTimer m_commandTimer;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
QByteArray m_pendingConsoleStreamOutput;
|
|
|
|
QByteArray m_pendingLogStreamOutput;
|
2009-10-09 16:35:52 +02:00
|
|
|
|
2010-03-03 18:08:18 +01:00
|
|
|
// This contains the first token number for the current round
|
2009-10-15 12:32:49 +02:00
|
|
|
// of evaluation. Responses with older tokens are considers
|
|
|
|
// out of date and discarded.
|
|
|
|
int m_oldestAcceptableToken;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-03-02 18:02:30 +01:00
|
|
|
int m_pendingWatchRequests; // Watch updating commands in flight
|
2010-03-03 18:08:18 +01:00
|
|
|
int m_pendingBreakpointRequests; // Watch updating commands in flight
|
2009-09-21 11:09:38 +02:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
typedef void (GdbEngine::*CommandsDoneCallback)();
|
2010-03-03 18:08:18 +01:00
|
|
|
// This function is called after all previous responses have been received.
|
2009-10-15 12:32:49 +02:00
|
|
|
CommandsDoneCallback m_commandsDoneCallback;
|
2009-09-21 11:09:38 +02:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
QList<GdbCommand> m_commandsToRunOnTemporaryBreak;
|
2009-12-18 16:25:59 +01:00
|
|
|
int gdbVersion() const { return m_gdbVersion; }
|
2009-10-15 12:32:49 +02:00
|
|
|
|
|
|
|
private: ////////// Gdb Output, State & Capability Handling //////////
|
2009-09-21 11:09:38 +02:00
|
|
|
|
2009-02-24 20:34:30 +01:00
|
|
|
void handleResponse(const QByteArray &buff);
|
2009-10-09 10:20:42 +02:00
|
|
|
void handleStopResponse(const GdbMi &data);
|
2009-10-23 21:32:08 +02:00
|
|
|
void handleResultRecord(GdbResponse *response);
|
2010-11-23 12:31:47 +01:00
|
|
|
void handleStop0(const GdbMi &data);
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleStop1(const GdbResponse &response);
|
2009-10-09 10:59:56 +02:00
|
|
|
void handleStop1(const GdbMi &data);
|
2010-12-17 13:07:17 +01:00
|
|
|
Q_SLOT void handleStop2();
|
2009-10-15 12:32:49 +02:00
|
|
|
StackFrame parseStackFrame(const GdbMi &mi, int level);
|
2010-08-11 09:46:39 +02:00
|
|
|
void resetCommandQueue();
|
2009-10-15 12:32:49 +02:00
|
|
|
|
2010-08-30 07:52:41 +02:00
|
|
|
bool isSynchronous() const { return hasPython(); }
|
2010-01-20 15:38:01 +01:00
|
|
|
virtual bool hasPython() const;
|
2009-10-15 12:32:49 +02:00
|
|
|
bool supportsThreads() const;
|
|
|
|
|
|
|
|
// Gdb initialization sequence
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleShowVersion(const GdbResponse &response);
|
2010-01-20 15:38:01 +01:00
|
|
|
void handleHasPython(const GdbResponse &response);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-22 11:08:06 +02:00
|
|
|
int m_gdbVersion; // 6.8.0 is 60800
|
2009-10-15 12:32:49 +02:00
|
|
|
int m_gdbBuildVersion; // MAC only?
|
2009-10-22 11:08:06 +02:00
|
|
|
bool m_isMacGdb;
|
2010-01-20 15:38:01 +01:00
|
|
|
bool m_hasPython;
|
2010-09-14 12:57:24 +02:00
|
|
|
bool m_hasInferiorThreadList;
|
2009-09-14 11:02:36 +02:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
private: ////////// Inferior Management //////////
|
2009-05-14 15:03:30 +02:00
|
|
|
|
2009-10-22 22:54:30 +02:00
|
|
|
// This should be always the last call in a function.
|
2010-11-10 16:33:11 +01:00
|
|
|
bool stateAcceptsBreakpointChanges() const;
|
|
|
|
bool acceptsBreakpoint(BreakpointId id) const;
|
|
|
|
void insertBreakpoint(BreakpointId id);
|
|
|
|
void removeBreakpoint(BreakpointId id);
|
|
|
|
void changeBreakpoint(BreakpointId id);
|
|
|
|
|
|
|
|
void executeStep();
|
|
|
|
void executeStepOut();
|
|
|
|
void executeNext();
|
|
|
|
void executeStepI();
|
|
|
|
void executeNextI();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
void continueInferiorInternal();
|
2011-02-11 15:00:13 +01:00
|
|
|
void doNotifyInferiorRunOk();
|
2009-10-15 12:32:49 +02:00
|
|
|
void autoContinueInferior();
|
2010-11-10 16:33:11 +01:00
|
|
|
void continueInferior();
|
|
|
|
void interruptInferior();
|
2009-11-02 16:59:57 +01:00
|
|
|
void interruptInferiorTemporarily();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2011-02-23 10:16:11 +01:00
|
|
|
void executeRunToLine(const ContextData &data);
|
2010-11-10 16:33:11 +01:00
|
|
|
void executeRunToFunction(const QString &functionName);
|
2011-02-23 10:16:11 +01:00
|
|
|
void executeJumpToLine(const ContextData &data);
|
2010-11-10 16:33:11 +01:00
|
|
|
void executeReturn();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-03-10 16:17:40 +01:00
|
|
|
void handleExecuteContinue(const GdbResponse &response);
|
|
|
|
void handleExecuteStep(const GdbResponse &response);
|
|
|
|
void handleExecuteNext(const GdbResponse &response);
|
|
|
|
void handleExecuteReturn(const GdbResponse &response);
|
2010-06-30 14:18:47 +02:00
|
|
|
void handleExecuteJumpToLine(const GdbResponse &response);
|
2010-06-30 14:39:41 +02:00
|
|
|
void handleExecuteRunToLine(const GdbResponse &response);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
void maybeHandleInferiorPidChanged(const QString &pid);
|
2009-11-09 22:11:56 +01:00
|
|
|
void handleInfoProc(const GdbResponse &response);
|
|
|
|
|
2010-05-05 17:00:54 +02:00
|
|
|
QByteArray m_entryPoint;
|
2009-10-30 17:16:56 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
private: ////////// View & Data Stuff //////////
|
|
|
|
|
2010-11-10 16:33:11 +01:00
|
|
|
void selectThread(int index);
|
|
|
|
void activateFrame(int index);
|
2009-10-15 12:32:49 +02:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
//
|
|
|
|
// Breakpoint specific stuff
|
|
|
|
//
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleBreakList(const GdbResponse &response);
|
2008-12-02 12:01:29 +01:00
|
|
|
void handleBreakList(const GdbMi &table);
|
2011-03-02 13:37:29 +01:00
|
|
|
void handleBreakListMultiple(const GdbResponse &response);
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleBreakIgnore(const GdbResponse &response);
|
2010-03-25 13:33:38 +01:00
|
|
|
void handleBreakDisable(const GdbResponse &response);
|
2010-11-15 16:22:51 +01:00
|
|
|
void handleBreakEnable(const GdbResponse &response);
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleBreakInsert1(const GdbResponse &response);
|
2010-03-04 15:42:09 +01:00
|
|
|
void handleBreakInsert2(const GdbResponse &response);
|
2010-12-16 17:58:43 +01:00
|
|
|
void handleTraceInsert2(const GdbResponse &response);
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleBreakCondition(const GdbResponse &response);
|
|
|
|
void handleBreakInfo(const GdbResponse &response);
|
2010-11-30 12:47:53 +01:00
|
|
|
void handleBreakThreadSpec(const GdbResponse &response);
|
2010-05-07 15:16:31 +02:00
|
|
|
void handleWatchInsert(const GdbResponse &response);
|
2011-03-04 19:26:11 +01:00
|
|
|
void handleCatchInsert(const GdbResponse &response);
|
2010-03-26 10:29:19 +01:00
|
|
|
void handleInfoLine(const GdbResponse &response);
|
2010-11-10 16:33:11 +01:00
|
|
|
void extractDataFromInfoBreak(const QString &output, BreakpointId);
|
2010-11-16 13:52:21 +01:00
|
|
|
void updateBreakpointDataFromOutput(BreakpointId id, const GdbMi &bkpt);
|
2011-03-04 18:08:56 +01:00
|
|
|
QByteArray breakpointLocation(BreakpointId id); // For gdb/MI.
|
|
|
|
QByteArray breakpointLocation2(BreakpointId id); // For gdb/CLI fallback.
|
2009-10-22 22:54:30 +02:00
|
|
|
QString breakLocation(const QString &file) const;
|
2009-12-09 11:13:20 +01:00
|
|
|
void reloadBreakListInternal();
|
2010-11-18 13:38:58 +01:00
|
|
|
void attemptAdjustBreakpointLocation(BreakpointId id);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
//
|
|
|
|
// Modules specific stuff
|
|
|
|
//
|
2010-11-10 16:33:11 +01:00
|
|
|
void loadSymbols(const QString &moduleName);
|
|
|
|
void loadAllSymbols();
|
2010-12-21 13:34:59 +01:00
|
|
|
void loadSymbolsForStack();
|
2010-11-10 16:33:11 +01:00
|
|
|
void requestModuleSymbols(const QString &moduleName);
|
|
|
|
void reloadModules();
|
|
|
|
void examineModules();
|
2009-10-28 22:08:58 +01:00
|
|
|
void reloadModulesInternal();
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleModulesList(const GdbResponse &response);
|
2010-11-26 09:58:34 +01:00
|
|
|
void handleShowModuleSymbols(const GdbResponse &response);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
bool m_modulesListOutdated;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-02-02 17:25:14 +01:00
|
|
|
//
|
|
|
|
// Snapshot specific stuff
|
|
|
|
//
|
2010-07-21 09:42:33 +02:00
|
|
|
virtual void createSnapshot();
|
2010-02-02 17:25:14 +01:00
|
|
|
void handleMakeSnapshot(const GdbResponse &response);
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
//
|
|
|
|
// Register specific stuff
|
2009-09-24 11:45:08 +02:00
|
|
|
//
|
2010-11-10 16:33:11 +01:00
|
|
|
Q_SLOT void reloadRegisters();
|
|
|
|
void setRegisterValue(int nr, const QString &value);
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleRegisterListNames(const GdbResponse &response);
|
|
|
|
void handleRegisterListValues(const GdbResponse &response);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
//
|
|
|
|
// Disassembler specific stuff
|
|
|
|
//
|
2011-02-10 13:43:02 +01:00
|
|
|
// Chain of fallbacks: PointMixed -> PointPlain -> RangeMixed -> RangePlain.
|
|
|
|
// The Mi versions are not used right now.
|
2010-12-14 12:29:32 +01:00
|
|
|
void fetchDisassembler(DisassemblerAgent *agent);
|
2011-02-10 13:43:02 +01:00
|
|
|
void fetchDisassemblerByCliPointMixed(const DisassemblerAgentCookie &ac);
|
|
|
|
void fetchDisassemblerByCliPointPlain(const DisassemblerAgentCookie &ac);
|
|
|
|
void fetchDisassemblerByCliRangeMixed(const DisassemblerAgentCookie &ac);
|
|
|
|
void fetchDisassemblerByCliRangePlain(const DisassemblerAgentCookie &ac);
|
|
|
|
//void fetchDisassemblerByMiPointMixed(const DisassemblerAgentCookie &ac);
|
|
|
|
//void fetchDisassemblerByMiPointPlain(const DisassemblerAgentCookie &ac);
|
|
|
|
//void fetchDisassemblerByMiRangeMixed(const DisassemblerAgentCookie &ac);
|
|
|
|
//void fetchDisassemblerByMiRangePlain(const DisassemblerAgentCookie &ac);
|
|
|
|
void handleFetchDisassemblerByCliPointMixed(const GdbResponse &response);
|
|
|
|
void handleFetchDisassemblerByCliPointPlain(const GdbResponse &response);
|
|
|
|
void handleFetchDisassemblerByCliRangeMixed(const GdbResponse &response);
|
|
|
|
void handleFetchDisassemblerByCliRangePlain(const GdbResponse &response);
|
|
|
|
//void handleFetchDisassemblerByMiPointMixed(const GdbResponse &response);
|
|
|
|
//void handleFetchDisassemblerByMiPointPlain(const GdbResponse &response);
|
|
|
|
//void handleFetchDisassemblerByMiRangeMixed(const GdbResponse &response);
|
|
|
|
//void handleFetchDisassemblerByMiRangePlain(const GdbResponse &response);
|
|
|
|
void handleDisassemblerCheck(const GdbResponse &response);
|
2011-03-21 15:04:31 +01:00
|
|
|
void handleBreakOnQFatal(const GdbResponse &response);
|
2011-02-10 13:43:02 +01:00
|
|
|
DisassemblerLines parseDisassembler(const GdbMi &data);
|
|
|
|
DisassemblerLines parseCliDisassembler(const GdbMi &lines);
|
|
|
|
DisassemblerLines parseMiDisassembler(const GdbMi &lines);
|
|
|
|
|
|
|
|
bool m_disassembleUsesComma;
|
2009-10-15 12:32:49 +02:00
|
|
|
|
2009-02-17 14:08:49 +01:00
|
|
|
//
|
|
|
|
// Source file specific stuff
|
2009-09-24 11:45:08 +02:00
|
|
|
//
|
2010-11-10 16:33:11 +01:00
|
|
|
void reloadSourceFiles();
|
2009-10-28 22:08:58 +01:00
|
|
|
void reloadSourceFilesInternal();
|
2009-10-15 12:32:49 +02:00
|
|
|
void handleQuerySources(const GdbResponse &response);
|
|
|
|
|
|
|
|
QString fullName(const QString &fileName);
|
2009-10-28 11:59:57 +01:00
|
|
|
QString cleanupFullName(const QString &fileName);
|
2009-10-15 12:32:49 +02:00
|
|
|
|
|
|
|
// awful hack to keep track of used files
|
|
|
|
QMap<QString, QString> m_shortToFullName;
|
|
|
|
QMap<QString, QString> m_fullToShortName;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-12-09 11:13:20 +01:00
|
|
|
void invalidateSourcesList();
|
2009-10-22 22:54:30 +02:00
|
|
|
bool m_sourcesListOutdated;
|
|
|
|
bool m_sourcesListUpdating;
|
2009-12-09 11:13:20 +01:00
|
|
|
bool m_breakListOutdated;
|
2009-10-22 22:54:30 +02:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
//
|
|
|
|
// Stack specific stuff
|
2009-09-24 11:45:08 +02:00
|
|
|
//
|
2009-10-15 12:32:49 +02:00
|
|
|
void updateAll();
|
2010-01-20 15:38:01 +01:00
|
|
|
void updateAllClassic();
|
|
|
|
void updateAllPython();
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleStackListFrames(const GdbResponse &response);
|
|
|
|
void handleStackSelectThread(const GdbResponse &response);
|
2010-03-10 17:39:08 +01:00
|
|
|
void handleStackSelectFrame(const GdbResponse &response);
|
2010-05-17 17:38:31 +02:00
|
|
|
void handleThreadListIds(const GdbResponse &response);
|
|
|
|
void handleThreadInfo(const GdbResponse &response);
|
2010-09-13 12:37:30 +02:00
|
|
|
void handleThreadNames(const GdbResponse &response);
|
2009-10-05 12:00:47 +02:00
|
|
|
Q_SLOT void reloadStack(bool forceGotoLocation);
|
2009-10-28 21:33:41 +01:00
|
|
|
Q_SLOT virtual void reloadFullStack();
|
2009-10-15 12:32:49 +02:00
|
|
|
int currentFrame() const;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
QList<GdbMi> m_currentFunctionArgs;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
//
|
2009-10-15 12:32:49 +02:00
|
|
|
// Watch specific stuff
|
2009-09-24 11:45:08 +02:00
|
|
|
//
|
2011-02-17 10:08:57 +01:00
|
|
|
virtual bool setToolTipExpression(const QPoint &mousePos,
|
2011-02-11 15:00:13 +01:00
|
|
|
TextEditor::ITextEditor *editor, const DebuggerToolTipContext &);
|
2010-11-18 13:38:58 +01:00
|
|
|
virtual void assignValueInDebugger(const WatchData *data,
|
|
|
|
const QString &expr, const QVariant &value);
|
2009-10-15 12:32:49 +02:00
|
|
|
|
2010-12-14 12:29:32 +01:00
|
|
|
virtual void fetchMemory(MemoryAgent *agent, QObject *token,
|
2010-02-17 17:33:42 +01:00
|
|
|
quint64 addr, quint64 length);
|
2011-02-25 13:21:54 +01:00
|
|
|
void handleChangeMemory(const GdbResponse &response);
|
|
|
|
virtual void changeMemory(MemoryAgent *agent, QObject *token,
|
|
|
|
quint64 addr, const QByteArray &data);
|
2009-10-15 12:32:49 +02:00
|
|
|
void handleFetchMemory(const GdbResponse &response);
|
|
|
|
|
|
|
|
virtual void watchPoint(const QPoint &);
|
|
|
|
void handleWatchPoint(const GdbResponse &response);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
// FIXME: BaseClass. called to improve situation for a watch item
|
2010-01-20 15:38:01 +01:00
|
|
|
void updateSubItemClassic(const WatchData &data);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-09-13 08:32:12 +02:00
|
|
|
void virtual updateWatchData(const WatchData &data, const WatchUpdateFlags &flags);
|
2009-08-31 09:14:04 +02:00
|
|
|
Q_SLOT void updateWatchDataHelper(const WatchData &data);
|
2010-03-02 18:02:30 +01:00
|
|
|
void rebuildWatchModel();
|
2009-10-15 12:32:49 +02:00
|
|
|
bool showToolTip();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
void insertData(const WatchData &data);
|
|
|
|
void sendWatchParameters(const QByteArray ¶ms0);
|
2010-01-20 15:38:01 +01:00
|
|
|
void createGdbVariableClassic(const WatchData &data);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-01-20 15:38:01 +01:00
|
|
|
void runDebuggingHelperClassic(const WatchData &data, bool dumpChildren);
|
|
|
|
void runDirectDebuggingHelperClassic(const WatchData &data, bool dumpChildren);
|
2010-09-01 17:36:09 +02:00
|
|
|
bool hasDebuggingHelperForType(const QByteArray &type) const;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-01-21 16:08:59 +01:00
|
|
|
void handleVarListChildrenClassic(const GdbResponse &response);
|
|
|
|
void handleVarListChildrenHelperClassic(const GdbMi &child,
|
2011-02-08 18:27:40 +01:00
|
|
|
const WatchData &parent, int sortId);
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleVarCreate(const GdbResponse &response);
|
|
|
|
void handleVarAssign(const GdbResponse &response);
|
2010-01-21 16:08:59 +01:00
|
|
|
void handleEvaluateExpressionClassic(const GdbResponse &response);
|
2010-01-20 15:38:01 +01:00
|
|
|
void handleQueryDebuggingHelperClassic(const GdbResponse &response);
|
|
|
|
void handleDebuggingHelperValue2Classic(const GdbResponse &response);
|
|
|
|
void handleDebuggingHelperValue3Classic(const GdbResponse &response);
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleDebuggingHelperEditValue(const GdbResponse &response);
|
|
|
|
void handleDebuggingHelperSetup(const GdbResponse &response);
|
2010-05-20 16:34:08 +02:00
|
|
|
void handleDebuggingHelperVersionCheckClassic(const GdbResponse &response);
|
2010-07-12 15:39:22 +02:00
|
|
|
void handleDetach(const GdbResponse &response);
|
2009-10-15 12:32:49 +02:00
|
|
|
|
2010-03-29 18:44:02 +02:00
|
|
|
Q_SLOT void createFullBacktrace();
|
|
|
|
void handleCreateFullBacktrace(const GdbResponse &response);
|
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
void updateLocals(const QVariant &cookie = QVariant());
|
2010-01-20 15:38:01 +01:00
|
|
|
void updateLocalsClassic(const QVariant &cookie);
|
2010-09-13 08:32:12 +02:00
|
|
|
void updateLocalsPython(bool tryPartial, const QByteArray &varList);
|
2010-01-20 15:38:01 +01:00
|
|
|
void handleStackFramePython(const GdbResponse &response);
|
2010-01-29 22:49:55 +01:00
|
|
|
|
2010-01-20 15:38:01 +01:00
|
|
|
void handleStackListLocalsClassic(const GdbResponse &response);
|
|
|
|
void handleStackListLocalsPython(const GdbResponse &response);
|
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
WatchData localVariable(const GdbMi &item,
|
|
|
|
const QStringList &uninitializedVariables,
|
|
|
|
QMap<QByteArray, int> *seen);
|
|
|
|
void setLocals(const QList<GdbMi> &locals);
|
2010-01-20 15:38:01 +01:00
|
|
|
void handleStackListArgumentsClassic(const GdbResponse &response);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-01-05 16:51:55 +01:00
|
|
|
QSet<QByteArray> m_processedNames;
|
2011-04-12 15:56:03 +02:00
|
|
|
struct TypeInfo
|
|
|
|
{
|
|
|
|
TypeInfo(uint s = 0) : size(s) {}
|
|
|
|
|
|
|
|
uint size;
|
|
|
|
};
|
|
|
|
|
|
|
|
QHash<QByteArray, TypeInfo> m_typeInfoCache;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-06-16 11:08:54 +02:00
|
|
|
//
|
|
|
|
// Dumper Management
|
|
|
|
//
|
2010-09-23 14:58:45 +02:00
|
|
|
bool checkDebuggingHelpersClassic();
|
2010-01-20 15:38:01 +01:00
|
|
|
void setDebuggingHelperStateClassic(DebuggingHelperState);
|
|
|
|
void tryLoadDebuggingHelpersClassic();
|
|
|
|
void tryQueryDebuggingHelpersClassic();
|
2009-10-15 12:32:49 +02:00
|
|
|
Q_SLOT void setUseDebuggingHelpers(const QVariant &on);
|
2009-09-22 10:50:44 +02:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
DebuggingHelperState m_debuggingHelperState;
|
2011-04-08 15:24:23 +02:00
|
|
|
DumperHelper m_dumperHelper;
|
2010-04-08 16:55:25 +02:00
|
|
|
QString m_gdb;
|
2009-10-05 14:59:39 +02:00
|
|
|
|
2010-12-16 12:05:48 +01:00
|
|
|
//
|
2010-06-16 11:08:54 +02:00
|
|
|
// Convenience Functions
|
|
|
|
//
|
2009-10-07 17:37:15 +02:00
|
|
|
QString errorMessage(QProcess::ProcessError error);
|
2010-05-05 12:49:08 +02:00
|
|
|
AbstractGdbProcess *gdbProc() const;
|
2010-07-09 17:07:59 +02:00
|
|
|
void showExecutionError(const QString &message);
|
2010-01-14 15:25:53 +01:00
|
|
|
|
2010-07-07 16:30:42 +02:00
|
|
|
static QByteArray tooltipIName(const QString &exp);
|
2011-02-11 15:00:13 +01:00
|
|
|
QString tooltipExpression() const;
|
|
|
|
void clearToolTip();
|
|
|
|
QScopedPointer<GdbToolTipContext> m_toolTipContext;
|
|
|
|
|
2010-06-30 14:39:41 +02:00
|
|
|
|
2010-12-17 13:07:17 +01:00
|
|
|
// For short-circuiting stack and thread list evaluation.
|
|
|
|
bool m_stackNeeded;
|
|
|
|
int m_currentThreadId;
|
|
|
|
|
2011-01-19 10:48:39 +01:00
|
|
|
//
|
|
|
|
// Qml
|
|
|
|
//
|
|
|
|
QHash<int, int> m_qmlBreakpointNumbers;
|
|
|
|
bool m_preparedForQmlBreak;
|
2011-01-19 14:34:25 +01:00
|
|
|
bool setupQmlStep(bool on);
|
|
|
|
void handleSetQmlStepBreakpoint(const GdbResponse &response);
|
2011-01-24 13:37:07 +01:00
|
|
|
bool isQmlStepBreakpoint1(int bpnr) const;
|
|
|
|
bool isQmlStepBreakpoint2(int bpnr) const;
|
2011-03-21 15:04:31 +01:00
|
|
|
bool isQFatalBreakpoint(int bpnr) const;
|
2011-01-19 10:48:39 +01:00
|
|
|
|
2010-06-30 14:39:41 +02:00
|
|
|
// HACK:
|
2010-12-20 16:28:26 +01:00
|
|
|
QByteArray m_currentThread;
|
2011-01-21 16:42:57 +01:00
|
|
|
QString m_lastWinException;
|
2011-03-21 15:04:31 +01:00
|
|
|
int m_qFatalBreakpointNumber;
|
2008-12-02 12:01:29 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace Internal
|
|
|
|
} // namespace Debugger
|
|
|
|
|
2009-05-04 18:30:22 +02:00
|
|
|
Q_DECLARE_OPERATORS_FOR_FLAGS(Debugger::Internal::GdbEngine::GdbCommandFlags)
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#endif // DEBUGGER_GDBENGINE_H
|