Project

General

Profile

Actions

Bug #17652

closed

GC compaction crash on mprotect

Added by peterzhu2118 (Peter Zhu) about 3 years ago. Updated about 3 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:102585]

Description

GitHub PR: https://github.com/ruby/ruby/pull/4221 https://github.com/ruby/ruby/pull/4227

Issue

GC compaction will crash on some pages due to a failing mprotect call. According to the mprotect documentation:

POSIX says that the behavior of mprotect() is unspecified if it is applied to a region of memory that was not obtained via mmap(2).

This causes mprotect to sometimes fail.

Reproduction

GC.auto_compact = true

times = 20_000_000
arr = Array.new(times)
times.times do |i|
  arr[i] = "#{i}"
end

arr = Array.new(1_000_000, 42)
GC.start

puts "ok"

Expected output

Program runs and prints "ok".

Actual output

Crashes on Ubuntu 18.04. See crash.log for the crash log (note that the log file has been truncated because it's too big).


Files

crash.log (6.26 KB) crash.log peterzhu2118 (Peter Zhu), 02/23/2021 09:34 PM
ruby-cygwin-rb_aligned_malloc.patch (840 Bytes) ruby-cygwin-rb_aligned_malloc.patch xtkoba (Tee KOBAYASHI), 02/27/2021 12:13 AM
Actions #1

Updated by peterzhu2118 (Peter Zhu) about 3 years ago

  • Description updated (diff)
Actions #2

Updated by peterzhu2118 (Peter Zhu) about 3 years ago

  • Description updated (diff)
Actions #3

Updated by peterzhu2118 (Peter Zhu) about 3 years ago

  • Description updated (diff)

Updated by xtkoba (Tee KOBAYASHI) about 3 years ago

Changes made for this issue seem to break the Cygwin builds (for both i686 and x86_64). A backtrace for miniruby (without any options) from GDB:

Thread 1 received signal SIGSEGV, Segmentation fault.
heap_page_allocate (objspace=0x800053110) at ../gc.c:1883
1883        page_body->header.page = page;
(gdb) bt
#0  heap_page_allocate (objspace=0x800053110) at ../gc.c:1883
#1  heap_page_create (objspace=0x800053110) at ../gc.c:1923
#2  heap_assign_page (objspace=objspace@entry=0x800053110, heap=heap@entry=0x800053138) at ../gc.c:1948
#3  0x0000000100467ef1 in heap_add_pages (objspace=objspace@entry=0x800053110, heap=heap@entry=0x800053138, add=24) at ../gc.c:1961
#4  0x00000001004681be in Init_heap () at ../gc.c:3190
#5  0x000000010045653b in ruby_setup () at ../eval.c:87
#6  0x0000000000000000 in ?? ()
(gdb) p page_body
$1 = (struct heap_page_body *) 0x6fffffee4000
(gdb) p *page_body
Cannot access memory at address 0x6fffffee4000
(gdb)

I have not yet started to investigate what is wrong.

Updated by xtkoba (Tee KOBAYASHI) about 3 years ago

It seems that the addr argument for Cygwin's munmap(2) must be aligned to 64KB boundaries. A patch is attached to conform to this.

Updated by peterzhu2118 (Peter Zhu) about 3 years ago

Thanks for reporting the issue in cygwin. I've proposed a patch that should solve the issue.

Actions #7

Updated by peterzhu2118 (Peter Zhu) about 3 years ago

  • Status changed from Open to Closed
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0