2012-11-30 10 views
5

Sto provando a eseguire il debug di codice c/C++ situato in librerie condivise che vengono caricate da ctypes.cdll.LoadLibrary() in python e successivamente vengono chiamate funzioni specifiche da python. Il codice python forca i processi figlio, quindi devo essere in grado di interrompere se la funzione c viene chiamata da un processo padre o figlio python. Un morto-semplice esempio: test.cgdb: interruzione nella libreria condivisa caricata da python

// j = clib.call1(i) 
int call1(int i) 
{ 
    return i*2; 
} 

test.py

import os, sys, ctypes 
path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), "test.so")) 
clib = ctypes.cdll.LoadLibrary(path) 
i = 20 
j = clib.call1(i) 
print "i=%d j=%d\n" %(i, j) 


$ gcc -g -O0 test.c -shared -o test.so 
$ gdb --args python-dbg test.py 
(gdb) break test.c call1 
Function "test.c call1" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 1 (test.c call1) pending. 
(gdb) info breakpoints 
Num  Type   Disp Enb Address What 
1  breakpoint  keep y <PENDING> test.c call1 
(gdb) run 
Starting program: /usr/bin/python-dbg test.py 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
i=20 j=40 

[23744 refs] 
[Inferior 1 (process 44079) exited normally] 

Si può vedere dal mio registro terminale che gdb non vede il punto di interruzione quando i carichi di pitone biblioteca. Sto vedendo lo stesso comportamento con la mia applicazione.

+0

aggiornamento: scavare ulteriormente, ho notato che "(gdb) rottura test.c: 6" funziona. perché uno lavora e non l'altro? – lightdee

risposta

5

pausa call1 invece

(gdb) break call1 

questo dovrebbe funzionare anche

(gdb) break test.c:call1 
+0

Quindi ha funzionato per questo esempio. Perché funziona quando "break test.c call1" non funziona? Questo non risolve il problema in cui potrei aver sovraccaricato i nomi delle funzioni in diverse librerie, ma suppongo di poter usare i numeri di linea per quello. – lightdee

+1

@lightdee è in realtà nomefile: funzione (un colon non è uno spazio). – iabdalkader

+0

grazie - Avrei dovuto prestare maggiore attenzione quando ho letto la pagina di aiuto – lightdee

Problemi correlati