0

cython を使用して ac ライブラリに python バインディングを記述したいと考えています。ライブラリはマルチスレッドの http サーバーを表し、ヘッダー ファイルを介してその API を公開します。cython ガイドに従って、3 つの基本関数の定義を含む pxd ファイルと pyc ファイルを作成しました。

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 ?? ()
4

0 に答える 0