8000 Segfault when calling show() after using Popen (test code inside) · Issue #6429 · matplotlib/matplotlib · GitHub
[go: up one dir, main page]

Skip to content
Segfault when calling show() after using Popen (test code inside) #6429
Closed
@cmey

Description

@cmey

Hi, please consider the following SSCCE:

import matplotlib
matplotlib.use('MacOSX')  # Segfault in backend from call to pyplot.show().
# matplotlib.use('TkAgg')  # This backend does not reproduce the segfault.
import matplotlib.pyplot as plt
import numpy as np
import signal
from subprocess import Popen, PIPE

def mplayer_view(img):
    mplayer = Popen(
        ['mplayer', '-',
         '-demuxer', 'rawvideo',
         '-rawvideo', 'w={}:h={}:format={}'.format(
            img.shape[1], img.shape[0], 'y8')],
        stdin=PIPE
    )

    tmp = img.astype('int8').tostring('C')

    # Writing twice is important to reproduce the segfault (no flush needed).
    mplayer.stdin.write(tmp)
    mplayer.stdin.write(tmp)

    mplayer.kill()

if __name__ == "__main__":
    img = np.zeros((512,512))  # Need to write enough bytes.
    mplayer_view(img)

    plt.figure()
    plt.show()  # <-- segfault here

Running that with python I get Segmentation fault: 11

Using faulthandler, the backtrace traces it to matplotlib's macosx backend from the call to show():

Fatal Python error: Segmentation fault

Current thread 0x00007fff7a0c4000 (most recent call first):
  File "/Users/cmey/.pyenv/versions/chips-3.4.3/lib/python3.4/site-packages/matplotlib/backends/backend_macosx.py", line 29 in mainloop
  File "/Users/cmey/.pyenv/versions/chips-3.4.3/lib/python3.4/site-packages/matplotlib/backend_bases.py", line 192 in __call__
  File "/Users/cmey/.pyenv/versions/chips-3.4.3/lib/python3.4/site-packages/matplotlib/pyplot.py", line 244 in show
  File "/Users/cmey/Code/python/test_matplotlib_segfault.py", line 35 in <module>
Segmentation fault: 11

I checked the return code from mplayer (with mplayer.wait()), it is -9 as it should (I kill it). If it was mplayer that segfaulted, wait() would return -11. Even if mplayer segfaults, that should not produce a segfault from matplotlib/Python.

I couldn't find another program than mplayer to pipe to, that reproduces the segfault.

Christophe
-- OSX, matplotlib version 1.5.1 from pip 8.1.2, Python 3.4.3 from pyenv, MPlayer 1.3.0-4.2.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0