| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
A Julia debugger.
| Build Status |
|---|
Note: If you are looking for the docs for the Julia VSCode debugger, see this link instead
Install Debugger using Pkg:
julia> import Pkg; Pkg.add("Debugger")The debug interface is entered using the @enter macro:
using Debugger
function foo(n)
x = n+1
((BigInt[1 1; 1 0])^x)[2,1]
end
@enter foo(20)This interface allows for manipulating program execution, such as stepping in and out of functions, line stepping, showing local variables, setting breakpoints and evaluating code in the context of functions.
Loading Debugger in an interactive session installs a debug> REPL mode, entered by pressing ) at the beginning of an empty julia> prompt (and left with backspace, like the Pkg and shell modes). In this mode:
julia> using Debugger debug> bp add sin [ Info: added breakpoint for function sin debug> cos(1.0) # equivalent to @enter cos(1.0)
Below, square brackets denote optional arguments.
All of the following commands work when the prompt is 1|debug>:
Misc:
Stepping (basic):
Stepping (advanced):
Querying:
Evaluation:
Breakpoints:
An empty command will execute the previous command.
Changing frames with f i::Int will change the prompt to $i|debug>. Stepping commands will not work until you return to f 1, but a subset of normal commands will continue to work.
In addition to these debugging commands, you can type ` to enter "evaluation mode" indicated by a prompt $i|julia>. In evaluation mode, any expression you type is executed in the debug context. For example, if you have a local variable named n, then once in evaluation mode typing n will show you the value of n rather than advancing to the next line.
Hit backspace as the first character of the line to return to "debug mode."
To add and manipulate breakpoints, either the bp add command in the debug interface or the JuliaInterpreter breakpoint API, documented here can be used.
It is common to want to run a function until a breakpoint is hit. Therefore, the "shortcut macro" @run is provided which is equivalent of starting the debug mode with @enter and then executing the continue command (c):
julia> using Debugger
julia> breakpoint(abs);
julia> @run sin(2.0)
Hit breakpoint:
[1/2] abs(x) at float.jl:522
>522 abs(x::Float64) = abs_float(x)
x::Float64 = 2.0 (arg)
→ (abs_float)(2.0)
1|debug> bt
>[1] abs(x) at float.jl:522
[2] sin(x) at special/trig.jl:30It is possible to halt execution when an error is thrown. This is done by calling the exported function break_on(:error).
julia> using Debugger
julia> break_on(:error)
julia> f() = "αβ"[2];
julia> @run f()
Breaking for error:
ERROR: StringIndexError("αβ", 2)
[1/4] string_index_err(s, i) at strings/string.jl:12
>12 @noinline string_index_err(s::AbstractString, i::Integer) =
s::String = "αβ" (arg)
i::Int64 = 2 (arg)
→ (throw)(StringIndexError("αβ", 2))
1|debug> bt
>[1] string_index_err(s, i) at strings/string.jl:12
[2] getindex_continued(s, i, u) at strings/string.jl:218
[3] getindex(s, i) at strings/string.jl:211
[4] f() at REPL[5]:1
julia> JuliaInterpreter.break_off(:error)
julia> @run f()
ERROR: StringIndexError("αβ", 2)
Stacktrace:
[...]It is sometimes more convenient to choose in the source code when to break. This is done for instance in Matlab/Octave with keyboard, and in R with browser(). You can use the @bp macro to do this:
julia> using Debugger
julia> function f(x)
if x < 0
@bp
else
println("All good!")
end
end
f (generic function with 1 method)
julia> @run f(2)
All good!
julia> @run f(-2)
Hit breakpoint:
[1/1] f(x) at REPL[6]:2
1 function f(x)
2 if x < 0
>3 @bp
4 else
5 println("All good!")
6 end
7 end
x::Int64 = -2 (arg)
→ return
1|debug> bt
>[1] f(x) at REPL[6]:3In order to fully support breakpoints, the debugger interprets all code, even code that is stepped over. Currently, there are cases where the interpreter is too slow for this to be feasible. A workaround is to use "compiled mode" which is toggled by pressing C in the debug REPL mode (note the change of prompt color). When using compiled mode, code that is stepped over will be executed by the normal julia compiler and run just as fast as normally. The drawback is that breakpoints in compiled code that is stepped over are missed.
To split the difference between these two extremes, one can fine tune which modules are compiled and which are not. For example, to compile all code in Base, even when not in C mode, and hence break on all specified points in user code, issue the following commands on the REPL before @enter:
using JuliaInterpreter, MethodAnalysis
union!(JuliaInterpreter.compiled_modules, child_modules(Base))Additional imported modules can also always be compiled with:
union!(JuliaInterpreter.compiled_modules, SomePackage)UI options are set with Debugger.config(; kwargs...); calling it without arguments shows the current settings. The available options are:
The older entry points Debugger.set_theme(theme) and Debugger.set_highlight(false) still work.
| Back | FazBrowse Home | New Git URL |