调试 C 扩展#
pandas 使用 Cython 和 C/C++ 扩展模块 来优化性能。不幸的是,标准的 Python 调试器不允许你进入这些扩展。Cython 扩展可以使用 Cython 调试器 进行调试,而 C/C++ 扩展可以使用你的平台编译器附带的工具进行调试。
对于有有限或没有C/C++经验的Python开发人员来说,这可能看起来是一项艰巨的任务。核心开发者Will Ayd撰写了一个3部分的博客系列,帮助你从标准的Python调试器引导到这些其他工具:
本地调试#
默认情况下,从源代码构建 pandas 将生成一个发布版本。要生成一个开发版本,你可以输入:
pip install -ve . --no-build-isolation -Cbuilddir="debug" -Csetup-args="-Dbuildtype=debug"
备注
conda 环境更新 CFLAGS/CPPFLAGS 时会使用倾向于生成发布的标志。如果使用 conda,你可能需要设置 CFLAGS="$CFLAGS -O0"
和 CPPFLAGS="$CPPFLAGS -O0"
以确保优化在调试时被关闭。
通过指定 builddir="debug"
,所有目标将被构建并放置在与项目根目录相对的 debug 目录中。这有助于将您的调试和发布制品分开;当然,您可以选择不同的目录名称或完全省略,如果您不关心分离构建类型的话。
使用 Docker#
为了简化调试过程,pandas 创建了一个包含调试版 Python 和预安装的 gdb/Cython 调试器的 Docker 镜像。你可以通过 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 -Cbuilddir="debug" -Csetup-args="-Dbuildtype=debug"
如果计划使用 cygdb,该应用程序所需的文件放置在构建文件夹中。因此,您必须首先 cd
到构建文件夹,然后启动该应用程序。
cd debug
cygdb
在调试器中,您可以使用 cygdb 命令 来导航 cython 扩展。
编辑器支持#
meson 构建系统会自动生成一个 编译数据库 并将其放置在构建目录中。许多语言服务器和 IDE 可以使用这些信息来提供代码补全、跳转到定义和错误检查支持,就像你输入的那样。
每个语言服务器 / IDE 如何选择查找编译数据库可能会有所不同。如果有疑问,您可能希望在项目根目录创建一个指向构建目录中编译数据库的符号链接。假设您使用了 debug 作为目录名称,您可以运行:
ln -s debug/compile_commands.json .