-
Notifications
You must be signed in to change notification settings - Fork 161
Debugging C kernels with lldb on MacOS
When using MacOS one is, generally, forced to use lldb
for debugging C code on the command line.
A list of lldb
commands can be found in this cheat sheet, though generally gdb
commands work as expected.
lldb
can be used to debug C code that has been generated with Firedrake by doing the following:
- Apply this patch to PyOP2:
diff --git a/pyop2/compilation.py b/pyop2/compilation.py
index 8fd7bf02..f5cd18b8 100644
--- a/pyop2/compilation.py
+++ b/pyop2/compilation.py
@@ -315,7 +315,7 @@ class Compiler(ABC):
soname = os.path.join(cachedir, "%s.so" % basename)
# Link into temporary file, then rename to shared library
# atomically (avoiding races).
- tmpname = os.path.join(cachedir, "%s_p%d.so.tmp" % (basename, pid))
+ # tmpname = os.path.join(cachedir, "%s_p%d.so.tmp" % (basename, pid))
if configuration['check_src_hashes'] or configuration['debug']:
matching = self.comm.allreduce(basename, op=_check_op)
@@ -347,7 +347,7 @@ class Compiler(ABC):
if not self.ld:
cc = (compiler,) \
+ compiler_flags \
- + ('-o', tmpname, cname) \
+ + ('-o', soname, cname) \
+ self.ldflags
debug('Compilation command: %s', ' '.join(cc))
with open(logfile, "w") as log, open(errfile, "w") as err:
@@ -375,7 +375,7 @@ Compile errors in %s""" % (e.cmd, e.returncode, logfile, errfile))
+ ('-c', '-o', oname, cname)
# Extract linker specific "cflags" from ldflags
ld = tuple(shlex.split(self.ld)) \
- + ('-o', tmpname, oname) \
+ + ('-o', soname, oname) \
+ tuple(self.expandWl(self.ldflags))
debug('Compilation command: %s', ' '.join(cc))
debug('Link command: %s', ' '.join(ld))
@@ -408,7 +408,7 @@ Unable to compile code
Compile log in %s
Compile errors in %s""" % (e.cmd, e.returncode, logfile, errfile))
# Atomically ensure soname exists
- os.rename(tmpname, soname)
+ # os.rename(tmpname, soname)
# Wait for compilation to complete
self.comm.barrier()
# Load resulting library
(correct as of 24th of May 2023).
To quote Lawrence, this diff
... turns off the compilation into a temp file and then renaming (which we do for parallel filesystem safety reasons) ... but that renaming defeats the debug symbol tracking on macos where the debug symbols are in a separate file from the shared library
-
Make sure the cache is empty by running
firedrake-clean
with the venv activated. -
Still on the command line, switch on debugging symbols in PyOP2 and run lldb:
export PYOP2_DEBUG=1
lldb -- python script.py
breakpoint set -n name_of_function
run
continue
Note that we have to use breakpoint set -n name_of_function
since our generated code will not necessarily be in the same location as our usual firedrake source code (so we can't do, say breakpoint set --file test.c --line 12
as listed in this LLDB cheat sheet).
We have to set lldb
running with the run
command (it starts in a repl mode but knows which file it needs to run).
The continue
command continues after an inital stop due to exec
(don't ask my why).
Reuben Nixon-Hill, 2022
Building locally
Tips
- Running Firedrake tests with different subpackage branches
- Modifying and Rebuilding PETSc and petsc4py
- Vectorisation
- Debugging C kernels with
lldb
on MacOS - Parallel MPI Debugging with
tmux-mpi
,pdb
andgdb
- Parallel MPI Debugging with VSCode and
debugpy
- Modifying generated code
- Kernel profiling with LIKWID
- breakpoint() builtin not working
- Debugging pytest with multiple processing
Developers Notes
- Upcoming meeting 2024-08-21
- 2024-08-07
- 2024-07-24
- 2024-07-17
- 2024-07-10
- 2024-06-26
- 2024-06-19
- 2024-06-05
- 2024-05-29
- 2024-05-15
- 2024-05-08
- 2024-05-01
- 2024-04-28
- 2024-04-17
- 2024-04-10
- 2024-04-03
- 2024-03-27
- 2024-03-20
- 2024-03-06
- 2024-02-28
- 2024-02-28
- 2024-02-21
- 2024-02-14
- 2024-02-07
- 2024-01-31
- 2024-01-24
- 2024-01-17
- 2024-01-10
- 2023-12-13
- 2023-12-06
- 2023-11-29
- 2023-11-22
- 2023-11-15
- 2023-11-08
- 2023-11-01
- 2023-10-25
- 2023-10-18
- 2023-10-11
- 2023-10-04
- 2023-09-27
- 2023-09-20
- 2023-09-06
- 2023-08-30
- 2023-08-23
- 2023-07-12
- 2023-07-05
- 2023-06-21
- 2023-06-14
- 2023-06-07
- 2023-05-17
- 2023-05-10
- 2023-03-08
- 2023-02-22
- 2023-02-15
- 2023-02-08
- 2023-01-18
- 2023-01-11
- 2023-12-14
- 2022-12-07
- 2022-11-23
- 2022-11-16
- 2022-11-09
- 2022-11-02
- 2022-10-26
- 2022-10-12
- 2022-10-05
- 2022-09-28
- 2022-09-21
- 2022-09-14
- 2022-09-07
- 2022-08-25
- 2022-08-11
- 2022-08-04
- 2022-07-28
- 2022-07-21
- 2022-07-07
- 2022-06-30
- 2022-06-23
- 2022-06-16
- 2022-05-26
- 2022-05-19
- 2022-05-12
- 2022-05-05
- 2022-04-21
- 2022-04-07
- 2022-03-17
- 2022-03-03
- 2022-02-24
- 2022-02-10
- 2022-02-03
- 2022-01-27
- 2022-01-20
- 2022-01-13
- 2021-12-15
- 2021-12-09
- 2021-11-25
- 2021-11-18
- 2021-11-11
- 2021-11-04
- 2021-10-28
- 2021-10-21
- 2021-10-14
- 2021-10-07
- 2021-09-30
- 2021-09-23
- 2021-09-09
- 2021-09-02
- 2021-08-26
- 2021-08-18
- 2021-08-11
- 2021-08-04
- 2021-07-28
- 2021-07-21
- 2021-07-14
- 2021-07-07
- 2021-06-30
- 2021-06-23
- 2021-06-16
- 2021-06-09
- 2021-06-02
- 2021-05-19
- 2021-05-12
- 2021-05-05
- 2021-04-28
- 2021-04-21
- 2021-04-14
- 2021-04-07
- 2021-03-17
- 2021-03-10
- 2021-02-24
- 2021-02-17
- 2021-02-10
- 2021-02-03
- 2021-01-27
- 2021-01-20
- 2021-01-13
- 2021-01-06