[Vm-dev] Linux 4.4.7.2357 VM crash under memory pressure
Bert Freudenberg
bert at freudenbergs.de
Sun May 20 13:08:20 UTC 2012
Hilaire discovered that his newest DrGeo segfaults on the XO-1. It works fine elsewhere, including the XO-1.5, which has pretty much the same OS.
We narrowed down the problem to the XO-1 having only 256 MB of RAM and no swap space. I can reproduce the crash in a virtual Ubuntu 12 with 768 MB RAM (!) but no swap. Top reports:
Mem: 766204k total, 601588k used, 164616k free, 45624k buffers
Swap: 0k total, 0k used, 0k free, 277024k cached
but DrGeo still crashes. Etoys runs fine using the same Squeak VM on the same system (and on XO-1). DrGeo is based on Pharo 1.4, using a closure image. Etoys still is pre-closure.
I ran the DrGeo under GDB. Here is the backtrace after the SEGFAULT, "gnu-interp.c:27272" maps to the "newOop = longAt(fwdBlock);" line in updatePointersInRootObjectsFromto():
=============
(gdb) bt
#0 0x0807acdb in updatePointersInRootObjectsFromto (memStart=-1314145112,
memEnd=-1312574048)
at /home/olpc/Squeak-4.4.7.2357-src/bld/gnu-interp.c:27272
#1 0x08068586 in mapPointersInObjectsFromto (memStart=-1314145112,
memEnd=-1312574048)
at /home/olpc/Squeak-4.4.7.2357-src/bld/gnu-interp.c:13495
#2 0x0805b53f in incCompBody ()
at /home/olpc/Squeak-4.4.7.2357-src/bld/gnu-interp.c:5068
#3 0x0805bbe8 in incrementalGC ()
at /home/olpc/Squeak-4.4.7.2357-src/bld/gnu-interp.c:5405
#4 0x0805c9c7 in instantiateContextsizeInBytes (classPointer=-1324064796,
sizeInBytes=92) at /home/olpc/Squeak-4.4.7.2357-src/bld/gnu-interp.c:6099
#5 0x080575b8 in allocateOrRecycleContext (needsLarge=0)
at /home/olpc/Squeak-4.4.7.2357-src/bld/gnu-interp.c:2050
#6 0x08061898 in interpret ()
at /home/olpc/Squeak-4.4.7.2357-src/bld/gnu-interp.c:9310
#7 0x0807f107 in main (argc=2, argv=0xbffff494, envp=0xbffff4a0)
at /home/olpc/Squeak-4.4.7.2357-src/unix/vm/sqUnixMain.c:1444
(gdb) p/x memory
$3 = 0xb1094000
(gdb) p/x foo->endOfMemory
$4 = 0xb1c3b5a0
(gdb) p/x memStart
$5 = 0xb1abbca8
(gdb) p/x memEnd
$6 = 0xb1c3b5a0
(gdb) p/x fwdBlock
$7 = 0x63577a08
=============
fwdBlock appears to be clearly outside the object memory, that can't be right? Any idea how to fix it?
- Bert -
More information about the Vm-dev
mailing list