调试 C 扩展#

Pandas 使用 Cython 和 C/C++ 扩展模块 来优化性能。不幸的是,标准 Python 调试器不允许您进入这些扩展。Cython 扩展可以使用 Cython 调试器 进行调试,而 C/C++ 扩展可以使用平台编译器提供的工具进行调试。

对于 C/C++ 经验有限或没有的 Python 开发人员来说,这似乎是一项艰巨的任务。核心开发者 Will Ayd 撰写了一个包含 3 部分的博客系列,以帮助您从标准 Python 调试器过渡到这些其他工具。

本地调试#

默认情况下,从源代码构建 pandas 将生成一个发布版本。要生成开发版本,您可以键入

pip install -ve . --no-build-isolation --config-settings=builddir="debug" --config-settings=setup-args="-Dbuildtype=debug"

注意

conda 环境更新 CFLAGS/CPPFLAGS,使用针对生成发行版的标志。如果使用 conda,您可能需要设置 CFLAGS="$CFLAGS -O0"CPPFLAGS="$CPPFLAGS -O0" 以确保禁用优化以进行调试

通过指定 builddir="debug",所有目标将被构建并放置在相对于项目根目录的 debug 目录中。这有助于将您的调试和发布工件分开;当然,您可以选择不同的目录名称或完全省略,如果您不关心分离构建类型。

使用 Docker#

为了简化调试过程,pandas 创建了一个 Docker 镜像,其中包含 Python 的调试构建以及预安装的 gdb/Cython 调试器。您可以 docker pull pandas/pandas-debug 获取此镜像,也可以从本地 tooling/debug 文件夹构建它。

然后,您可以将您的 pandas 存储库挂载到此镜像中,方法是

docker run --rm -it -w /data -v ${PWD}:/data pandas/pandas-debug

在镜像内部,您可以使用 meson 构建/安装 pandas 并将构建工件放置到 debug 文件夹中,使用以下命令

python -m pip install -ve . --no-build-isolation --config-settings=builddir="debug" --config-settings=setup-args="-Dbuildtype=debug"

如果计划使用 cygdb,该应用程序所需的文件将放置在构建文件夹中。因此,您必须先 cd 到构建文件夹,然后启动该应用程序。

cd debug
cygdb

在调试器中,您可以使用 cygdb 命令 导航 cython 扩展。

编辑器支持#

meson 构建系统会自动生成一个 编译数据库 并将其放置在构建目录中。许多语言服务器和 IDE 可以使用此信息在您键入时提供代码完成、转到定义和错误检查支持。

每个语言服务器/IDE 选择查找编译数据库的方式可能会有所不同。如有疑问,您可能需要在项目的根目录创建一个指向构建目录中编译数据库的符号链接。假设您使用的是 *debug* 作为您的目录名称,您可以运行

ln -s debug/compile_commands.json .