Debugging Nix

This section shows how to build and debug Nix with debug symbols enabled.

Additionally, see Testing Nix for further instructions on how to debug Nix in the context of a unit test or functional test.

Building Nix with Debug Symbols

In the development shell, set the mesonBuildType environment variable to debug before configuring the build:

[nix-shell]$ export mesonBuildType=debugoptimized

Then, proceed to build Nix as described in Building Nix. This will build Nix with debug symbols, which are essential for effective debugging.

It is also possible to build without debugging for faster build:

[nix-shell]$ NIX_HARDENING_ENABLE=$(printLines $NIX_HARDENING_ENABLE | grep -v fortify)
[nix-shell]$ export mesonBuildType=debug

(The first line is needed because fortify hardening requires at least some optimization.)

Debugging the Nix Binary

Obtain your preferred debugger within the development shell:

[nix-shell]$ nix-shell -p gdb

On macOS, use lldb:

[nix-shell]$ nix-shell -p lldb

Launching the Debugger

To debug the Nix binary, run:

[nix-shell]$ gdb --args ../outputs/out/bin/nix

On macOS, use lldb:

[nix-shell]$ lldb -- ../outputs/out/bin/nix

Using the Debugger

Inside the debugger, you can set breakpoints, run the program, and inspect variables.

(gdb) break main
(gdb) run <arguments>

Refer to the GDB Documentation for comprehensive usage instructions.

On macOS, use lldb:

(lldb) breakpoint set --name main
(lldb) process launch -- <arguments>

Refer to the LLDB Tutorial for comprehensive usage instructions.