Libvips: segfault em python ou libvips durante a convolução aproximada de uma imagem curta ou ushort

Criado em 10 nov. 2018  ·  4Comentários  ·  Fonte: libvips/libvips

Oi John,

Eu estava experimentando a convolução aproximada que você mencionou em # 1160 e me deparei com um segfault persistente, mas apenas ao convolver imagens ushort. Posso fazer com que o segfault aconteça em python ou libvips, dependendo do tamanho da imagem, então suponho que seja um double free. Aqui está um programa de teste com alguns experimentos para ver onde o problema acontece. Abaixo disso está um rastreamento de pilha da localização do segfault dentro de libvips.so.42.9.0 (sem usar uma compilação de depuração no momento, então talvez não seja tão útil).

Estou executando o vips vips-8.7.0-Sun Jan 28 17:23:05 UTC 2018 usando a interface do pyvips em python Python 2.7.15 :: Anaconda custom (64-bit)

Desde já, obrigado.

Nota: na verdade, um arquivo .py:
segfault.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

Rastreamento de pilha possivelmente relevante quando 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

Comentários muito úteis

Este é um bug que precisa ser consertado, então este deve permanecer aberto, eu acho.

Todos 4 comentários

Observe que o link segfault.txt acima é na verdade um arquivo .py com o programa de teste, pois o github não permite anexar arquivos .py.

Sim, conva não é realmente uma qualidade de produção, infelizmente :( Vou dar uma olhada.

Estou cuidando de alguns problemas de jardinagem 🌱🌿 🌷 e me deparei com esse problema. Já que é bem antigo, eu só queria perguntar se isso ainda é relevante. Se não for, talvez possamos encerrar este problema.

Ao fechar alguns problemas antigos, reduzimos a lista de problemas em aberto a um conjunto mais gerenciável.

Este é um bug que precisa ser consertado, então este deve permanecer aberto, eu acho.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

harukizaemon picture harukizaemon  ·  4Comentários

volkan picture volkan  ·  5Comentários

revathi-murali picture revathi-murali  ·  3Comentários

solisoft picture solisoft  ·  3Comentários

felixbuenemann picture felixbuenemann  ·  4Comentários