2013-03-06 139 views
13

我試圖調試用於Python的擴展模塊,我在C.我寫使用以下編譯它:Python擴展調試

python setup.py build -g install --user 

然後我和調試:

gdb python 
... 
b py_node_make 
run test.py 

它在py_node_make休息(我所定義的功能之一),但後來我嘗試:

(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; 
} 

回答

15

要使源代碼調試工作,必須使用調試信息(gcc -g)構建您的C擴展。既然你開車的編譯過程與distutils,您可以指定通過CFLAGS使用環境變量(Installing Python Modules: Tweaking compiler/linker flags)編譯器標誌:

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

請注意,即使distutils的默認更高的優化級別比- O0,你真的不應該得到那當前上下文中沒有符號「節點」錯誤只要-g被傳遞並且大多數Python編譯默認通過-g

+0

我相信麻煩的是該功能被完全優化了。我知道-g標誌被設置,因爲其他函數在這裏和那裏有很多信息,只是不是py_node_make。 – CrazyCasta 2013-03-09 05:41:53

+0

我明白了。 py_node_make()是一個小的靜態函數,也是嵌入的主要目標。在其上設置斷點仍然有效,但參數名稱** node **丟失。 – scottt 2013-03-09 09:24:20

3

問題是優化。我不知道如何從命令行執行它,但在setup.py腳本中,我只是將extra_compile_args=['-O0'],添加到Extension構造函數,並且一切正常。

仍然會喜歡(也會接受)一個涉及命令行參數(在python setup.py build之後)的答案,它可以完成同樣的任務,所以我不必在setup.py文件中具有編譯器特定的行。