Project

General

Profile

Bug #8364

Updated by nobu (Nobuyoshi Nakada) about 11 years ago

=begin 
 This problem was originally reported to vim-jp project.    See 
 ((<URL:https://github.com/vim-jp/issues/issues/372>)) https://github.com/vim-jp/issues/issues/372 (Japanese discussion). 

 ((<Vim|URL:http://www.vim.org/>)) Vim (http://www.vim.org/) is an text editor and it supports embedded 
 ruby interface so that we can customize Vim with Ruby.    On Mac, ruby 
 causes crash. 

 Steps to reproduce: 
   $ vim 
   :function! F() 
   :    ruby nil 
   :endfunction 
   :call F() 
   :ruby 10000.times { 'x' * 10000 } 
   Vim: Caught deadly signal ABRT 
   Vim: Finished. 

 Version is: 
   Mac OS X 10.7.5 
   ruby-2.0.0-p0 
   Vim 7.3.918 


 Maybe the following is minimum C code to reproduce crash. 

   

 ```c 
 /* rubyembed.c */ 
   
 #include <ruby.h> 

   

 void rbinit() { 
       
     int dummy_argc = 2; 
       
     char *dummy_argv[] = {"foo", "-e0"}; 
       
     RUBY_INIT_STACK; 
       
     ruby_init(); 
       
     ruby_process_options(dummy_argc, dummy_argv); 
   
 } 

   

 void rbexe(const char *src) { 
       
     int state; 
       
     rb_eval_string_protect(src, &state); 
       
     if (state) 
           
         ruby_error_print(); 
   
 } 

   

 void init() { 
       
     int eatstack[1024]; /* perhaps you need more to crash */ 
       
     rbinit(); 
   
 } 

   

 int main(int argc, char **argv) { 
       
     init(); 
       
     rbexe("10000.times { 'x' * 10000 }"); 
       
     return 0; 
   
 } 

  
 ``` 

 ```sh 
 $ cd ~/tmp/ruby-2.0.0-p0 
  
 $ ./configure --prefix=$HOME/tmp/opt && make install 
  
 $ cc rubyembed.c -I$HOME/tmp/opt/include/ruby-2.0.0 -I$HOME/tmp/opt/include/ruby-2.0.0/x86_64-darwin11.4.2 -L$HOME/tmp/opt/lib -lruby-static 
  
 $ ./a.out 
  
 eval:1: [BUG] gc_sweep(): unknown data type 0x0(0x007fb2590651e0) 0x102000 
  
 ruby 2.0.0p0 (2013-02-24) [x86_64-darwin11.4.2] 

  

 -- 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 
     
    the more detail of. 

  

 -- Control frame information ----------------------------------------------- 
  
 eval:1: [BUG] object allocation during garbage collection phase 
  
 ruby 2.0.0p0 (2013-02-24) [x86_64-darwin11.4.2] 

  

 -- 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 
     
    the more detail of. 

  

 -- Control frame information ----------------------------------------------- 
  
 c:0005 p:---- s:0013 e:000012 CFUNC    :* 
  
 c:0004 p:0010 s:0009 e:000008 BLOCK    eval:1 [FINISH] 
  
 c:0003 p:---- s:0007 e:000006 CFUNC    :times 
  
 c:0002 p:0006 s:0004 e:000003 EVAL     eval:1 [FINISH] 
  
 c:0001 p:0000 s:0002 E:000d48 TOP      [FINISH] 

  

 eval:1:in `<main>' 
  
 eval:1:in `times' 
  
 eval:1:in `block in <main>' 
  
 eval:1:in `*' 

  

 -- C level backtrace information ------------------------------------------- 
  
 0     a.out                                 0x000000010dc0b02b rb_vm_bugreport + 251 
  
 1     a.out                                 0x000000010daa7af8 report_bug + 392 
  
 2     a.out                                 0x000000010daa7dff rb_bug + 207 
  
 3     a.out                                 0x000000010dac89f9 newobj + 297 
  
 4     a.out                                 0x000000010dac910f rb_newobj_of + 31 
  
 5     a.out                                 0x000000010db942a4 str_new + 68 
  
 6     a.out                                 0x000000010db957ee rb_usascii_str_new + 30 
  
 7     a.out                                 0x000000010db13aeb rb_id2str + 107 
  
 8     a.out                                 0x000000010db13cb9 rb_id2name + 9 
  
 9     a.out                                 0x000000010dc0adbb control_frame_dump + 1035 
  
 10    a.out                                 0x000000010dc0afcb rb_vm_bugreport + 155 
  
 11    a.out                                 0x000000010daa7af8 report_bug + 392 
  
 12    a.out                                 0x000000010daa7dff rb_bug + 207 
  
 13    a.out                                 0x000000010dac4803 slot_sweep + 659 
  
 14    a.out                                 0x000000010dac7dcf garbage_collect + 623 
  
 15    a.out                                 0x000000010dac82e5 vm_xmalloc + 149 
  
 16    a.out                                 0x000000010db943a3 str_new + 323 
  
 17    a.out                                 0x000000010db96966 rb_str_times + 118 
  
 18    a.out                                 0x000000010dbecad9 vm_call_cfunc_with_frame + 761 
  
 19    a.out                                 0x000000010dbf21bd vm_exec_core + 14301 
  
 20    a.out                                 0x000000010dbf79d1 vm_exec + 2673 
  
 21    a.out                                 0x000000010dc061fb rb_yield + 507 
  
 22    a.out                                 0x000000010daf7b1d int_dotimes + 61 
  
 23    a.out                                 0x000000010dbecad9 vm_call_cfunc_with_frame + 761 
  
 24    a.out                                 0x000000010dc04f5c vm_call_method + 828 
  
 25    a.out                                 0x000000010dbf0b43 vm_exec_core + 8547 
  
 26    a.out                                 0x000000010dbf79d1 vm_exec + 2673 
  
 27    a.out                                 0x000000010dbf8305 eval_string_with_cref + 693 
  
 28    a.out                                 0x000000010daaddd8 rb_protect + 232 
  
 29    a.out                                 0x000000010da6694f rbexe + 31 
  
 30    a.out                                 0x000000010da669b5 main + 37 
  
 31    a.out                                 0x000000010da668c4 start + 52 

  

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

  

 * Loaded script: -e 

  

 * Loaded features: 

      

     0 enumerator.so 
      
     1 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/x86_64-darwin11.4.2/enc/encdb.bundle 
      
     2 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/x86_64-darwin11.4.2/enc/trans/transdb.bundle 
      
     3 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/x86_64-darwin11.4.2/rbconfig.rb 
      
     4 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/rubygems/compatibility.rb 
      
     5 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/rubygems/defaults.rb 
      
     6 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/rubygems/deprecate.rb 
      
     7 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/rubygems/errors.rb 
      
     8 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/rubygems/version.rb 
      
     9 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/rubygems/requirement.rb 
     
    10 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/rubygems/platform.rb 
     
    11 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/rubygems/specification.rb 
     
    12 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/rubygems/exceptions.rb 
     
    13 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/rubygems/core_ext/kernel_gem.rb 
     
    14 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb 
     
    15 /Users/yukihiro/tmp/opt/lib/ruby/2.0.0/rubygems.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 

 
 ``` 



 I am not sure that this is correct fix but above problem seems 
 disappeared with this. 

  

 ```diff 
 diff --git a/thread_pthread.c b/thread_pthread.c 
  
 index 8953f5e..58b63b8 100644 
  
 --- a/thread_pthread.c 
  
 +++ b/thread_pthread.c 
  
 @@ -618,8 +618,10 @@ ruby_init_stack(volatile VALUE *addr 
       
      ) 
   
  { 
       
      native_main_thread.id = pthread_self(); 
  
 -#ifdef STACK_END_ADDRESS 
  
 +#if defined(STACK_END_ADDRESS) 
       
      native_main_thread.stack_start = STACK_END_ADDRESS; 
  
 +#elif defined(STACKADDR_AVAILABLE) 
  
 +      native_main_thread.stack_start = pthread_get_stackaddr_np(pthread_self()); 
   
  #else 
       
      if (!native_main_thread.stack_start || 
           
          STACK_UPPER((VALUE *)(void *)&addr, 

 
 ``` 


 Or perhaps such code is not valid or something is wrong in Vim's if_ruby code? 
 =end 

Back