See [lix-project/lix#1156], but basically currently the `:st <n>` debugger command doesn't allow any negative indices, and putting a plus sign in front of the arg doesn't change anything; thus, we can exploit that "design space" to allow users to move between different stack frames easily, by simply prepending their arg with a +/- sign. The actual behavior is little more nuanced when you account for errors: as suggested by @pennae (thanks! :), when the user inputs an offset that would result in an invalid frame index, the debugger instead clamps it to the closest bound (i.e. 0 for negative offsets, $maxFrame for positive ones) and just prints a warning. Fixes #1156 [lix-project/lix#1156]: https://git.lix.systems/lix-project/lix/issues/1156 Change-Id: I02a0cdb6aaebbdb0515308880a3bf9c0d2fcd25e
113 lines
4.0 KiB
Plaintext
113 lines
4.0 KiB
Plaintext
@args --debugger
|
|
|
|
:c at the root repl is not allowed since no debugger is running yet
|
|
nix-repl> :c
|
|
error: command 'c' can only be used when the debugger is active
|
|
|
|
:c and other commands become available once a debugger starts
|
|
nix-repl> with {}; a
|
|
error: undefined variable 'a'
|
|
at «string»:1:10:
|
|
1| with {}; a
|
|
| ^
|
|
|
|
nix-repl> :?
|
|
The following commands are available:
|
|
|
|
<expr> Evaluate and print expression
|
|
<x> = <expr> Bind expression to variable
|
|
:?, :help Print help about all commands (this content)
|
|
:a, :add <expr> Add attributes from resulting set to scope
|
|
:b, :build <expr> Build a derivation
|
|
:bl, :build-with-gc-roots <expr> Build a derivation, creating GC roots in the working directory
|
|
:doc <expr> Show documentation for the provided function (experimental lambda support)
|
|
:e, :edit <expr> Open package or function in $EDITOR
|
|
:env Show environment stack
|
|
:i, :build-and-install <expr> Build derivation, then install result into current profile
|
|
:l, :load <path> Load Nix expression and add it to scope
|
|
:log <expr | .drv path> Show logs for a derivation
|
|
:p, :print <expr> Evaluate and print expression recursively
|
|
Strings are printed directly, without escaping.
|
|
:q, :quit Exit the REPL
|
|
:r, :reload Reload all files successfully loaded
|
|
:sh, :shell <expr> Build dependencies of derivation, then start nix-shell
|
|
:t, :type <expr> Describe result of evaluation
|
|
:te, :trace-enable [bool] Enable, disable, or toggle showing traces for errors
|
|
:u, :use <expr> Build derivation, then start nix-shell
|
|
|
|
Debug mode commands
|
|
|
|
:bt, :backtrace Show trace stack
|
|
:c, :continue Go until end of program, exception or builtins.break
|
|
:s, :step Go one step
|
|
:st, :show-trace [integer index] Show current trace. If an integer is provided, this switches to that stack beforehand. If the integer has an explicit + or - sign, it is treated as relative to the current stack index.
|
|
|
|
Flakes commands
|
|
|
|
:lf, :load-flake <flakeref> Load Nix flake and add it to the scope
|
|
|
|
we can now inspect state
|
|
nix-repl> :bt
|
|
0: error: undefined variable 'a'
|
|
«string»:1:10
|
|
|
|
1| with {}; a
|
|
| ^
|
|
|
|
1: error: Fake frame for debugging purposes
|
|
«string»:1:10
|
|
|
|
1| with {}; a
|
|
| ^
|
|
|
|
and resume execution
|
|
nix-repl> :c
|
|
error: undefined variable 'a'
|
|
at «string»:1:10:
|
|
1| with {}; a
|
|
| ^
|
|
|
|
the debugger is once again disabled
|
|
nix-repl> :c
|
|
error: command 'c' can only be used when the debugger is active
|
|
|
|
leaving the debugger from a toplevel error and entering it again doesn't leave old frames visible
|
|
nix-repl> with {}; a
|
|
error: undefined variable 'a'
|
|
at «string»:1:10:
|
|
1| with {}; a
|
|
| ^
|
|
|
|
nix-repl> :s
|
|
error: undefined variable 'a'
|
|
at «string»:1:10:
|
|
1| with {}; a
|
|
| ^
|
|
|
|
nix-repl> with {}; b
|
|
error: undefined variable 'b'
|
|
at «string»:1:10:
|
|
1| with {}; b
|
|
| ^
|
|
|
|
nix-repl> :bt
|
|
|
|
0: error: undefined variable 'b'
|
|
«string»:1:10
|
|
|
|
1| with {}; b
|
|
| ^
|
|
|
|
1: error: Fake frame for debugging purposes
|
|
«string»:1:10
|
|
|
|
1| with {}; b
|
|
| ^
|
|
|
|
exiting from here prints the error
|
|
nix-repl> :q
|
|
error: undefined variable 'b'
|
|
at «string»:1:10:
|
|
1| with {}; b
|
|
| ^
|