Skip to content

Segfault when calling show() after using Popen (test code inside) #6429

@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

      pFad - Phonifier reborn

      Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

      Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


      Alternative Proxies:

      Alternative Proxy

      pFad Proxy

      pFad v3 Proxy

      pFad v4 Proxy