Skip to article
Documentation

Debugger configuration and inspection

Pause the right process, inspect Elixir values, and control interpreted modules.

On this page

Establish a normal run first#

Run the configuration successfully before choosing Debug. For the order workshop, debug the multi-item ExUnit test with a breakpoint on subtotal = unit_price * quantity. That line is executable and belongs to the project source currently being compiled.

Interpret the intended modules#

The debugger interprets selected Erlang/Elixir modules. Module filters control what is interpreted and where stepping can enter. A project module excluded by the filters can explain a skipped breakpoint; interpreting many dependencies can slow startup or stepping.

Check the configuration’s SDK, Mix root, and build output when a breakpoint remains unbound. A stale _build or another environment’s BEAM file does not describe the open source. Recompile after source changes.

Inspect a suspended program#

Select a process and stack frame, then inspect variables. Elixir-aware rendering presents structs, maps, tuples, binaries, charlists, lists, pids, ports, and refs more usefully than raw terms.

At the workshop breakpoint, expect unit_price = 125 and quantity = 3. Step over the assignment and inspect subtotal = 375. Evaluate an expression in the selected frame only when you understand its effects; evaluation executes code in a live debug context.

Step deliberately#

Step Over executes the current call without entering it. Step Into follows an eligible call; Step Out runs until the current frame returns. Selecting another frame changes what you inspect, not where the program executes.

Phoenix/template breakpoints require the corresponding code path to execute. Put a breakpoint in an Elixir segment of a supported template, trigger the route or event in the running app, and check process/frame context if another request is paused.

When a breakpoint is missed#

Check execution path, line placement, module filters, selected process, SDK/build identity, and compiler output in that order. Use a dependency-free local test to separate debugger setup from an application’s concurrent or remote-runtime behavior.

A paused Elixir test with process frames and expanded map values in the debugger.

A paused Elixir test with process frames and expanded map values in the debugger. Select the image to view it at full size.

Manual for version 2026.1.15 · Reviewed