pharo
pharo copied to clipboard
Running a script crashes the VM
Bug description Running the script below with:
./pharo Pharo.image --headless st a.st
crashes the VM with a segmentation fault.
To Reproduce Steps to reproduce the behavior:
- create
a.st
:
| count |
Stdio stdout
<< 'Starting...';
lf; flush.
count := 0.
1 to: 1000 do:
[ :i |
[ ExternalAddress null fromCString.
Stdio stdout
print: i;
<< ': ';
print: count;
lf; flush. ]
on: PrimitiveFailed
do: [ :ex | count := count + 1 ] ].
Stdio stdout
<< 'Completed with count: ';
print: count;
lf.
- run the script:
./pharo Pharo.image --headless st a.st
produces:
./pharo Pharo.image --headless st a.st
Starting...
Segmentation fault Wed Jun 29 09:11:50 2022
/home/alistair/pharo/Pharo11-001/pharo-vm/lib/pharo
PharoVM version:5.0-Pharo 9.0.15 built on Jun 10 2022 15:52:10 Compiler: 5.4.0 20160609 5.4.0 20160609 [Production Spur 64-bit VM]
Built from: CoInterpreter * VMMaker-tonel.1 uuid: aa6234f4-799d-0d00-90d1-c90e092bce84 Jun 10 2022
With:StackToRegisterMappingCogit * VMMaker-tonel.1 uuid: aa6234f4-799d-0d00-90d1-c90e092bce84 Jun 10 2022
Revision: v9.0.15 - Commit: b487900 - Date: 2022-06-02 09:48:57 +0200
C stack backtrace & registers:
rax 0x00000000 rbx 0x7f68fccae2d8 rcx 0x00000e9d rdx 0x1772ad48
rdi 0x00000001 rsi 0x00000001 rbp 0x7ffdc2d81280 rsp 0x7ffdc2d81260
r8 0x16816330 r9 0x17e5fc00 r10 0x7f68fcca5d00 r11 0x7ffdc2d80f60
r12 0x16817ca9 r13 0x7ffdc2d80f60 r14 0x00000009 r15 0x1772ad58
rip 0x1681646d
*[0x1681646d]
/home/alistair/pharo/Pharo11-001/pharo-vm/lib/libPharoVMCore.so(+0xc41ec)[0x7f68fca641ec]
/home/alistair/pharo/Pharo11-001/pharo-vm/lib/libPharoVMCore.so(doReport+0xb5)[0x7f68fca644d5]
/home/alistair/pharo/Pharo11-001/pharo-vm/lib/libPharoVMCore.so(sigsegv+0x14)[0x7f68fca64544]
/lib/x86_64-linux-gnu/libc.so.6(+0x43090)[0x7f68fc7f1090]
[0x1681646d]
[0xffffffffffffffff]
All Smalltalk process stacks (active first):
Process 0x175046e0 priority 40
0x7ffdc2d81280 M ExternalAddress>unsignedByteAt: 0x1772ad48: a(n) ExternalAddress
0x7ffdc2d812c0 M [] in ExternalAddress>fromCString 0x1772ad48: a(n) ExternalAddress
0x7ffdc2d81300 M ByteArray class(SequenceableCollection class)>new:streamContents: 0x17e745e8: a(n) ByteArray class
0x7ffdc2d81340 M ByteArray class(SequenceableCollection class)>streamContents: 0x17e745e8: a(n) ByteArray class
0x7ffdc2d81380 M ExternalAddress>fromCString 0x1772ad48: a(n) ExternalAddress
0x7ffdc2d813c0 M [] in UndefinedObject>DoIt 0x17e5fc00: a(n) UndefinedObject
0x7ffdc2d813f0 M FullBlockClosure(BlockClosure)>on:do: 0x1772ace0: a(n) FullBlockClosure
0x7ffdc2d81440 M UndefinedObject>DoIt 0x17e5fc00: a(n) UndefinedObject
0x7ffdc2d81480 I OCReceiverDoItSemanticScope(OCDoItSemanticScope)>evaluateDoIt: 0x1752d0e8: a(n) OCReceiverDoItSemanticScope
0x7ffdc2d814d8 I OpalCompiler>evaluate 0x1752ce20: a(n) OpalCompiler
0x7ffdc2d81518 I DoItChunk>importFor:logSource: 0x17528a10: a(n) DoItChunk
0x7ffdc2d81560 M [] in CodeImporter>evaluate 0x17510738: a(n) CodeImporter
0x7ffdc2d815a8 M OrderedCollection>do: 0x17510ce0: a(n) OrderedCollection
0x7ffdc2d815f8 I CodeImporter>evaluate 0x17510738: a(n) CodeImporter
0x7ffdc2d81630 M [] in STCommandLineHandler>installSourceFile: 0x17509020: a(n) STCommandLineHandler
0x17529540 w FullBlockClosure(BlockClosure)>on:do:
...
Running the same on an earlier debug VM results in the message invalidInstructionPointerinMethod
being printed numerous times.
Expected behavior
The script runs without crashing, producing a count of the handled exceptions.
Version information:
- OS: Ubuntu
- Version: 20.04
- Pharo Version: Pharo-11.0.0+build.112.sha.991ae666c4d926bae4732c3e55b68f2b77babc1c (64 Bit)
Expected development cost
This appears to be reproduceable within the gdb debugger, so hopefully can be resolved in a few days.
I'm happy to help.
The crash described above also happens on MacOS (BigSpur Intel) with Pharo 10.
Pharo10.0.0
Build information: Pharo-10.0.0+build.521.sha.14f541319d443f4261f84f4fa19fbb34460a5edb (64 Bit)
CoInterpreter * VMMaker-tonel.1 uuid: 9bb1c8f0-799d-0d00-a873-c9210f2acd2a Jun 10 2022
StackToRegisterMappingCogit * VMMaker-tonel.1 uuid: 9bb1c8f0-799d-0d00-a873-c9210f2acd2a Jun 10 2022
v9.0.15 - Commit: b4879008 - Date: 2022-06-02 09:48:57 +0200
Pharo 9.0.15 built on Jun 10 2022 15:50:46 Compiler: 4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.32.29)
VMMaker versionString v9.0.15 - Commit: b4879008 - Date: 2022-06-02 09:48:57 +0200
CoInterpreter * VMMaker-tonel.1 uuid: 9bb1c8f0-799d-0d00-a873-c9210f2acd2a Jun 10 2022
StackToRegisterMappingCogit * VMMaker-tonel.1 uuid: 9bb1c8f0-799d-0d00-a873-c9210f2acd2a Jun 10 2022
Stack trace:
./pharo Pharo.image --headless st a.st
Starting...
Segmentation fault: 11 Thu Jun 30 21:00:50 2022
/Users/pharo-vm/Pharo.app/Contents/MacOS/Pharo
PharoVM version:5.0-Pharo 9.0.15 built on Jun 10 2022 15:50:46 Compiler: 4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.32.29) 4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.32.29) [Production Spur 64-bit VM]
Built from: CoInterpreter * VMMaker-tonel.1 uuid: 9bb1c8f0-799d-0d00-a873-c9210f2acd2a Jun 10 2022
With:StackToRegisterMappingCogit * VMMaker-tonel.1 uuid: 9bb1c8f0-799d-0d00-a873-c9210f2acd2a Jun 10 2022
Revision: v9.0.15 - Commit: b4879008 - Date: 2022-06-02 09:48:57 +0200
C stack backtrace & registers:
rax 0x0000000000000000 rbx 0x000000010bd21c80 rcx 0x0000000000000e9e rdx 0x000000011a02b0b0
rdi 0x0000000000000001 rsi 0x0000000000000001 rbp 0x00007ffee3fb5680 rsp 0x00007ffee3fb5660
r8 0x000000010beba200 r9 0x000000011a78bc00 r10 0x000000010bd23560 r11 0x0000000000000001
r12 0x000000010bdbb0f8 r13 0x0000000000000032 r14 0x0000000000000009 r15 0x000000011a02b0c0
rip 0x000000010beba33d
*0 ??? 0x000000010beba33d 0x0 + 4494959421
1 libPharoVMCore.dylib 0x000000010bcf6581 reportStackState + 305
2 libPharoVMCore.dylib 0x000000010bcf641e doReport + 190
3 libPharoVMCore.dylib 0x000000010bcf6749 sigsegv + 25
4 libsystem_platform.dylib 0x00007fff20456d7d _sigtramp + 29
5 ??? 0x0000000000000000 0x0 + 0
6 ??? 0x000000010beba0c7 0x0 + 4494958791
7 ??? 0x000000010bf8a78e 0x0 + 4495812494
8 ??? 0x000000010bf8a69b 0x0 + 4495812251
9 ??? 0x000000010bebadc1 0x0 + 4494962113
10 ??? 0x000000010bfc5176 0x0 + 4496052598
11 ??? 0x000000010be8f929 0x0 + 4494784809
12 ??? 0x000000010bfc4a31 0x0 + 4496050737
13 ??? 0x000000010bf770cd 0x0 + 4495732941
14 ??? 0x000000010be8f929 0x0 + 4494784809
15 ??? 0x000000010be8c3e0 0x0 + 4494771168
16 ??? 0x0000000000000000 0x0 + 0
All Smalltalk process stacks (active first):
Process 0x119e2c3d8 priority 40
0x7ffee3fb5680 M ExternalAddress>unsignedByteAt: 0x11a02b0b0: a(n) ExternalAddress
0x7ffee3fb56c0 M [] in ExternalAddress>fromCString 0x11a02b0b0: a(n) ExternalAddress
0x7ffee3fb5700 M ByteArray class(SequenceableCollection class)>new:streamContents: 0x11a7a05e8: a(n) ByteArray class
0x7ffee3fb5740 M ByteArray class(SequenceableCollection class)>streamContents: 0x11a7a05e8: a(n) ByteArray class
0x7ffee3fb5780 M ExternalAddress>fromCString 0x11a02b0b0: a(n) ExternalAddress
0x7ffee3fb57c0 M [] in UndefinedObject>DoIt 0x11a78bc00: a(n) UndefinedObject
0x7ffee3fb57f0 M FullBlockClosure(BlockClosure)>on:do: 0x11a02b048: a(n) FullBlockClosure
0x7ffee3fb5840 M UndefinedObject>DoIt 0x11a78bc00: a(n) UndefinedObject
0x7ffee3fb5870 M [] in OpalCompiler>evaluate 0x119e53a30: a(n) OpalCompiler
0x7ffee3fb58a0 M FullBlockClosure(BlockClosure)>on:do: 0x119e54620: a(n) FullBlockClosure
0x7ffee3fb58f8 I OpalCompiler>evaluate 0x119e53a30: a(n) OpalCompiler
0x7ffee3fb5938 I DoItChunk>importFor:logSource: 0x119e4f8b8: a(n) DoItChunk
0x7ffee3fb5980 M [] in CodeImporter>evaluate 0x119e379b0: a(n) CodeImporter
0x7ffee3fb59c8 M OrderedCollection>do: 0x119e37cb8: a(n) OrderedCollection
0x7ffee3fb5a18 I CodeImporter>evaluate 0x119e379b0: a(n) CodeImporter
0x7ffee3fb5a50 M [] in STCommandLineHandler>installSourceFile: 0x119e307d8: a(n) STCommandLineHandler
0x7ffee3fb35b0 M FullBlockClosure(BlockClosure)>on:do: 0x119e50040: a(n) FullBlockClosure
0x7ffee3fb35f0 M STCommandLineHandler>handleErrorsDuring:reference: 0x119e307d8: a(n) STCommandLineHandler
0x7ffee3fb3648 I STCommandLineHandler>installSourceFile: 0x119e307d8: a(n) STCommandLineHandler
0x7ffee3fb3680 M [] in STCommandLineHandler>installSourceFiles 0x119e307d8: a(n) STCommandLineHandler
0x7ffee3fb36c8 M OrderedCollection>do: 0x119e34ef8: a(n) OrderedCollection
0x7ffee3fb3700 M [] in STCommandLineHandler>installSourceFiles 0x119e307d8: a(n) STCommandLineHandler
0x7ffee3fb3740 M FullBlockClosure(BlockClosure)>ensure: 0x119e34ff0: a(n) FullBlockClosure
0x7ffee3fb3788 I STCommandLineHandler>installSourceFiles 0x119e307d8: a(n) STCommandLineHandler
0x7ffee3fb37c8 I STCommandLineHandler>activate 0x119e307d8: a(n) STCommandLineHandler
0x7ffee3fb3808 I STCommandLineHandler class(CommandLineHandler class)>activateWith: 0x11a8d9588: a(n) STCommandLineHandler class
0x7ffee3fb3848 M [] in PharoCommandLineHandler>activateSubCommand: 0x1194999e0: a(n) PharoCommandLineHandler
0x7ffee3fb3878 M FullBlockClosure(BlockClosure)>on:do: 0x119e30778: a(n) FullBlockClosure
0x7ffee3fb38c8 I PharoCommandLineHandler(BasicCommandLineHandler)>activateSubCommand: 0x1194999e0: a(n) PharoCommandLineHandler
0x7ffee3fb3918 I PharoCommandLineHandler(BasicCommandLineHandler)>handleSubcommand 0x1194999e0: a(n) PharoCommandLineHandler
0x7ffee3fb3958 I PharoCommandLineHandler(BasicCommandLineHandler)>handleArgument: 0x1194999e0: a(n) PharoCommandLineHandler
0x7ffee3fb3990 M [] in PharoCommandLineHandler>activate 0x1194999e0: a(n) PharoCommandLineHandler
0x7ffee3fb39c0 M FullBlockClosure(BlockClosure)>on:do: 0x119e2d168: a(n) FullBlockClosure
0x7ffee3fb3a10 I [] in PharoCommandLineHandler>activate 0x1194999e0: a(n) PharoCommandLineHandler
0x7ffee3fb3a50 I [] in FullBlockClosure>newProcess 0x119e2c218: a(n) FullBlockClosure
processes at priority 40
Process 0x11d0d6290 priority 40
0x7ffee3fa7a48 I MorphicRenderLoop>doOneCycleWhile: 0x11d0e9978: a(n) MorphicRenderLoop
0x11d0e99c0 s [] in MorphicUIManager>spawnNewProcess
0x11d0e9aa0 s [] in FullBlockClosure(BlockClosure)>newProcess
processes at priority 10
Process 0x119493890 priority 10
0x11949aef8 s [] in FullBlockClosure(BlockClosure)>newProcess
suspended processes
Process 0x119497120 priority 50
0x7ffee3fa39d0 I WeakArray class>finalizationProcess 0x11a7a1c90: a(n) WeakArray class
0x7ffee3fa3a10 I [] in WeakArray class>restartFinalizationProcess 0x11a7a1c90: a(n) WeakArray class
0x7ffee3fa3a50 I [] in FullBlockClosure>newProcess 0x119499370: a(n) FullBlockClosure
Process 0x11d0d62e0 priority 80
0x7ffee3f999f8 I DelayMicrosecondTicker>waitForUserSignalled:orExpired: 0x11ab74bd0: a(n) DelayMicrosecondTicker
0x7ffee3f99a50 I [] in DelaySemaphoreScheduler>runBackendLoopAtTimingPriority 0x11ab717e0: a(n) DelaySemaphoreScheduler
0x11ded96c0 s FullBlockClosure(BlockClosure)>ensure:
0x11d0e9bd0 s DelaySemaphoreScheduler(DelayBasicScheduler)>runBackendLoopAtTimingPriority
0x11ded8f60 s [] in DelaySemaphoreScheduler(DelayBasicScheduler)>startTimerEventLoopPriority:
0x11d0e9cb0 s [] in FullBlockClosure(BlockClosure)>newProcess
Process 0x11c6dc5c8 priority 40
0x11c6e2538 s AtomicSharedQueue>waitForNewItems
0x11c6e6828 s AtomicSharedQueue>next
0x11c6e7738 s TKTWorkerProcess>privateNextTask
0x11c6e8160 s [] in TKTWorkerProcess>workerLoop
0x11c6e8a38 s FullBlockClosure(BlockClosure)>repeat
0x11c6d23d8 s TKTWorkerProcess>workerLoop
0x11c6d2490 s MessageSend>value
0x11c6d2548 s [] in TKTPharoProcessProvider>createProcessDoing:named:
0x11c6d2620 s [] in FullBlockClosure(BlockClosure)>newProcess
Process 0x119493840 priority 60
0x7ffee3fa19d0 I SmalltalkImage>lowSpaceWatcher 0x11a7aefa0: a(n) SmalltalkImage
0x7ffee3fa1a10 I [] in SmalltalkImage>installLowSpaceWatcher 0x11a7aefa0: a(n) SmalltalkImage
0x7ffee3fa1a50 I [] in FullBlockClosure>newProcess 0x119499180: a(n) FullBlockClosure
Process 0x11949e6a8 priority 70
0x7ffee3f9fa10 I [] in TFCallbackQueue>forkCallbackProcess 0x119496f30: a(n) TFCallbackQueue
0x7ffee3f9fa50 I [] in FullBlockClosure>newProcess 0x119498fc0: a(n) FullBlockClosure
Most recent primitives
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
compare:with:collated:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
compare:with:collated:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
**StackOverflow**
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
compare:with:collated:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
compare:with:collated:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
**StackOverflow**
basicNew
stringHash:initialHash:
value:
basicNew
stringHash:initialHash:
stringHash:initialHash:
at:
at:put:
at:
replaceFrom:to:with:startingAt:
at:put:
**StackOverflow**
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
compare:with:collated:
basicNew
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
**StackOverflow**
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
compare:with:collated:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
compare:with:collated:
stringHash:initialHash:
compare:with:collated:
stringHash:initialHash:
stringHash:initialHash:
compare:with:collated:
stringHash:initialHash:
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
compare:with:collated:
stringHash:initialHash:
compare:with:collated:
**StackOverflow**
stringHash:initialHash:
compare:with:collated:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
compare:with:collated:
compare:with:collated:
**StackOverflow**
**StackOverflow**
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
stringHash:initialHash:
compare:with:collated:
compare:with:collated:
**StackOverflow**
stringHash:initialHash:
stringHash:initialHash:
basicNew
size
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
**StackOverflow**
class
basicNew:
basicAt:put:
basicSize
basicAt:
objectAt:put:
withArgs:executeMethod:
basicSize
write:from:startingAt:count:
asInteger
basicNew:
basicSize
basicSize
flush:
value
basicNew:
size
stack page bytes 8192 available headroom 5576 minimum unused headroom 472
(Segmentation fault: 11)
One other aspect we noticed is that the crash happens with primitives from ExternalAddress
. As an experiment we tried removing the primitive pragma from methods in ExternalAddress
that deal with integer operations, as those calls will happen then through FFI.
In an image we run the code below and then saved the image:
externalAddressMethodsToPatch := #(
boolean8AtOffset: boolean8AtOffset:put:
char8AtOffset: char8AtOffset:put:
char16AtOffset: char16AtOffset:put:
char32AtOffset: char32AtOffset:put:
int8AtOffset: int8AtOffset:put:
int16AtOffset: int16AtOffset:put:
int32AtOffset: int32AtOffset:put:
int64AtOffset: int64AtOffset:put:
uint8AtOffset: uint8AtOffset:put:
uint16AtOffset: uint16AtOffset:put:
uint32AtOffset: uint32AtOffset:put:
uint64AtOffset: uint64AtOffset:put:).
externalAddressMethodsToPatch do: [ :each |
(RBRemovePragmaTransformation
pragma: '<primitive: nil>'
inMethod: each
inClass: #ExternalAddress) asRefactoring execute ].
Now running the same code that failed before works:
./pharo Pharo.image --headless st a.st
Starting...
Completed with count: 1000
Seems making the call through a named primitive fails, but making the call through FFI passes.
The crash is also random. If one calls only ExternalAddress null fromCString
in some case as expected a debugger appears with the PrimitiveFailed
error.
