Ich versuche zu debuggen c/C++ Code in gemeinsam genutzten Bibliotheken, die von ctypes.cdll.LoadLibrary() in Python geladen werden und dann bestimmte Funktionen aus Python aufgerufen werden. Der Python-Code gibt untergeordnete Prozesse aus, also muss ich in der Lage sein zu brechen, ob die c-Funktion von einem Python-Eltern- oder Kind-Prozess aufgerufen wird. Ein totes-einfaches Beispiel: test.cgdb: break in shared library von python geladen
// 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]
Sie können von meinem Terminal Protokoll sehen, dass gdb nicht den Haltepunkt zu sehen, wenn Python lädt die Bibliothek. Ich sehe das gleiche Verhalten mit meiner Anwendung.
Update: Graben weiter, bemerkte ich, dass "(gdb) break test.c: 6" Arbeit macht. Warum arbeitet man und nicht das andere? – lightdee