2012-11-30 9 views
5

私は、ctypes.cdll.LoadLibrary()によって読み込まれた共有ライブラリにあるc/C++コードをPythonでデバッグしようとしています。 pythonコードは子プロセスをフォークするので、c関数がpython親プロセスか子プロセスかを呼び出すかどうかを判断する必要があります。 デッド簡単な例:test.cのgdb:pythonによってロードされた共有ライブラリの中断

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

あなたは、Pythonライブラリをロードする際にGDBがブレークポイントを見ていないというのが私の端末ログから見ることができます。私は自分のアプリケーションで同じ動作を見ています。 call1

+0

アップデートを動作するはずです:作業を行います。さらに掘り、私は "6(GDB)ブレークtest.cのは" ことに気づきました。なぜ、1つは動作し、もう1つは動作しませんか? – lightdee

答えて

5

ブレークではなく

(gdb) break call1 

これはあまりにも

(gdb) break test.c:call1 
+0

この例ではうまくいきました。なぜ "break test.c call1"が動作しないのでしょうか?これは、異なるライブラリで関数名が多重定義されている問題を解決するものではありませんが、行番号を使用することができます。 – lightdee

+1

@lightdee実際にはfilename:function(コロンは空白ではありません)です。 – iabdalkader

+0

ありがとう - 私はヘルプページを読むときに注意を払うべきだった – lightdee

関連する問題