Backport #6618


Seg Fault when printing thread.keys

Added by cantregister (Why Cantiregister) over 10 years ago. Updated almost 10 years ago.



This is very easy to reproduce:

require 'bigdecimal'

for thr in Thread.list
puts thr.keys

Somehow a key is introduced to the thread with the object ID of 8.

Attempting to inspect or to_s this key results in a seg fault.

1.9.3p194 :001 > ObjectSpace._id2ref(8)
RangeError: 0x00000000000008 is not symbol id value

It is not clear how this object is created or inserted into the Thread.

Updated by cantregister (Why Cantiregister) over 10 years ago


puts ">>>>>>>>>>>>>>>> starting"

require 'bigdecimal'

for thr in Thread.list
puts thr.keys

mac:code user$ ruby threadtest.rb

threadtest.rb:6: [BUG] Segmentation fault
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.3.0]

-- Control frame information -----------------------------------------------
c:0009 p:---- s:0023 b:0023 l:000022 d:000022 CFUNC :to_s
c:0008 p:---- s:0021 b:0021 l:000020 d:000020 CFUNC :puts
c:0007 p:---- s:0019 b:0019 l:000018 d:000018 CFUNC :puts
c:0006 p:0024 s:0015 b:0015 l:001948 d:000014 BLOCK threadtest.rb:6
c:0005 p:---- s:0012 b:0012 l:000011 d:000011 FINISH
c:0004 p:---- s:0010 b:0010 l:000009 d:000009 CFUNC :each
c:0003 p:0045 s:0007 b:0007 l:001948 d:000a00 EVAL threadtest.rb:5
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
c:0001 p:0000 s:0002 b:0002 l:001948 d:001948 TOP

-- Ruby level backtrace information ----------------------------------------
threadtest.rb:5:in <main>' threadtest.rb:5:in each'
threadtest.rb:6:in block in <main>' threadtest.rb:6:in puts'
threadtest.rb:6:in puts' threadtest.rb:6:in to_s'

-- C level backtrace information -------------------------------------------

See Crash Report log file under ~/Library/Logs/CrashReporter or
/Library/Logs/CrashReporter, for the more detail of.

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

  • Loaded script: threadtest.rb

  • Loaded features:

    1 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/enc/encdb.bundle
    2 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/enc/trans/transdb.bundle
    3 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/defaults.rb
    4 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/rbconfig.rb
    5 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/deprecate.rb
    6 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/exceptions.rb
    7 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb
    8 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems.rb
    9 /Users/user/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/x86_64-darwin11.3.0/bigdecimal.bundle

You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details:

Abort trap: 6

Updated by cantregister (Why Cantiregister) over 10 years ago

sorry about the strange username, i tried to register 3 times before this one worked.

Actions #3

Updated by naruse (Yui NARUSE) over 10 years ago

  • Tracker changed from Bug to Backport
  • Project changed from Ruby master to Backport193
  • Target version deleted (1.9.3)
Actions #4

Updated by naruse (Yui NARUSE) over 10 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r36159.
Why, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

merge revision(s) 35625: [Backport #6618]

* thread.c (rb_threadptr_execute_interrupts_common):
  test_signal_requiring of test/ruby/test_signal.rb fail if the sub
  process is killed on waiting IO in lex_io_gets in rb_load_file in
  rb_load_internal in require.
  This is because
  (1) the process receive the killing signal in
      rb_thread_io_blocking_region in rb_read_internal in lex_io_gets.
  (2) set th->errinfo as INT2FIX(TAG_FATAL) at
  (3) escape rb_load_file in rb_load_internal and jump to EXEC_TAG()
      without set loaded as TRUE.
  (4) call first rb_exc_raise(GET_THREAD()->errinfo); because loaded
      is FALSE as above. this errinfo should be an exception object
      but this is INT2FIX(TAG_FATAL).
  Don't call first rb_exc_raise if GET_THREAD()->errinfo is Fixnum.

Also available in: Atom PDF