I’m new to julia and i was wondering how to place a breakpoint dynamically through code, and debugging with the vs-code extension. For example, on Windows, with the Visual Studio IDE and C++, we can use something like __debugbreak()
to place breakpoints through our code, but how to do that in julia using vs-code?
Perhaps, we can create a macro to do this:
macro breakpoint(condition)
quote
if $condition
BREAKPOINT # what this should be?
end
end
end
And then using that macro and debugging with vs-code. How can we to do that?
Sorry for my english or if something that i wrote doesn’t see to make sense, i’m not a native english speaker.
That macro already exists and is called @bp
. You’ll need to access it as e.g. Main.VSCodeServer.JuliaInterpreter.@bp
at the moment, which is a bit verbose.
Note that VSCode also supports conditional breakpoints out of the box; just right click on a breakpoint and select Edit breakpoint
to add a condition.
2 Likes
When i use Main.VSCodeServer.JuliaInterpreter.@bp
in my code, and execute through the Run and Debug tab in vs-code, i get this error:
Warning: Some Julia code in the VS Code extension crashed with
│ e =
│ LoadError: UndefVarError: VSCodeServer not defined
│ in expression starting at c:\Users\jorge\dev\Omnix\src\Omnigl.jl:13
└ @ VSCodeDebugger c:\Users\jorge\.vscode\extensions\julialang.language-julia-1.1.40\scripts\error_handler.jl:5
ERROR: LoadError: UndefVarError: VSCodeServer not defined
Stacktrace:
[1] lower
@ .\meta.jl:165 [inlined]
[2] VSCodeDebugger.JuliaInterpreter.Frame(mod::Module, ex::Expr)
@ VSCodeDebugger.JuliaInterpreter c:\Users\jorge\.vscode\extensions\julialang.language-julia-1.1.40\scripts\packages\JuliaInterpreter\src\types.jl:245
[3] get_next_top_level_frame(state::VSCodeDebugger.DebugAdapter.DebuggerState)
@ VSCodeDebugger.DebugAdapter c:\Users\jorge\.vscode\extensions\julialang.language-julia-1.1.40\scripts\packages\DebugAdapter\src\debugger_core.jl:59
[4] our_debug_command(cmd::Symbol, state::VSCodeDebugger.DebugAdapter.DebuggerState)
@ VSCodeDebugger.DebugAdapter c:\Users\jorge\.vscode\extensions\julialang.language-julia-1.1.40\scripts\packages\DebugAdapter\src\debugger_core.jl:81
[5] startdebug(socket::Base.PipeEndpoint, error_handler::VSCodeDebugger.var"#3#4"{Tuple{String, String}})
@ VSCodeDebugger.DebugAdapter c:\Users\jorge\.vscode\extensions\julialang.language-julia-1.1.40\scripts\packages\DebugAdapter\src\packagedef.jl:104
[6] startdebugger()
@ VSCodeDebugger c:\Users\jorge\.vscode\extensions\julialang.language-julia-1.1.40\scripts\packages\VSCodeDebugger\src\VSCodeDebugger.jl:38
[7] top-level scope
@ c:\Users\jorge\.vscode\extensions\julialang.language-julia-1.1.40\scripts\debugger\run_debugger.jl:9
in expression starting at c:\Users\jorge\dev\Omnix\src\Omnigl.jl:13
Julia debuggee finished. Press ENTER to close this terminal.
Ah, yeah. That’ll only work when debugging in the REPL. In a separate debugging session you’ll need VSCodeDebugger.JuliaInterpreter.@bp
instead.
var"@bp" = (isdefined(Main, :VSCodeServer) ? Main.VSCodeServer : Main.VSCodeDebugger).JuliaInterpreter.var"@bp"
works in both cases. I’d still urge you to use the normal graphical breakpoints though – are you missing some functionality or why do you want to put the breakpoints directly into your code?
3 Likes
Thanks, that solves for what i want.
I have a extern C/C++ API with binds for Julia, and every function of that API may be susceptible to errors so a way to debugging theses functions programmatically (if they failed for some reason) will be better than manually placing breakpoints in every function call of that API.
1 Like