1. ホーム
  2. python

[解決済み】エラーです。Segmentation fault (コアダンプ)

2022-02-12 14:15:31

質問

Pythonの初心者なのですが、変なエラーが出ます。

Segmentation fault (core dumped)

以下のコードを実行すると

  class Workspace(QMainWindow, Ui_MainWindow):
    """ This class is for managing the whole GUI `Workspace'.
        Currently a Workspace is similar to a MainWindow
    """

    def __init__(self):
        #p= subprocess.Popen(["java -Xmx256m -jar bin/HelloWorld.jar"],cwd=r'/home/karen/sphinx4-1.0beta5-src/sphinx4-1.0beta5/', shell=True, stdout=subprocess.PIPE, bufsize= 4024)
        try:
            from Queue import Queue, Empty
        except ImportError:
            while True:
    #from queue import Queue, Empty  # python 3.x
                print "error"

        ON_POSIX = 'posix' in sys.builtin_module_names

        def enqueue_output(out, queue):
            for line in iter(out.readline, b''):
                queue.put(line)
            out.close()

        p= Popen(["java -Xmx256m -jar bin/HelloWorld.jar"],cwd=r'/home/karen/sphinx4-1.0beta5-src/sphinx4-1.0beta5/',stdout=PIPE, shell=True, bufsize= 4024)
        q = Queue()
        t = threading.Thread(target=enqueue_output, args=(p.stdout, q))
        #t = Thread(target=enqueue_output, args=(p.stdout, q))
        t.daemon = True # thread dies with the program
        t.start()

# ... do other things here
        def myfunc(q):
            while True:

                try: line = q.get_nowait()
         # or q.get(timeout=.1)
                except Empty:
                    print('Vacio')
                else: # got line
    # ... do something with line

                    print line  


        thread = threading.Thread(target=myfunc, args=(q,))
        thread.start()

この部分は、プログラムの標準出力から読み取っています。 myfunc スレッドの外に出れば、うまくいきます。しかし、スレッドの中で実行すると、うまくいきません。 何か提案はありますか?

解決方法は?

"Segmentation fault (core dumped)" でプログラムが終了するときにLinuxが表示する文字列です。 SIGSEGV シグナルがあり、コアの作成が有効になっている場合。これはつまり いくつか プログラムがクラッシュしました。

実際にPythonを実行してこのエラーが出た場合、Pythonのインタープリタがクラッシュしたことを意味します。このようなことが起こる理由はほんの少しです。

  1. C言語で書かれたサードパーティの拡張モジュールを使用していて、その拡張モジュールがクラッシュした。

  2. 直接または間接的に)ビルトインモジュール ctypes で、外部コードを呼び出すとクラッシュします。

  3. Pythonのインストールに何か問題があるようです。

  4. Pythonのバグを発見したので、報告する必要があります。

1つ目は、圧倒的に一般的なものです。もし、あなたの q がサードパーティの拡張モジュールのオブジェクトのインスタンスである場合、ドキュメントを見たくなるかもしれません。

C言語モジュールがクラッシュするのは、無効な、あるいは少なくとも一般的でない、テストされていないことを行っているからであることがよくあります。しかし、その意味であなたのせいであろうとなかろうと、それは問題ではありません。モジュール は、クラッシュする代わりに、デバッグ可能な Python の例外を発生させます。ですから、あなたはおそらくその拡張機能を書いた人にバグを報告すべきです。しかしその間、バグが修正されて新しいバージョンが出るのを6ヶ月待つよりも、クラッシュの引き金になったことを突き止め、あなたがしたいことをする別の方法がないかどうか考える必要があります。あるいは、別のライブラリに変更することも必要です。

一方、どこかからデータを読み込んでプリントアウトしているので、Pythonインタプリタが行の "Segmentation fault (core dumped)" を読み、読み取ったものを忠実にプリントしています。その場合、上流にある他のプログラムがクラッシュしたと思われます。(誰もクラッシュしていない可能性もあります。もしあなたがウェブからこのページを取ってきてプリントアウトしたら、同じ行が表示されますよね?) あなたの場合、あなたのコメントからすると、クラッシュしたのはおそらくJavaプログラムでしょう。

もし、どのケースかわからない(プロセス管理やコアファイルの検査、Cレベルのデバッグを今日学びたくない)場合は、簡単にテストする方法があります。の後に print line という行を追加してください。 print "And I'm OK" . の後に表示されている場合は Segmentation fault の行は、Pythonがクラッシュしたのではなく、他の誰かがクラッシュしたのです。もしそれが見えないなら、おそらくPythonがクラッシュしたのでしょう。