调试 C 扩展#

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

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

  1. 基础 Python 调试 — 第 1 部分 — Python

  2. 基础 Python 调试 — 第 2 部分 — Python 扩展

  3. 基础 Python 调试 — 第 3 部分 — Cython 扩展

本地调试#

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

pip install -ve . --no-build-isolation -Cbuilddir="debug" -Csetup-args="-Dbuildtype=debug"

注意

conda 环境会更新 CFLAGS/CPPFLAGS,其中包含用于生成发布的标志,这些标志可能与开发环境中的使用相悖。如果使用 conda,您应该通过 export CFLAGS=export CPPFLAGS= 取消设置这些环境变量。

通过指定 builddir="debug",所有目标都将在项目根目录下的 debug 目录中构建和放置。这有助于将调试和发布产物分开;当然,您也可以选择其他目录名称,或者如果您不关心区分构建类型,则可以省略。

使用 cygdb 进行 Cython 调试#

对于 Cython 扩展的调试,推荐使用 cygdbcygdb 调试器随 Cython 一起预装,因此如果您已在开发环境中安装了 Cython,则应该已经可以使用它了。

在用调试符号构建 pandas(如上所示)后,您可以导航到构建文件夹并启动调试器来使用 cygdb。

cd debug
cygdb

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

编辑器支持#

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

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

ln -s debug/compile_commands.json .