Debugging AMICI

This document contains some information on how to debug any issues in AMICI, in particular for C++ Python extensions.

Caveman debugging / printf-debugging

The simplest approach may often be adding some print-statements to the code, as this does not require any special tools.

Note that after each change of the C++ files, the AMICI extension as well as the model extension (if any model functions are called), need to be recompiled. The simplest and safest approach would be re-installation of the amici package and re-import of the model. As this can be very time-consuming, the following shortcut is possible, assuming you are using a development installation (pip install -e ...):

# rebuild the amici base extension, from within the amici root directory
# (note that this only recompiles the amici source files, NOT third-party
# dependencies such as sundials):
cd python/sdist/
python setup.py build_ext --build-lib .

# rebuild the model, from within the model package directory:
python setup.py build_ext --force --build-lib .

Note: Be careful when working interactively, Python may not pick up any changes in already imported modules. The safest is to start a new Python process after any changes.

Using a proper debugger

Debugging with with [gdb](https://www.sourceware.org/gdb/) is most convenient with a minimal reproducible example that is directly invoked from gdb. For example:

# start gdb
gdb --args python -m pytest ../tests/test_sbml_import.py::test_nosensi

# inside gdb, set a meaningful breakpoint and launch:
break amici::runAmiciSimulation
run
# ... (see one of the many gdb tutorials)

Alternative, gdb can attach to a running process by passing the --pid argument.

For many users, it may be more convenient to use gdb via some graphical user interface as provided by various C++ IDEs.

Note

For better debugging experience, but at the cost of runtime performance, consider building the amici and model extension with environment variable ENABLE_AMICI_DEBUGGING=TRUE. This will include debugging symbols and disable compiler optimizations.