diff options
author | Maxim Siniavine <siniavine@google.com> | 2014-06-16 17:53:55 -0700 |
---|---|---|
committer | Maxim Siniavine <siniavine@google.com> | 2014-06-16 18:03:19 -0700 |
commit | df2e25b0b50559b3d293a15a0714d41608eca305 (patch) | |
tree | 4afe56d1e215848aea5333ccdb5eb683520630ad | |
parent | 3410870776b680391b3e223d4d4dd7637cf8d6fd (diff) | |
download | loganalysis-df2e25b0b50559b3d293a15a0714d41608eca305.tar.gz |
Better identify java crashes when they don't come from regular apps.
Change-Id: I4e14fb4dc3414b6a78d1b5456403699980abb8a8
-rw-r--r-- | src/com/android/loganalysis/parser/LogcatParser.java | 21 | ||||
-rw-r--r-- | tests/src/com/android/loganalysis/parser/LogcatParserTest.java | 21 |
2 files changed, 41 insertions, 1 deletions
diff --git a/src/com/android/loganalysis/parser/LogcatParser.java b/src/com/android/loganalysis/parser/LogcatParser.java index 8d9ca7f..7011646 100644 --- a/src/com/android/loganalysis/parser/LogcatParser.java +++ b/src/com/android/loganalysis/parser/LogcatParser.java @@ -79,6 +79,12 @@ public class LogcatParser implements IParser { private static final Pattern JAVA_CRASH_PROCESS_PID = Pattern.compile( "^(Process: (\\S+), )?PID: (\\d+)$"); + + /** + * Match a line thats printed when a non app java process starts. + */ + private static final Pattern JAVA_PROC_START = Pattern.compile("Calling main entry (.+)"); + /** * Class for storing logcat meta data for a particular grouped list of lines. */ @@ -119,6 +125,8 @@ public class LogcatParser implements IParser { private boolean mIsParsing = true; + private Map<Integer, String> mPids = new HashMap<Integer, String>(); + /** * Constructor for {@link LogcatParser}. */ @@ -233,6 +241,14 @@ public class LogcatParser implements IParser { return; } + + // When a non app java process starts add its pid to the map + Matcher pidMatcher = JAVA_PROC_START.matcher(msg); + if (pidMatcher.matches()) { + String name = pidMatcher.group(1); + mPids.put(pid, name); + } + // ANRs are separated either by different PID/TIDs or when AnrParser.START matches a line. // The newest entry is kept in the dataMap for quick lookup while all entries are added to // the list. @@ -321,7 +337,10 @@ public class LogcatParser implements IParser { } m = SYSTEM_SERVER_CRASH.matcher(line); if (m.matches()) { - app = "system_server"; + app = mPids.get(data.mPid); + if (app == null) { + app = "system_server"; + } data.mLines = data.mLines.subList(i + 1, data.mLines.size()); break; } diff --git a/tests/src/com/android/loganalysis/parser/LogcatParserTest.java b/tests/src/com/android/loganalysis/parser/LogcatParserTest.java index a794a14..44f3151 100644 --- a/tests/src/com/android/loganalysis/parser/LogcatParserTest.java +++ b/tests/src/com/android/loganalysis/parser/LogcatParserTest.java @@ -15,6 +15,7 @@ */ package com.android.loganalysis.parser; +import com.android.loganalysis.item.JavaCrashItem; import com.android.loganalysis.item.LogcatItem; import com.android.loganalysis.item.MiscLogcatItem; import com.android.loganalysis.util.ArrayUtil; @@ -596,6 +597,26 @@ public class LogcatParserTest extends TestCase { assertEquals("I'm the one you need to find!", matchedEvents.get(0).getStack()); } + public void testFatalException() { + List<String> lines = Arrays.asList( + "06-05 06:14:51.529 1712 1712 D AndroidRuntime: Calling main entry com.android.commands.input.Input", + "06-05 06:14:51.709 1712 1712 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main", + "06-05 06:14:51.709 1712 1712 E AndroidRuntime: java.lang.NullPointerException", + "06-05 06:14:51.709 1712 1712 E AndroidRuntime: \tat android.hardware.input.InputManager.injectInputEvent(InputManager.java:641)", + "06-05 06:14:51.709 1712 1712 E AndroidRuntime: \tat com.android.commands.input.Input.injectKeyEvent(Input.java:233)", + "06-05 06:14:51.709 1712 1712 E AndroidRuntime: \tat com.android.commands.input.Input.sendKeyEvent(Input.java:184)", + "06-05 06:14:51.709 1712 1712 E AndroidRuntime: \tat com.android.commands.input.Input.run(Input.java:96)", + "06-05 06:14:51.709 1712 1712 E AndroidRuntime: \tat com.android.commands.input.Input.main(Input.java:59)", + "06-05 06:14:51.709 1712 1712 E AndroidRuntime: \tat com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)", + "06-05 06:14:51.709 1712 1712 E AndroidRuntime: \tat com.android.internal.os.RuntimeInit.main(RuntimeInit.java:243)", + "06-05 06:14:51.709 1712 1712 E AndroidRuntime: \tat dalvik.system.NativeStart.main(Native Method)"); + LogcatParser parser = new LogcatParser("2014"); + LogcatItem logcat = parser.parse(lines); + assertEquals(1, logcat.getJavaCrashes().size()); + JavaCrashItem crash = logcat.getJavaCrashes().get(0); + assertEquals("com.android.commands.input.Input", crash.getApp()); + } + /** * Test that an empty input returns {@code null}. */ |