forked from lix-project/lix
Merge pull request #9914 from 9999years/debugger-on-trace
Enter debugger on `builtins.trace` with an option
(cherry picked from commit 774e7ca5847ebc392eac2a124a8f12b24da4f65a)
Change-Id: If01e2110b3a128e639b05143227e365227d149f1
This commit is contained in:
parent
030c8aa833
commit
f2e11ddce1
9
doc/manual/rl-next/debugger-on-trace.md
Normal file
9
doc/manual/rl-next/debugger-on-trace.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
---
|
||||||
|
synopsis: Enter the `--debugger` when `builtins.trace` is called if `debugger-on-trace` is set
|
||||||
|
prs: 9914
|
||||||
|
---
|
||||||
|
|
||||||
|
If the `debugger-on-trace` option is set and `--debugger` is given,
|
||||||
|
`builtins.trace` calls will behave similarly to `builtins.break` and will enter
|
||||||
|
the debug REPL. This is useful for determining where warnings are being emitted
|
||||||
|
from.
|
|
@ -114,6 +114,16 @@ struct EvalSettings : Config
|
||||||
|
|
||||||
Setting<unsigned int> maxCallDepth{this, 10000, "max-call-depth",
|
Setting<unsigned int> maxCallDepth{this, 10000, "max-call-depth",
|
||||||
"The maximum function call depth to allow before erroring."};
|
"The maximum function call depth to allow before erroring."};
|
||||||
|
|
||||||
|
Setting<bool> builtinsTraceDebugger{this, false, "debugger-on-trace",
|
||||||
|
R"(
|
||||||
|
If set to true and the `--debugger` flag is given,
|
||||||
|
[`builtins.trace`](@docroot@/language/builtins.md#builtins-trace) will
|
||||||
|
enter the debugger like
|
||||||
|
[`builtins.break`](@docroot@/language/builtins.md#builtins-break).
|
||||||
|
|
||||||
|
This is useful for debugging warnings in third-party Nix code.
|
||||||
|
)"};
|
||||||
};
|
};
|
||||||
|
|
||||||
extern EvalSettings evalSettings;
|
extern EvalSettings evalSettings;
|
||||||
|
|
|
@ -980,6 +980,10 @@ static void prim_trace(EvalState & state, const PosIdx pos, Value * * args, Valu
|
||||||
printError("trace: %1%", args[0]->string.s);
|
printError("trace: %1%", args[0]->string.s);
|
||||||
else
|
else
|
||||||
printError("trace: %1%", ValuePrinter(state, *args[0]));
|
printError("trace: %1%", ValuePrinter(state, *args[0]));
|
||||||
|
if (evalSettings.builtinsTraceDebugger && state.debugRepl && !state.debugTraces.empty()) {
|
||||||
|
const DebugTrace & last = state.debugTraces.front();
|
||||||
|
state.runDebugRepl(nullptr, last.env, last.expr);
|
||||||
|
}
|
||||||
state.forceValue(*args[1], pos);
|
state.forceValue(*args[1], pos);
|
||||||
v = *args[1];
|
v = *args[1];
|
||||||
}
|
}
|
||||||
|
@ -991,6 +995,12 @@ static RegisterPrimOp primop_trace({
|
||||||
Evaluate *e1* and print its abstract syntax representation on
|
Evaluate *e1* and print its abstract syntax representation on
|
||||||
standard error. Then return *e2*. This function is useful for
|
standard error. Then return *e2*. This function is useful for
|
||||||
debugging.
|
debugging.
|
||||||
|
|
||||||
|
If the
|
||||||
|
[`debugger-on-trace`](@docroot@/command-ref/conf-file.md#conf-debugger-on-trace)
|
||||||
|
option is set to `true` and the `--debugger` flag is given, the
|
||||||
|
interactive debugger will be started when `trace` is called (like
|
||||||
|
[`break`](@docroot@/language/builtins.md#builtins-break)).
|
||||||
)",
|
)",
|
||||||
.fun = prim_trace,
|
.fun = prim_trace,
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue