在 MacOS 中调试 Numba

Debugging Numba in MacOS

问题

我在使用 numba 运行 一些模拟时遇到分段错误(进程结束,退出代码 139(被信号 11 中断:SIGSEGV))。

我正在尝试按照 numba 文档 (https://numba.pydata.org/numba-doc/dev/user/troubleshoot.html#example-debug-usage) 上的说明进行操作,但我无法在我的 MacOS 上安装 GDB。

MacOS 上的 GDB

我已按照本网站上的说明在 MacOS 上安装 GDB https://www.thomasvitale.com/how-to-setup-gdb-and-eclipse-to-debug-c-files-on-macos-sierra/, 然而当执行

$ gdb python

在终端上,我收到以下警告,这使我无法调试代码:


warning: `/tmp/lto.o': can't open to read symbols: No such file or directory.
(No debugging symbols found in python)

lldb 和 Numba

我尝试过的另一个选项是使用 lldb 调试 Numba,但它似乎不起作用。

因此,我的问题是:如何在 MacOS 上调试 Numba?

macOS 处理调试信息的方式与其他系统略有不同。在大多数 Unix 系统上,编译器将调试信息发送到 .o 文件中。然后 linker 将调试信息复制到最终的可执行文件中。然后调试器从可执行文件中读取调试信息。由于调试信息通常很大,需要进行大量复制...因此在 macOS 上,我们将调试信息保留在 .o 文件中,而不是 linker 将 "debug map" 写入可执行文件。调试器的工作是找到 .o 文件并使用调试映射 link 调试信息。

听起来您正在使用的构建过程使用 "lto"(Link 时间优化),它获取所有 .o 文件并构建单个 .o 文件,然后 link编辑。这对于优化目的非常有用,因为您现在可以跨编译单元边界内联函数和其他类似的巧妙技巧。

但是需要保留该临时 lto 输出文件以便进行调试。在您的构建过程中似乎没有发生这种情况。

macOS 调试信息还有一步。如果您想长期存储调试信息,那么必须保留所有 .o 文件会很烦人,因此有一个工具 (dsymutil) 可以将调试信息从 .o 文件复制到“.dSYM”包中。您可能会看到您的构建过程是否说明了有关 dSYM 的任何信息,这可能是它如何从构建中保留调试信息?