Bug #705
closedsample/test.rb:1829: [BUG] Segmentation fault
Description
=begin
r19078 以降 SEGV します。
D:\work\ruby_1_8-r19078\win32>nmake test
Microsoft (R) Program Maintenance Utility Version 6.00.9782.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
./../sample/test.rb:1829: [BUG] Segmentation fault
ruby 1.8.7 (2008-09-02 revision 19404) [i386-mswin32]
abnormal program termination
test failed
NMAKE : fatal error U1077: '.\miniruby.exe' : リターン コード '0x1'
Stop.
=end
Updated by nobu (Nobuyoshi Nakada) about 16 years ago
=begin
なかだです。
At Sat, 1 Nov 2008 12:52:56 +0900,
pegacorn jp wrote in [ruby-dev:37008]:
r19078 以降 SEGV します。
D:\work\ruby_1_8-r19078\win32>nmake test Microsoft (R) Program Maintenance Utility Version 6.00.9782.0 Copyright (C) Microsoft Corp 1988-1998. All rights reserved. ./../sample/test.rb:1829: [BUG] Segmentation fault ruby 1.8.7 (2008-09-02 revision 19404) [i386-mswin32] abnormal program termination test failed NMAKE : fatal error U1077: '.\miniruby.exe' : リターン コード '0x1' Stop.
VC6ですよね? とりあえず最新版で試してみたのですが再現できません
でした。VCのデバッガでバックトレースとかとれないでしょうか。
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦
=end
Updated by pegacorn (pegacorn jp) about 16 years ago
=begin
Windows 2000(SP4) + VC6(SP6) です。
msdev ruby.exe -I../lib ./../sample/test.rb
でコールスタックが取れました。
---- ここから
NTDLL! 77f9193c()
NTDLL! 77f9c73e()
NTDLL! 77fb064e()
NTDLL! 77f9bd5a()
NTDLL! 77fcb63e()
MSVCRT! 78001532()
MSVCRT! 780014cf()
st_insert(st_table * 0x02ce1c48, unsigned long 3137, unsigned long 48541080) line 293 + 51 bytes
clone_method() line 70 + 39 bytes
st_foreach(st_table * 0x02a7e140, int (void)* 0x100474c0 clone_method(void), unsigned long 37806436) line 487 + 21 bytes
rb_mod_init_copy(unsigned long 48541400, unsigned long 44819520) line 100 + 21 bytes
rb_class_init_copy(unsigned long 48541400, unsigned long 44819520) line 117 + 13 bytes
rb_call0() line 5906 + 205 bytes
rb_call(unsigned long 44830020, unsigned long 48541400, unsigned long 2969, int 1, const unsigned long * 0x0240e3c0, int 1, unsigned long 6) line 6153 + 37 bytes
vafuncall() line 6230 + 133 bytes
rb_funcall(unsigned long 48541400, unsigned long 2969, int 1) line 6247 + 21 bytes
init_copy() line 188 + 21 bytes
rb_obj_clone(unsigned long 44819520) line 227 + 13 bytes
rb_call0() line 5906 + 178 bytes
rb_call(unsigned long 44829920, unsigned long 44819520, unsigned long 3065, int 0, const unsigned long * 0x00000000, int 0, unsigned long 44824980) line 6153 + 37 bytes
rb_eval(unsigned long 44824980, RNode * 0x02b1f4c0) line 3494 + 186 bytes
rb_eval(unsigned long 44824980, RNode * 0x02aaf8f0) line 3704 + 16 bytes
eval_node() line 1438 + 13 bytes
ruby_exec_internal() line 1643 + 18 bytes
ruby_exec() line 1664
ruby_run() line 1673 + 5 bytes
main() line 51
RUBY! mainCRTStartup + 227 bytes
KERNEL32! 77e789d5()
---- ここまで
この直前は、以下の通りです。
---- ここから
ruby_xmalloc(long 16) line 159 + 5 bytes
st_insert(st_table * 0x02ce1c48, unsigned long 3137, unsigned long 48541080) line 293 + 51 bytes
(後略)
---- ここまで
=end
Updated by pegacorn (pegacorn jp) about 16 years ago
=begin
r19078 の変更で、
marshal_load が、load_ensure で解放した領域を使用するようになって
ヒープを破壊しています。
static VALUE
load_ensure(arg)
struct load_arg *arg;
{
if (!DATA_PTR(arg->wrapper)) return 0;
st_free_table(arg->symbols);
st_free_table(arg->data); /* <-- ここで解放 */
DATA_PTR(arg->wrapper) = 0;
arg->wrapper = 0;
return 0;
}
static VALUE
marshal_load(argc, argv)
int argc;
VALUE *argv;
{
(省略)
v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg);
RBASIC(arg.data)->klass = rb_cHash; /* <-- ここで使用 */
return v;
}
=end
Updated by nobu (Nobuyoshi Nakada) about 16 years ago
=begin
なかだです。
At Mon, 3 Nov 2008 09:33:54 +0900,
pegacorn jp wrote in [ruby-dev:37016]:
r19078 の変更で、
marshal_load が、load_ensure で解放した領域を使用するようになって
ヒープを破壊しています。
というかarg.dataはもうHashではないのでmarshal_loadのほうが消し忘
れですね。
RBASIC(arg.data)->klass = rb_cHash; /* <-- ここで使用 */
この行を消したら解決しますか?
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦
=end
Updated by pegacorn (pegacorn jp) about 16 years ago
=begin
RBASIC(arg.data)->klass = rb_cHash; /* <-- ここで使用 */
この行を消したら解決しますか?
はい。SEGV しなくなりました。
D:\work\ruby_1_8-r19078\win32>nmake test
Microsoft (R) Program Maintenance Utility Version 6.00.9782.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
test succeeded
=end
Updated by nobu (Nobuyoshi Nakada) about 16 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
Applied in changeset r20097.
=end