Segfault with tk.rb

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?

···

--
Wybo

Message-ID: <Pine.LNX.4.64.0603290017030.8945@servalys.nl>

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.

···

From: Wybo Dekker <wybo@servalys.nl>
Subject: segfault with tk.rb
Date: Wed, 29 Mar 2006 07:23:55 +0900
--
Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)

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:in `initialize'
         from t:11
/usr/local/lib/ruby/1.8/tk/variable.rb:290:
INTERP._unset_global_var(@id)
(rdb:1) c
123.45

···

--
Wybo

Message-ID: <Pine.LNX.4.64.0603291033430.8945@servalys.nl>

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 Dekker <wybo@servalys.nl>
Subject: Re: segfault with tk.rb
Date: Wed, 29 Mar 2006 17:43:43 +0900

From: Wybo Dekker <wybo@servalys.nl>
Subject: Re: segfault with tk.rb
Date: Wed, 29 Mar 2006 17:43:43 +0900
Message-ID: <Pine.LNX.4.64.0603291033430.8945@servalys.nl>

$ 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:in `initialize'
         from t:11
/usr/local/lib/ruby/1.8/tk/variable.rb:290:
INTERP._unset_global_var(@id)

--
Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)

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.

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'

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)

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...

···

On Thu, 30 Mar 2006, Hidetoshi NAGAI wrote:

--
Wybo

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.

···

--
Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)

Message-ID: <20060401.095916.41648212.nagai@ai.kyutech.ac.jp>

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&gt;\.
Could you try it?

···

From: Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
Subject: Re: segfault with tk.rb
Date: Sat, 1 Apr 2006 09:59:27 +0900
--
Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)

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:anonymous@cvs.ruby-lang.org:/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.

···

On Thu, 6 Apr 2006, Hidetoshi NAGAI wrote:

From: Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
Subject: Re: segfault with tk.rb
Date: Sat, 1 Apr 2006 09:59:27 +0900
Message-ID: <20060401.095916.41648212.nagai@ai.kyutech.ac.jp>

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&gt;\.
Could you try it?

--
Wybo

Message-ID: <Pine.LNX.4.64.0604101055500.25724@servalys.nl>

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:anonymous@cvs.ruby-lang.org:/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.

···

From: Wybo Dekker <wybo@servalys.nl>
Subject: Re: segfault with tk.rb
Date: Mon, 10 Apr 2006 11:05:52 +0200 (CEST)
--
Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)

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:

cvs -z4 -d :pserver:anonymous@cvs.ruby-lang.org:/src \

   checkout -r ruby_1_8 ruby/ext/tk/tcltklib.c

cd ruby
make
./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

···

On Mon, 10 Apr 2006, Hidetoshi NAGAI wrote:

--
Wybo

Message-ID: <Pine.LNX.4.64.0604102242320.25724@servalys.nl>

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.

···

From: Wybo Dekker <wybo@servalys.nl>
Subject: Re: segfault with tk.rb
Date: Tue, 11 Apr 2006 05:48:21 +0900
--
Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)