Difference between revisions of "Debugger Status"
From Lazarus wiki
Jump to navigationJump to searchLine 22: | Line 22: | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Run || {{keypress|F9}} | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| Y | | Y | ||
Line 28: | Line 28: | ||
| | | | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Run to first line (Step) || {{keypress|F7}} / {{keypress|F8}} | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| class="unknown" | ? | | class="unknown" | ? | ||
Line 34: | Line 34: | ||
| For GUI apps the first line is in the code generated by the IDE | | For GUI apps the first line is in the code generated by the IDE | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Attach || | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| class="unknown" | ? | | class="unknown" | ? | ||
Line 40: | Line 40: | ||
| | | | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Detach || | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| class="unknown" | ? | | class="unknown" | ? | ||
Line 46: | Line 46: | ||
| | | | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Stop || {{keypress|Ctrl}}+{{keypress|F2}} | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| Y | | Y | ||
Line 52: | Line 52: | ||
| | | | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Reset Debugger || | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| Y | | Y | ||
Line 58: | Line 58: | ||
| Kill/Stop<br>Restart the external debugger (gdb/lldb) | | Kill/Stop<br>Restart the external debugger (gdb/lldb) | ||
|---- class="unknown" style="font-style:italic" | |---- class="unknown" style="font-style:italic" | ||
− | + | | style="text-align:left" | Run without debugging || {{keypress|Ctrl}}+{{keypress|Shift}}+{{keypress|F9}} || colspan="6" | Y || Not debugger specific | |
|} | |} | ||
Line 69: | Line 69: | ||
! Comments | ! Comments | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Continue (Run) || {{keypress|F9}} | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| Y | | Y | ||
Line 75: | Line 75: | ||
| | | | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Step over line || {{keypress|F8}} | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| Y | | Y | ||
Line 81: | Line 81: | ||
| | | | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Step into line || {{keypress|F7}} | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| Y | | Y | ||
Line 87: | Line 87: | ||
| | | | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Step (over) to line at cursor || {{keypress|F4}} | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| class="unknown" | ? | | class="unknown" | ? | ||
Line 95: | Line 95: | ||
<br>It will *step* *over* any recursive calls of the procedure, therefore not stopping at the line during recursion. | <br>It will *step* *over* any recursive calls of the procedure, therefore not stopping at the line during recursion. | ||
|---- class="not" | |---- class="not" | ||
− | + | | style="text-align:left" | Run to line at cursor || | |
| N || N || N || N | | N || N || N || N | ||
| N | | N | ||
Line 102: | Line 102: | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Step out (of current function) || {{keypress|Shift}}+{{keypress|F8}} | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| Y | | Y | ||
Line 108: | Line 108: | ||
| | | | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Step over asm || {{keypress|Alt}}+{{keypress|F8}} | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| Y | | Y | ||
Line 114: | Line 114: | ||
| | | | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Step into asm || {{keypress|Alt}}+{{keypress|F7}} | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| Y | | Y | ||
Line 127: | Line 127: | ||
<br>{{Warning|The "auto-continue" (time based) function may not return to stepping, but instead "run/continue" execution.}} | <br>{{Warning|The "auto-continue" (time based) function may not return to stepping, but instead "run/continue" execution.}} | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Step over ignored exceptions || | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| class="unknown" | ? | | class="unknown" | ? | ||
Line 134: | Line 134: | ||
Win32 and other OS structured exception handling are not supported (Ignored exceptions will turn Stepping into Running). | Win32 and other OS structured exception handling are not supported (Ignored exceptions will turn Stepping into Running). | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Step from except to finally or except || | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| class="unknown" | ? | | class="unknown" | ? | ||
Line 155: | Line 155: | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Breakpoint on Source Line || {{keypress|F5}} | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| Y | | Y | ||
Line 161: | Line 161: | ||
| | | | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Breakpoint on Assembler Line || | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| Y | | Y | ||
Line 167: | Line 167: | ||
| | | | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Watchpoint / Breakpoint Data || | |
| Y || Y || Y || Y | | Y || Y || Y || Y | ||
| class="unknown" | ? | | class="unknown" | ? | ||
Line 175: | Line 175: | ||
|---- class="unknown" | |---- class="unknown" | ||
− | + | | style="text-align:left" | .... || | |
| . || . || . || . | | . || . || . || . | ||
| . | | . | ||
Line 287: | Line 287: | ||
|---- class="working" | |---- class="working" | ||
− | + | | style="text-align:left" | Remote debugging || | |
| class="not" | N || Y || Y || class="not" | N | | class="not" | N || Y || Y || class="not" | N | ||
| class="not" | N | | class="not" | N |
Revision as of 17:51, 8 December 2019
This is based on Lazarus 2.0
Available Debuggers
- GNU Debugger (gdb)
- The first debugger that was supplied with Lazarus. This debugger uses GDB as backend. The IDE performs translations between gdb's none Pascal-ish interface and the interface provided by the IDE. Package: LazDebuggerGdbmi
- GNU Debugger through SSH (gdb)
- Allows to launch GDB over an ssh connection for remote debugging. This has however some serious limitations. Package: LazDebuggerGdbmi
- GNU remote debugger (gdbserver)
- Remote debugger using GdbServer (part of the gdb suite). Package: LazDebuggerGdbmi
- LLDB Debugger (Alpha)
- A basic LLDB based backend. This is a prove of concept implementation. The IDE displays raw LLDB output (no translation, no clean-up...) and there are no plans to add translation of the LLDB output. For using LLDB on Pascal applications the "LLDB Debugger (with fpdebug)" should be used. Package: LazDebuggerLldb
- LLDB Debugger (with fpdebug)
- This debugger uses LLDB as a backend. In order to display Pascal-style results, it uses the "fpdebug" engine to show locals/watches. LLDB is used to control stepping, breakpoint and execution. For reading data LLDB is used to read the raw memory only. Package: LazDebuggerFPLldb
- GNU Debugger (with fpdebug)
- Using GDB for stepping/breakpoints/... and FpDebug for watches. Package: LazDebuggerFPGdbmi
- FpDebug / LazDebuggerFp - integrated DWARF debugger / (Known issues)
- A new debugger completely implemented in Pascal. This debugger implements the DWARF standard (currently 2 and 3 are partly implemented). It has special implementations added to interpret info provided by FPC. It can currently be used on Windows and Linux (very basic support for MacOS). Package: LazDebuggerFP
- FpDebug / LazDebuggerFpRspRemote
- A new remote debugger to communicate with a gdbserver stub using gdb's remote serial protocol over tcp/ip (in future this could be expanded to include serial/UART). This debugger inherits from LazDebuggerFP, hence in principle supports the same functionality. Currently it only supports the AVR target. Not stable yet. Package: LazDebuggerFpRspRemote
- DAB / LazDABDebugger
- The Debug Adapter Protocol (DAB) is a protocol to abstract the communication between a Debugger-frontend like Lazarus, and an underlying debugger like FpdServer. LazDABDebugger is a debugger that connects to (any?) DAB-adapter. This makes is possible to debug other languages or different platforms within Lazarus.
- DAB - FpdServer / LazFPDServerDebugger
- A derivative of LazDABDebugger specifically shaped to work with FpdServer, a debugger based on FpDebug that supports the DAB-protocol.
Notes
- For the GDB and LLDB based debugger, support is indicated based on the assumptino that your version of GDB supports this. Support indication is generally based on current GDB/LLDB for mainstream OS.
- Fp-Debugger currently only works for Windows and Linux
- The "LLDB Debugger (Alpha)" is not included below. It is a by-product of the "LLDB+FpDebug". It is not actively developed/maintained, other than what is needed for "LLDB+FpDebug".
Start/Stop
Feature | Key | GdbMi | GdbMi+Ssh | GdbServer | GdbMi+FpDebug | Lldb+FpDebug | Fp-Debugger | Comments |
---|---|---|---|---|---|---|---|---|
Run | F9 | Y | Y | Y | Y | Y | Y | |
Run to first line (Step) | F7 / F8 | Y | Y | Y | Y | ? | N | For GUI apps the first line is in the code generated by the IDE |
Attach | Y | Y | Y | Y | ? | N | ||
Detach | Y | Y | Y | Y | ? | N | ||
Stop | Ctrl+F2 | Y | Y | Y | Y | Y | Y | |
Reset Debugger | Y | Y | Y | Y | Y | Y | Kill/Stop Restart the external debugger (gdb/lldb) | |
Run without debugging | Ctrl+⇧ Shift+F9 | Y | Not debugger specific |
Execution Control
Feature | Key | GdbMi | GdbMi+Ssh | GdbServer | GdbMi+FpDebug | Lldb+FpDebug | Fp-Debugger | Comments |
---|---|---|---|---|---|---|---|---|
Continue (Run) | F9 | Y | Y | Y | Y | Y | Y | |
Step over line | F8 | Y | Y | Y | Y | Y | Y | |
Step into line | F7 | Y | Y | Y | Y | Y | Y | |
Step (over) to line at cursor | F4 | Y | Y | Y | Y | ? | Partial | "STEP OVER" - This works only within the current procedure.
It will go to the selected line, or stop if the current procedure is left.
|
Run to line at cursor | N | N | N | N | N | N | Workaround: Use F5 to set a breakpoint, then F9 to run | |
Step out (of current function) | ⇧ Shift+F8 | Y | Y | Y | Y | Y | Y | |
Step over asm | Alt+F8 | Y | Y | Y | Y | Y | Y | |
Step into asm | Alt+F7 | Y | Y | Y | Y | Y | Y | |
Step over "none breaking" breakpoint | Y | Y | Y | Y | ? | Lazarus 2.0 or 2.2 ? | Any "step" command will continue to its step-end after a "none breaking" Breakpoints. This is a Breakpoint that has its break property turned off. It may record a snapshot, log a message, or enable/disable other breakpoints.
| |
Step over ignored exceptions | Y | Y | Y | Y | ? | Lazarus 2.2 | Only for standard fpc exception handling. And (Lazarus 2.2) SEH on Win64. Win32 and other OS structured exception handling are not supported (Ignored exceptions will turn Stepping into Running). | |
Step from except to finally or except | Y | Y | Y | Y | ? | Lazarus 2.2 | Only for standard fpc exception handling. And (Lazarus 2.2) SEH on Win64. Win32 and other OS structured exception handling are not supported (Ignored exceptions will turn Stepping into Running). |
- Breakpoints / None-breaking breakpoints / Auto-continue breakpoints / Disabled breakpoints
- A breakpoint usually pauses your app, in addition it can perform tasks like logging a message (debugger event log), dumping data to the log, taking a snapshot (debugger history).
A none-breaking breakpoint will perform those extra tasks, but not pause your app.
An auto-continue breakpoint will pause your app (and perform any other action) for a given amount of milliseconds (during which you can use the pause button, to pause permanently), after that it will continue your app. It usually continues using "Run", therefore loosing any current single-step action
A disabled breakpoint will do nothing. It is as if it does not exist. - Stepping and breakpoints / exceptions
- If any debugger pauses the target-app at a breakpoint or exception while single stepping, then the single-step is lost. The breakpoint/exception may be in a deeply nested called function, and you can not continue the single-step. I.e. there is no build in way to get back to the function where you started your step, and finish this step. For this you need to go through the callstack yourself and find the start location and use breakpoints
- Stepping and none-breaking-breakpoints / Ignored-exceptions
- Most/All? debugger backends can in this case continue to the position where the single-step would have ended. (This may be limited for asm stepping). In case of an exception the single step will end at the next finally or except. "Next" from the point of view of the step-command. I.e., any finally inside a "stepped over function" will be stepped over, but any finally on the same level as the step began will be used as end point. If there is none on the same level, then the next outer will be used.
This feature relies heavily on FPC implementation details. Thus it may not work with newer FPC versions.
Breakpoints / Exceptions
Feature | Key | GdbMi | GdbMi+Ssh | GdbServer | GdbMi+FpDebug | Lldb+FpDebug | Fp-Debugger | Comments |
---|---|---|---|---|---|---|---|---|
Breakpoint on Source Line | F5 | Y | Y | Y | Y | Y | Y | |
Breakpoint on Assembler Line | Y | Y | Y | Y | Y | Y | ||
Watchpoint / Breakpoint Data | Y | Y | Y | Y | ? | Partial | Amount/Size is limited by architecture
Intel based systems usually have 4 Watchpoints, each with a max size of 32 bit (64 bit on 64bit CPU) | |
.... | . | . | . | . | . | . |
Data
Feature | Key | GdbMi | GdbMi+Ssh | GdbServer | GdbMi+FpDebug | Lldb+FpDebug | Fp-Debugger | Comments |
---|---|---|---|---|---|---|---|---|
Watches | Y | Y | Y | Y | Y | Y | ||
Locals | Y | Y | Y | Y | Y | Y | ||
Stack | Y | Y | Y | Y | Y | Y | ||
Threads | Y | Y | Y | Y | Y | Y | Running State indicator may not be accurate | |
Inspect | Y | Y | Y | Y | Y | Y | ||
Evaluate / Modify | Y | Y | Y | Y | ? | Only Evaluate No Modify |
||
Disassembler | Y | Y | Y | Y | ? | Partial | ||
Watch/Inspect Class Properties | N | N | N | N | N | N | Using "DWARF" properties that refer directly to a field (no getter method) are shown. | |
Watch/Inspect Function calls | N | N | N | N | N | N | ||
Use Instance type/class | Y | Y | Y | Y | Y | Y | By default the debugger shows variables according to their declared type/class.
"Sender: TObject" will only show as TObject.
| |
Tooltip / Hint | Y | Y | Y | Y | Y | Y | ||
Tooltip / Hint => Auto-deref pointer | Y | Y | Y | Y | Y | Y | ||
Tooltip / Hint => Use Instance Class | Y | Y | Y | Y | Y | Y |
|
Other
Feature | Key | GdbMi | GdbMi+Ssh | GdbServer | GdbMi+FpDebug | Lldb+FpDebug | Fp-Debugger | Comments |
---|---|---|---|---|---|---|---|---|
Remote debugging | N | Y | Y | N | N | N |