C拡張のデバッグ#
Pandasは、パフォーマンスを最適化するためにCythonとC/C++拡張モジュールを使用しています。残念ながら、標準のPythonデバッガでは、これらの拡張モジュール内部をステップ実行することはできません。Cython拡張はCythonデバッガで、C/C++拡張はプラットフォームのコンパイラに付属のツールを使用してデバッグできます。
C/C++の経験がほとんどない、またはまったくないPython開発者にとっては、これは難しい作業に見えるかもしれません。コア開発者のWill Aydは、標準のPythonデバッガからこれらの他のツールへとガイドする3部構成のブログシリーズを作成しました。
ローカルでのデバッグ#
デフォルトでは、ソースから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は、デバッグビルドの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 --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 .