调试 C 扩展#
Pandas 使用 Cython 和 C/C++ 扩展模块 来优化性能。不幸的是,标准的 Python 调试器不允许您进入这些扩展。Cython 扩展可以使用 Cython 调试器 进行调试,而 C/C++ 扩展可以使用平台编译器附带的工具进行调试。
对于 C/C++ 经验有限或没有 C/C++ 经验的 Python 开发者来说,这可能看起来是一项艰巨的任务。核心开发者 Will Ayd 撰写了一个由三部分组成的系列博客,旨在帮助您从标准 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 .