Segfault with tk.rb


#1

This works OK:

 #!/usr/bin/ruby

 require 'tk'
 class TkVariable
   def to_m
     "%.2f" % [self.to_i.abs/100.0]
   end
 end
 puts TkVariable.new(12345).to_m

 -> 123.45

But when I add the -w option to the first line, I get:

/usr/local/lib/ruby/1.8/tk.rb:2313: warning: redefine encoding=
/usr/local/lib/ruby/1.8/tk.rb:2316: warning: redefine encoding
123.45
Segmentation fault

and this takes 45 seconds.
What’s wrong?


#2

From: Wybo D. removed_email_address@domain.invalid
Subject: segfault with tk.rb
Date: Wed, 29 Mar 2006 07:23:55 +0900
Message-ID: removed_email_address@domain.invalid

But when I add the -w option to the first line, I get:

/usr/local/lib/ruby/1.8/tk.rb:2313: warning: redefine encoding=
/usr/local/lib/ruby/1.8/tk.rb:2316: warning: redefine encoding
123.45
Segmentation fault

and this takes 45 seconds.
What’s wrong?

I cannot cause SEGV on my Linux box.
Probably, we need more information to solve your trouble.


#3

n Wed, 29 Mar 2006, Hidetoshi NAGAI wrote:

I cannot cause SEGV on my Linux box.
Probably, we need more information to solve your trouble.

what would you suggest me to do?

I tried the profiler:
#!/usr/bin/ruby -w
require ‘profiler’

 require 'tk'
 class TkVariable
   def to_m
     "%.2f" % [self.to_i.abs/100.0]
   end
 end

 Profiler__::start_profile
 begin
   puts TkVariable.new(12345).to_m
 rescue
   Profiler__::stop_profile
   Profiler__::print_profile($stdout)
 end

but then the problem is gone.

I also tried -rdebug, but then I first get, as I always do when using
tk.rb, a Runtime Error: can’t unset “v00000”: no such variable, and then
when I continue, the problem is gone again:

$ ruby -rdebug t
Debug.rb
Emacs support available.

t:3:require ‘tk’
(rdb:1) c
/usr/local/lib/ruby/1.8/tk.rb:2313: warning: redefine encoding=
/usr/local/lib/ruby/1.8/tk.rb:2316: warning: redefine encoding
/usr/local/lib/ruby/1.8/tk/variable.rb:290: can't unset "v00000": no such variable' (RuntimeError) from /usr/local/lib/ruby/1.8/tk/variable.rb:290:ininitialize’
from t:11
/usr/local/lib/ruby/1.8/tk/variable.rb:290:
INTERP._unset_global_var(@id)
(rdb:1)
c
123.45


#4

From: Wybo D. removed_email_address@domain.invalid
Subject: Re: segfault with tk.rb
Date: Wed, 29 Mar 2006 17:43:43 +0900
Message-ID: removed_email_address@domain.invalid

what would you suggest me to do?

Oh, I’m sorry.
SEGV trouble on Ruby/Tk depends on tcltklib.so.

Of course, if the trouble realy depends on Ruby/Tk. :wink:

To check the reason, information of your environment
(OS, nativethread suuport, library verion, and so on) are required.

If you can, please report the followings.

If you can also, please try the latest tcltklib.

  • ruby version
  • configure options
  • result of 'ruby -r tk -e ‘p Tk::TK_PATCHLEVEL; p Tk::PLATFORM’
  • [depends on your OS] result of ldd your ‘ruby’ and ‘tcltklib.so’
    e.g. $ ldd /usr/local/lib/ruby/1.8/i686-linux/tcltklib.so
    linux-gate.so.1 => (0xffffe000)
    libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0xb7e3d000)
    libdl.so.2 => /lib/libdl.so.2 (0xb7e2c000)
    libpthread.so.0 => /lib/i686/libpthread.so.0 (0xb7ddb000)
    libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7dae000)
    libm.so.6 => /lib/i686/libm.so.6 (0xb7d8b000)
    libc.so.6 => /lib/i686/libc.so.6 (0xb7c51000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
  • information which you think useful to solve the trouble :slight_smile:

Anyway, the follwoing wraning and error are expecetd.
Those have no problem, but the exception may cause SEGV.
However, I think such troubles on exception are fixed on ruby 1.8.3
or later. If no case of troubles is escaped notice.

From: Wybo D. removed_email_address@domain.invalid
Subject: Re: segfault with tk.rb
Date: Wed, 29 Mar 2006 17:43:43 +0900
Message-ID: removed_email_address@domain.invalid


#5

Thank you for your report.
I think that depends on the finalize operation of a Tk interpreter
when Ruby is exiting.
But now, I have no time to fix the problem.
If you can, please comment out all part of ip_finalize(ip) in
tcltklib.c and try to use it.
Probably, it causes some problems when the running Ruby releases
Tk IP objects.
However, on your case, you may be able to avoid the SEGV trouble.


#6

On Thu, 30 Mar 2006, Hidetoshi NAGAI wrote:

If you can also, please try the latest tcltklib.

I suppose it is the latest, as it comes with ruby-1.8.4?

  • ruby version

ruby 1.8.4 (2005-12-24) [i686-linux]

  • configure options

none

  • result of 'ruby -r tk -e ‘p Tk::TK_PATCHLEVEL; p Tk::PLATFORM’

“8.4.7”
{“wordSize”=>“4”, “user”=>“root”, “machine”=>“i686”, “platform”=>“unix”,
“osVersion”=>“2.6.8-24.20-default”, “os”=>“Linux”,
“byteOrder”=>“littleEndian”}

  • [depends on your OS] result of ldd your ‘ruby’ and ‘tcltklib.so’

wybo>ldd /usr/local/bin/ruby
linux-gate.so.1 => (0xffffe000)
libdl.so.2 => /lib/libdl.so.2 (0x4002d000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x40032000)
libm.so.6 => /lib/tls/libm.so.6 (0x40064000)
libc.so.6 => /lib/tls/libc.so.6 (0x40087000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
wybo>ldd /usr/local/lib/ruby/1.8/i686-linux/tcltklib.so
linux-gate.so.1 => (0xffffe000)
libtk8.4.so => /usr/lib/libtk8.4.so (0x40029000)
libtcl8.4.so => /usr/lib/libtcl8.4.so (0x40104000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x401ac000)
libdl.so.2 => /lib/libdl.so.2 (0x402a8000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x402ac000)
libm.so.6 => /lib/tls/libm.so.6 (0x402de000)
libc.so.6 => /lib/tls/libc.so.6 (0x40301000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

OS: SuSE-9.2 kept up to date with its online update tool.

test prog:
#!/usr/local/bin/ruby -w
require ‘tk’
class TkVariable
def to_m
“%.2f” % [self.to_i.abs/100.0]
end
end
puts TkVariable.new(12345).to_m

Hope that helps…


#7

From: Hidetoshi NAGAI removed_email_address@domain.invalid
Subject: Re: segfault with tk.rb
Date: Sat, 1 Apr 2006 09:59:27 +0900
Message-ID: removed_email_address@domain.invalid

Thank you for your report.
I think that depends on the finalize operation of a Tk interpreter
when Ruby is exiting.
But now, I have no time to fix the problem.

I’d try to fix the problem. The diff of ruby_1_8 branch is
http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/ext/tk/tcltklib.c.diff?r1=1.40.2.5;r2=1.40.2.6;only_with_tag=ruby_1_8.
Could you try it?


#8

From: Wybo D. removed_email_address@domain.invalid
Subject: Re: segfault with tk.rb
Date: Mon, 10 Apr 2006 11:05:52 +0200 (CEST)
Message-ID: removed_email_address@domain.invalid

Sorry for being so late with my reaction. Had other troubles and
also had to find out how to get 1.8.4 from cvs.

It does not seem to work. What I did was:

cvs -z4 -d :pserver:removed_email_address@domain.invalid:/src checkout -r ruby_1_8 ruby
patch -p0 <patch

-> patching file ruby/ext/tk/tcltklib.c

Reversed (or previously applied) patch detected! Assume -R? [n] y

‘ruby_1_8’ branch on CVS is already applied the patch.
You rolled back tcltklib.c. :slight_smile:
If you can try the latest version on CVS,
please try it without the patch.


#9

On Thu, 6 Apr 2006, Hidetoshi NAGAI wrote:

http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/ext/tk/tcltklib.c.diff?r1=1.40.2.5;r2=1.40.2.6;only_with_tag=ruby_1_8.
Could you try it?

Sorry for being so late with my reaction. Had other troubles and
also had to find out how to get 1.8.4 from cvs.

It does not seem to work. What I did was:

cvs -z4 -d :pserver:removed_email_address@domain.invalid:/src checkout -r
ruby_1_8 ruby
patch -p0 <patch

-> patching file ruby/ext/tk/tcltklib.c

Reversed (or previously applied) patch detected! Assume -R? [n] y

Hunk #5 succeeded at 4375 (offset 5 lines).

Hunk #6 succeeded at 4385 (offset 5 lines).

Hunk #7 succeeded at 4404 (offset 5 lines).

Hunk #8 succeeded at 4414 (offset 5 lines).

Hunk #9 succeeded at 4472 (offset 5 lines).

Hunk #10 succeeded at 4915 (offset 5 lines).

Hunk #11 succeeded at 6197 (offset 5 lines).

Hunk #12 succeeded at 6376 (offset 5 lines).

Hunk #13 succeeded at 7934 (offset 5 lines).

cd ruby
autoconf
./configure
make
./ruby …/warntest
./ruby -w …/warntest

where warntest contained:

require ‘tk’
class TkVariable
def to_m
“%.2f” % [self.to_i.abs/100.0]
end
end
puts TkVariable.new(12345).to_m

The first run on warntest worked fine.
But the ruby -w …/warntest gave the old problem: very heavy system load
ending in a segmentation fault.


#10

From: Wybo D. removed_email_address@domain.invalid
Subject: Re: segfault with tk.rb
Date: Tue, 11 Apr 2006 05:48:21 +0900
Message-ID: removed_email_address@domain.invalid

Ah, I see… I thought that could not be the case because, before
doing the patch, I tried my test and it went wrong.

I’m very sorry that I’m bothering you.
But I want to ask you one more try.
At Apr. 6 01:04:47, I committed patches of tk.rb and tk/variable.rb
to remove some warnings.
Please check on the latest version of those.
Possibly, the result helps me to fix the SEGV trouble.


#11

On Mon, 10 Apr 2006, Hidetoshi NAGAI wrote:

You rolled back tcltklib.c. :slight_smile:

Ah, I see… I thought that could not be the case because, before
doing the patch, I tried my test and it went wrong.

If you can try the latest version on CVS,
please try it without the patch.

I replaced tcltklib with the original and tried without patching:

Downloads>cvs -z4 -d :pserver:removed_email_address@domain.invalid:/src
checkout -r ruby_1_8 ruby/ext/tk/tcltklib.c
Downloads>cd ruby
ruby>make
ruby>./ruby -w …/warntest
/usr/local/lib/ruby/1.8/tk.rb:2313: warning: redefine encoding=
/usr/local/lib/ruby/1.8/tk.rb:2316: warning: redefine encoding
123.45
Segmentation fault