1

Pythonから共有cライブラリを呼び出す際に問題が発生しました。ライブラリは正常にロードされ、公開されている3つの関数の1つが呼び出し可能であり、期待どおりに機能します。ただし、ライブラリに別の関数を追加すると、他の2つは機能しないことがわかりました。何が起こるかというと、Pythonは実際の関数呼び出しでハングし、何もせずにスピンするだけです。Python側とc側の両方に詳細なログがあり、デバッグファイルが書き込まれていないため、ライブラリ内の関数が開始されていないことがわかります。

以下は、問題のコードの小さな断片です。

これは失敗しているcコードサンプル関数です:

    int genTest(char* filePath)
    {
       infoPrint(filePath, 2);
       return EXIT_SUCCESS;
    }

これは私がそれを呼んでいるPythonです:

    import ctypes as C

    lg.create_log_entry('loading dll... from ' + str(lib_path) + str(lib_name))
    myclib = C.CDLL(lib_path + lib_name)

    lg.create_log_entry('loaded')

    genTest = myclib.genTest

    genTest.argtypes = [C.c_char_p]
    genTest.restype = C.c_int

    lg.create_log_entry('test start')
    res = genTest(C.c_char_p(str(source_as_image)))
    certirxlogging.create_log_entry('test successful')

このコードは「teststart」の記述になり、ハングします。私が言ったように、これはpythonコードの他の場所にあるライブラリ内の別の関数で正常に機能し、pythonはエラーをスローしないため、何もデバッグできません。何か案は?

4

1 に答える 1

2

それで、なぜそれが失敗したのかを理解しました。infoPrint関数へのその呼び出しの何かが、セグメンテーション違反をスローしていました。

プログラムがハングする原因は、Pythonのマルチプロセッシングライブラリを使用してこの関数を別のプロセスで実行し、パイプで通信していたためです。親プロセスは、突然のクラッシュが原因で発生しなかった戻り値を取得するために、タイムアウトを使用してパイプをポーリングしていました。

この小さな問題を乗り越えるのに助けてくれてありがとう、今私は(うまくいけば)cコードの何が悪いのかを理解することができます。

于 2013-01-16T16:07:38.183 に答える