gpt4 book ai didi

python - Ctypes - 从使用 ctypes 的 python 代码获取 C 回溯

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:02 27 4
gpt4 key购买 nike

我正在尝试调试 python 使用 ctypes 调用 C 函数的代码。我感兴趣的 python 代码中的一行看起来像:

returnValue = cfunction()

其中 cfunction 是一个 C 函数。我想知道 cfunction 从哪里返回的 cfunction 代码。我怎样才能做到这一点?

看起来我可以将 gdb 与 python 一起使用,但我不确定使用 gdb 的正确方法,因此我可以在上面的行中设置断点并显示 C 函数从 C 代码中返回的位置。当然,我有使用 -g 编译的 C 代码。

这不是我必须为此使用 gdb 的要求,只要我可以在 Linux 中使用一些免费(如啤酒或演讲)工具来完成即可。

(我运行的是 python 2.7.6,gdb 7.7,C 代码是用 gcc 4.8.2 编译的。)

最佳答案

如果你在任何合理的调试器(包括 gdb)下运行 python,无论是通过这种方式启动它还是通过附加到它,它都可以在 C 代码中创建断点,无论它是 Python 的一部分,作为扩展模块,通过`ctypes 或其他方式加载。而且,完成后,您可以打印出回溯,逐行或进或出等,任何您想要的。这只是一个普通的调试器 session 。 (当然,您的 Python 中可能没有调试符号,但只要您的 .so 有它们,这就是您所关心的,对吧?)

例如(使用 lldb,但我认为我坚持使用完全与 gdb 兼容的命令子集……):

$ lldb python3
Current executable set to 'python3' (x86_64).
(lldb) run
Process 6828 launched: '/Library/Frameworks/Python.framework/Versions/3.4/bin/python3' (x86_64)
Process 6828 stopped
* thread #1: tid = 0x8cf0d1, 0x00007fff5fc01028 dyld`_dyld_start, stop reason = exec
frame #0: 0x00007fff5fc01028 dyld`_dyld_start
dyld`_dyld_start:
-> 0x7fff5fc01028: popq %rdi
0x7fff5fc01029: pushq $0x0
0x7fff5fc0102b: movq %rsp, %rbp
0x7fff5fc0102e: andq $-0x10, %rsp
(lldb) c
Process 6828 resuming
Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 00:54:21)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> libc = ctypes.CDLL('/usr/lib/libc.dylib')
Process 6828 stopped
* thread #1: tid = 0x8cf0d1, 0x00007fff8a7149aa libsystem_kernel.dylib`__select + 10, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
frame #0: 0x00007fff8a7149aa libsystem_kernel.dylib`__select + 10
libsystem_kernel.dylib`__select + 10:
-> 0x7fff8a7149aa: jae 0x7fff8a7149b4 ; __select + 20
0x7fff8a7149ac: movq %rax, %rdi
0x7fff8a7149af: jmpq 0x7fff8a71119a ; cerror
0x7fff8a7149b4: ret
(lldb) b printf
Breakpoint 1: where = libsystem_c.dylib`printf, address = 0x00007fff875cf8a8
(lldb) c
Process 6828 resuming
>>> libc.printf('spam')
Process 6828 stopped
* thread #1: tid = 0x8cf0d1, 0x00007fff875cf8a8 libsystem_c.dylib`printf, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x00007fff875cf8a8 libsystem_c.dylib`printf
libsystem_c.dylib`printf:
-> 0x7fff875cf8a8: pushq %rbp
0x7fff875cf8a9: movq %rsp, %rbp
0x7fff875cf8ac: pushq %r15
0x7fff875cf8ae: pushq %r14
(lldb) bt
* thread #1: tid = 0x8cf0d1, 0x00007fff875cf8a8 libsystem_c.dylib`printf, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
* frame #0: 0x00007fff875cf8a8 libsystem_c.dylib`printf
frame #1: 0x0000000101a545e7 _ctypes.so`ffi_call_unix64 + 79
frame #2: 0x0000000101a5549f _ctypes.so`ffi_call + 575
frame #3: 0x0000000101a4f81f _ctypes.so`_ctypes_callproc + 879
frame #4: 0x0000000101a4772a _ctypes.so`PyCFuncPtr_call + 314
frame #5: 0x000000010000da08 Python`PyObject_Call + 104
frame #6: 0x00000001000e1c3f Python`PyEval_EvalFrameEx + 16975
frame #7: 0x00000001000e665d Python`PyEval_EvalCodeEx + 2349
frame #8: 0x00000001000e671f Python`PyEval_EvalCode + 63
frame #9: 0x000000010010f5ba Python`PyRun_InteractiveOneObject + 474
frame #10: 0x000000010010f93e Python`PyRun_InteractiveLoopFlags + 110
frame #11: 0x00000001001113e1 Python`PyRun_AnyFileExFlags + 161
frame #12: 0x000000010012867f Python`Py_Main + 3535
frame #13: 0x0000000100000e32 Python
frame #14: 0x0000000100000c84 Python
(lldb)

关于python - Ctypes - 从使用 ctypes 的 python 代码获取 C 回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25776188/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com