6

私は時々 gdb を使って Python スクリプトをデバッグします (もちろん CPython)。これは通常、コア ダンプをデバッグするのに役立ちます (および c 拡張モジュールが含まれる場合)。

基本的な質問は、gdb で Python 関数にブレークポイントを設定する方法です。関数 foo を持つ Python スクリプトがあり、foo が呼び出された直後にブレークしたいとします。条件付きブレークポイントを設定するPyEval_EvalFrameExとうまくいくと思いますが、その方法がわかりません。

4

1 に答える 1

1

あなたが提案した手法を使用すると、これはうまくいきます(きれいではありませんが):

break PyEval_EvalFrameEx if (strcmp((((PyStringObject *)(f->f_code->co_name))->ob_sval), "foo") == 0)

ここで、f は PyFrameObject です。また、正しいファイルがあることを確認するためにチェックすることもf->f_code->co_filenameできます。多くのブレークと比較を行っているため、これによりプログラムがかなり遅くなることに注意してください。

GDB 7 には、CPython を扱うための優れたヘルパー マクロがいくつかありますが、私はそれらに慣れていません。それらで探しているものを達成するためのより良い方法がおそらくあります。

于 2013-03-06T06:31:42.753 に答える