Libvips: erreur de segmentation en python ou libvips lors de la convolution approximative d'une image courte ou ushort

Créé le 10 nov. 2018  ·  4Commentaires  ·  Source: libvips/libvips

Salut John,

J'expérimentais la convolution approximative que vous avez mentionnée dans #1160 et je suis tombé sur une erreur de segmentation persistante, mais uniquement lors de la convolution d'images ushort. Je peux faire en sorte que la erreur de segmentation se produise en python ou en libvips en fonction de la taille de l'image, donc je suppose que cela pourrait être un double gratuit. Voici un programme de test avec quelques expériences pour voir où le problème se produit. Ci-dessous se trouve une trace de pile de l'emplacement de l'erreur de segmentation dans libvips.so.42.9.0 (sans utiliser de version de débogage pour le moment, donc peut-être pas si utile).

J'exécute vips vips-8.7.0-Sun Jan 28 17:23:05 UTC 2018 utilisant l'interface pyvips sous python Python 2.7.15 :: Anaconda custom (64-bit)

Merci d'avance.

Remarque : en fait un fichier .py :
erreur de segmentation.txt

# /usr/bin/env python
import pyvips

slab = pyvips.Image.new_from_array([[1]*10]*10, scale=100)  # 10x10 moving average

n = 30000 # also segfaults when n=30000.  See note below.

# The following are all fine
uchar_im = pyvips.Image.black(n, n).cast('uchar')  # just to be sure it's uchar
uchar_im.conv(slab, precision='approximate', layers=1).write_to_file('uchar_conv.v')

float_im = pyvips.Image.black(n, n).cast('float')
float_im.conv(slab, precision='approximate', layers=1).write_to_file('float_conv.v')


# EVERY CONVOLUTION BELOW THIS LINE SEGFAULTS

# if n=1, completes by writing result to file, then segfaults in python:
# *** Error in `python': free(): invalid pointer: 0x00005651d79154c0 ***

# if n=30000, does not complete and segfaults in libvips
# [1049087.739802] worker[599]: segfault at 7f4cd631a000 ip 00007f4ce7f93318 sp 00007f4cd2caea70 error 4 in libvips.so.42.9.0[7f4ce7eb6000+1f5000]

ushort_im = pyvips.Image.black(n, n).cast('ushort')
ushort_im.conv(slab.cast('ushort'), precision='approximate', layers=1).write_to_file('ushort_conv.v')  # segfault happens here

ushort_im = pyvips.Image.black(n, n).cast('ushort')
ushort_im.conv(slab, precision='approximate', layers=1).write_to_file('ushort_conv.v')  # segfault would also happen here

short_im = pyvips.Image.black(n, n).cast('short')
short_im.conv(slab, precision='approximate', layers=1).write_to_file('short_conv.v')  # segfault would also happen here

Trace de pile éventuellement pertinente lorsque n=30000 :

Thread 52 "worker" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffe64d5700 (LWP 4069)]
0x00007ffff4ab4c7d in ?? () from /usr/lib/libvips.so.42
(gdb) up
#1  0x00007ffff4b4e411 in ?? () from /usr/lib/libvips.so.42
(gdb) up
#2  0x00007ffff4b4f0c9 in vips_region_fill () from /usr/lib/libvips.so.42
(gdb) up
#3  0x00007ffff4b50d53 in vips_region_prepare () from /usr/lib/libvips.so.42
(gdb) up
#4  0x00007ffff4ab65b3 in ?? () from /usr/lib/libvips.so.42
(gdb) up
#5  0x00007ffff4b4e411 in ?? () from /usr/lib/libvips.so.42
(gdb) up
#6  0x00007ffff4b4f0c9 in vips_region_fill () from /usr/lib/libvips.so.42
(gdb) up
#7  0x00007ffff4b50d53 in vips_region_prepare () from /usr/lib/libvips.so.42
(gdb) up
#8  0x00007ffff4b40d59 in ?? () from /usr/lib/libvips.so.42
(gdb) up
#9  0x00007ffff4b4e411 in ?? () from /usr/lib/libvips.so.42
(gdb) up
#10 0x00007ffff4b4f0c9 in vips_region_fill () from /usr/lib/libvips.so.42
(gdb) up
#11 0x00007ffff4b50d53 in vips_region_prepare () from /usr/lib/libvips.so.42
(gdb) up
#12 0x00007ffff4b40d59 in ?? () from /usr/lib/libvips.so.42
(gdb) up
#13 0x00007ffff4b4e411 in ?? () from /usr/lib/libvips.so.42
(gdb) up
#14 0x00007ffff4b4f0c9 in vips_region_fill () from /usr/lib/libvips.so.42
(gdb) up
#15 0x00007ffff4b50d53 in vips_region_prepare () from /usr/lib/libvips.so.42
(gdb) up
#16 0x00007ffff4b40d59 in ?? () from /usr/lib/libvips.so.42
(gdb) up
#17 0x00007ffff4b4e411 in ?? () from /usr/lib/libvips.so.42
(gdb) up
#18 0x00007ffff4b4f615 in ?? () from /usr/lib/libvips.so.42
(gdb) up
#19 0x00007ffff4b50f5f in vips_region_prepare_to () from /usr/lib/libvips.so.42
(gdb) up
#20 0x00007ffff4b48228 in ?? () from /usr/lib/libvips.so.42
(gdb) up
#21 0x00007ffff4b5171b in ?? () from /usr/lib/libvips.so.42
(gdb) up
#22 0x00007ffff4b51504 in ?? () from /usr/lib/libvips.so.42
(gdb) up
#23 0x00007ffff44e0a8a in g_thread_proxy (data=0x5555559df720) from /opt/anaconda/lib/libglib-2.0.so.0
(gdb) up
#24 0x00007ffff77e36ba in start_thread (arg=0x7fffe64d5700) at pthread_create.c:333
333 pthread_create.c: No such file or directory.
bug

Commentaire le plus utile

C'est un bug qui doit être corrigé, donc celui-ci devrait rester ouvert, je pense.

Tous les 4 commentaires

Notez que le lien segfault.txt ci-dessus est en fait un fichier .py avec le programme de test car github ne permet pas de joindre des fichiers .py.

Oui, conva n'est pas vraiment de la qualité de production, malheureusement :( Je vais jeter un œil.

Je fais du jardinage 🌷 et je suis tombé sur ce problème. Comme c'est assez ancien, je voulais juste demander si c'est toujours d'actualité. Si ce n'est pas le cas, peut-être pouvons-nous fermer ce problème ?

En fermant certains anciens problèmes, nous réduisons la liste des problèmes ouverts à un ensemble plus gérable.

C'est un bug qui doit être corrigé, donc celui-ci devrait rester ouvert, je pense.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

revathi-murali picture revathi-murali  ·  3Commentaires

adamu picture adamu  ·  3Commentaires

kloczek picture kloczek  ·  3Commentaires

AKlein920 picture AKlein920  ·  3Commentaires

felixbuenemann picture felixbuenemann  ·  4Commentaires