1

Python で書かれたいくつかの単体テストを実行する必要があります。C++ でテストするコードがあるので、それを共有オブジェクトにコンパイルし、swig を使用して、Python スクリプトがテストに必要な API を呼び出すためのインターフェイスを提供します。

Python スクリプトの 1 つを実行すると (明らかに、テストしようとしている C++ コードベースにアクセスしています)、「glibc が free() を検出しました: 無効なポインター」というメッセージが表示されます。これで、二重解放またはアクセスできないメモリを解放しているというメモリの問題があることがわかりました。今私があなたの専門家に要求していること:

1]私はバックトレースを取得していません(行番号もありません)、問題がどこで発生しているかを知る方法はありますか? ある時点でスクリプトが突然停止し、次のような情報を出力する以外の情報は得られません
*** glibc が検出されました*
free(): 無効 なポインター: 0x099e9b28 *** いくつかのフラグを設定することによって可能性がありますか?

2] 私は valgrind を実行しました:
"valgrind --leak-check=yes ./myscript.py"
私はそれからいくつかの行を取得しませんでした:
glibc detected free(): invalid pointer: 0x099e9b28
==25728==
== 25728== 条件付きジャンプまたは移動は初期化されていない値に依存します
==25728== at 0x625AEA: PyObject_Free (in /usr/lib/libpython2.3.so.1.0)
==25728== by 0x614C7F: (in /usr /lib/libpython2.3.so.1.0)
==25728== by 0x61EA53: (/usr/lib/libpython2.3.so.1.0 内)

基本的に自分のコードに関連するものは何も得られません。valgrindで他にすべきことはありますか。

3] printfs を試してみましたが、実際には何も起こりませんでした。
4] gdb を試してみました:
prompt>gdb python
gdb> set args myscript.py
gdb> run

これによりスクリプトが実行され、ブレークポイントを設定できませんでした。実行されてエラーが出力されます。絶対的な助けはありません。GDBで他にすべきことはありますか? ブレークポイントを設定する方法はありますか?

皆さんが私に与えることができるあらゆる種類のポインタに感謝します。

4

2 に答える 2

1

やっとわかった!コマンド
ulimit -c unlimited を実行しました

この後、コア ダンプが表示され、
gdb /usr/bin/python2.3 core.31685を介して分析できるようになりました。

于 2013-03-07T06:48:24.340 に答える
0

Google のヒープ チェッカーを使用して、この種の問題を正常にデバッグしました。割り当てと解放の両方のポイントのスタック トレースが表示されます。

于 2013-03-06T20:40:29.077 に答える