2012-11-30 5 views
5

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.

+0

Update: Graben weiter, bemerkte ich, dass "(gdb) break test.c: 6" Arbeit macht. Warum arbeitet man und nicht das andere? – lightdee

Antwort

5

Pause auf call1 statt

(gdb) break call1 

sollte diese Arbeit zu

(gdb) break test.c:call1 
+0

Das hat also für dieses Beispiel funktioniert. Warum funktioniert das, wenn "break test.c call1" nicht funktioniert? Das löst das Problem nicht, wo ich möglicherweise Funktionsnamen in verschiedenen Bibliotheken überladen habe, aber ich denke, dass ich Zeilennummern dafür verwenden kann. – lightdee

+1

@lightdee es ist eigentlich Dateiname: Funktion (ein Doppelpunkt kein Leerzeichen). – iabdalkader

+0

danke - Ich hätte aufmerksamer sein müssen, wenn ich die Hilfe-Seite gelesen habe – lightdee