调试 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 .