Bug 494576 - Hang writing regular expression in custom text parser
Summary: Hang writing regular expression in custom text parser
Status: NEW
Alias: None
Product: Tracecompass
Classification: Tools
Component: TMF (show other bugs)
Version: 2.0.0   Edit
Hardware: PC Linux
: P3 normal
Target Milestone: ---   Edit
Assignee: Project Inbox CLA
QA Contact: Project Inbox CLA
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-05-25 14:55 EDT by Marc-André Laperle CLA
Modified: 2016-06-03 17:12 EDT (History)
1 user (show)

See Also:


Attachments
Screen shot (143.37 KB, image/png)
2016-05-25 14:55 EDT, Marc-André Laperle CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Marc-André Laperle CLA 2016-05-25 14:55:42 EDT
Created attachment 262007 [details]
Screen shot

Using lastest master. I was trying to create a custom text parser from the Hudson output, see attached screenshot

My regular expression (WIP) was (\S*)\s+(\[INFO\])\s+---((.*)\(.*\))\s+@\s+(\S+)+

Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$Loop.match(Matcher, int, CharSequence) line: 4785	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$Loop.match(Matcher, int, CharSequence) line: 4785	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$Loop.match(Matcher, int, CharSequence) line: 4785	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$Loop.match(Matcher, int, CharSequence) line: 4785	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$Loop.match(Matcher, int, CharSequence) line: 4785	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$Loop.match(Matcher, int, CharSequence) line: 4785	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$Loop.match(Matcher, int, CharSequence) line: 4785	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$Loop.match(Matcher, int, CharSequence) line: 4785	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$Loop.match(Matcher, int, CharSequence) line: 4785	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$Loop.matchInit(Matcher, int, CharSequence) line: 4801	
Pattern$Prolog.match(Matcher, int, CharSequence) line: 4741	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4279	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$Single(Pattern$BmpCharProperty).match(Matcher, int, CharSequence) line: 3798	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4279	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Single(Pattern$BmpCharProperty).match(Matcher, int, CharSequence) line: 3798	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$Single(Pattern$BmpCharProperty).match(Matcher, int, CharSequence) line: 3798	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$Slice.match(Matcher, int, CharSequence) line: 3972	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4279	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Slice.match(Matcher, int, CharSequence) line: 3972	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupTail.match(Matcher, int, CharSequence) line: 4717	
Pattern$Curly.match0(Matcher, int, int, CharSequence) line: 4272	
Pattern$Curly.match(Matcher, int, CharSequence) line: 4234	
Pattern$GroupHead.match(Matcher, int, CharSequence) line: 4658	
Matcher.match(int, int) line: 1270	
Matcher.matches() line: 604	
CustomTxtParserInputWizardPage.updatePreviews(boolean) line: 704	
CustomTxtParserInputWizardPage.updatePreviews() line: 653	
CustomTxtParserInputWizardPage.access$8(CustomTxtParserInputWizardPage) line: 652	
CustomTxtParserInputWizardPage$UpdateListener.modifyText(ModifyEvent) line: 1024	
TypedListener.handleEvent(Event) line: 180	
EventTable.sendEvent(Event) line: 84	
Display.sendEvent(EventTable, Event) line: 5208	
Text(Widget).sendEvent(Event) line: 1340	
Display.runDeferredEvents() line: 4542	
Display.readAndDispatch() line: 4132	
WizardDialog(Window).runEventLoop(Shell) line: 818	
WizardDialog(Window).open() line: 794	
ManageCustomParsersDialog$5.widgetSelected(SelectionEvent) line: 197	
TypedListener.handleEvent(Event) line: 249	
EventTable.sendEvent(Event) line: 84	
Display.sendEvent(EventTable, Event) line: 5208	
Button(Widget).sendEvent(Event) line: 1340	
Display.runDeferredEvents() line: 4542	
Display.readAndDispatch() line: 4132	
ManageCustomParsersDialog(Window).runEventLoop(Shell) line: 818	
ManageCustomParsersDialog(Window).open() line: 794	
ManageCustomParsersCommandHandler.execute(ExecutionEvent) line: 31
Comment 1 Patrick Tasse CLA 2016-06-03 17:12:49 EDT
I was able to reproduce this.

It's an occurrence of 'catastrophic backtracking' in regular expression matching.

I'm not sure what we could do? It could happen when parsing an actual trace with this regex at runtime also...

Perhaps if this happens only on the partial regex but not on the completed regex, then we could add the option to turn off automatic highlighting altogether in the wizard page? Then after killing Eclipse and restarting the user could try again typing the regex with matching off.

Another path that could be tried is spawning off the regex matching in an interruptible thread with a timeout... see http://stackoverflow.com/questions/910740/cancelling-a-long-running-regex-match/910798#910798