2009-02-25 09:15:00 +01:00
|
|
|
/**************************************************************************
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
|
|
|
** This file is part of Qt Creator
|
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2009-06-17 00:01:27 +10:00
|
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Commercial Usage
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Licensees holding valid Qt Commercial licenses may use this file in
|
|
|
|
** accordance with the Qt Commercial License Agreement provided with the
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
** a written agreement between you and Nokia.
|
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
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Alternatively, 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
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** If you are unsure which license is appropriate for your use, please
|
2009-08-14 09:30:56 +02:00
|
|
|
** contact the sales department at http://qt.nokia.com/contact.
|
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
|
|
|
|
|
2008-12-09 12:27:55 +01:00
|
|
|
#include "idebuggerengine.h"
|
2009-09-10 13:09:42 +02:00
|
|
|
#include "debuggermanager.h" // only for StartParameters
|
2008-12-09 12:27:55 +01:00
|
|
|
#include "gdbmi.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>
|
|
|
|
#include <QtCore/QHash>
|
|
|
|
#include <QtCore/QMap>
|
|
|
|
#include <QtCore/QObject>
|
|
|
|
#include <QtCore/QProcess>
|
|
|
|
#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>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <QtCore/QVariant>
|
|
|
|
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
|
|
class QAbstractItemModel;
|
2009-12-11 16:59:34 +01:00
|
|
|
class QAction;
|
|
|
|
class QMainWindow;
|
|
|
|
class QMessageBox;
|
2009-11-03 14:56:27 +01:00
|
|
|
class QTimer;
|
2008-12-02 12:01:29 +01:00
|
|
|
class QWidget;
|
|
|
|
QT_END_NAMESPACE
|
|
|
|
|
|
|
|
namespace Debugger {
|
2009-09-25 16:01:28 +02:00
|
|
|
class DebuggerManager;
|
2008-12-02 12:01:29 +01:00
|
|
|
namespace Internal {
|
|
|
|
|
2009-09-21 11:09:38 +02:00
|
|
|
class AbstractGdbAdapter;
|
2009-09-24 11:16:00 +02:00
|
|
|
class GdbResponse;
|
2008-12-02 12:01:29 +01:00
|
|
|
class GdbMi;
|
|
|
|
|
|
|
|
class BreakpointData;
|
2009-09-23 15:28:50 +02:00
|
|
|
class WatchData;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-09-23 15:28:50 +02:00
|
|
|
class AttachGdbAdapter;
|
|
|
|
class CoreGdbAdapter;
|
2009-09-23 09:54:21 +02:00
|
|
|
class PlainGdbAdapter;
|
|
|
|
class RemoteGdbAdapter;
|
2009-09-23 15:28:50 +02:00
|
|
|
class TrkGdbAdapter;
|
2009-10-05 14:59:39 +02:00
|
|
|
struct TrkOptions;
|
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,
|
|
|
|
DebuggingHelperUnavailable,
|
2008-12-02 12:01:29 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
class GdbEngine : public IDebuggerEngine
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
2009-09-25 08:35:31 +02:00
|
|
|
explicit GdbEngine(DebuggerManager *manager);
|
2008-12-02 12:01:29 +01:00
|
|
|
~GdbEngine();
|
|
|
|
|
|
|
|
private:
|
2009-10-07 17:36:44 +02:00
|
|
|
friend class AbstractGdbAdapter;
|
2009-09-23 15:28:50 +02:00
|
|
|
friend class AttachGdbAdapter;
|
|
|
|
friend class CoreGdbAdapter;
|
2009-09-11 15:53:08 +02:00
|
|
|
friend class PlainGdbAdapter;
|
2009-10-07 10:25:26 +02:00
|
|
|
friend class TermGdbAdapter;
|
2009-09-22 10:50:44 +02:00
|
|
|
friend class RemoteGdbAdapter;
|
2009-09-23 15:28:50 +02:00
|
|
|
friend class TrkGdbAdapter;
|
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
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
virtual void addOptionPages(QList<Core::IOptionsPage*> *opts) const;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
virtual bool checkConfiguration(int toolChain, QString *errorMessage, QString *settingsPage= 0) const;
|
|
|
|
virtual void startDebugger(const DebuggerStartParametersPtr &sp);
|
2010-02-05 10:23:55 +01:00
|
|
|
virtual unsigned debuggerCapabilities() const;
|
2009-10-15 12:32:49 +02:00
|
|
|
virtual void exitDebugger();
|
|
|
|
virtual void detachDebugger();
|
|
|
|
virtual void shutdown();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
virtual void executeDebuggerCommand(const QString &command);
|
2009-11-25 08:35:02 +01:00
|
|
|
virtual QString qtNamespace() const { return m_dumperHelper.qtNamespace(); }
|
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
|
|
|
void initializeVariables();
|
|
|
|
DebuggerStartMode startMode() const;
|
|
|
|
const DebuggerStartParameters &startParameters() const
|
|
|
|
{ return *m_startParameters; }
|
|
|
|
Q_SLOT void setAutoDerefPointers(const QVariant &on);
|
2009-08-12 10:51:25 +02:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
DebuggerStartParametersPtr m_startParameters;
|
|
|
|
QSharedPointer<TrkOptions> m_trkOptions;
|
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
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
AbstractGdbAdapter *createAdapter(const DebuggerStartParametersPtr &dp);
|
|
|
|
void connectAdapter();
|
2009-10-26 11:55:02 +01:00
|
|
|
bool startGdb(const QStringList &args = QStringList(),
|
|
|
|
const QString &gdb = QString(),
|
|
|
|
const QString &settingsIdHint = QString());
|
2009-10-19 19:04:01 +02:00
|
|
|
void startInferiorPhase2();
|
2009-10-08 17:23:27 +02:00
|
|
|
|
2009-10-20 11:02:16 +02:00
|
|
|
void handleInferiorShutdown(const GdbResponse &response);
|
|
|
|
void handleGdbExit(const GdbResponse &response);
|
|
|
|
|
2010-02-08 15:15:08 +01:00
|
|
|
void showDebuggerInput(int channel, const QString &msg)
|
|
|
|
{ m_manager->showDebuggerInput(channel, msg); }
|
|
|
|
void showDebuggerOutput(int channel, const QString &msg)
|
|
|
|
{ m_manager->showDebuggerOutput(channel, msg); }
|
2009-04-20 16:40:50 +02:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
private slots:
|
2009-10-20 11:02:16 +02:00
|
|
|
void handleGdbFinished(int, QProcess::ExitStatus status);
|
|
|
|
void handleGdbError(QProcess::ProcessError error);
|
2009-10-15 12:32:49 +02:00
|
|
|
void readGdbStandardOutput();
|
|
|
|
void readGdbStandardError();
|
|
|
|
void readDebugeeOutput(const QByteArray &data);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
void handleAdapterStarted();
|
|
|
|
void handleAdapterStartFailed(const QString &msg, const QString &settingsIdHint = QString());
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-19 19:04:01 +02:00
|
|
|
void handleInferiorPrepared();
|
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
void handleInferiorStartFailed(const QString &msg);
|
|
|
|
|
|
|
|
void handleAdapterCrashed(const QString &msg);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
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-20 11:02:16 +02:00
|
|
|
QProcess m_gdbProc;
|
2009-10-15 12:32:49 +02:00
|
|
|
AbstractGdbAdapter *m_gdbAdapter;
|
|
|
|
|
|
|
|
private: ////////// Gdb Command Management //////////
|
|
|
|
|
|
|
|
public: // otherwise the Qt flag macros are unhappy
|
2009-05-04 18:30:22 +02:00
|
|
|
enum GdbCommandFlag {
|
|
|
|
NoFlags = 0,
|
2009-10-12 12:05:35 +02:00
|
|
|
NeedsStop = 1, // The command needs a stopped inferior
|
|
|
|
Discardable = 2, // No need to wait for the reply before continuing inferior
|
2010-03-02 18:02:30 +01:00
|
|
|
RebuildWatchModel = 4, // Trigger model rebuild when no such commands are pending any more
|
|
|
|
WatchUpdate = Discardable | RebuildWatchModel,
|
2009-12-11 16:59:34 +01:00
|
|
|
NonCriticalResponse = 8, // We can live without recieving an answer
|
2009-11-02 16:59:57 +01:00
|
|
|
RunRequest = 16, // Callback expects GdbResultRunning instead of GdbResultDone
|
|
|
|
ExitRequest = 32, // Callback expects GdbResultExit instead of GdbResultDone
|
|
|
|
LosesChild = 64 // Auto-set inferior shutdown related states
|
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
|
|
|
};
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
// type and cookie are sender-internal data, opaque for the "event
|
|
|
|
// 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;
|
2009-11-03 14:56:27 +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
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
// contains the first token number for the current round
|
|
|
|
// 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
|
2009-09-21 11:09:38 +02:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
typedef void (GdbEngine::*CommandsDoneCallback)();
|
|
|
|
// function called after all previous responses have been received
|
|
|
|
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);
|
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);
|
2009-10-15 12:32:49 +02:00
|
|
|
StackFrame parseStackFrame(const GdbMi &mi, int level);
|
|
|
|
|
2010-01-20 17:35:21 +01:00
|
|
|
bool isSynchroneous() 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;
|
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.
|
2009-10-15 12:32:49 +02:00
|
|
|
Q_SLOT virtual void attemptBreakpointSynchronization();
|
2009-01-15 14:47:14 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
virtual void stepExec();
|
|
|
|
virtual void stepOutExec();
|
|
|
|
virtual void nextExec();
|
|
|
|
virtual void stepIExec();
|
|
|
|
virtual void nextIExec();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
void continueInferiorInternal();
|
|
|
|
void autoContinueInferior();
|
|
|
|
virtual void continueInferior();
|
|
|
|
virtual void interruptInferior();
|
2009-11-02 16:59:57 +01:00
|
|
|
void interruptInferiorTemporarily();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
virtual void runToLineExec(const QString &fileName, int lineNumber);
|
|
|
|
virtual void runToFunctionExec(const QString &functionName);
|
|
|
|
// void handleExecRunToFunction(const GdbResponse &response);
|
|
|
|
virtual void jumpToLineExec(const QString &fileName, int lineNumber);
|
2010-02-15 16:02:41 +01:00
|
|
|
virtual void returnExec();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
void handleExecContinue(const GdbResponse &response);
|
2010-02-01 16:14:57 +01:00
|
|
|
void handleExecStep(const GdbResponse &response);
|
|
|
|
void handleExecNext(const GdbResponse &response);
|
2010-02-15 16:02:41 +01:00
|
|
|
void handleExecReturn(const GdbResponse &response);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
qint64 inferiorPid() const { return m_manager->inferiorPid(); }
|
|
|
|
void handleInferiorPidChanged(qint64 pid) { manager()->notifyInferiorPidChanged(pid); }
|
|
|
|
void maybeHandleInferiorPidChanged(const QString &pid);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-30 17:16:56 +01:00
|
|
|
#ifdef Q_OS_LINUX
|
2009-11-09 22:11:56 +01:00
|
|
|
void handleInfoProc(const GdbResponse &response);
|
|
|
|
|
2009-10-30 17:16:56 +01:00
|
|
|
QByteArray m_entryPoint;
|
|
|
|
#endif
|
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
private: ////////// View & Data Stuff //////////
|
|
|
|
|
|
|
|
virtual void selectThread(int index);
|
|
|
|
virtual void activateFrame(int index);
|
|
|
|
|
|
|
|
void gotoLocation(const StackFrame &frame, bool setLocationMarker);
|
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);
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleBreakIgnore(const GdbResponse &response);
|
|
|
|
void handleBreakInsert(const GdbResponse &response);
|
|
|
|
void handleBreakInsert1(const GdbResponse &response);
|
|
|
|
void handleBreakCondition(const GdbResponse &response);
|
|
|
|
void handleBreakInfo(const GdbResponse &response);
|
2008-12-02 12:01:29 +01:00
|
|
|
void extractDataFromInfoBreak(const QString &output, BreakpointData *data);
|
|
|
|
void breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt);
|
|
|
|
void sendInsertBreakpoint(int index);
|
2009-10-22 22:54:30 +02:00
|
|
|
QString breakLocation(const QString &file) const;
|
2009-12-09 11:13:20 +01:00
|
|
|
void reloadBreakListInternal();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
//
|
|
|
|
// Modules specific stuff
|
|
|
|
//
|
2009-10-15 12:32:49 +02:00
|
|
|
virtual void loadSymbols(const QString &moduleName);
|
|
|
|
virtual void loadAllSymbols();
|
|
|
|
virtual QList<Symbol> moduleSymbols(const QString &moduleName);
|
2009-10-28 21:33:41 +01:00
|
|
|
virtual void reloadModules();
|
2009-10-28 22:08:58 +01:00
|
|
|
void reloadModulesInternal();
|
2009-09-24 11:16:00 +02:00
|
|
|
void handleModulesList(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
|
|
|
|
//
|
|
|
|
virtual void makeSnapshot();
|
|
|
|
void handleMakeSnapshot(const GdbResponse &response);
|
|
|
|
void handleActivateSnapshot(const GdbResponse &response);
|
|
|
|
void activateSnapshot(int index);
|
|
|
|
void activateSnapshot2();
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
//
|
|
|
|
// Register specific stuff
|
2009-09-24 11:45:08 +02:00
|
|
|
//
|
2009-10-28 21:33:41 +01:00
|
|
|
Q_SLOT virtual void reloadRegisters();
|
|
|
|
virtual 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
|
|
|
|
//
|
2010-02-01 16:14:57 +01:00
|
|
|
virtual void fetchDisassembler(DisassemblerViewAgent *agent);
|
2009-10-15 12:32:49 +02:00
|
|
|
void fetchDisassemblerByAddress(DisassemblerViewAgent *agent,
|
|
|
|
bool useMixedMode);
|
2010-02-09 15:02:55 +01:00
|
|
|
void fetchDisassemblerByCli(DisassemblerViewAgent *agent,
|
|
|
|
bool useMixedMode);
|
|
|
|
void fetchDisassemblerByAddressCli(DisassemblerViewAgent *agent);
|
|
|
|
void handleFetchDisassemblerByCli(const GdbResponse &response);
|
2009-10-15 12:32:49 +02:00
|
|
|
void handleFetchDisassemblerByLine(const GdbResponse &response);
|
|
|
|
void handleFetchDisassemblerByAddress1(const GdbResponse &response);
|
|
|
|
void handleFetchDisassemblerByAddress0(const GdbResponse &response);
|
|
|
|
QString parseDisassembler(const GdbMi &lines);
|
|
|
|
|
2009-02-17 14:08:49 +01:00
|
|
|
//
|
|
|
|
// Source file specific stuff
|
2009-09-24 11:45:08 +02:00
|
|
|
//
|
2009-10-28 21:33:41 +01:00
|
|
|
virtual 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
|
|
|
#ifdef Q_OS_WIN
|
|
|
|
QString cleanupFullName(const QString &fileName);
|
|
|
|
#else
|
|
|
|
QString cleanupFullName(const QString &fileName) { return fileName; }
|
|
|
|
#endif
|
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;
|
|
|
|
bool m_breakListUpdating;
|
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);
|
|
|
|
void handleStackListThreads(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;
|
|
|
|
QString m_currentFrame;
|
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
|
|
|
//
|
2010-02-11 13:21:38 +01:00
|
|
|
virtual void setToolTipExpression(const QPoint &mousePos,
|
|
|
|
TextEditor::ITextEditor *editor, int cursorPos);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
virtual void assignValueInDebugger(const QString &expr, const QString &value);
|
|
|
|
|
2010-02-17 17:33:42 +01:00
|
|
|
virtual void fetchMemory(MemoryViewAgent *agent, QObject *token,
|
|
|
|
quint64 addr, quint64 length);
|
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);
|
2009-10-15 12:32:49 +02:00
|
|
|
void handleChildren(const WatchData &parent, const GdbMi &child,
|
|
|
|
QList<WatchData> *insertions);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-10-28 21:33:41 +01:00
|
|
|
void virtual updateWatchData(const WatchData &data);
|
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);
|
2009-04-07 16:39:17 +02:00
|
|
|
bool hasDebuggingHelperForType(const QString &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,
|
2009-10-15 12:32:49 +02:00
|
|
|
const WatchData &parent);
|
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);
|
2009-09-24 11:16:00 +02:00
|
|
|
//void handleToolTip(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);
|
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);
|
|
|
|
void updateLocalsPython(const QByteArray &varList);
|
|
|
|
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
|
|
|
void setWatchDataType(WatchData &data, const GdbMi &mi);
|
2009-08-25 17:32:14 +02:00
|
|
|
void setWatchDataDisplayedType(WatchData &data, const GdbMi &mi);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2010-01-05 16:51:55 +01:00
|
|
|
QSet<QByteArray> m_processedNames;
|
2008-12-02 12:01:29 +01:00
|
|
|
QMap<QString, QString> m_varToType;
|
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
private: ////////// Dumper Management //////////
|
2009-11-03 14:06:21 +01:00
|
|
|
QString qtDumperLibraryName() const;
|
|
|
|
bool checkDebuggingHelpers();
|
2010-01-20 15:38:01 +01:00
|
|
|
bool checkDebuggingHelpersClassic();
|
|
|
|
void setDebuggingHelperStateClassic(DebuggingHelperState);
|
|
|
|
void tryLoadDebuggingHelpersClassic();
|
|
|
|
void tryQueryDebuggingHelpersClassic();
|
|
|
|
Q_SLOT void recheckDebuggingHelperAvailabilityClassic();
|
2009-10-15 12:32:49 +02:00
|
|
|
void connectDebuggingHelperActions();
|
|
|
|
void disconnectDebuggingHelperActions();
|
2010-01-20 15:38:01 +01:00
|
|
|
Q_SLOT void setDebugDebuggingHelpersClassic(const QVariant &on);
|
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;
|
|
|
|
QtDumperHelper m_dumperHelper;
|
2009-10-05 14:59:39 +02:00
|
|
|
|
2009-10-15 12:32:49 +02:00
|
|
|
private: ////////// Convenience Functions //////////
|
2009-09-24 11:45:08 +02:00
|
|
|
|
2009-10-07 17:37:15 +02:00
|
|
|
QString errorMessage(QProcess::ProcessError error);
|
2009-12-11 16:59:34 +01:00
|
|
|
QMessageBox *showMessageBox(int icon, const QString &title, const QString &text,
|
|
|
|
int buttons = 0);
|
2009-09-22 10:50:44 +02:00
|
|
|
void debugMessage(const QString &msg);
|
2009-10-15 12:32:49 +02:00
|
|
|
QMainWindow *mainWindow() const;
|
2010-01-14 15:25:53 +01:00
|
|
|
|
2010-01-20 15:38:01 +01:00
|
|
|
static QString m_toolTipExpression;
|
|
|
|
static QPoint m_toolTipPos;
|
|
|
|
static QByteArray tooltipINameForExpression(const QByteArray &exp);
|
2010-01-21 16:08:59 +01:00
|
|
|
|
|
|
|
static void setWatchDataValue(WatchData &data, const GdbMi &mi,
|
|
|
|
int encoding = 0);
|
|
|
|
static void setWatchDataEditValue(WatchData &data, const GdbMi &mi);
|
|
|
|
static void setWatchDataValueToolTip(WatchData &data, const GdbMi &mi,
|
|
|
|
int encoding = 0);
|
|
|
|
static void setWatchDataChildCount(WatchData &data, const GdbMi &mi);
|
|
|
|
static void setWatchDataValueEnabled(WatchData &data, const GdbMi &mi);
|
|
|
|
static void setWatchDataValueEditable(WatchData &data, const GdbMi &mi);
|
|
|
|
static void setWatchDataExpression(WatchData &data, const GdbMi &mi);
|
|
|
|
static void setWatchDataAddress(WatchData &data, const GdbMi &mi);
|
2010-02-11 14:36:01 +01:00
|
|
|
static void setWatchDataAddressHelper(WatchData &data, const QByteArray &addr);
|
2010-01-21 16:08:59 +01:00
|
|
|
static void setWatchDataSAddress(WatchData &data, const GdbMi &mi);
|
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
|