1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ** In addition, as a special exception, Nokia gives you certain additional
26 ** rights. These rights are described in the Nokia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
32 **************************************************************************/
34 #ifndef DEBUGGER_CDBENGINE_H
35 #define DEBUGGER_CDBENGINE_H
37 #include "debuggerengine.h"
38 #include "breakpoint.h"
40 #include <QtCore/QSharedPointer>
41 #include <QtCore/QProcess>
42 #include <QtCore/QVariantList>
43 #include <QtCore/QMap>
44 #include <QtCore/QTime>
45 #include <QtCore/QPair>
46 #include <QtCore/QList>
54 class DisassemblerAgent;
55 struct CdbBuiltinCommand;
56 struct CdbExtensionCommand;
58 class ByteArrayInputStream;
61 class CdbEngine : public Debugger::DebuggerEngine
66 typedef QSharedPointer<CdbOptions> OptionsPtr;
68 enum CommandFlags { QuietCommand = 0x1 };
69 // Flag bits for a sequence of commands
70 enum CommandSequenceFlags {
71 CommandListStack = 0x1,
72 CommandListThreads = 0x2,
73 CommandListRegisters = 0x4,
74 CommandListModules = 0x8,
75 CommandListBreakPoints = 0x10
78 typedef QSharedPointer<CdbBuiltinCommand> CdbBuiltinCommandPtr;
79 typedef QSharedPointer<CdbExtensionCommand> CdbExtensionCommandPtr;
80 typedef void (CdbEngine::*BuiltinCommandHandler)(const CdbBuiltinCommandPtr &);
81 typedef void (CdbEngine::*ExtensionCommandHandler)(const CdbExtensionCommandPtr &);
83 explicit CdbEngine(const DebuggerStartParameters &sp,
84 DebuggerEngine *masterEngine,
85 const OptionsPtr &options);
88 // Factory function that returns 0 if the debug engine library cannot be found.
90 virtual bool setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor,
91 const DebuggerToolTipContext &ctx);
92 virtual void setupEngine();
93 virtual void setupInferior();
94 virtual void runEngine();
95 virtual void shutdownInferior();
96 virtual void shutdownEngine();
97 virtual void detachDebugger();
98 virtual void updateWatchData(const WatchData &data,
99 const WatchUpdateFlags & flags = WatchUpdateFlags());
100 virtual unsigned debuggerCapabilities() const;
101 virtual void watchPoint(const QPoint &);
102 virtual void setRegisterValue(int regnr, const QString &value);
104 virtual void executeStep();
105 virtual void executeStepOut();
106 virtual void executeNext();
107 virtual void executeStepI();
108 virtual void executeNextI();
110 virtual void continueInferior();
111 virtual void interruptInferior();
113 virtual void executeRunToLine(const ContextData &data);
114 virtual void executeRunToFunction(const QString &functionName);
115 virtual void executeJumpToLine(const ContextData &data);
116 virtual void assignValueInDebugger(const WatchData *w, const QString &expr, const QVariant &value);
117 virtual void executeDebuggerCommand(const QString &command);
119 virtual void activateFrame(int index);
120 virtual void selectThread(int index);
122 virtual bool stateAcceptsBreakpointChanges() const;
123 virtual bool acceptsBreakpoint(BreakpointId id) const;
124 virtual void attemptBreakpointSynchronization();
126 virtual void fetchDisassembler(DisassemblerAgent *agent);
127 virtual void fetchMemory(MemoryAgent *, QObject *, quint64 addr, quint64 length);
128 virtual void changeMemory(Internal::MemoryAgent *, QObject *, quint64 addr, const QByteArray &data);
130 virtual void reloadModules();
131 virtual void loadSymbols(const QString &moduleName);
132 virtual void loadAllSymbols();
133 virtual void requestModuleSymbols(const QString &moduleName);
135 virtual void reloadRegisters();
136 virtual void reloadSourceFiles();
137 virtual void reloadFullStack();
139 static QString extensionLibraryName(bool is64Bit);
142 void readyReadStandardOut();
143 void readyReadStandardError();
145 void processFinished();
146 void postCommand(const QByteArray &cmd, unsigned flags);
147 void postBuiltinCommand(const QByteArray &cmd,
149 BuiltinCommandHandler handler,
150 unsigned nextCommandFlag = 0,
151 const QVariant &cookie = QVariant());
153 void postExtensionCommand(const QByteArray &cmd,
154 const QByteArray &arguments,
156 ExtensionCommandHandler handler,
157 unsigned nextCommandFlag = 0,
158 const QVariant &cookie = QVariant());
160 void postCommandSequence(unsigned mask);
161 void operateByInstructionTriggered(bool);
163 void consoleStubMessage(const QString &, bool);
164 void consoleStubProcessStarted();
165 void consoleStubExited();
168 typedef QHash<BreakpointId, BreakpointResponse> PendingBreakPointMap;
169 typedef QPair<QString, QString> SourcePathMapping;
170 struct NormalizedSourceFileName // Struct for caching mapped/normalized source files.
172 NormalizedSourceFileName(const QString &fn = QString(), bool e = false) : fileName(fn), exists(e) {}
181 SpecialStopSynchronizeBreakpoints,
182 SpecialStopGetWidgetAt,
183 CustomSpecialStop // Associated with m_specialStopData, handleCustomSpecialStop()
185 enum ParseStackResultFlags // Flags returned by parseStackTrace
187 ParseStackStepInto = 1 // Need to execute a step, hit on a call frame in "Step into"
191 bool startConsole(const DebuggerStartParameters &sp, QString *errorMessage);
193 unsigned examineStopReason(const GdbMi &stopReason, QString *message,
194 QString *exceptionBoxMessage);
195 bool commandsPending() const;
196 void handleExtensionMessage(char t, int token, const QByteArray &what, const QByteArray &message);
197 bool doSetupEngine(QString *errorMessage);
198 bool launchCDB(const DebuggerStartParameters &sp, QString *errorMessage);
199 void handleSessionAccessible(unsigned long cdbExState);
200 void handleSessionInaccessible(unsigned long cdbExState);
201 void handleSessionIdle(const QByteArray &message);
202 void doInterruptInferior(SpecialStopMode sm);
203 void doInterruptInferiorCustomSpecialStop(const QVariant &v);
204 void doContinueInferior();
205 inline void parseOutputLine(QByteArray line);
206 inline bool isCdbProcessRunning() const { return m_process.state() != QProcess::NotRunning; }
207 bool canInterruptInferior() const;
208 void syncOperateByInstruction(bool operateByInstruction);
209 void postWidgetAtCommand();
210 void handleCustomSpecialStop(const QVariant &v);
213 void dummyHandler(const CdbBuiltinCommandPtr &);
214 void handleStackTrace(const CdbExtensionCommandPtr &);
215 void handleRegisters(const CdbBuiltinCommandPtr &);
216 void handleDisassembler(const CdbBuiltinCommandPtr &);
217 void handleJumpToLineAddressResolution(const CdbBuiltinCommandPtr &);
218 void jumpToAddress(quint64 address);
219 // Extension commands
220 void handleThreads(const CdbExtensionCommandPtr &);
221 void handlePid(const CdbExtensionCommandPtr &reply);
222 void handleLocals(const CdbExtensionCommandPtr &reply);
223 void handleAddWatch(const CdbExtensionCommandPtr &reply);
224 void handleExpandLocals(const CdbExtensionCommandPtr &reply);
225 void handleRegisters(const CdbExtensionCommandPtr &reply);
226 void handleModules(const CdbExtensionCommandPtr &reply);
227 void handleMemory(const CdbExtensionCommandPtr &);
228 void handleWidgetAt(const CdbExtensionCommandPtr &);
229 void handleBreakPoints(const CdbExtensionCommandPtr &);
230 void handleBreakPoints(const GdbMi &value);
231 NormalizedSourceFileName sourceMapNormalizeFileNameFromDebugger(const QString &f);
232 void updateLocalVariable(const QByteArray &iname);
233 void updateLocals(bool forNewStackFrame = false);
234 int elapsedLogTime() const;
235 void addLocalsOptions(ByteArrayInputStream &s) const;
236 unsigned parseStackTrace(const GdbMi &data, bool sourceStepInto);
237 void parseThreads(const GdbMi &, int forceCurrentThreadId = -1);
239 const QByteArray m_creatorExtPrefix;
240 const QByteArray m_tokenPrefix;
241 const OptionsPtr m_options;
244 QScopedPointer<Utils::ConsoleProcess> m_consoleStub;
245 DebuggerStartMode m_effectiveStartMode;
246 QByteArray m_outputBuffer;
247 unsigned long m_inferiorPid;
248 //! Debugger accessible (expecting commands)
250 SpecialStopMode m_specialStopMode;
251 int m_nextCommandToken;
252 QList<CdbBuiltinCommandPtr> m_builtinCommandQueue;
253 int m_currentBuiltinCommandIndex; //!< Current command whose output is recorded.
254 QList<CdbExtensionCommandPtr> m_extensionCommandQueue;
255 QMap<QString, NormalizedSourceFileName> m_normalizedFileCache;
256 const QByteArray m_extensionCommandPrefixBA; //!< Library name used as prefix
257 bool m_operateByInstructionPending; //!< Creator operate by instruction action changed.
258 bool m_operateByInstruction;
259 bool m_notifyEngineShutdownOnTermination;
262 mutable int m_elapsedLogTime;
263 QByteArray m_extensionMessageBuffer;
264 bool m_sourceStepInto;
267 PendingBreakPointMap m_pendingBreakpointMap;
268 QHash<QString, QString> m_fileNameModuleHash;
269 bool m_ignoreCdbOutput;
270 QVariantList m_customSpecialStopData;
271 QList<SourcePathMapping> m_sourcePathMappings;
274 } // namespace Internal
275 } // namespace Debugger
277 #endif // DEBUGGER_CDBENGINE_H