3 // Copyright by Johannes Sixt
4 // This file is under GPL, the GNU General Public Licence
24 * A type representing an address.
31 DbgAddr(const QString
& aa
);
32 DbgAddr(const DbgAddr
& src
) : a(src
.a
), fnoffs(src
.fnoffs
) { }
33 void operator=(const QString
& aa
);
34 void operator=(const DbgAddr
& src
) { a
= src
.a
; fnoffs
= src
.fnoffs
; }
35 QString
asString() const;
36 bool isEmpty() const { return a
.isEmpty(); }
40 bool operator==(const DbgAddr
& a1
, const DbgAddr
& a2
);
41 bool operator>(const DbgAddr
& a1
, const DbgAddr
& a2
);
60 DCsetoption
, /* debugger options */
70 DCuntil
, /* line number is zero-based! */
73 DCbreakline
, /* line number is zero-based! */
74 DCtbreakline
, /* line number is zero-based! */
98 RDNstdin
= 0x1, /* redirect stdin to /dev/null */
99 RDNstdout
= 0x2, /* redirect stdout to /dev/null */
100 RDNstderr
= 0x4 /* redirect stderr to /dev/null */
104 * How the memory dump is formated. The lowest 4 bits define the size of
105 * the entities. The higher bits define how these are formatted. Note that
106 * not all combinations make sense.
108 enum MemoryDumpType
{
132 * Debugger commands are placed in a queue. Only one command at a time is
133 * sent down to the debugger. All other commands in the queue are retained
134 * until the sent command has been processed by gdb. The debugger tells us
135 * that it's done with the command by sending the prompt. The output of the
136 * debugger is parsed at that time. Then, if more commands are in the
137 * queue, the next one is sent to the debugger.
143 bool m_committed
; /* just a debugging aid */
144 // remember which expression when printing an expression
147 // remember file position
150 // the breakpoint info
152 // whether command was emitted due to direct user request (only set when relevant)
155 CmdQueueItem(DbgCommand cmd
, const QString
& str
) :
168 * The information about a breakpoint that is parsed from the list of
173 int id
; /* gdb's number */
175 breakpoint
, watchpoint
180 QString text
; /* text if set using DCbreaktext */
181 DbgAddr address
; /* exact address of breakpoint */
182 QString condition
; /* condition as printed by gdb */
183 int ignoreCount
; /* ignore next that may hits */
184 int hitCount
; /* as reported by gdb */
185 // the following items repeat the location, but in a better usable way
187 int lineNo
; /* zero-based line number */
189 bool isOrphaned() const { return id
< 0; }
193 * Information about a stack frame.
198 int lineNo
; /* zero-based line number */
199 DbgAddr address
; /* exact address of PC */
203 * The information about a stack frame as parsed from the backtrace.
205 struct StackFrame
: FrameInfo
208 VarTree
* var
; /* more information if non-zero */
209 StackFrame() : var(0) { }
214 * The information about a thread as parsed from the threads list.
216 struct ThreadInfo
: FrameInfo
218 int id
; /* gdb's number */
219 QString threadName
; /* the SYSTAG */
220 QString function
; /* where thread is halted */
221 bool hasFocus
; /* the thread whose stack we are watching */
225 * Register information
231 QString cookedValue
; /* may be empty */
232 QString type
; /* of vector register if not empty */
238 struct DisassembledCode
254 * This is an abstract base class for debugger process.
256 * This class represents the debugger program. It provides the low-level
257 * interface to the commandline debugger. As such it implements the
258 * commands and parses the output.
260 class DebuggerDriver
: public KProcess
265 virtual ~DebuggerDriver() = 0;
267 virtual QString
driverName() const = 0;
269 * Returns the default command string to invoke the debugger driver.
271 virtual QString
defaultInvocation() const = 0;
274 * Returns a list of options that can be turned on and off.
276 virtual QStringList
boolOptionList() const = 0;
278 virtual bool startup(QString cmdStr
);
279 void dequeueCmdByVar(VarTree
* var
);
280 void setLogFileName(const QString
& fname
) { m_logFileName
= fname
; }
286 DSidle
, /* gdb waits for input */
287 DSinterrupted
, /* a command was interrupted */
288 DSrunningLow
, /* gdb is running a low-priority command */
289 DSrunning
, /* gdb waits for program */
290 DScommandSent
, /* command has been sent, we wait for wroteStdin signal */
291 DScommandSentLow
/* low-prioritycommand has been sent */
293 DebuggerState m_state
;
296 bool isIdle() const { return m_state
== DSidle
; }
298 * Tells whether a high prority command would be executed immediately.
300 bool canExecuteImmediately() const { return m_hipriCmdQueue
.isEmpty(); }
303 char* m_output
; /* normal gdb output */
304 size_t m_outputLen
; /* amount of data so far accumulated in m_output */
305 size_t m_outputAlloc
; /* space available in m_output */
306 typedef QCString DelayedStr
;
307 QQueue
<DelayedStr
> m_delayedOutput
; /* output colleced while we have receivedOutput */
308 /* but before signal wroteStdin arrived */
312 * Enqueues a high-priority command. High-priority commands are
313 * executed before any low-priority commands. No user interaction is
314 * possible as long as there is a high-priority command in the queue.
316 virtual CmdQueueItem
* executeCmd(DbgCommand
,
317 bool clearLow
= false) = 0;
318 virtual CmdQueueItem
* executeCmd(DbgCommand
, QString strArg
,
319 bool clearLow
= false) = 0;
320 virtual CmdQueueItem
* executeCmd(DbgCommand
, int intArg
,
321 bool clearLow
= false) = 0;
322 virtual CmdQueueItem
* executeCmd(DbgCommand
, QString strArg
, int intArg
,
323 bool clearLow
= false) = 0;
324 virtual CmdQueueItem
* executeCmd(DbgCommand
, QString strArg1
, QString strArg2
,
325 bool clearLow
= false) = 0;
326 virtual CmdQueueItem
* executeCmd(DbgCommand
, int intArg1
, int intArg2
,
327 bool clearLow
= false) = 0;
330 QMnormal
, /* queues the command last */
331 QMoverride
, /* removes an already queued command */
332 QMoverrideMoreEqual
/* ditto, also puts the command first in the queue */
336 * Enqueues a low-priority command. Low-priority commands are executed
337 * after any high-priority commands.
339 virtual CmdQueueItem
* queueCmd(DbgCommand
,
341 virtual CmdQueueItem
* queueCmd(DbgCommand
, QString strArg
,
343 virtual CmdQueueItem
* queueCmd(DbgCommand
, int intArg
,
345 virtual CmdQueueItem
* queueCmd(DbgCommand
, QString strArg
, int intArg
,
347 virtual CmdQueueItem
* queueCmd(DbgCommand
, QString strArg1
, QString strArg2
,
351 * Flushes the command queues.
352 * @param hipriOnly if true, only the high priority queue is flushed.
354 virtual void flushCommands(bool hipriOnly
= false);
357 * Terminates the debugger process.
359 virtual void terminate() = 0;
362 * Terminates the debugger process, but also detaches any program that
363 * it has been attached to.
365 virtual void detachAndTerminate() = 0;
368 * Interrupts the debuggee.
370 virtual void interruptInferior() = 0;
373 * Parses the output as an array of QChars.
375 virtual VarTree
* parseQCharArray(const char* output
, bool wantErrorValue
, bool qt3like
) = 0;
378 * Parses a back-trace (the output of the DCbt command).
380 virtual void parseBackTrace(const char* output
, QList
<StackFrame
>& stack
) = 0;
383 * Parses the output of the DCframe command;
384 * @param frameNo Returns the frame number.
385 * @param file Returns the source file name.
386 * @param lineNo The zero-based line number.
387 * @param address Returns the exact address.
388 * @return false if the frame could not be parsed successfully. The
389 * output values are undefined in this case.
391 virtual bool parseFrameChange(const char* output
, int& frameNo
,
392 QString
& file
, int& lineNo
, DbgAddr
& address
) = 0;
395 * Parses a list of breakpoints.
396 * @param output The output of the debugger.
397 * @param brks The list of new #Breakpoint objects. The list
398 * must initially be empty.
399 * @return False if there was an error before the first breakpoint
400 * was found. Even if true is returned, #brks may be empty.
402 virtual bool parseBreakList(const char* output
, QList
<Breakpoint
>& brks
) = 0;
405 * Parses a list of threads.
406 * @param output The output of the debugger.
407 * @param threads The list of new #ThreadInfo objects. The list
408 * must initially be empty.
409 * @return False if there was an error before the first thread entry
410 * was found. Even if true is returned, #threads may be empty.
412 virtual bool parseThreadList(const char* output
, QList
<ThreadInfo
>& threads
) = 0;
415 * Parses the output when the program stops to see whether this it
416 * stopped due to a breakpoint.
417 * @param output The output of the debugger.
418 * @param id Returns the breakpoint id.
419 * @param file Returns the file name in which the breakpoint is.
420 * @param lineNo Returns the zero-based line number of the breakpoint.
421 * @param address Returns the address of the breakpoint.
422 * @return False if there was no breakpoint.
424 virtual bool parseBreakpoint(const char* output
, int& id
,
425 QString
& file
, int& lineNo
, QString
& address
) = 0;
428 * Parses the output of the DCinfolocals command.
429 * @param output The output of the debugger.
430 * @param newVars Receives the parsed variable values. The values are
431 * simply append()ed to the supplied list.
433 virtual void parseLocals(const char* output
, QList
<VarTree
>& newVars
) = 0;
436 * Parses the output of a DCprint or DCprintStruct command.
437 * @param output The output of the debugger.
438 * @param wantErrorValue Specifies whether the error message should be
439 * provided as the value of a NKplain variable. If this is false,
440 * #var will be 0 if the printed value is an error message.
441 * @param var Returns the variable value. It is set to 0 if there was
442 * a parse error or if the output is an error message and wantErrorValue
443 * is false. If it is not 0, #var->text() will return junk and must be
444 * set using #var->setText().
445 * @return false if the output is an error message. Even if true is
446 * returned, #var might still be 0 (due to a parse error).
448 virtual bool parsePrintExpr(const char* output
, bool wantErrorValue
,
452 * Parses the output of the DCcd command.
453 * @return false if the message is an error message.
455 virtual bool parseChangeWD(const char* output
, QString
& message
) = 0;
458 * Parses the output of the DCexecutable command.
459 * @return false if an error occured.
461 virtual bool parseChangeExecutable(const char* output
, QString
& message
) = 0;
464 * Parses the output of the DCcorefile command.
465 * @return false if the core file was not loaded successfully.
467 virtual bool parseCoreFile(const char* output
) = 0;
470 SFrefreshSource
= 1, /* refresh of source code is needed */
471 SFrefreshBreak
= 2, /* refresh breakpoints */
472 SFrefreshThreads
= 4, /* refresh thread list */
473 SFprogramActive
= 128 /* program remains active */
476 * Parses the output of commands that execute (a piece of) the program.
477 * @return The inclusive OR of zero or more of the StopFlags.
479 virtual uint
parseProgramStopped(const char* output
, QString
& message
) = 0;
482 * Parses the output of the DCsharedlibs command.
484 virtual void parseSharedLibs(const char* output
, QStrList
& shlibs
) = 0;
487 * Parses the output of the DCfindType command.
488 * @return true if a type was found.
490 virtual bool parseFindType(const char* output
, QString
& type
) = 0;
493 * Parses the output of the DCinforegisters command.
495 virtual void parseRegisters(const char* output
, QList
<RegisterInfo
>& regs
) = 0;
498 * Parses the output of the DCinfoline command. Returns false if the
499 * two addresses could not be found.
501 virtual bool parseInfoLine(const char* output
,
502 QString
& addrFrom
, QString
& addrTo
) = 0;
505 * Parses the ouput of the DCdisassemble command.
507 virtual void parseDisassemble(const char* output
, QList
<DisassembledCode
>& code
) = 0;
510 * Parses a memory dump. Returns an empty string if no error was found;
511 * otherwise it contains an error message.
513 virtual QString
parseMemoryDump(const char* output
, QList
<MemoryDump
>& memdump
) = 0;
516 * Parses the output of the DCsetvariable command. Returns an empty
517 * string if no error was found; otherwise it contains an error
520 virtual QString
parseSetVariable(const char* output
) = 0;
523 * Returns a value that the user can edit.
525 virtual QString
editableValue(VarTree
* value
);
528 /** Removes all commands from the low-priority queue. */
529 void flushLoPriQueue();
530 /** Removes all commands from the high-priority queue. */
531 void flushHiPriQueue();
533 QQueue
<CmdQueueItem
> m_hipriCmdQueue
;
534 QList
<CmdQueueItem
> m_lopriCmdQueue
;
536 * The active command is kept separately from other pending commands.
538 CmdQueueItem
* m_activeCmd
;
540 * Helper function that queues the given command string in the
541 * low-priority queue.
543 CmdQueueItem
* queueCmdString(DbgCommand cmd
, QString cmdString
,
546 * Helper function that queues the given command string in the
547 * high-priority queue.
549 CmdQueueItem
* executeCmdString(DbgCommand cmd
, QString cmdString
,
552 virtual void commandFinished(CmdQueueItem
* cmd
) = 0;
556 virtual int commSetupDoneC();
559 size_t m_promptMinLen
;
560 char m_promptLastChar
;
564 QString m_logFileName
;
568 virtual void slotReceiveOutput(KProcess
*, char* buffer
, int buflen
);
569 virtual void slotCommandRead(KProcess
*);
570 virtual void slotExited(KProcess
*);
574 * This signal is emitted when the output of a command has been fully
575 * collected and is ready to be interpreted.
577 void commandReceived(CmdQueueItem
* cmd
, const char* output
);
580 * This signal is emitted when the debugger recognizes that a specific
581 * location in a file ought to be displayed.
583 * Gdb's --fullname option supports this for the step, next, frame, and
584 * run commands (and possibly others).
586 * @param file specifies the file; this is not necessarily a full path
587 * name, and if it is relative, you won't know relative to what, you
589 * @param lineNo specifies the line number (0-based!) (this may be
590 * negative, in which case the file should be activated, but the line
591 * should NOT be changed).
592 * @param address specifies the exact address of the PC or is empty.
594 void activateFileLine(const QString
& file
, int lineNo
, const DbgAddr
& address
);
597 * This signal is emitted when a command that starts the inferior has
598 * been submitted to the debugger.
600 void inferiorRunning();
603 * This signal is emitted when all output from the debugger has been
604 * consumed and no more commands are in the queues.
606 void enterIdleState();
609 #endif // DBGDRIVER_H