vaiorabbit / ruby-opengl

Yet another OpenGL wrapper for Ruby (and wrapper code generator).
Other
86 stars 11 forks source link

Some samples cause interpreter crash on Ruby 2.3.0 #23

Closed vaiorabbit closed 8 years ago

vaiorabbit commented 8 years ago

For example,

$ ruby --version
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
$ cd RedBook
$ ruby teapots.rb

And then pressing some keys cause :

/Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/glfw.rb:408: [BUG] Segmentation fault at 0x0000010ff46000

I have just started investigating this problem. Any helps are welcome.

vaiorabbit commented 8 years ago

Crash Report:

/Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/glfw.rb:408: [BUG] Segmentation fault at 0x0000010c8e6000
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]

-- Crash Report log information --------------------------------------------
   See Crash Report log file under the one of following:
     * ~/Library/Logs/CrashReporter
     * /Library/Logs/CrashReporter
     * ~/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:0004 p:---- s:0020 e:000019 CFUNC  :call
c:0003 p:0025 s:0017 e:000016 METHOD /Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/glfw.rb:408
c:0002 p:0285 s:0012 E:000b00 EVAL   teapots.rb:196 [FINISH]
c:0001 p:0000 s:0002 E:000080 (none) [FINISH]

-- Ruby level backtrace information ----------------------------------------
teapots.rb:196:in `<main>'
/Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/glfw.rb:408:in `glfwPollEvents'
/Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/glfw.rb:408:in `call'

-- Machine register context ------------------------------------------------
 rax: 0x000000010c8e6000 rbx: 0x0000000000000009 rcx: 0x0000000000000001
 rdx: 0x0000000000000000 rdi: 0x00007f87d40ccd30 rsi: 0x0000000000000041
 rbp: 0x00007fff53b3da10 rsp: 0x00007fff53b3d9e8  r8: 0x0000000000000000
  r9: 0x0000000000000001 r10: 0x00007f87d1d85c00 r11: 0x00007fff7f112098
 r12: 0x0000000000000000 r13: 0x00007fff968304c0 r14: 0x00007f87d432fc00
 r15: 0x00007f87d1f19b20 rip: 0x000000010c8e6000 rfl: 0x0000000000010206

-- C level backtrace information -------------------------------------------
0   libruby.2.3.0.dylib                 0x000000010c268474 rb_vm_bugreport + 388
1   libruby.2.3.0.dylib                 0x000000010c109183 rb_bug_context + 483
2   libruby.2.3.0.dylib                 0x000000010c1dd003 sigsegv + 83
3   libsystem_platform.dylib            0x00007fff92213eaa _sigtramp + 26
4   ???                                 0x000000010c8e6000 0x0 + 4505624576
5   libglfw.3.1.dylib                   0x000000010c89de22 _glfwInputKey + 290
6   libglfw.3.1.dylib                   0x000000010c8a4eb7 -[GLFWContentView keyDown:] + 151
7   AppKit                              0x00007fffa02cf715 -[NSWindow _reallySendEvent:isDelayedEvent:] + 2108
8   AppKit                              0x00007fff9fc27735 -[NSWindow sendEvent:] + 517
9   AppKit                              0x00007fff9fc2457b -[NSApplication sendEvent:] + 4382
10  libglfw.3.1.dylib                   0x000000010c8a575a -[GLFWApplication sendEvent:] + 170
11  libglfw.3.1.dylib                   0x000000010c8a68fd _glfwPlatformPollEvents + 141
12  libglfw.3.1.dylib                   0x000000010c8a203e glfwPollEvents + 46
13  libffi.dylib                        0x00007fff94ec5f14 ffi_call_unix64 + 76
14  libffi.dylib                        0x00007fff94ec679b ffi_call + 923
15  fiddle.bundle                       0x000000010c72d6eb nogvl_ffi_call + 27
16  libruby.2.3.0.dylib                 0x000000010c2706dd rb_thread_call_without_gvl + 93
17  fiddle.bundle                       0x000000010c72d22c function_call + 780
18  libruby.2.3.0.dylib                 0x000000010c25e640 vm_call_cfunc + 304
19  libruby.2.3.0.dylib                 0x000000010c247cd5 vm_exec_core + 10821
20  libruby.2.3.0.dylib                 0x000000010c259079 vm_exec + 121
21  libruby.2.3.0.dylib                 0x000000010c112484 ruby_exec_internal + 148
22  libruby.2.3.0.dylib                 0x000000010c112396 ruby_run_node + 54
23  ruby                                0x000000010c0c1f1f main + 79

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

* Loaded script: teapots.rb

* Loaded features:

    0 enumerator.so
    1 thread.rb
    2 rational.so
    3 complex.so
    4 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/x86_64-darwin15/enc/encdb.bundle
    5 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/x86_64-darwin15/enc/trans/transdb.bundle
    6 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/unicode_normalize.rb
    7 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/x86_64-darwin15/rbconfig.rb
    8 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/compatibility.rb
    9 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/defaults.rb
   10 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/deprecate.rb
   11 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/errors.rb
   12 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/version.rb
   13 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/requirement.rb
   14 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/platform.rb
   15 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/basic_specification.rb
   16 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/stub_specification.rb
   17 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/util/list.rb
   18 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/x86_64-darwin15/stringio.bundle
   19 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/specification.rb
   20 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/exceptions.rb
   21 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_gem.rb
   22 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/monitor.rb
   23 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb
   24 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems.rb
   25 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/path_support.rb
   26 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/dependency.rb
   27 /Users/foo/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib/did_you_mean/version.rb
   28 /Users/foo/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib/did_you_mean/core_ext/name_error.rb
   29 /Users/foo/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib/did_you_mean/levenshtein.rb
   30 /Users/foo/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib/did_you_mean/jaro_winkler.rb
   31 /Users/foo/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib/did_you_mean/spell_checkable.rb
   32 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/delegate.rb
   33 /Users/foo/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rb
   34 /Users/foo/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rb
   35 /Users/foo/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib/did_you_mean/spell_checkers/name_error_checkers.rb
   36 /Users/foo/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib/did_you_mean/spell_checkers/method_name_checker.rb
   37 /Users/foo/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib/did_you_mean/spell_checkers/null_checker.rb
   38 /Users/foo/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib/did_you_mean/formatter.rb
   39 /Users/foo/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib/did_you_mean.rb
   40 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/x86_64-darwin15/fiddle.bundle
   41 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fiddle/function.rb
   42 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fiddle/closure.rb
   43 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fiddle.rb
   44 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fiddle/value.rb
   45 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fiddle/pack.rb
   46 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fiddle/struct.rb
   47 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fiddle/cparser.rb
   48 /Users/foo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/fiddle/import.rb
   49 /Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/glfw.rb
   50 /Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/opengl_platform.rb
   51 /Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/opengl_common.rb
   52 /Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/opengl_enum.rb
   53 /Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/opengl_command.rb
   54 /Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/opengl_macosx.rb
   55 /Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/opengl.rb
   56 /Users/foo/.rvm/gems/ruby-2.3.0/gems/opengl-bindings-1.5.2/lib/glu.rb
   57 /Users/foo/ruby-opengl_private/sample/util/setup_dll.rb
   58 /Users/foo/ruby-opengl_private/sample/util/WavefrontOBJ.rb

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html
vaiorabbit commented 8 years ago

Using Fiddle::Closure may help to avoid crashing.

For example, rewrite codes like

key_callback = GLFW::create_callback(:GLFWkeyfun) do |window_handle, key, scancode, action, mods|
  case key
  when GLFW_KEY_ESCAPE
    glfwSetWindowShouldClose(window_handle, 1)
  end
end

into

GLFWkeyfun_cb_args = [Fiddle::TYPE_VOIDP, -Fiddle::TYPE_INT, -Fiddle::TYPE_INT, -Fiddle::TYPE_INT, Fiddle::TYPE_INT]
GLFWkeyfun_cb_retval = Fiddle::TYPE_VOID
key_callback = Fiddle::Closure::BlockCaller.new(GLFWkeyfun_cb_retval, GLFWkeyfun_cb_args, Fiddle::Function::DEFAULT) { |window_handle, key, scancode, action, mods|
  case key
  when GLFW_KEY_ESCAPE
    glfwSetWindowShouldClose(window_handle, 1)
  end
}

Reference:

vaiorabbit commented 8 years ago

I updated glut.rb and glfw.rb at revision https://github.com/vaiorabbit/ruby-opengl/commit/ea018f3198c9ae918c680ab5bb68533567ebbc22 .

vaiorabbit commented 8 years ago

The new 'create_callback' ( https://github.com/vaiorabbit/ruby-opengl/commit/ea018f3198c9ae918c680ab5bb68533567ebbc22 ) is availavle on version 1.5.3