gdb debugging tips

Displaying Julia variables

Within gdb, any jl_value_t* object obj can be displayed using

(gdb)calljl_(obj)

The object will be displayed in the julia session, not in the gdb session. This is a useful way to discover the types and values of objects being manipulated by Julia’s C code.

Similarly, if you’re debugging some of julia’s internals (e.g., inference.jl), you can print obj using

ccall(:jl_,Void,(Any,),obj)

This is a good way to circumvent problems that arise from the order in which julia’s output streams are initialized.

Inserting breakpoints for inspection from gdb

In your gdb session, set a breakpoint in jl_breakpoint like so:

(gdb)breakjl_breakpoint

Then within your Julia code, insert a call to jl_breakpoint by adding

ccall(:jl_breakpoint,Void,())

or alternatively

ccall(:jl_breakpoint,Void,(Any,),obj)

if you want to inspect obj from within jl_breakpoint.

It’s particularly helpful to back up to the jl_apply frame, from which you can display the arguments to a function using, e.g.,

(gdb)calljl_(args[0])

Inserting breakpoints upon certain conditions

Loading a particular file

Let’s say the file is sysimg.jl:

(gdb)breakjl_loadifstrcmp(fname,"sysimg.jl")==0

Calling a particular method

(gdb)breakjl_apply_genericifstrcmp(F->name->name,"method_to_break")==0

Since this function is used for every call, you will make everything 1000x slower if you do this.