1

ImageMagick でコンパイルされた node.js、node-vips、libvips を使用して、画像の変換とサイズ変更を行っています。2 つ以上の画像のサイズを変更しようとすると、セグメンテーション違反が発生し、アサーションが失敗します。

私は非常に多くの異なるクラッシュを経験しており、どこから始めればよいかわかりません。libvips 7.26.8 から始めましたが、7.30.7 も試しました。これは、かなり標準的でクリーンなubuntuボックスで、ソースからコンパイルされたノードv0.8.17を使用しています。

#0  0x0000158ac3765c59 in ?? ()
Cannot access memory at address 0x7fffa837ec90

#0  0x0000000000000000 in ?? ()
#1  0x0000000000000000 in ?? ()

node: ../deps/uv/src/unix/stream.c:729: uv__stream_io: Assertion `!!(events & EV_READ) ^ !!(events & EV_WRITE)' failed.
Aborted (core dumped)

#0  0x00007f5ed4df9425 in raise () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007f5ed4dfcb8b in abort () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00007f5ed4df20ee in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#3  0x00007f5ed4df2192 in __assert_fail () from /lib/x86_64-linux-gnu/libc.so.6
#4  0x00000000005d1bc8 in uv__stream_io (loop=<optimized out>, w=<optimized out>, events=<optimized out>) at ../deps/uv/src/unix/stream.c:729
#5  0x00000000005c6ac2 in ev_invoke_pending (loop=0xdb34c0 <default_loop_struct>) at ../deps/uv/src/unix/ev/ev.c:2145
#6  0x00000000005c2986 in uv__poll (loop=0xdb27e0 <default_loop_struct>) at ../deps/uv/src/unix/core.c:246
#7  uv__run (loop=0xdb27e0 <default_loop_struct>) at ../deps/uv/src/unix/core.c:257
#8  0x00000000005c2c60 in uv_run (loop=0xdb27e0 <default_loop_struct>) at ../deps/uv/src/unix/core.c:265
#9  0x000000000057d9f7 in node::Start(int, char**) ()
#10 0x00007f5ed4de476d in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
#11 0x0000000000575245 in _start ()

#0  0x00000000006b13b8 in v8::Object::SetHiddenValue(v8::Handle<v8::String>, v8::Handle<v8::Value>) ()
#1  0x0000000000593f5a in node::SlabAllocator::Allocate(v8::Handle<v8::Object>, unsigned int) ()
#2  0x0000000000591d04 in node::StreamWrap::OnAlloc(uv_handle_s*, unsigned long) ()
#3  0x00000000005d08fb in uv__read (stream=0x1fa7f90) at ../deps/uv/src/unix/stream.c:575
#4  0x00000000005d1a1a in uv__stream_io (loop=<optimized out>, w=<optimized out>, events=<optimized out>) at ../deps/uv/src/unix/stream.c:745
#5  0x00000000005c6ac2 in ev_invoke_pending (loop=0xdb34c0 <default_loop_struct>) at ../deps/uv/src/unix/ev/ev.c:2145
#6  0x00000000005c29df in uv__poll (loop=0xdb27e0 <default_loop_struct>) at ../deps/uv/src/unix/core.c:248
#7  uv__run (loop=0xdb27e0 <default_loop_struct>) at ../deps/uv/src/unix/core.c:257
#8  0x00000000005c2c60 in uv_run (loop=0xdb27e0 <default_loop_struct>) at ../deps/uv/src/unix/core.c:265
#9  0x000000000057d9f7 in node::Start(int, char**) ()
#10 0x00007f065aa1176d in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
#11 0x0000000000575245 in _start ()

多くの場合、最初の 2 つのエラーのいずれかが表示されます。つまり、スタック トレースがありません。これらはすべて、6 枚ほどの画像のサイズを変更しようとしたときに発生しました。エラーなしですべて成功することもありますが、通常は、最初の 1 つまたは 2 つの画像のサイズが変更された後にエラーが発生します。

これをデバッグするにはどうすればよいですか?

node-vips プラグインの単体テストには、次のようなコメントがあります。

libeio から呼び出されたときに imagemagick がクラッシュするため、vips が imagemagick サポート付きでコンパイルされている場合、このテストはクラッシュします。

どうしてこれなの?これはまだ本当ですか?ImageMagick は完全にスレッドセーフだと思っていましたが、libeio/libuv から呼び出すのが安全ではないのはなぜですか?

4

0 に答える 0