Skip to content

Debugger UI

The whole window at a glance, and what each area is for.

The Bugsaur window during a debug session

The zones

The window is split into a left column and a right area, each divided into two zones:

+----------------+-----------------------------+
|                |                             |
|   top_left     |            main             |
|   ① Threads    |   ③ Variables · Watches     |
|                |     Evaluate · Logs         |
|                |     Inspector · Breakpoints |
+----------------+-----------------------------+  ← main_split
|                |                             |
|  bottom_left   |          bottom             |
|       ②        |       ④ Call Stack          |
+----------------+-----------------------------+
        ↑ left_split          ↑ left

By default the left column holds Threads at full height, the right area holds a stack of tabs — Variables, Watches, Evaluate, Logs, Inspector, Breakpoints — with Call Stack below it.

Panels in one zone become a tab stack, in the order you list them. A panel not named in any zone is not shown at all — that is how you remove one.

The zones and the proportions between them are set by the project, in the [ui.layout] section: see Configuration → UI.

The execution toolbar

Along the top: continue, step over, step into, step out, stop, restart. Each button has a keyboard equivalent that works everywhere in the window — including while the cursor sits in the Evaluate or Watches input field.

Key Action
F9 continue
F8 step over
F7 step into
Shift+F8 step out
Cmd+F2 / Ctrl+F2 stop

Details of what each one means: Stepping.

Focus: one active panel

Exactly one panel is active for the keyboard. You can tell which one two ways: its tab title is accented, and its body is framed. The title is visible even when the panel is too narrow to show the frame clearly.

Chord Effect
Tab / Shift+Tab next and previous panel, cyclically
Ctrl+Tab / Ctrl+Shift+Tab the same
Ctrl+T Threads
Ctrl+C Call Stack
Ctrl+V Variables
Ctrl+W Watches
Ctrl+E Evaluate
Ctrl+L Logs
Ctrl+I Inspector
Ctrl+B Breakpoints

The cycle covers the whole window, not the tabs of one stack. A panel sitting as a background tab comes to the front when you move to it. The letter belongs to the panel, not to its position in the layout — and the letter of a panel your layout does not show does nothing at all. Focus starts on Variables.

Why Tab and not arrow keys

egui's own widget traversal is switched off: focus never lands on toolbar buttons, and arrows do not drag it between them. There is exactly one kind of navigation in the window — panels and rows — which is why Tab was free to take panel switching.

Moving inside a panel

Keys Effect
J / K, Down / Up previous and next row
G / Home, Shift+G / End first and last row
H / L, Left / Right collapse and expand a tree node
Enter / Space activate
Esc leave an input field

What "activate" means depends on the panel:

Panel J / K Enter
Threads move the cursor select the thread
Call Stack selects the frame immediately
Variables move the selection in the tree collapse / expand the node
Watches move between expressions enter the input field (D / Del removes)
Evaluate enter the input field
Logs scroll one line
Breakpoints move the selection open the location in the editor

Shift+G in Logs re-enables following the tail of the feed; G turns it off.

Variables has a search of its own: / opens it, N and Shift+N walk the matches. It reaches into structures that have not been opened yet, and Variables describes what it covers and what bounds it.

While the cursor is in a text field, letters stay letters — they do not trigger navigation. Chords with a modifier, function keys, Esc and Tab still work from there: Tab cannot be part of an expression, and leaving for the next panel is exactly what people expect of it.

Themes and fonts

The window ships both a dark and a light scheme; the project decides which one shows:

[ui]
theme = "dark"   # dark (default) | light | system

The default is dark, not system. The debugger window opens next to your editor rather than instead of it, and it should follow the OS setting only when asked — that is what system is for, and with it the theme switches on a live session.

Colour in the variable tree means the kind of value, not the importance of the row: strings green, numbers and booleans blue, nil dimmed, the type grey in braces. Contrast is verified by a test for every colour on every background in both themes — 4.5:1 for primary text, 3:1 for secondary.

Full theme rules and precedence against the editor: see Configuration → UI.

Getting help in the window

F1 or ? shows the bindings currently in effect — the result of all four configuration layers, not the defaults printed in the documentation. When a key does something other than what you expect, that panel is the authority.