2012-11-30 38 views
5

मैं डिबग 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 ब्रेकप्वाइंट देख पा रहा है जब अजगर भार पुस्तकालय। मैं अपने आवेदन के साथ एक ही व्यवहार देख रहा हूँ।

+0

अद्यतन काम करना चाहिए: आगे खुदाई, मैंने देखा है कि "(gdb) को तोड़ने test.c: 6" काम करता है। एक काम क्यों करता है और दूसरा नहीं? – lightdee

उत्तर

5

call1 पर ब्रेक बजाय

(gdb) break call1 

यह भी

(gdb) break test.c:call1 
+0

तो इस उदाहरण के लिए काम किया। "Test test.c call1" तोड़ने पर यह क्यों काम करता है? यह समस्या को हल नहीं करता है जहां मैंने अलग-अलग पुस्तकालयों में फ़ंक्शन नामों को अधिभारित किया हो सकता है, लेकिन मुझे लगता है कि मैं इसके लिए लाइन नंबर का उपयोग कर सकता हूं। – lightdee

+1

@lightdee यह वास्तव में फ़ाइल नाम है: फ़ंक्शन (एक कोलन एक स्थान नहीं है)। – iabdalkader

+0

धन्यवाद - जब मैं सहायता पृष्ठ पढ़ता हूं तो मुझे अधिक ध्यान देना चाहिए था – lightdee