From c20ea281cf1762806d297cf4ddf3cff3b60b9cec Mon Sep 17 00:00:00 2001 From: Eric Rowe Date: Wed, 28 Oct 2015 18:56:49 -0700 Subject: Only add unknown reset if no good boot reason Change-Id: Ie36b3192e49aa3570185da5eab78157e85e27e41 --- .../loganalysis/parser/BugreportParser.java | 27 ++++++++++++++++++---- .../loganalysis/parser/KernelLogParser.java | 26 +++++++++++++++------ .../loganalysis/parser/BugreportParserTest.java | 10 +++++--- .../loganalysis/parser/MonkeyLogParserTest.java | 4 ++-- .../loganalysis/parser/NativeCrashParserTest.java | 1 - 5 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/com/android/loganalysis/parser/BugreportParser.java b/src/com/android/loganalysis/parser/BugreportParser.java index 4243d67..14ac2a1 100644 --- a/src/com/android/loganalysis/parser/BugreportParser.java +++ b/src/com/android/loganalysis/parser/BugreportParser.java @@ -175,6 +175,8 @@ public class BugreportParser extends AbstractSectionParser { addSectionParser(mLastKmsgParser, LAST_KMSG_SECTION_REGEX); addSectionParser(mDumpsysParser, DUMPSYS_SECTION_REGEX); addSectionParser(new NoopParser(), NOOP_SECTION_REGEX); + mKernelLogParser.setAddUnknownBootreason(false); + mLastKmsgParser.setAddUnknownBootreason(false); } /** @@ -218,19 +220,36 @@ public class BugreportParser extends AbstractSectionParser { traces.getStack()); } + KernelLogItem lastKmsg = mBugreport.getLastKmsg(); + if (lastKmsg == null) { + lastKmsg = new KernelLogItem(); + mBugreport.setLastKmsg(lastKmsg); + } if (mCommandLine.containsKey(BOOTREASON)) { String bootreason = mCommandLine.get(BOOTREASON); Matcher m = KernelLogParser.BAD_BOOTREASONS.matcher(bootreason); if (m.matches()) { - if (mBugreport.getLastKmsg() == null) { - mBugreport.setLastKmsg(new KernelLogItem()); - } MiscKernelLogItem item = new MiscKernelLogItem(); item.setStack("Last boot reason: " + bootreason.trim()); item.setCategory(KernelLogParser.KERNEL_RESET); - mBugreport.getLastKmsg().addEvent(item); + lastKmsg.addEvent(item); + } + m = KernelLogParser.GOOD_BOOTREASONS.matcher(bootreason); + if (m.matches()) { + MiscKernelLogItem item = new MiscKernelLogItem(); + item.setStack("Last boot reason: " + bootreason.trim()); + item.setCategory(KernelLogParser.NORMAL_REBOOT); + lastKmsg.addEvent(item); } } + + if (lastKmsg.getMiscEvents(KernelLogParser.KERNEL_RESET).isEmpty() && + lastKmsg.getMiscEvents(KernelLogParser.NORMAL_REBOOT).isEmpty()) { + MiscKernelLogItem unknownReset = new MiscKernelLogItem(); + unknownReset.setStack("Unknown reason"); + unknownReset.setCategory(KernelLogParser.KERNEL_RESET); + lastKmsg.addEvent(unknownReset); + } } } diff --git a/src/com/android/loganalysis/parser/KernelLogParser.java b/src/com/android/loganalysis/parser/KernelLogParser.java index add195f..2a9deaf 100644 --- a/src/com/android/loganalysis/parser/KernelLogParser.java +++ b/src/com/android/loganalysis/parser/KernelLogParser.java @@ -49,8 +49,16 @@ public class KernelLogParser implements IParser { * Regular expression representing all known bootreasons which are bad. */ public static final Pattern BAD_BOOTREASONS = Pattern.compile( - "(?:kernel_panic|rpm_err|hw_reset(?:$|\\n)|wdog_.*|tz_err|adsp_err|modem_err|mba_err|" - + "watchdogr?|Watchdog|Panic|srto:.*)"); + "(?:kernel_panic.*|rpm_err|hw_reset(?:$|\\n)|wdog_.*|tz_err|adsp_err|modem_err|mba_err|" + + "watchdog.*|Watchdog|Panic|srto:.*|oemerr.*)"); + + /** + * Regular expression representing all known bootreasons which are good. + */ + public static final Pattern GOOD_BOOTREASONS = Pattern.compile( + "(?:PowerKey|normal|recovery|reboot.*)"); + + private boolean mAddUnknownBootreason = true; private KernelLogItem mKernelLog = null; private Double mStartTime = null; @@ -58,12 +66,16 @@ public class KernelLogParser implements IParser { private LogPatternUtil mPatternUtil = new LogPatternUtil(); private LogTailUtil mPreambleUtil = new LogTailUtil(500, 50, 50); - private boolean mRebootReasonFound = false; + private boolean mBootreasonFound = false; public KernelLogParser() { initPatterns(); } + public void setAddUnknownBootreason(boolean enable) { + mAddUnknownBootreason = enable; + } + /** * Parse a kernel log from a {@link BufferedReader} into an {@link KernelLogItem} object. * @@ -87,7 +99,7 @@ public class KernelLogParser implements IParser { */ @Override public KernelLogItem parse(List lines) { - mRebootReasonFound = false; + mBootreasonFound = false; for (String line : lines) { parseLine(line); } @@ -136,7 +148,7 @@ public class KernelLogParser implements IParser { } if (category.equals(KERNEL_RESET) || category.equals(NORMAL_REBOOT)) { - mRebootReasonFound = true; + mBootreasonFound = true; } if (category.equals(NORMAL_REBOOT)) { @@ -171,7 +183,7 @@ public class KernelLogParser implements IParser { mKernelLog.setStartTime(mStartTime); mKernelLog.setStopTime(mStopTime); - if (!mRebootReasonFound) { + if (mAddUnknownBootreason && !mBootreasonFound) { MiscKernelLogItem unknownReset = new MiscKernelLogItem(); unknownReset.setEventTime(mStopTime); unknownReset.setPreamble(mPreambleUtil.getLastTail()); @@ -204,7 +216,7 @@ public class KernelLogParser implements IParser { final String[] goodSignatures = { "Restarting system.*", "Power down.*", - "Last boot reason: (?:PowerKey|normal|recovery|reboot)", + "Last boot reason: " + GOOD_BOOTREASONS, }; for (String pattern : kernelResets) { mPatternUtil.addPattern(Pattern.compile(pattern), KERNEL_RESET); diff --git a/tests/src/com/android/loganalysis/parser/BugreportParserTest.java b/tests/src/com/android/loganalysis/parser/BugreportParserTest.java index 4cfc6c7..5dfd75a 100644 --- a/tests/src/com/android/loganalysis/parser/BugreportParserTest.java +++ b/tests/src/com/android/loganalysis/parser/BugreportParserTest.java @@ -238,7 +238,11 @@ public class BugreportParserTest extends TestCase { "Command line: androidboot.bootreason=reboot", ""); BugreportItem bugreport = new BugreportParser().parse(lines); - assertNull(bugreport.getLastKmsg()); + assertNotNull(bugreport.getLastKmsg()); + assertEquals(1, bugreport.getLastKmsg().getEvents().size()); + assertEquals("Last boot reason: reboot", + bugreport.getLastKmsg().getEvents().get(0).getStack()); + assertEquals("NORMAL_REBOOT", bugreport.getLastKmsg().getEvents().get(0).getCategory()); } public void testParse_bootreason_bad() { @@ -420,12 +424,12 @@ public class BugreportParserTest extends TestCase { assertNotNull(bugreport); assertNull(bugreport.getDumpsys()); assertNull(bugreport.getKernelLog()); - assertNull(bugreport.getLastKmsg()); assertNull(bugreport.getMemInfo()); assertNull(bugreport.getProcrank()); assertNull(bugreport.getSystemLog()); assertNull(bugreport.getSystemProps()); assertNull(bugreport.getTop()); + assertNotNull(bugreport.getLastKmsg()); lines = Arrays.asList( "========================================================", @@ -453,12 +457,12 @@ public class BugreportParserTest extends TestCase { assertNotNull(bugreport); assertNotNull(bugreport.getDumpsys()); assertNull(bugreport.getKernelLog()); - assertNull(bugreport.getLastKmsg()); assertNull(bugreport.getMemInfo()); assertNull(bugreport.getProcrank()); assertNull(bugreport.getSystemLog()); assertNull(bugreport.getSystemProps()); assertNull(bugreport.getTop()); + assertNotNull(bugreport.getLastKmsg()); } /** diff --git a/tests/src/com/android/loganalysis/parser/MonkeyLogParserTest.java b/tests/src/com/android/loganalysis/parser/MonkeyLogParserTest.java index fa4d4df..b7e867d 100644 --- a/tests/src/com/android/loganalysis/parser/MonkeyLogParserTest.java +++ b/tests/src/com/android/loganalysis/parser/MonkeyLogParserTest.java @@ -442,7 +442,7 @@ public class MonkeyLogParserTest extends TestCase { assertEquals("google/mantaray/manta:4.1/JRO01/12345:userdebug/dev-keys", ((NativeCrashItem) monkeyLog.getCrash()).getFingerprint()); // Make sure that the entire stack is included. - assertEquals(24, ((NativeCrashItem) monkeyLog.getCrash()).getStack().split("\n").length); + assertEquals(23, ((NativeCrashItem) monkeyLog.getCrash()).getStack().split("\n").length); } /** @@ -537,7 +537,7 @@ public class MonkeyLogParserTest extends TestCase { assertEquals("google/mantaray/manta:4.1/JRO01/12345:userdebug/dev-keys", nc.getFingerprint()); // Make sure that the stack with the last line stripped is included. - assertEquals(24, nc.getStack().split("\n").length); + assertEquals(23, nc.getStack().split("\n").length); assertFalse(nc.getStack().contains("New native crash detected")); } diff --git a/tests/src/com/android/loganalysis/parser/NativeCrashParserTest.java b/tests/src/com/android/loganalysis/parser/NativeCrashParserTest.java index 4e82c8f..6c5cf98 100644 --- a/tests/src/com/android/loganalysis/parser/NativeCrashParserTest.java +++ b/tests/src/com/android/loganalysis/parser/NativeCrashParserTest.java @@ -33,7 +33,6 @@ public class NativeCrashParserTest extends TestCase { */ public void testParseage() { List lines = Arrays.asList( - "*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***", "Build fingerprint: 'google/soju/crespo:4.0.4/IMM76D/299849:userdebug/test-keys'", "pid: 2058, tid: 2523 >>> com.google.android.browser <<<", "signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000", -- cgit v1.2.3