Project

General

Profile

Bug #13432

set_trace_funcにproc->is_from_method = TRUEのオブジェクトを渡し、SystemStackErrorを発生させるとRubyVMが停止する

Added by masato_hi (Masato Hi) about 2 years ago. Updated almost 2 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.5.0dev (2017-04-13 trunk 58340) [x86_64-darwin16]
[ruby-dev:<unknown>]

Description

以下のコードのように、Method#to_procで作成したProcオブジェクトをset_trace_funcに設定しSystemStackErrorを発生させるとRubyVMが停止する。

def trace_method(event, file, line, id, binding, klass); end

set_trace_func method(:trace_method).to_proc

def stack_overflow
  stack_overflow
end

stack_overflow #=> RubyVM stops

以下のコードではこの問題は発生しない。

set_trace_func lambda {|event, file, line, id, binding, klass|
}

def stack_overflow
  stack_overflow
end

stack_overflow #=> stack level too deep (SystemStackError)

Related issues

Is duplicate of Ruby trunk - Bug #13425: Tracer.onにした状態でSystemStackErrorを発生させるとSegmentation faultClosedActions

Associated revisions

Revision 75b11469
Added by usa (Usaku NAKAMURA) almost 2 years ago

merge revision(s) 58334,58346,58349: [Backport #13425] [Backport #13432]

    thread.c: disable VM events when stack overflow

    * thread.c (ruby_thread_stack_overflow): disable VM events when
      stack overflow occurred; it causes another stack overflow again
      in making backtrace object, and crashes.
      [ruby-core:80662] [Bug #13425]
    increase timeout seconds.

    * test/ruby/test_trace.rb (test_trace_stackoverflow): on some platforms
      this test fails because of timeout.

    disable rewind hooks.

    * vm.c (hook_before_rewind): skip rewind hooks if err is SystemStackError
      because rewind hooks can cause stack overflow again and again.

    * thread.c (ruby_thread_stack_overflow): do not disable all hooks.
      Additionally, clearing ruby_vm_event_flags is not suitable way
      to disable hooks.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@59232 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 59232
Added by usa (Usaku NAKAMURA) almost 2 years ago

merge revision(s) 58334,58346,58349: [Backport #13425] [Backport #13432]

thread.c: disable VM events when stack overflow

* thread.c (ruby_thread_stack_overflow): disable VM events when
  stack overflow occurred; it causes another stack overflow again
  in making backtrace object, and crashes.
  [ruby-core:80662] [Bug #13425]
increase timeout seconds.

* test/ruby/test_trace.rb (test_trace_stackoverflow): on some platforms
  this test fails because of timeout.

disable rewind hooks.

* vm.c (hook_before_rewind): skip rewind hooks if err is SystemStackError
  because rewind hooks can cause stack overflow again and again.

* thread.c (ruby_thread_stack_overflow): do not disable all hooks.
  Additionally, clearing ruby_vm_event_flags is not suitable way
  to disable hooks.

Revision 5528c18d
Added by nagachika (Tomoyuki Chikanaga) almost 2 years ago

merge revision(s) 58334,58346,58349: [Backport #13425] [Backport #13432]

    thread.c: disable VM events when stack overflow

    * thread.c (ruby_thread_stack_overflow): disable VM events when
      stack overflow occurred; it causes another stack overflow again
      in making backtrace object, and crashes.
      [ruby-core:80662] [Bug #13425]
    increase timeout seconds.

    * test/ruby/test_trace.rb (test_trace_stackoverflow): on some platforms
      this test fails because of timeout.

    disable rewind hooks.

    * vm.c (hook_before_rewind): skip rewind hooks if err is SystemStackError
      because rewind hooks can cause stack overflow again and again.

    * thread.c (ruby_thread_stack_overflow): do not disable all hooks.
      Additionally, clearing ruby_vm_event_flags is not suitable way
      to disable hooks.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@59297 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 59297
Added by nagachika (Tomoyuki Chikanaga) almost 2 years ago

merge revision(s) 58334,58346,58349: [Backport #13425] [Backport #13432]

thread.c: disable VM events when stack overflow

* thread.c (ruby_thread_stack_overflow): disable VM events when
  stack overflow occurred; it causes another stack overflow again
  in making backtrace object, and crashes.
  [ruby-core:80662] [Bug #13425]
increase timeout seconds.

* test/ruby/test_trace.rb (test_trace_stackoverflow): on some platforms
  this test fails because of timeout.

disable rewind hooks.

* vm.c (hook_before_rewind): skip rewind hooks if err is SystemStackError
  because rewind hooks can cause stack overflow again and again.

* thread.c (ruby_thread_stack_overflow): do not disable all hooks.
  Additionally, clearing ruby_vm_event_flags is not suitable way
  to disable hooks.

History

#1

Updated by masato_hi (Masato Hi) about 2 years ago

  • Description updated (diff)

Updated by nobu (Nobuyoshi Nakada) about 2 years ago

  • Description updated (diff)

r59100では起きないようです。

Updated by nobu (Nobuyoshi Nakada) about 2 years ago

  • Backport changed from 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN to 2.2: REQUIRED, 2.3: REQUIRED, 2.4: REQUIRED

r58349 で修正済み。

#4

Updated by nobu (Nobuyoshi Nakada) about 2 years ago

  • Is duplicate of Bug #13425: Tracer.onにした状態でSystemStackErrorを発生させるとSegmentation fault added
#5

Updated by nobu (Nobuyoshi Nakada) about 2 years ago

  • Status changed from Open to Closed
#6

Updated by usa (Usaku NAKAMURA) almost 2 years ago

  • Backport changed from 2.2: REQUIRED, 2.3: REQUIRED, 2.4: REQUIRED to 2.2: REQUIRED, 2.3: DONE, 2.4: REQUIRED

Updated by nagachika (Tomoyuki Chikanaga) almost 2 years ago

  • Backport changed from 2.2: REQUIRED, 2.3: DONE, 2.4: REQUIRED to 2.2: REQUIRED, 2.3: DONE, 2.4: DONE

ruby_2_4 r59297 merged revision(s) 58334,58346,58349.

Also available in: Atom PDF