Skip to content

Commit

Permalink
Fix java trace parser issues
Browse files Browse the repository at this point in the history
  • Loading branch information
iarkhanhelsky committed Jan 25, 2019
1 parent a849a90 commit 788092f
Show file tree
Hide file tree
Showing 9 changed files with 48 additions and 48 deletions.
7 changes: 4 additions & 3 deletions lib/tracetool/android/java.rb
Expand Up @@ -16,12 +16,13 @@ def initialize(files)
# Processes java traces
class JavaTraceScanner
# Usually java trace starts with
# com.something.SomeClass: Some message
RX_FIRST_EXCEPTION_LINE = /^(.*):(.*)$/.freeze
# com.something.SomeClass(: Some message)?
RX_FIRST_EXCEPTION_LINE = /^([a-zA-Z.]*)(:.*)?$/.freeze

# Rest is expanded as
# at com.other.OtherClass.someMethod(OtherClass.java:42)
# Source marker can be just "Native Method" or "Unknown Source"
RX_OTHER_EXCEPTION_LINE = /at [^(]+\((([^:]+:\d+)|(Unknown Source))|(Native Method)\)$/.freeze
RX_OTHER_EXCEPTION_LINE = /((at [a-zA-Z$.]+)|(Caused by:)|(\.\.\. [0-9]* more))(.+)?$/.freeze

def initialize(string)
@trace = string
Expand Down
2 changes: 1 addition & 1 deletion lib/tracetool/android/native.rb
Expand Up @@ -54,7 +54,7 @@ def prepare(trace)
def convert_line(line, index)
frame = index
addr = line[/^(-?\d+) (.*)$/, 1]
lib = line[/^(-?\d+) (.*)$/, 2].strip
lib = (line[/^(-?\d+) (.*)$/, 2] || '').strip # nil safe
' #%02<frame>i pc %08<addr>x %<lib>s'
.format(frame: frame, addr: addr, lib: lib)
end
Expand Down
10 changes: 10 additions & 0 deletions spec/tracetool/android/java/fixtures/scanner_caused_by.txt
@@ -0,0 +1,10 @@
when android trace contains Caused by ...
java.lang.RuntimeException: Package manager has died
at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:258)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1648)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1353)
Caused by: android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:503)
at android.content.pm.IPackageManager$Stub$Proxy.getPackageInfo(IPackageManager.java:2730)
at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:253)
@@ -0,0 +1,8 @@
when java trace with error message
java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
at java.lang.Thread.nativeCreate(Native Method)
at java.lang.Thread.start(Thread.java:1063)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:920)
at java.util.concurrent.ThreadPoolExecutor.ensurePrestart(ThreadPoolExecutor.java:1553)
at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:306)
at java.util.concurrent.ScheduledThreadPoolExecutor.schedule(ScheduledThreadPoolExecutor.java:503)
@@ -0,0 +1,6 @@
when java trace contains `... xx more`
java.lang.RuntimeException: Package manager has died
at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:258)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1648)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1353)
... 6 more
@@ -0,0 +1,2 @@
when trace contains only message line
java.lang.SecurityException: META-INF/MANIFEST.MF has invalid digest for a.png in a.png
@@ -0,0 +1,6 @@
when trace contains frames tagged with `Unknown source`
java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
at java.lang.Thread.nativeCreate(Native Method)
at java.lang.Thread.start(Thread.java:1063)
at com.google.android.zzv.zza(Unknown Source)
at com.google.android.internal.zzv.zzg(Unknown Source)
10 changes: 7 additions & 3 deletions spec/tracetool/android/java/parser_spec.rb
Expand Up @@ -6,9 +6,13 @@
let(:trace) do
<<-JAVA.strip_indent
java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
at java.lang.Thread.nativeCreate(Native Method)
at java.lang.Thread.start(Thread.java:1063)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:920)
at java.lang.Thread.nativeCreate(Native Method)
at java.lang.Thread.start(Thread.java:1063)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:920)
Caused by: android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:503)
... 234 more
JAVA
end

Expand Down
45 changes: 4 additions & 41 deletions spec/tracetool/android/java/scanner_spec.rb
Expand Up @@ -5,48 +5,11 @@ module Android
describe JavaTraceScanner do
describe '#match' do
let(:matcher) { JavaTraceScanner }
context 'when example java trace' do
let(:trace) do
<<-JAVA.strip_indent
java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
at java.lang.Thread.nativeCreate(Native Method)
at java.lang.Thread.start(Thread.java:1063)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:920)
at java.util.concurrent.ThreadPoolExecutor.ensurePrestart(ThreadPoolExecutor.java:1553)
at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:306)
at java.util.concurrent.ScheduledThreadPoolExecutor.schedule(ScheduledThreadPoolExecutor.java:503)
JAVA
end
it 'should match java trace' do
expect(matcher.match(trace)).to be_truthy
end
end

context 'when trace contains frames tagged with "Unknown source"' do
let(:trace) do
<<-JAVA.strip_indent
java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
at java.lang.Thread.nativeCreate(Native Method)
at java.lang.Thread.start(Thread.java:1063)
at com.google.android.zzv.zza(Unknown Source)
at com.google.android.internal.zzv.zzg(Unknown Source)
JAVA
end

it 'should match java trace' do
expect(matcher.match(trace)).to be_truthy
end
end

context 'when trace contains only message line' do
let(:trace) do
<<-JAVA.strip_indent
java.lang.SecurityException: META-INF/MANIFEST.MF has invalid digest for a.png in a.png
JAVA
end

it 'should match java trace' do
expect(matcher.match(trace)).to be_truthy
Dir[File.join(__dir__, 'fixtures', 'scanner_*')].each do |file|
context_title, *lines = IO.read(file).split("\n")
context context_title do
it { expect(matcher.match(lines.join("\n"))).to be_truthy }
end
end
end
Expand Down

0 comments on commit 788092f

Please sign in to comment.