2012-11-30 4 views
5

파이썬에서 ctypes.cdll.LoadLibrary()에 의해로드 된 공유 라이브러리에있는 c/C++ 코드를 디버깅하려고 시도하고 특정 함수가 파이썬에서 호출됩니다. 파이썬 코드가 자식 프로세스를 포크하므로 파이썬 부모 또는 자식 프로세스에서 c 함수가 호출되는지 여부를 확인할 수 있어야합니다. 죽은 - 간단한 예제 : 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가 중단 점을 보지 않는 것이 내 터미널 로그에서 볼 수있을 때 파이썬로드 라이브러리. 내 응용 프로그램과 동일한 동작이 나타납니다. call1

+0

업데이 트를 작동합니다 : 작업을 수행 : 더 파고, 나는 "6 (GDB) 브레이크 TEST.C"는 것으로 나타났습니다. 왜 그 중 하나가 작동합니까? – lightdee

답변

5

휴식 대신

(gdb) break call1 

이 너무

(gdb) break test.c:call1 
+0

그래서이 예제에서 작동했습니다. "break test.c call1"이 작동하지 않는 이유는 무엇입니까? 이 문제는 다른 라이브러리에서 오버로드 된 함수 이름을 해결할 수는 없지만 줄 번호를 사용할 수 있다고 생각합니다. – lightdee

+1

@lightee 실제로 filename : function (콜론이 아닌 공백)입니다. – iabdalkader

+0

감사합니다. 도움말 페이지를 읽을 때 좀 더주의를 기울여야했습니다. – lightdee

관련 문제