16

pyodbc の segfaultに問題があり、Windows XP x86 でデバッグしたいと考えています。ただし、オンラインの情報は主に Linux 中心のようです。これについて最善の方法は何ですか?

4

4 に答える 4

15

そのため、Visual Studio 2008 を使用して問題を解決することができました。ここに記載されている手順に大まかに従いました。

http://www.velocityreviews.com/forums/t329214-debugging-python-extensions.html

そして、ここで回避策に関するいくつかのヒント -

MSVC で定義された DEBUG を使用して Python モジュールをコンパイルする

これは、この問題に遭遇する可能性のある他の人のための私のバージョンの手順です。

  1. まだ行っていない場合は、VS で Python ヘッダーと libs ディレクトリをセットアップしてください。

    を。[ツール] > [オプション] > [プロジェクトとソリューション] > [VC++ ディレクトリ]に移動します。インクルード ファイルとライブラリ ファイルのパスに、インクルードとライブラリのパスをそれぞれ追加してください。(例C:\Python27\include: C:\Python27\libs)

  2. Python のインクルード フォルダーに移動し (もう一度例を挙げますC:\Python27\include)、編集しますpyconfig.h。行をコメントアウトして# define Py_DEBUG保存します。libs フォルダー (例: C:\Python27\libs) に移動し、 のコピーを作成しますpython27.lib。コピーに名前を付けますpython27_d.lib

  3. 新しいプロジェクトを作成します。Win32 Projectを選択し、モジュール名に名前を付けます (私の場合は. Nextpyodbcをクリックし、 Application typeにDLLを選択し、 Empty Projectをチェックします。

  4. ソリューション エクスプローラーで、ヘッダー ファイルを右クリックし、[追加] > [既存の項目] を選択します。必要なヘッダー ファイルをすべて選択します。ソース ファイルについても同じことを行います。

  5. [プロジェクト] > [プロパティ]に移動し、[構成プロパティ]の下にある-

    を。一般- 正しい文字セットを使用していることを確認してください。私にとってはそうでしたUse Multi-Byte Character Set。Python 3 にはおそらくUse Unicode Character Set.

    b. デバッグ- [コマンド]フィールドに Python へのパスを入力します。(例C:\Python27\python.exe)。次に、[アタッチ]を に設定しYesます。

    c. [リンカー] > [一般] - [出力ファイル]の末尾.pyd.dll.

  6. 構成がデバッグに設定されていることを確認します。[ビルド] > [ソリューションのビルド]に移動します。

  7. cmd を開き、ファイルがコンパイルさcdれたディレクトリに移動します。pydコマンド ウィンドウから Python を起動します。この実行中の Python プロセスにデバッガーをアタッチするには、Visual Studio に戻り、緑色の再生ボタンをクリックしてデバッグを開始します。Debugging -> Attach to Process... を使用することもできます。Python に戻り、モジュールをインポートします。遊んで、テストして、それを壊してみてください!

于 2012-08-01T22:23:46.657 に答える
11

WinDbg を使用したワークフローのデバッグ

このワークフローでは、リリース ビルドのデバッグ情報が作成されるため、Python の元のインクルード ファイルとライブラリ ファイルをいじる必要はありません。

  1. Windows 用デバッグ ツールをダウンロードしてインストールする

  2. Python バージョンのシンボル ファイルを取得して展開します。Python 2.7.3 の場合、これはhttp://www.python.org/ftp/python/2.7.3/python-2.7.3-pdb.zipになります。

  3. 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'])
                    ]
    
  4. いつものように拡張機能をビルドします ( python setup.py ...)。

  5. 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 モジュールに必要なシンボルをダウンロードしてキャッシュします。

  6. Python 実行可能ファイルを開始します (Ctrl + E)。スクリプトを直接実行するか、対話モードで実行できます。

  7. "Go" (F5) で最初のブレークポイントをスキップします。

  8. セグメンテーション エラーが発生すると、実行が中断 され、WinDbg コンソールにアクセス違反 - コード c0000005 (最初のチャンス)のようなものが表示されます。

  9. 詳細な例外情報を取得する!analyze -v には、WinDbg コンソールに入力し、現在のスタック トレースをkb. このような出力の例を次に示します。

2番目のステップを省略してリリース構成でプロジェクトをビルドすると 、このアプローチを pyrospade の答えと組み合わせて Visual Studio でデバッグできるはずです 。

WinDbg の詳細なチュートリアルは、こちらにあります

于 2013-03-07T08:03:37.383 に答える
2

Segfault は、Python コードからトラップする方法がなく、C 側で多くのスタック トレース情報を取得する方法さえないため、特に不可解です。少なくとももう少し情報を得ることができることの 1 つは、Google ブレークパッド C ライブラリを使用して、 segfaultが発生したときに C スタック トレースを報告することです。

于 2012-07-29T23:42:06.863 に答える
0

CPyCheckerC 拡張機能のメモリ リークやその他のバグを静的に分析する David Malcolm のツールを試してみてください。このツールは、ここに文書化されています

于 2014-03-23T23:58:21.990 に答える