Bug #9739

TestException#test_machine_stackoverflow(_by_define_method) failures on x64-mingw32

Added by Hiroshi Shirosaki over 1 year ago. Updated 12 months ago.

[ruby-core:62015]
Status:Closed
Priority:Normal
Assignee:Nobuyoshi Nakada
ruby -v:ruby 2.2.0dev (2014-04-13 trunk 45580) [x64-mingw32] Backport:2.0.0: DONE, 2.1: DONE

Description

I have the following two test failures with x64-mingw32 on Windows 7.

$ gcc -v 2>&1 | tail -n1
gcc version 4.8.2 20130712 (prerelease) (Built by MinGW-builds project)
$ make test-all TESTS="-q ruby/test_exception.rb"

(snip)

[29/43] TestException#test_machine_stackoverflow = 0.05 s
  1) Failure:
TestException#test_machine_stackoverflow [c:/Users/h.shirosaki/work/ruby/test/ruby/test_exception.rb:537]:
pid 2228 killed by SIGSEGV (signal 11)

[30/43] TestException#test_machine_stackoverflow_by_define_method = 0.05 s
  2) Failure:
TestException#test_machine_stackoverflow_by_define_method [c:/Users/h.shirosaki/work/ruby/test/ruby/test_exception.rb:54
8]:
pid 8984 killed by SIGSEGV (signal 11)

Finished tests in 0.575033s, 74.7783 tests/s, 370.4135 assertions/s.
43 tests, 213 assertions, 2 failures, 0 errors, 0 skips

ruby -v: ruby 2.2.0dev (2014-04-13 trunk 45580) [x64-mingw32]

I'm not sure the reason, but setting larger stack size fixes SIGSEGV.

diff --git a/configure.in b/configure.in
index f52e0ba..078f9ba 100644
--- a/configure.in
+++ b/configure.in
@@ -2782,7 +2782,7 @@ if test "$with_dln_a_out" != yes; then
            rb_cv_dlopen=yes],
    [cygwin*|mingw*], [
            : ${LDSHARED='$(CC) -shared $(if $(filter-out -g -g0,$(debugflags)),,-s)'}
-           XLDFLAGS="$XLDFLAGS -Wl,--stack,0x00200000,--enable-auto-import"
+           XLDFLAGS="$XLDFLAGS -Wl,--stack,0x01200000,--enable-auto-import"
            DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import"
            : ${LIBPATHENV=""}
            rb_cv_dlopen=yes],

0001-Handle-machine-stack-overflow-on-mingw.patch Magnifier (1.89 KB) Hiroshi Shirosaki, 05/15/2014 03:11 AM

Associated revisions

Revision 46522
Added by Tomoyuki Chikanaga about 1 year ago

merge revision(s) r45947,r45951: [Backport #9739] [Backport #9844]

* thread_win32.c (rb_w32_stack_overflow_handler): use Structured
  Exception Handling by Addvectoredexceptionhandler() for machine
  stack overflow on mingw.
  This would be equivalent to the handling using __try and __exept
  on mswin introduced by r43748.
  Exception Handling by AddVectoredExceptionHandler() for machine
  This would be equivalent to the handling using __try and __except

Revision 46576
Added by Usaku NAKAMURA about 1 year ago

merge revision(s) 43748,45947,45951: [Backport #9739]

* eval_intern.h (SAVE_ROOT_JMPBUF): workaround for the failure of
  test/ruby/test_exception.rb on Windows.
  wrap by __try and __exception statements on mswin to raise SIGSEGV
  when EXCEPTION_STACK_OVERFLOW is occurred, because MSVCRT doesn't
  handle the exception.
  however, (1) mingw-gcc doesn't support __try and __exception
  statements, and (2) we cannot retry SystemStackError after this
  change yet (maybe crashed) because SEH and longjmp() are too
  uncongenial.

* signal.c (check_stack_overflow, CHECK_STACK_OVERFLOW): now defined on
  Windows, too.

* thread_win32.c (ruby_stack_overflowed_p): ditto.

* thread_win32.c (rb_w32_stack_overflow_handler): use Structured
  Exception Handling by Addvectoredexceptionhandler() for machine
  stack overflow on mingw.
  This would be equivalent to the handling using __try and __exept
  on mswin introduced by r43748.
  Exception Handling by AddVectoredExceptionHandler() for machine
  This would be equivalent to the handling using __try and __except

History

#1 Updated by Luis Lavena over 1 year ago

  • Target version set to current: 2.2.0
  • Category set to build
  • Status changed from Open to Assigned
  • Assignee set to Nobuyoshi Nakada

Nobu,

Can you review, reject or approve so we can resolve these test failures?

Thank you.

#2 Updated by Hiroshi Shirosaki over 1 year ago

I found this fix was provided on mswin at r43748, but not on mingw.

We can use Structured Exception Handling by
Addvectoredexceptionhandler() for machine stack overflow on mingw.
This would be equivalent to the handling using __try and __exept
on mswin introduced by r43748.

Attached a patch.

#3 Updated by Hiroshi Shirosaki over 1 year ago

  • Category changed from build to platform/mingw
  • Status changed from Assigned to Closed

Applied at r45947. Thank you.

#4 Updated by Tomoyuki Chikanaga about 1 year ago

  • Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN to 2.0.0: UNKNOWN, 2.1: DONE

Backported into ruby_2_1 branch at r46522.

#5 Updated by Usaku NAKAMURA about 1 year ago

  • Backport changed from 2.0.0: UNKNOWN, 2.1: DONE to 2.0.0: DONE, 2.1: DONE

backported r43748 (for mswin), r45947 and r45951 (for mingw) into ruby_2_0_0 at r46576.

#6 Updated by Vit Ondruch 12 months ago

Interestingly, I met this test error recently on Fedora's builder:

  3) Failure:
TestException#test_machine_stackoverflow_by_define_method [/builddir/build/BUILD/ruby-2.2.0-r47288/test/ruby/test_exception.rb:555]:
pid 19431 killed by SIGSEGV (signal 11)
15620 tests, 2470788 assertions, 1 failures, 0 errors, 31 skips
ruby -v: ruby 2.2.0dev (2014-08-26 trunk 47288) [i386-linux]

Also available in: Atom PDF