2012-11-30 24 views
5

Python'da ctypes.cdll.LoadLibrary() tarafından yüklenen paylaşılan kitaplıklarda bulunan c/C++ kodunu ayıklamaya çalışıyorum ve daha sonra belirli işlevler python'dan çağrılıyor. Python kodu alt süreçleri sorar, bu yüzden c işlevinin bir python ebeveynsinden mi yoksa çocuk işleminden mi çağrıldığını anlayabilmem gerekir. Ölü-basit bir örnek: test.cgdb: python tarafından yüklenen paylaşılan kitaplıktaki kopma

// 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] 

Sen gdb kesme noktası göremiyorsa bu benim terminali günlüğünden görebileceğiniz zaman piton yükleri kütüphanesi. Uygulamamla aynı davranışı görüyorum. call1 üzerinde

+0

güncelleştirme çalışması gerekir: çalışır: Daha kazma, ben "6 (gdb) mola test.c" fark ettim. Neden biri çalışıyor ve diğerini değil? – lightdee

cevap

5

mola yerine

(gdb) break call1 

bu çok

(gdb) break test.c:call1 
+0

Yani bu örnek için çalıştı. Neden "break test.c call1" kopmadığında bu işe yarar? Bu, farklı kitaplıklarda aşırı yüklenmiş işlev adlarına sahip olabileceğim sorunu çözmüyor, ancak sanırım bunun için satır numaralarını kullanabilirim. – lightdee

+1

@lightdee aslında dosya adı: işlev (bir boşluk değil, bir boşluk). – iabdalkader

+0

teşekkürler - Yardım sayfasını okurken daha fazla dikkat etmeliydim – lightdee