Strange, non-deterministic exceptions
By Tony Garnock-Jones - Posted on January 8th, 2008
Tagged:
| Project: | GNU Smalltalk |
| Component: | VM |
| Category: | bug |
| Priority: | normal |
| Assigned: | Unassigned |
| Status: | active |
| Attachment: | termination-bug.st (799 bytes) |
Description
When you run TerminationExperiment's #run, it can sometimes reach several tens of thousands of iterations of busyLoop before faulting, but will often fault before 20,000 iterations have completed on my machine.
When you run #run2, things behave as I would have expected them to behave. No faulting occurs, and the process is sensibly terminated.
Here's a selection of some of the faults I see from #run after several seconds. Each comes at the end of a single run of the script, as attached.
Object: '' error: Invalid argument : must be a SmallInteger SystemExceptions.WrongClass(Exception)>>signal SystemExceptions.WrongClass class>>signalOn:mustBe: SystemExceptions.WrongClass class>>signalOn:mustBe: String(Object)>>checkIndexableBounds:put: String>>at:put: String class(ArrayedCollection class)>>with: Character>>asString [] in TextCollector>>showCr: [] in Semaphore>>critical: BlockClosure>>ensure: Semaphore>>critical: TextCollector>>showCr: String(Object)>>printNl TerminationExperiment>>busyLoop TerminationExperiment>>run UndefinedObject>>executeStatements
Object: nil error: did not understand #generality MessageNotUnderstood(Exception)>>signal UndefinedObject(Object)>>doesNotUnderstand: #generality SmallInteger>>+ FileStream(FileDescriptor)>>write:from:to: FileStream>>flush FileStream(Stream)>>nextPutAllFlush: TextCollector>>primNextPutAll: [] in TextCollector>>showCr: [] in Semaphore>>critical: BlockClosure>>ensure: Semaphore>>critical: TextCollector>>showCr: String(Object)>>printNl TerminationExperiment>>busyLoop TerminationExperiment>>run UndefinedObject>>executeStatements
Object: String error: Invalid argument 'b': must be a SmallInteger SystemExceptions.WrongClass(Exception)>>signal SystemExceptions.WrongClass class>>signalOn:mustBe: SystemExceptions.WrongClass class>>signalOn:mustBe: String class(Behavior)>>new: String(Collection)>>copyEmpty: String(ArrayedCollection)>>copyFrom:to: WriteStream>>contents String(Object)>>printString String(Object)>>printNl TerminationExperiment>>busyLoop TerminationExperiment>>run UndefinedObject>>executeStatements
Object: 3 error: did not understand #replaceFrom:to:with:startingAt: MessageNotUnderstood(Exception)>>signal SmallInteger(Object)>>doesNotUnderstand: #replaceFrom:to:with:startingAt: String(ArrayedCollection)>>copyFrom:to: WriteStream>>contents String(Object)>>printString String(Object)>>printNl TerminationExperiment>>busyLoop TerminationExperiment>>run UndefinedObject>>executeStatements
This one includes the end of the stdout, to illustrate an odd doubling
of 'c':
'a' 'b' 'c''c'Object: nil error: did not understand #generality MessageNotUnderstood(Exception)>>signal UndefinedObject(Object)>>doesNotUnderstand: #generality SmallInteger>>+ FileStream(FileDescriptor)>>write:from:to: FileStream>>flush FileStream(Stream)>>nextPutAllFlush: TextCollector>>primNextPutAll: [] in TextCollector>>showCr: [] in Semaphore>>critical: BlockClosure>>ensure: Semaphore>>critical: TextCollector>>showCr: String(Object)>>printNl TerminationExperiment>>busyLoop TerminationExperiment>>run UndefinedObject>>executeStatements
Object: String error: did not understand #copyEmpty: MessageNotUnderstood(Exception)>>signal String class(Object)>>doesNotUnderstand: #copyEmpty: WriteStream>>growCollection WriteStream>>nextPut: String>>printOn: String(Object)>>printString String(Object)>>printNl TerminationExperiment>>busyLoop TerminationExperiment>>run UndefinedObject>>executeStatements
etc. etc.
