2011-12-28 4 views
2

私はいくつかのPython C-extensionsをまとめました。それぞれの動作が検証されましたが、refcountデバッグによってこれを検証したいと思います。Python C-extensionのrefcountを最も簡単にデバッグする方法はありますか?

INC/DECリファレンスが正しく挿入されたことを確認するにはどうすればよいですか?私はブラックボックスの観点からこの検証をしたい、つまり、すべてのrefcountが正しく実行されていれば、関数の入出力がどのように見えるのでしょうか?

私の最初のアプローチは、sys.getrefcount(obj)を使用し、すべての入出力オブジェクトのrefcountをチェックして、それらが正常であることを確認することです。次に、メモリリークがないことを確認するために使用されたメモリをチェックすることもできます。

私はこれまでにこれまでにこれをしたことがないので、これを行う最も簡単で正しい方法は何ですか?

ご注意: を私はCythonスタイルライブラリを使用したくない、私はむしろCの核心にしてください基本を学ぶために自分自身をザラザラ。

解決策:私はデバッグ対応のPythonインタープリタを作成しました。私はそれが難しいと思ったが、そうではなかった。このrecipeに従って、これらの正確な行をObjects/object.cに追加しました。私がダウンロードしたPythonのソースディレクトリにしなければならなかったすべてのことの後だった。この新しいインタプリタにC-拡張を構築に関して

./configure --with-pydebug --prefix=/usr/local/python/ 
make 
make install 

、その前に行われなければならなかったことすべてがinclude_dirsタグを指すようにしましたsetup.pyから'/usr/local/python/include/python2.7'の内線番号を入力し、新しいインタプリタでbuildコマンドとinstallコマンドを実行します。それが完了したら、Cコードに_Py_CountReferences(stderr);行を追加するだけで、refcountはstderr(コンソール)にダンプされます。 refcountをどのように変更するか、コードが進むにつれてインクリメント/デクリメントする方法を知ることはとても良いことです。

答えて

1

1つの提案:Pythonインタプリタをデバッグモードでコンパイルします(--with-pydebug)。このインタプリタを使用して、エクステンションをコンパイルしてテストします。インタプリタはオブジェクトの総数のカウントを表示します。この合計は、テストの繰り返しを繰り返すにつれて増加しません。あなたのコードのすべての可能な出口パスをテストすることを確認してください - 例外が発生したときにオブジェクトをDECREFに忘れてしまいました。

+0

私はいくつかのブログ記事でそれについて読んでいます。私はおそらく私が通訳をコンパイルすることなくそれをすることができると思った。しかし、それが私に知る必要があるすべてを私に伝えれば、それを行う最良の方法だと思います。私はこれのためにvirtualenvを設定できますか? – c00kiemonster

+0

私はvirtualenvの経験がありません。ドキュメントのクイックスキャンは、virtualenvが同じバージョンのPython用に異なる環境を作成することを意味しています。この場合、少し違うバージョンのPythonをコンパイルします。私はvirtualenvがそれを助けるかどうかわからない。 – casevh

+0

私はPythonのデバッグ版をビルドすることができました。私のC-エクステンションはそれに対してリンクしてコンパイルします。しかし今、どういうふうに情報にアクセスするのですか?私は_Py_CountReferencesを[this](http://code.activestate.com/recipes/67112-help-in-debugging-memory-problems/)の例(Python cookbookから取りました)から動作させようとしていますが、動作しません。コンパイラは、 'COUNTREFS();'行を挿入しようとすると文句を言う。 – c00kiemonster

関連する問題