2013-03-06 24 views
13

Próbuję debugować moduł rozszerzeń dla Pythona, który napisałem w C. I skompilowany przy użyciu następujących:Python rozszerzenie debugowanie

python setup.py build -g install --user 

Potem debugowania z:

gdb python 
... 
b py_node_make 
run test.py 

To przerwy w py_node_make (jedna z funkcji I określonych), ale wtedy staram:

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

funkcja próbuję debugowania jest:

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

Odpowiedz

15

Aby debugowanie źródłowe działało, twoje rozszerzenia C muszą być zbudowane z informacjami debugowania (gcc -g). Skoro jedziesz proces kompilacji z distutils można określić flagi kompilatora używane przez flagami zmienną środowiskową (Installing Python Modules: Tweaking compiler/linker flags):

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

Zauważ, że nawet jeśli distutils domyślnie wyższym poziomie niż optymalizacji - O0, to naprawdę nie powinien dostać że nie symbol „węzła” w obecnym kontekście błędu dopóki -g przepuszcza i najbardziej Python buduje przechodzą -g domyślnie.

+0

Uważam, że problem polegał na tym, że funkcja została całkowicie zoptymalizowana. Wiem, że flaga -g została ustawiona, ponieważ inne funkcje tu i tam i mnóstwo informacji, po prostu nie py_node_make. – CrazyCasta

+0

Rozumiem. py_node_make() była małą funkcją statyczną i głównym celem do inlineing. Ustawienie punktu przerwania nadal działało, ale nazwa argumentu ** węzeł ** została utracona. – scottt

3

Problem polega na optymalizacji. Nie jestem pewien, jak to zrobić z wiersza poleceń, ale w skrypcie setup.py właśnie dodałem extra_compile_args=['-O0'], do konstruktora Extension i wszystko działało.

Nadal chciałbym (i zaakceptował) odpowiedź, która dotyczyłaby wiersza poleceń (coś po python setup.py build), który wykonałby to samo, więc nie muszę mieć wiersza kompilatora w moim pliku setup.py.