ruby-vips seg fault only when running rails tests in parallel

Đang mở
#429 7 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
5/5
Thời gian dự kiến
Hơn một tuần
Mức phù hợp với người mới
25/100
Loại issue
Lỗi
Độ rõ ràng
Cần làm rõ
Mức độ hoạt động
Đình trệ
Công nghệ
ruby
Lĩnh vực
computer-vision

Hướng nghiên cứu

Bắt đầu với test/models/image_processor_test.rb:285 và lần theo đường dẫn lời gọi qua app/models/image_processor_base.rb, app/models/image_processor_vips.rb và lib/vips/image.rb:284. Chạy các bài kiểm thử Rails liên quan với và không có song song hóa, đồng thời thu thập một bản tái hiện tối thiểu cùng báo cáo crash macOS đầy đủ. Được xem là hoàn tất khi xác định được lỗi nằm ở ruby-vips, libvips hay thiết lập kiểm thử, đồng thời ghi lại một bước tiếp theo có thể tái hiện.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

bug

When I run tests for my rails project with parallelization enabled, ruby-vips seg faults. It works without parallelization or if I use image magick for the same image processing operations. I don't currently have a clean reproduction to share. I'm not sure what could cause this, if the issue is in my code or test data, the ruby-vips library, or vips itself. I don't know if this will affect my upcoming production debian server that will run multiple puma workers.

macOS Tahoe 26.1, M1 chip, ruby 3.4.7, rails 8.1.1, ruby-vips 2.3.0, vips 8.16.1 via homebrew.

The crash is in:

/Users/curi/.gem/ruby/3.4.7/gems/ruby-vips-2.3.0/lib/vips/image.rb:284, specifically:

loader = Vips.vips_foreign_find_load filename

from:

    def self.new_from_file name, **opts
      # very common, and Vips::vips_filename_get_filename will segv if we
      # pass this
      raise Vips::Error, "filename is nil" if name.nil?

      filename = Vips.p2str(Vips.vips_filename_get_filename(name))
      option_string = Vips.p2str(Vips.vips_filename_get_options(name))
      loader = Vips.vips_foreign_find_load filename
      raise Vips::Error if loader.nil?

      Operation.call loader, [filename], opts, option_string
    end

Here's part of a crash log:

981c00000-982000000 rw-
982000000-982400000 rw-
982400000-982800000 rw-
982800000-982c00000 rw-
982c00000-983000000 rw-
983000000-983400000 rw-
983400000-c7e000000 ---
c96000000-c96400000 rw-
c96400000-c96800000 rw-
c96800000-c96b00000 rw-
c96c00000-c96f00000 rw-
c97000000-c97600000 rw-
c97800000-c97c00000 rw-
c97c00000-c98000000 rw-
c98000000-c98774000 rw-
fc0000000-1000000000 ---
1000000000-7000000000 ---
[IMPORTANT]
Don't forget to include the Crash Report log file under
DiagnosticReports directory in bug reports.

./Users/curi/.gem/ruby/3.4.7/gems/ruby-vips-2.3.0/lib/vips/image.rb:284: [BUG] Segmentation fault at 0x0000000122c50853
ruby 3.4.7 (2025-10-08 revision 7a5688e2a2) +YJIT +PRISM [arm64-darwin25]

-- Crash Report log information --------------------------------------------
   See Crash Report log file in one of the following locations:             
     * ~/Library/Logs/DiagnosticReports                                     
     * /Library/Logs/DiagnosticReports                                      
   for more details.                                                        
Don't forget to include the above Crash Report log file in bug reports.     

-- Control frame information -----------------------------------------------
c:0034 p:---- s:0184 e:000183 CFUNC  :vips_foreign_find_load
c:0033 p:0044 s:0179 e:000178 METHOD /Users/curi/.gem/ruby/3.4.7/gems/ruby-vips-2.3.0/lib/vips/image.rb:284
c:0032 p:0006 s:0170 e:000169 METHOD /Users/curi/w/c/redacted/app/models/image_processor_vips.rb:13
c:0031 p:0024 s:0163 e:000162 METHOD /Users/curi/w/c/redacted/app/models/image_processor_base.rb:17 [FINISH]
c:0030 p:---- s:0155 e:000154 CFUNC  :new
c:0029 p:0047 s:0148 e:000147 METHOD /Users/curi/w/c/redacted/app/models/image_processor_base.rb:30
c:0028 p:0010 s:0139 e:000138 BLOCK  /Users/curi/w/c/redacted/test/models/image_processor_test.rb:285
c:0027 p:0012 s:0127 e:000126 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:95
c:0026 p:0002 s:0124 e:000123 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:191
c:0025 p:0004 s:0119 e:000118 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:90
c:0024 p:0008 s:0116 e:000115 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:382
c:0023 p:0004 s:0111 e:000110 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:89
c:0022 p:0006 s:0107 e:000106 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/executor/test_helper.rb:5
c:0021 p:0012 s:0104 e:000103 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/execution_wrapper.rb:104
c:0020 p:0009 s:0099 e:000098 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/executor/test_helper.rb:5
c:0019 p:0008 s:0094 e:000093 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:1223
c:0018 p:0008 s:0087 e:000086 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:50
c:0017 p:0022 s:0084 E:002470 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:487
c:0016 p:0014 s:0076 e:000075 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:474
c:0015 p:0049 s:0070 E:001f68 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:49
c:0014 p:0011 s:0061 e:000060 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:38
c:0013 p:0043 s:0056 e:000055 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:27 [FINISH]
c:0012 p:---- s:0053 e:000052 CFUNC  :fork
c:0011 p:0004 s:0049 e:000048 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:15
c:0010 p:0011 s:0045 e:000044 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization.rb:50 [FINISH]
c:0009 p:---- s:0041 e:000040 IFUNC 
c:0008 p:0024 s:0038 e:000036 METHOD <internal:numeric>:257 [FINISH]
c:0007 p:---- s:0032 e:000031 CFUNC  :each
c:0006 p:---- s:0029 e:000028 CFUNC  :map
c:0005 p:0012 s:0025 e:000024 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization.rb:49
c:0004 p:0023 s:0021 e:000020 METHOD /Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelize_executor.rb:19
c:0003 p:0128 s:0017 e:000016 METHOD /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:298
c:0002 p:0045 s:0008 E:002300 BLOCK  /Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:85 [FINISH]
c:0001 p:0000 s:0003 E:000be0 DUMMY  [FINISH]

-- Ruby level backtrace information ----------------------------------------
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:85:in 'block in autorun'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:298:in 'run'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelize_executor.rb:19:in 'start'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization.rb:49:in 'start'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization.rb:49:in 'map'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization.rb:49:in 'each'
<internal:numeric>:257:in 'times'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization.rb:50:in 'block in start'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:15:in 'start'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:15:in 'fork'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:27:in 'block in start'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:38:in 'work_from_queue'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:49:in 'perform_job'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:474:in 'with_info_handler'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:487:in 'on_signal'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/testing/parallelization/worker.rb:50:in 'block in perform_job'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:1223:in 'run_one_method'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/executor/test_helper.rb:5:in 'run'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/execution_wrapper.rb:104:in 'perform'
/Users/curi/.gem/ruby/3.4.7/gems/activesupport-8.1.1/lib/active_support/executor/test_helper.rb:5:in 'block in run'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:89:in 'run'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest.rb:382:in 'time_it'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:90:in 'block in run'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:191:in 'capture_exceptions'
/Users/curi/.gem/ruby/3.4.7/gems/minitest-5.27.0/lib/minitest/test.rb:95:in 'block (2 levels) in run'
/Users/curi/w/c/redacted/test/models/image_processor_test.rb:285:in 'block in <class:ImageProcessorTest>'
/Users/curi/w/c/redacted/app/models/image_processor_base.rb:30:in 'smartload'
/Users/curi/w/c/redacted/app/models/image_processor_base.rb:30:in 'new'
/Users/curi/w/c/redacted/app/models/image_processor_base.rb:17:in 'initialize'
/Users/curi/w/c/redacted/app/models/image_processor_vips.rb:13:in 'setup_from_path'
/Users/curi/.gem/ruby/3.4.7/gems/ruby-vips-2.3.0/lib/vips/image.rb:284:in 'new_from_file'
/Users/curi/.gem/ruby/3.4.7/gems/ruby-vips-2.3.0/lib/vips/image.rb:284:in 'vips_foreign_find_load'

-- Threading information ---------------------------------------------------
Total ractor count: 1
Ruby thread count for this ractor: 3

-- Machine register context ------------------------------------------------
  x0: 0xf794951c077abd7b  x1: 0x0000000000000029  x2: 0x0000000000000000
  x3: 0x000000016d76e1fd  x4: 0x0000000000000073  x5: 0x0000000000000073
  x6: 0x0000000000000000  x7: 0xfffff0003ffff800 x18: 0x0000000000000000
 x19: 0x000000016d76e1d0 x20: 0x000000010334e330 x21: 0x00000001989c0d06
 x22: 0x000000016d76e1d0 x23: 0x0000000000000015 x24: 0x000000016d76e1d4
 x25: 0x0000000fffffc104 x26: 0x0000000000000015 x27: 0x0000000000000014
 x28: 0x0000000000000001  lr: 0x000000019064909c  fp: 0x000000016d76e1c0
  sp: 0x000000016d76e1b0

-- C level backtrace information -------------------------------------------
/Users/curi/.rubies/ruby-3.4.7/bin/ruby(rb_vm_bugreport+0xb6c) [0x10290461c]
/Users/curi/.rubies/ruby-3.4.7/bin/ruby(rb_bug_for_fatal_signal+0x100) [0x10273d3bc]
/Users/curi/.rubies/ruby-3.4.7/bin/ruby(sigsegv+0x84) [0x102864c54]
/usr/lib/system/libsystem_platform.dylib(_sigtramp+0x38) [0x190927744]
/usr/lib/system/libsystem_trace.dylib(_os_log_find+0x28) [0x19064909c]
[0x190648dd4]
[0x19889a834]
[0x19077aac4]
[0x190763a60]
[0x1989b6830]
[0x1987e8344]
[0x1276b44d4]
[0x1276c4f54]
[0x1276b0a54]
[0x1276b0960]
[0x1273db210]
[0x12435c078]
[0x12444dcb0]
[0x12435bd70]
[0x12435bf9c]

-- Other runtime information -----------------------------------------------

* Loaded script: bin/rails

* Loaded features:

    0 enumerator.so
    1 thread.rb
    2 fiber.so
    3 rational.so
    4 complex.so
    5 ruby2_keywords.rb
    6 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/3.4.0/arm64-darwin25/enc/encdb.bundle
    7 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/3.4.0/arm64-darwin25/enc/trans/transdb.bundle
    8 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/3.4.0/arm64-darwin25/rbconfig.rb
    9 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/defaults.rb
   10 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/deprecate.rb
   11 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/errors.rb
   12 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/target_rbconfig.rb
   13 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/win_platform.rb
   14 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/unknown_command_spell_checker.rb
   15 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/exceptions.rb
   16 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/basic_specification.rb
   17 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/stub_specification.rb
   18 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/platform.rb
   19 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/specification_record.rb
   20 /Users/curi/.rubies/ruby-3.4.7/lib/ruby/site_ruby/3.4.0/rubygems/util/list.rb
Ngôn ngữ chính
Ruby
Star
904
Fork
64
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của libvips/ruby-vips

Tất cả issue của libvips/ruby-vips

Issue tương tự

Thêm issue về Ruby

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.