pyodbc の segfaultに問題があり、Windows XP x86 でデバッグしたいと考えています。ただし、オンラインの情報は主に Linux 中心のようです。これについて最善の方法は何ですか?
4 に答える
そのため、Visual Studio 2008 を使用して問題を解決することができました。ここに記載されている手順に大まかに従いました。
http://www.velocityreviews.com/forums/t329214-debugging-python-extensions.html
そして、ここで回避策に関するいくつかのヒント -
MSVC で定義された DEBUG を使用して Python モジュールをコンパイルする
これは、この問題に遭遇する可能性のある他の人のための私のバージョンの手順です。
まだ行っていない場合は、VS で Python ヘッダーと libs ディレクトリをセットアップしてください。
を。[ツール] > [オプション] > [プロジェクトとソリューション] > [VC++ ディレクトリ]に移動します。インクルード ファイルとライブラリ ファイルのパスに、インクルードとライブラリのパスをそれぞれ追加してください。(例
C:\Python27\include
:C:\Python27\libs
)Python のインクルード フォルダーに移動し (もう一度例を挙げます
C:\Python27\include
)、編集しますpyconfig.h
。行をコメントアウトして# define Py_DEBUG
保存します。libs フォルダー (例:C:\Python27\libs
) に移動し、 のコピーを作成しますpython27.lib
。コピーに名前を付けますpython27_d.lib
。新しいプロジェクトを作成します。Win32 Projectを選択し、モジュール名に名前を付けます (私の場合は. Next
pyodbc
をクリックし、 Application typeにDLLを選択し、 Empty Projectをチェックします。ソリューション エクスプローラーで、ヘッダー ファイルを右クリックし、[追加] > [既存の項目] を選択します。必要なヘッダー ファイルをすべて選択します。ソース ファイルについても同じことを行います。
[プロジェクト] > [プロパティ]に移動し、[構成プロパティ]の下にある-
を。一般- 正しい文字セットを使用していることを確認してください。私にとってはそうでした
Use Multi-Byte Character Set
。Python 3 にはおそらくUse Unicode Character Set
.b. デバッグ- [コマンド]フィールドに Python へのパスを入力します。(例
C:\Python27\python.exe
)。次に、[アタッチ]を に設定しYes
ます。c. [リンカー] > [一般] - [出力ファイル]の末尾
.pyd
を.dll
.構成がデバッグに設定されていることを確認します。[ビルド] > [ソリューションのビルド]に移動します。
cmd を開き、ファイルがコンパイルさ
cd
れたディレクトリに移動します。pyd
コマンド ウィンドウから Python を起動します。この実行中の Python プロセスにデバッガーをアタッチするには、Visual Studio に戻り、緑色の再生ボタンをクリックしてデバッグを開始します。Debugging -> Attach to Process... を使用することもできます。Python に戻り、モジュールをインポートします。遊んで、テストして、それを壊してみてください!
WinDbg を使用したワークフローのデバッグ
このワークフローでは、リリース ビルドのデバッグ情報が作成されるため、Python の元のインクルード ファイルとライブラリ ファイルをいじる必要はありません。
Windows 用デバッグ ツールをダウンロードしてインストールする
Python バージョンのシンボル ファイルを取得して展開します。Python 2.7.3 の場合、これはhttp://www.python.org/ftp/python/2.7.3/python-2.7.3-pdb.zipになります。
setup.py
デバッグ ファイルを生成するように変更します。とに追加する必要が'/Zi'
ありextra_compile_args
ます。例:'/DEBUG'
extra_link_args
ext_modules = [Extension('pyuv', sources=['src/pyuv.c'], extra_compile_args=['/Zi'], extra_link_args=['/DEBUG']) ]
いつものように拡張機能をビルドします (
python setup.py ...
)。WinDbg を起動し、シンボル検索パスを指定します (Ctrl + S)。
C:\Path\To\Extension_pdb C:\Path\To\Extracted\python-2.7.3-pdb srv*;SRV*c:\tmp*http://msdl.microsoft.com/download/symbols
最後の行は、Windows モジュールに必要なシンボルをダウンロードしてキャッシュします。
Python 実行可能ファイルを開始します (Ctrl + E)。スクリプトを直接実行するか、対話モードで実行できます。
"Go" (F5) で最初のブレークポイントをスキップします。
セグメンテーション エラーが発生すると、実行が中断 され、WinDbg コンソールにアクセス違反 - コード c0000005 (最初のチャンス)のようなものが表示されます。
詳細な例外情報を取得する
!analyze -v
には、WinDbg コンソールに入力し、現在のスタック トレースをkb
. このような出力の例を次に示します。
2番目のステップを省略してリリース構成でプロジェクトをビルドすると 、このアプローチを pyrospade の答えと組み合わせて Visual Studio でデバッグできるはずです 。
WinDbg の詳細なチュートリアルは、こちらにあります。
Segfault は、Python コードからトラップする方法がなく、C 側で多くのスタック トレース情報を取得する方法さえないため、特に不可解です。少なくとももう少し情報を得ることができることの 1 つは、Google ブレークパッド C ライブラリを使用して、 segfaultが発生したときに C スタック トレースを報告することです。
CPyChecker
C 拡張機能のメモリ リークやその他のバグを静的に分析する David Malcolm のツールを試してみてください。このツールは、ここに文書化されています。