Debugging Chapel Programs
Chapel compiler-generated executables have a flag to launch the program
in a debug session. --gdb
launches the program in a gdb
session, while
--lldb
launches it in an lldb
session. For best results, you
should read this section to build Chapel and
build your application.
You can also just run the program with gdb
or lldb
directly. This
may be useful, for example if you want to use a graphical debugger like VSCode.
--gdb
and --lldb
are just convenience flags that do the following:
Source the command files to setup the debugger for Chapel
For GDB:
source $CHPL_HOME/runtime/etc/debug/gdb.commands
For LLDB:
command source $CHPL_HOME/runtime/etc/debug/lldb.commands
LLDB only: Enable the Chapel pretty-printer for LLDB, i.e.
command script import $CHPL_HOME/runtime/etc/debug/chpl_lldb_pretty_print.py
If specified, execute additional debugger commands from a file whose path is set in
CHPL_RT_DEBUGGER_CMD_FILE
If you are not using --gdb
or --lldb
, make sure to replicate the
above steps in your debugger of choice for the best experience.
Note
GDB/LLDB will not know about $CHPL_HOME
, you will need to expand that
variable to the actual path.
The following sections provide more information on debugging Chapel programs:
Useful Debug Features
Pretty Printing (LLDB only)
The Chapel pretty-printer for LLDB is automatically loaded when using the
--lldb
flag. If you are using LLDB without this flag, you can load the
pretty-printer manually by running the following command in LLDB:
command script import $CHPL_HOME/runtime/etc/debug/chpl_lldb_pretty_print.py
This pretty-printer understands a number of builtin Chapel types. This
overrides the default printing for many types when using p
(print
) or
v
(frame variable
). To circumvent this, you can use v -R
(frame
variable -R
) to print the raw value of a variable without the pretty-printer.
Using a Graphical Debugger
The Chapel VSCode extension provides a graphical debugging experience with
either gdb
or lldb
. See Debugging in VSCode for more information.
The Debugger.breakpoint statement
The Debugger
module provides a parenless function called
breakpoint
. This will cause an attached debugger to
automatically stop at calls to this function as a breakpoint.
Note
This requires b debuggerBreakHere
to be set in the debugger, which is
done automatically by the --gdb
and --lldb
flags. If you need a true
debug trap, see the debugTrap
function.
We continue to improve our debugging support for Chapel programs. If you find cases where the debugging experience could be improved, please let us know so that we can prioritize accordingly.