16

Cで書いたPythonの拡張モジュールをデバッグしようとしています。次を使用してコンパイルしました。

python setup.py build -g install --user

次に、次のコマンドでデバッグします。

gdb python
...
b py_node_make
run test.py

py_node_make(私が定義した関数の1つ)で壊れますが、それから私は試します:

(gdb) print node
No symbol "node" in current context.

私がデバッグしようとしている関数は次のとおりです。

static Python_node_t* py_node_make(
        node_t* node)
{
    Python_node_t* pyNode;

    pyNode = PyObject_New(Python_node_t, &t_node);
    pyNode->node = node;
    pyNode->borrowed = true;

    return pyNode;
}
4

2 に答える 2

19

ソースデバッグを機能させるには、C拡張機能をデバッグ情報()を使用して構築する必要がありますgcc -g。でコンパイルプロセスを駆動しているので、 CFLAGS環境変数distutilsを介して使用されるコンパイラフラグを指定できます( Pythonモジュールのインストール:コンパイラ/リンカーフラグの調整):

CFLAGS='-Wall -O0 -g' python setup.py build

distutilsのデフォルトが-O0よりも高い最適化レベルであっても、 -gが渡され、ほとんどのPythonビルドがデフォルトで-gを渡す限り、現在のコンテキストエラーでNosymbol"node"を取得するべきではないことに注意してください。

于 2013-03-09T00:05:47.720 に答える
3

問題は最適化です。コマンドラインからそれを行う方法はわかりませんが、setup.pyスクリプトでextra_compile_args=['-O0'],Extensionコンストラクターに追加しただけで、すべてが機能しました。

同じことを実行するコマンドライン引数(後の何か)を含む回答がまだ必要です(そして受け入れます)python setup.py buildので、setup.pyファイルにコンパイラ固有の行を含める必要はありません。

于 2013-03-06T18:02:15.887 に答える