调试 C 扩展#
Pandas 使用 Cython 和 C/C++ extension modules 来优化性能。不幸的是,标准的 Python 调试器不允许您单步调试这些扩展。Cython 扩展可以使用 Cython debugger 进行调试,而 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 commands 来导航 Cython 扩展。
编辑器支持#
meson 构建系统会自动生成一个 compilation database 并在构建目录中放置它。许多语言服务器和 IDE 可以利用此信息,在您键入时提供代码补全、跳转到定义和错误检查支持。
每个语言服务器/IDE 查找编译数据库的方式可能会有所不同。如有疑问,您可能需要在项目根目录下创建一个指向构建目录中编译数据库的符号链接。假设您使用了 debug 作为目录名称,您可以运行:
ln -s debug/compile_commands.json .