调试 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"将构建所有目标并将其放置在相对于项目根目录的调试目录中。这有助于将调试和发布工件分开;如果您不介意分离构建类型,您当然可以选择不同的目录名称或完全省略。

使用 Docker #

为了简化调试过程,pandas 创建了一个 Docker 镜像,其中预装了 Python 调试版本和 gdb/Cython 调试器。您可以访问此图像或从本地文件夹构建它。docker pull pandas/pandas-debugtooling/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 .