[前][次][番号順一覧][スレッド一覧]

ruby-changes:62356

From: Jake <ko1@a...>
Date: Wed, 22 Jul 2020 20:46:59 +0900 (JST)
Subject: [ruby-changes:62356] 8b0dc77a62 (master): configure.ac: Bump the size of sigaltstack

https://git.ruby-lang.org/ruby.git/commit/?id=8b0dc77a62

From 8b0dc77a621ded75f72486c33f55404ce73f00d7 Mon Sep 17 00:00:00 2001
From: Jake Zimmerman <zimmerman.jake@g...>
Date: Fri, 10 Jul 2020 12:05:34 -0700
Subject: configure.ac: Bump the size of sigaltstack

The RubyVM uses C macro defines to feature detect whether
`backtrace(2)` support is available, and if so it includes C level backtraces
when the RubyVM itself crashes.

But on my machine, C level backtraces from `vm_dump.c` didn't work when
using a version of Ruby buillt on the machine, but worked fine when using a
version of Ruby built on another machine and copied to my machine.

The default autoconf test for backtraces uses a sigaltstack size that is
too small, so the SIGSEGV signal handler itself causes a SIGSEGV).
I noticed that signal.c uses a larger sigaltstack size:

https://github.com/ruby/ruby/blob/v2_6_5/signal.c#L568

The specific variables it looks at:

- `HAVE_BACKTRACE`

  this is a macro defined by autoconf because there is a line in the
  configure script like `AC_CHECK_FUNCS(backtrace)` (see the autoconf
  docs for more).

- `BROKEN_BACKTRACE`

  this comes from a custom program that Ruby's configure script runs to
  attempt to figure out whether actually using backtrace(2) in a real
  program works. You can see the autoconf program here.

  <https://github.com/ruby/ruby/blob/v2_6_5/configure.ac#L2817-L2863>

It uses sigaltstack and SA_ONSTACK to create a seperate stack for
handling signals.

The problem was: SIGSTKSZ (which comes from a system header!) was not
suggesting a large enough stack size. When checking on an Ubuntu 16.04
box, we found that SIGSTKSZ was 8192 and MINSIGSTKSZ was 2048.

diff --git a/configure.ac b/configure.ac
index dc4ab53..ae908f7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2948,12 +2948,12 @@ main(void) https://github.com/ruby/ruby/blob/trunk/configure.ac#L2948
     stack_t ss;
     struct sigaction sa;
 
-    ss.ss_sp = malloc(SIGSTKSZ);
+    ss.ss_sp = malloc(16*1024);
     if (ss.ss_sp == NULL) {
 	fprintf(stderr, "cannot allocate memory for sigaltstack\n");
 	return EXIT_FAILURE;
     }
-    ss.ss_size = SIGSTKSZ;
+    ss.ss_size = 16*1024;
     ss.ss_flags = 0;
     if (sigaltstack(&ss, NULL) == -1) {
 	fprintf(stderr, "sigaltstack failed\n");
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]