Download pdf - Misery Loves Company

Transcript

Tommaso Dal SassoAndrea MocciMichele Lanza University of Lugano

Misery Loves CompanyCrowdStacking Traces to Aid Problem DetectionSANER 2015

Development

Stack Traces

Stack TracesSmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluateSelectionAndDo: SmalltalkEditor>>evaluateSelection PluggableTextMorph>>doIt PluggableTextMorph>>handleEdit: TextMorphForEditView>>handleEdit: PluggableTextMorph>>handleEdit: PluggableTextMorph>>doIt SmalltalkEditor class>>buildSmalltalkEditorKeymappingsOn: BlockClosure>>cull: BlockClosure>>cull:cull: BlockClosure>>cull:cull:cull: KMCategoryBinding>>completeMatch:buffer: KMKeymap>>notifyCompleteMatchTo:buffer: Array>>do: KMKeymap>>notifyCompleteMatchTo:buffer: KMKeymap>>onMatchWith:notify:andDo: KMCategory>>onMatchWith:notify:andDo: Set>>do:

Stack TracesSmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluateSelectionAndDo: SmalltalkEditor>>evaluateSelection PluggableTextMorph>>doIt PluggableTextMorph>>handleEdit: TextMorphForEditView>>handleEdit: PluggableTextMorph>>handleEdit: PluggableTextMorph>>doIt SmalltalkEditor class>>buildSmalltalkEditorKeymappingsOn: BlockClosure>>cull: BlockClosure>>cull:cull: BlockClosure>>cull:cull:cull: KMCategoryBinding>>completeMatch:buffer: KMKeymap>>notifyCompleteMatchTo:buffer: Array>>do: KMKeymap>>notifyCompleteMatchTo:buffer: KMKeymap>>onMatchWith:notify:andDo: KMCategory>>onMatchWith:notify:andDo: Set>>do:

Can we use this data?

Stack TracesSmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

SmallInteger>>/ UndefinedObject>>DoIt OpalCompiler>>evaluate BlockClosure>>ensure: EpCurrentEvent>>valueIn:put:during: EpCurrentEvent>>value:during: BlockClosure>>triggering: OpalCompiler>>evaluate SmalltalkEditor>>evaluat

Development Data

ShoreLine Reporter

A reporting tool for Pharo

Collected Data

Date

Author Name Stack TraceClassName>>method:

Version(date, update, name)

June — November 2014 # of stack traces 7,532

# of lines in all stack traces 252,668

# of developers 8

average lines of a stack trace 34

size of the longest stack trace 314

Using the Data

Bugs

Understand Execution

Community

Clustering Stack TracesVector Space Model

ClassName>>method ClassName>>method ClassName>>method …

<1,0,1,1,…>

Cosine similarity

distance between two stack traces

Archetype Popularity

UndefinedObject»doesNotUnderstand: 1,585

UndefinedObject»doesNotUnderstand: 647

UndefinedObject»DoIt 619

… …

SystemDictionary»errorKeyNotFound: 71

MouseWheelEvent»doesNotUnderstand: 69

UndefinedObject»doesNotUnderstand: 57

NBGLFrameBuffer»error: 41

Language features

Anomalies

Match with the Bug Tracker

Stack Traces Bug Tracker

23

‣ Specific project

‣ Misuse of API

‣ Untracked Bug

‣ Bug reports related

to the exception

Filtered Stack Traces

15

No match

8

Match

The case of Bug #12973PluggableButtonMorph(Morph)>>handleKeyDown: KeyboardEvent>>sentTo: PluggableButtonMorph(Morph)>>handleEvent: PluggableButtonMorph(Morph)>>handleFocusEvent: [ActiveHand := self.ActiveEvent := anEvent.result := focusHolder handleFocusEvent: (anEvent transformedBy: (focusHolder transformedFrom: self)) ] in HandMorph>>sendFocusEvent:to:clear: BlockClosure>>on:do: WorldMorph(PasteUpMorph)>>becomeActiveDuring: HandMorph>>sendFocusEvent:to:clear: HandMorph>>sendEvent:focus:clear: HandMorph>>sendKeyboardEvent: HandMorph>>handleEvent: HandMorph>>processEvents [ :h |ActiveHand := h.h processEvents. ActiveHand := nil ] in WorldState>>doOneCycleNowFor:

Description

Discussion

Patch

Resolution

Stack Trace

Use of Related Bug Reports

‣ Give context to the current error

‣ Support the debugging process

‣ Provide feedback on the status of a defect

‣ Support understanding of undocumented code

Crowdstacking TracesUsing the activity of the community to help the code development

Provide a smart environment to deal with software defects

Build a dataset of fresh execution data

Crowdstacking Traces

http://shoreline.inf.usi.ch/