The segfault appears in the parser stage. That’s already quite surprising, actually.
According to strace it seems to happens while parsing src/crystal/dwarf/abbrev.cr
.
... [shortened] ...
#12 0.784 read(6, "require \"crystal/dwarf\"\n{% if fl"..., 4096) = 2048
#12 0.785 read(6, "", 4096) = 0
#12 0.785 close(6) = 0
#12 0.786 access("lib/crystal/dwarf.cr", F_OK) = -1 ENOENT (No such file or directory)
#12 0.786 getcwd("/opt/app", 4096) = 9
#12 0.786 access("/opt/app/lib/crystal/src/dwarf.cr", F_OK) = -1 ENOENT (No such file or directory)
#12 0.787 getcwd("/opt/app", 4096) = 9
#12 0.787 access("/opt/app/lib/crystal/src/crystal/dwarf.cr", F_OK) = -1 ENOENT (No such file or directory)
#12 0.788 getcwd("/opt/app", 4096) = 9
#12 0.788 access("/opt/app/lib/crystal/dwarf/dwarf.cr", F_OK) = -1 ENOENT (No such file or directory)
#12 0.788 getcwd("/opt/app", 4096) = 9
#12 0.788 access("/opt/app/lib/crystal/src/dwarf/dwarf.cr", F_OK) = -1 ENOENT (No such file or directory)
#12 0.789 getcwd("/opt/app", 4096) = 9
#12 0.790 access("/opt/app/lib/crystal/src/crystal/dwarf/dwarf.cr", F_OK) = -1 ENOENT (No such file or directory)
#12 0.790 access("/usr/lib/crystal/shards/crystal/dwarf.cr", F_OK) = -1 ENOENT (No such file or directory)
#12 0.790 getcwd("/opt/app", 4096) = 9
#12 0.791 access("/usr/lib/crystal/shards/crystal/src/dwarf.cr", F_OK) = -1 ENOENT (No such file or directory)
#12 0.792 getcwd("/opt/app", 4096) = 9
#12 0.792 access("/usr/lib/crystal/shards/crystal/src/crystal/dwarf.cr", F_OK) = -1 ENOENT (No such file or directory)
#12 0.793 getcwd("/opt/app", 4096) = 9
#12 0.793 access("/usr/lib/crystal/shards/crystal/dwarf/dwarf.cr", F_OK) = -1 ENOENT (No such file or directory)
#12 0.794 getcwd("/opt/app", 4096) = 9
#12 0.794 access("/usr/lib/crystal/shards/crystal/src/dwarf/dwarf.cr", F_OK) = -1 ENOENT (No such file or directory)
#12 0.795 getcwd("/opt/app", 4096) = 9
#12 0.795 access("/usr/lib/crystal/shards/crystal/src/crystal/dwarf/dwarf.cr", F_OK) = -1 ENOENT (No such file or directory)
#12 0.795 access("/usr/lib/crystal/core/crystal/dwarf.cr", F_OK) = 0
#12 0.796 getcwd("/opt/app", 4096) = 9
#12 0.796 open("/usr/lib/crystal/core/crystal/dwarf.cr", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 6
#12 0.797 fcntl(6, F_SETFD, FD_CLOEXEC) = 0
#12 0.797 fcntl(6, F_GETFL) = 0x8000 (flags O_RDONLY|O_LARGEFILE)
#12 0.797 fstat(6, {st_mode=S_IFREG|0644, st_size=955, ...}) = 0
#12 0.798 read(6, "require \"./dwarf/abbrev\"\nrequire"..., 4096) = 955
#12 0.798 read(6, "", 4096) = 0
#12 0.798 close(6)
#12 0.799 access("/usr/lib/crystal/core/crystal/./dwarf/abbrev.cr", F_OK) = 0 [37/1859]
#12 0.799 getcwd("/opt/app", 4096) = 9
#12 0.799 open("/usr/lib/crystal/core/crystal/dwarf/abbrev.cr", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 6
#12 0.800 fcntl(6, F_SETFD, FD_CLOEXEC) = 0
#12 0.800 fcntl(6, F_GETFL) = 0x8000 (flags O_RDONLY|O_LARGEFILE)
#12 0.800 fstat(6, {st_mode=S_IFREG|0644, st_size=9295, ...}) = 0
#12 0.800 read(6, "require \"../dwarf\"\n\nmodule Cryst"..., 4096) = 4096
#12 0.801 read(6, " DW_AT_artificial = "..., 4096) = 4096
#12 0.801 read(6, "esent = 0x19 # flag\n RefSig"..., 4096) = 1103
#12 0.801 read(6, "", 4096) = 0
#12 0.802 close(6) = 0
#12 0.802 access("/usr/lib/crystal/core/crystal/dwarf/../dwarf.cr", F_OK) = 0
#12 0.803 getcwd("/opt/app", 4096) = 9
#12 0.803 --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x562d84afe82a} ---
#12 0.803 writev(2, [{iov_base="Invalid memory access (signal 11"..., iov_len=60}, {iov_base=NULL, iov_len=0}], 2Invalid memory access (signal 11) at address 0x562d84afe82a
#12 0.805 ) = 60
#12 0.805 mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a94bd000
#12 0.805 mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a94ad000
#12 0.807 munmap(0x7fe9a94ad000, 65536) = 0
#12 0.808 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a94bb000
#12 0.808 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a94b9000
#12 0.808 munmap(0x7fe9a94b9000, 8192) = 0
#12 0.809 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a94b7000
#12 0.810 munmap(0x7fe9a94b7000, 16384) = 0
#12 0.812 mmap(NULL, 650156, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a941c000
#12 0.812 mmap(NULL, 650156, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a937d000
#12 0.843 munmap(0x7fe9a937d000, 651264) = 0
#12 0.844 mmap(NULL, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a9412000
#12 0.844 mmap(NULL, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a9408000
#12 0.846 munmap(0x7fe9a9408000, 40960) = 0
#12 0.846 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a940e000
#12 0.847 munmap(0x7fe9a940e000, 16384) = 0
#12 0.847 writev(2, [{iov_base="[0x562c849f3186] ???\n", iov_len=21}, {iov_base=NULL, iov_len=0}], 2[0x562c849f3186] ???
#12 0.848 ) = 21
#12 0.848 mmap(NULL, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a940c000
#12 0.848 mmap(NULL, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a9406000
#12 0.849 munmap(0x7fe9a9406000, 24576) = 0
#12 0.849 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a940a000
#12 0.850 munmap(0x7fe9a940a000, 8192) = 0
#12 0.850 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe9a940b000
#12 0.850 munmap(0x7fe9a940b000, 4096) = 0
#12 0.851 writev(2, [{iov_base="[0x562c849f3153] ???\n", iov_len=21}, {iov_base=NULL, iov_len=0}], 2[0x562c849f3153] ???
#12 0.851 ) = 21
#12 0.851 writev(2, [{iov_base="[0x7fe9b3254c8a] ???\n", iov_len=21}, {iov_base=NULL, iov_len=0}], 2[0x7fe9b3254c8a] ???
#12 0.852 ) = 21
#12 0.852 exit_group(11) = ?
#12 0.855 +++ exited with 11 +++