我想使用 cython 编写 python 绑定到 ac 库。该库代表一个多线程 http 服务器,并通过头文件公开它的 API。按照 cython 指南,我编写了一个 pxd 和一个 pyc 文件,其中包含 3 个基本函数的定义:
struct server *server_init()
int server_start(struct server *)
int server_stop(struct server *)
python 包装器看起来类似于:
cdef class Server:
cdef library.server *_server
def __cinit__(self):
self._server = library.server_init()
def server_start(self):
return library.server_start(self._server)
def server_stop(self):
return library.server_stop(self._server)
绑定工作正常,服务器启动并提供内容,但是,当我从 python 停止服务器时,大多数情况下,python 解释器会因分段错误而崩溃。崩溃发生在从 c server_stop 返回之后,我不知道是什么导致了段错误。
内存分配/初始化/释放发生在这 3 个函数中,完全由 c 库在内部处理。
也许我遗漏了一些东西,那么分段错误错误的原因是什么?
编辑:
它不会在 valgrind 或 gdb 中重现。但是,我生成了一个核心转储,回溯如下所示:
#0 0x00007f4cd0020008 in ?? () from /lib/x86_64-linux-gnu/libgcc_s.so.1
#1 0x00007f4cd00208b3 in ?? () from /lib/x86_64-linux-gnu/libgcc_s.so.1
#2 0x00007f4cd0020c54 in _Unwind_ForcedUnwind () from /lib/x86_64-linux-gnu/libgcc_s.so.1
#3 0x00007f4cd5194630 in __GI___pthread_unwind (buf=<optimized out>) at unwind.c:129
#4 0x00007f4cd518c85b in __do_cancel () at ../nptl/pthreadP.h:264
#5 sigcancel_handler (sig=<optimized out>, si=<optimized out>, ctx=<optimized out>) at nptl-init.c:214
#6 sigcancel_handler (sig=<optimized out>, si=<optimized out>, ctx=<optimized out>) at nptl-init.c:173
#7 <signal handler called>
#8 0x00007f4cd4eba72b in accept4 (fd=<optimized out>, addr=..., addr_len=<optimized out>, flags=<optimized out>) at ../sysdeps/unix/sysv/linux/accept4.c:38
#9 0x00007f4cd3a2ee50 in ?? ()
#10 0x0000000000000000 in ?? ()