मैं डिबग C/C++ साझा पुस्तकालयों में स्थित है जो अजगर में ctypes.cdll.LoadLibrary() द्वारा लोड किए गए हैं और उसके बाद विशिष्ट कार्यों अजगर से कहा जाता है कोड के लिए कोशिश कर रहा हूँ द्वारा लोड। पायथन कोड बाल प्रक्रियाओं को फोर्क करता है, इसलिए मुझे तोड़ने में सक्षम होना चाहिए कि सी फ़ंक्शन को अजगर माता-पिता या बाल प्रक्रिया से बुलाया जाता है या नहीं। एक मृत-सरल उदाहरण: test.cgdb: साझा लाइब्रेरी में तोड़ अजगर
// 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]
तुम मेरे टर्मिनल लॉग से देख सकते हैं कि gdb ब्रेकप्वाइंट देख पा रहा है जब अजगर भार पुस्तकालय। मैं अपने आवेदन के साथ एक ही व्यवहार देख रहा हूँ।
अद्यतन काम करना चाहिए: आगे खुदाई, मैंने देखा है कि "(gdb) को तोड़ने test.c: 6" काम करता है। एक काम क्यों करता है और दूसरा नहीं? – lightdee