summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Rowe <erowe@google.com>2013-05-15 16:00:30 -0700
committerEric Rowe <erowe@google.com>2013-05-15 17:08:10 -0700
commit6e947cdfb125a638ff81eb20a51886c217551a27 (patch)
treeb12eb617411443920c94e5b7d1baf0c76908d234
parentbd9f87614a8320d8b557ddb05b285fbb19f28d1f (diff)
downloadloganalysis-6e947cdfb125a638ff81eb20a51886c217551a27.tar.gz
Merge GenericLogcatItem and MiscLogcatItem.
Also, support merging logcat items together. Change-Id: I133b0a8b32228ffaae389ea75009f156d6181df1
-rw-r--r--src/com/android/loganalysis/heuristic/KernelResetHeuristic.java2
-rw-r--r--src/com/android/loganalysis/heuristic/RuntimeRestartHeuristic.java2
-rw-r--r--src/com/android/loganalysis/item/AnrItem.java23
-rw-r--r--src/com/android/loganalysis/item/GenericItem.java7
-rw-r--r--src/com/android/loganalysis/item/GenericLogcatItem.java146
-rw-r--r--src/com/android/loganalysis/item/JavaCrashItem.java23
-rw-r--r--src/com/android/loganalysis/item/LogcatItem.java90
-rw-r--r--src/com/android/loganalysis/item/MiscKernelLogItem.java16
-rw-r--r--src/com/android/loganalysis/item/MiscLogcatItem.java136
-rw-r--r--src/com/android/loganalysis/item/MonkeyLogItem.java6
-rw-r--r--src/com/android/loganalysis/item/NativeCrashItem.java23
-rw-r--r--src/com/android/loganalysis/parser/BugreportParser.java8
-rw-r--r--src/com/android/loganalysis/parser/KernelLogParser.java2
-rw-r--r--src/com/android/loganalysis/parser/LogcatParser.java8
-rw-r--r--src/com/android/loganalysis/parser/MonkeyLogParser.java6
-rw-r--r--tests/src/com/android/loganalysis/item/GenericItemTest.java29
-rw-r--r--tests/src/com/android/loganalysis/parser/KernelLogParserTest.java8
17 files changed, 274 insertions, 261 deletions
diff --git a/src/com/android/loganalysis/heuristic/KernelResetHeuristic.java b/src/com/android/loganalysis/heuristic/KernelResetHeuristic.java
index 945ee9c..11e67b9 100644
--- a/src/com/android/loganalysis/heuristic/KernelResetHeuristic.java
+++ b/src/com/android/loganalysis/heuristic/KernelResetHeuristic.java
@@ -94,7 +94,7 @@ public class KernelResetHeuristic extends AbstractHeuristic {
if (mKernelLog != null) {
for (MiscKernelLogItem item : mKernelLog.getMiscEvents(KernelLogParser.KERNEL_RESET)) {
sb.append(String.format("Reason: %s, Time: %.6f\nPreamble:\n%s\n\n",
- item.getMessage(), item.getEventTime(), item.getPreamble()));
+ item.getStack(), item.getEventTime(), item.getPreamble()));
}
}
return sb.toString();
diff --git a/src/com/android/loganalysis/heuristic/RuntimeRestartHeuristic.java b/src/com/android/loganalysis/heuristic/RuntimeRestartHeuristic.java
index 9b70b7c..d4041c2 100644
--- a/src/com/android/loganalysis/heuristic/RuntimeRestartHeuristic.java
+++ b/src/com/android/loganalysis/heuristic/RuntimeRestartHeuristic.java
@@ -131,7 +131,7 @@ public class RuntimeRestartHeuristic extends AbstractHeuristic {
if (mLogcat != null) {
for (MiscLogcatItem item : mLogcat.getMiscEvents(LogcatParser.RUNTIME_RESTART)) {
sb.append(String.format("Message: %s, Time: %s\n\nLast lines of logcat:\n%s\n\n" +
- "Process lines for pid %d:\n%s\n\n", item.getMessage(), item.getEventTime(),
+ "Process lines for pid %d:\n%s\n\n", item.getStack(), item.getEventTime(),
item.getLastPreamble(), item.getPid(), item.getProcessPreamble()));
}
}
diff --git a/src/com/android/loganalysis/item/AnrItem.java b/src/com/android/loganalysis/item/AnrItem.java
index d028335..fe440bb 100644
--- a/src/com/android/loganalysis/item/AnrItem.java
+++ b/src/com/android/loganalysis/item/AnrItem.java
@@ -15,6 +15,8 @@
*/
package com.android.loganalysis.item;
+import com.android.loganalysis.parser.LogcatParser;
+
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
@@ -22,7 +24,7 @@ import java.util.Set;
/**
* An {@link IItem} used to store ANR info.
*/
-public class AnrItem extends GenericLogcatItem {
+public class AnrItem extends MiscLogcatItem {
/**
* An enum used to select the CPU usage category.
*/
@@ -47,8 +49,6 @@ public class AnrItem extends GenericLogcatItem {
/** Constant for JSON output */
public static final String REASON = "REASON";
/** Constant for JSON output */
- public static final String STACK = "STACK";
- /** Constant for JSON output */
public static final String TRACE = "TRACE";
private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList(
@@ -59,13 +59,14 @@ public class AnrItem extends GenericLogcatItem {
LoadCategory.LOAD_1.toString(),
LoadCategory.LOAD_5.toString(),
LoadCategory.LOAD_15.toString(),
- ACTIVITY, REASON, STACK, TRACE));
+ ACTIVITY, REASON, TRACE));
/**
* The constructor for {@link AnrItem}.
*/
public AnrItem() {
super(ATTRIBUTES);
+ setCategory(LogcatParser.ANR);
}
/**
@@ -125,20 +126,6 @@ public class AnrItem extends GenericLogcatItem {
}
/**
- * Get the stack for the ANR.
- */
- public String getStack() {
- return (String) getAttribute(STACK);
- }
-
- /**
- * Set the stack for the ANR.
- */
- public void setStack(String stack) {
- setAttribute(STACK, stack);
- }
-
- /**
* Get the main trace for the ANR.
*/
public String getTrace() {
diff --git a/src/com/android/loganalysis/item/GenericItem.java b/src/com/android/loganalysis/item/GenericItem.java
index a98ed28..0ebf870 100644
--- a/src/com/android/loganalysis/item/GenericItem.java
+++ b/src/com/android/loganalysis/item/GenericItem.java
@@ -55,7 +55,7 @@ public class GenericItem implements IItem {
throw new ConflictingItemException("Conflicting class types");
}
- return new GenericItem(mAllowedAttributes, mergeAttributes(other));
+ return new GenericItem(mAllowedAttributes, mergeAttributes(other, mAllowedAttributes));
}
/**
@@ -68,7 +68,8 @@ public class GenericItem implements IItem {
* @return A Map from Strings to Objects containing merged attributes.
* @throws ConflictingItemException If the two items are not consistent.
*/
- protected Map<String, Object> mergeAttributes(IItem other) throws ConflictingItemException {
+ protected Map<String, Object> mergeAttributes(IItem other, Set<String> attributes)
+ throws ConflictingItemException {
if (this == other) {
return mAttributes;
}
@@ -78,7 +79,7 @@ public class GenericItem implements IItem {
GenericItem item = (GenericItem) other;
Map<String, Object> mergedAttributes = new HashMap<String, Object>();
- for (String attribute : mAllowedAttributes) {
+ for (String attribute : attributes) {
mergedAttributes.put(attribute,
mergeObjects(getAttribute(attribute), item.getAttribute(attribute)));
}
diff --git a/src/com/android/loganalysis/item/GenericLogcatItem.java b/src/com/android/loganalysis/item/GenericLogcatItem.java
deleted file mode 100644
index 03ef704..0000000
--- a/src/com/android/loganalysis/item/GenericLogcatItem.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.loganalysis.item;
-
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A generic item containing attributes for time, process, and thread and can be extended for
- * items such as {@link AnrItem} and {@link JavaCrashItem}.
- */
-public abstract class GenericLogcatItem extends GenericItem {
-
- /** Constant for JSON output */
- public static final String EVENT_TIME = "EVENT_TIME";
- /** Constant for JSON output */
- public static final String PID = "PID";
- /** Constant for JSON output */
- public static final String TID = "TID";
- /** Constant for JSON output */
- public static final String APP = "APP";
- /** Constant for JSON output */
- public static final String LAST_PREAMBLE = "LAST_PREAMBLE";
- /** Constant for JSON output */
- public static final String PROCESS_PREAMBLE = "PROCESS_PREAMBLE";
-
- private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList(
- EVENT_TIME, PID, TID, APP, LAST_PREAMBLE, PROCESS_PREAMBLE));
-
- /**
- * Constructor for {@link GenericLogcatItem}.
- *
- * @param attributes A list of allowed attributes.
- */
- protected GenericLogcatItem(Set<String> attributes) {
- super(getAllAttributes(attributes));
- }
-
- /**
- * Get the {@link Date} object when the event happened.
- */
- public Date getEventTime() {
- return (Date) getAttribute(EVENT_TIME);
- }
-
- /**
- * Set the {@link Date} object when the event happened.
- */
- public void setEventTime(Date time) {
- setAttribute(EVENT_TIME, time);
- }
-
- /**
- * Get the PID of the event.
- */
- public Integer getPid() {
- return (Integer) getAttribute(PID);
- }
-
- /**
- * Set the PID of the event.
- */
- public void setPid(Integer pid) {
- setAttribute(PID, pid);
- }
-
- /**
- * Get the TID of the event.
- */
- public Integer getTid() {
- return (Integer) getAttribute(TID);
- }
-
- /**
- * Set the TID of the event.
- */
- public void setTid(Integer tid) {
- setAttribute(TID, tid);
- }
-
- /**
- * Get the app or package name of the event.
- */
- public String getApp() {
- return (String) getAttribute(APP);
- }
-
- /**
- * Set the app or package name of the event.
- */
- public void setApp(String app) {
- setAttribute(APP, app);
- }
-
- /**
- * Get the last preamble for the event.
- */
- public String getLastPreamble() {
- return (String) getAttribute(LAST_PREAMBLE);
- }
-
- /**
- * Set the last preamble for the event.
- */
- public void setLastPreamble(String preamble) {
- setAttribute(LAST_PREAMBLE, preamble);
- }
-
- /**
- * Get the process preamble for the event.
- */
- public String getProcessPreamble() {
- return (String) getAttribute(PROCESS_PREAMBLE);
- }
-
- /**
- * Set the process preamble for the event.
- */
- public void setProcessPreamble(String preamble) {
- setAttribute(PROCESS_PREAMBLE, preamble);
- }
-
- /**
- * Combine an array of attributes with the internal list of attributes.
- */
- private static Set<String> getAllAttributes(Set<String> attributes) {
- Set<String> allAttributes = new HashSet<String>(ATTRIBUTES);
- allAttributes.addAll(attributes);
- return allAttributes;
- }
-}
diff --git a/src/com/android/loganalysis/item/JavaCrashItem.java b/src/com/android/loganalysis/item/JavaCrashItem.java
index bcf7e90..cd81ed6 100644
--- a/src/com/android/loganalysis/item/JavaCrashItem.java
+++ b/src/com/android/loganalysis/item/JavaCrashItem.java
@@ -15,6 +15,8 @@
*/
package com.android.loganalysis.item;
+import com.android.loganalysis.parser.LogcatParser;
+
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
@@ -22,23 +24,22 @@ import java.util.Set;
/**
* An {@link IItem} used to store Java crash info.
*/
-public class JavaCrashItem extends GenericLogcatItem {
+public class JavaCrashItem extends MiscLogcatItem {
/** Constant for JSON output */
public static final String EXCEPTION = "EXCEPTION";
/** Constant for JSON output */
public static final String MESSAGE = "MESSAGE";
- /** Constant for JSON output */
- public static final String STACK = "STACK";
private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList(
- EXCEPTION, MESSAGE, STACK));
+ EXCEPTION, MESSAGE));
/**
* The constructor for {@link JavaCrashItem}.
*/
public JavaCrashItem() {
super(ATTRIBUTES);
+ setCategory(LogcatParser.JAVA_CRASH);
}
/**
@@ -68,18 +69,4 @@ public class JavaCrashItem extends GenericLogcatItem {
public void setMessage(String message) {
setAttribute(MESSAGE, message);
}
-
- /**
- * Get the stack for the ANR.
- */
- public String getStack() {
- return (String) getAttribute(STACK);
- }
-
- /**
- * Set the stack for the ANR.
- */
- public void setStack(String stack) {
- setAttribute(STACK, stack);
- }
}
diff --git a/src/com/android/loganalysis/item/LogcatItem.java b/src/com/android/loganalysis/item/LogcatItem.java
index 1353ef8..04e753c 100644
--- a/src/com/android/loganalysis/item/LogcatItem.java
+++ b/src/com/android/loganalysis/item/LogcatItem.java
@@ -15,6 +15,10 @@
*/
package com.android.loganalysis.item;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
@@ -37,9 +41,8 @@ public class LogcatItem extends GenericItem {
private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList(
START_TIME, STOP_TIME, EVENTS));
- private class ItemList extends LinkedList<IItem> {
- private static final long serialVersionUID = 1088529764741812025L;
- }
+ @SuppressWarnings("serial")
+ private class ItemList extends LinkedList<MiscLogcatItem> {}
/**
* The constructor for {@link LogcatItem}.
@@ -79,16 +82,16 @@ public class LogcatItem extends GenericItem {
}
/**
- * Get the list of all {@link IItem} events.
+ * Get the list of all {@link MiscLogcatItem} events.
*/
- public List<IItem> getEvents() {
+ public List<MiscLogcatItem> getEvents() {
return (ItemList) getAttribute(EVENTS);
}
/**
- * Add an {@link IItem} event to the end of the list of events.
+ * Add an {@link MiscLogcatItem} event to the end of the list of events.
*/
- public void addEvent(IItem event) {
+ public void addEvent(MiscLogcatItem event) {
((ItemList) getAttribute(EVENTS)).add(event);
}
@@ -144,4 +147,77 @@ public class LogcatItem extends GenericItem {
}
return items;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public LogcatItem merge(IItem other) throws ConflictingItemException {
+ if (this == other) {
+ return this;
+ }
+ if (other == null || !(other instanceof LogcatItem)) {
+ throw new ConflictingItemException("Conflicting class types");
+ }
+
+ LogcatItem logcat = (LogcatItem) other;
+
+ Date start = logcat.getStartTime().before(getStartTime()) ?
+ logcat.getStartTime() : getStartTime();
+ Date stop = logcat.getStopTime().after(getStopTime()) ?
+ logcat.getStopTime() : getStopTime();
+ Date overlapStart = logcat.getStartTime().after(getStartTime()) ?
+ logcat.getStartTime() : getStartTime();
+ Date overlapStop = logcat.getStopTime().before(getStopTime()) ?
+ logcat.getStopTime() : getStopTime();
+
+ // Make sure that all events in the overlapping span are
+ ItemList mergedEvents = new ItemList();
+ for (MiscLogcatItem event : getEvents()) {
+ final Date eventTime = event.getEventTime();
+ if (eventTime.after(overlapStart) && eventTime.before(overlapStop) &&
+ !logcat.getEvents().contains(event)) {
+ throw new ConflictingItemException("Event in first logcat not contained in " +
+ "overlapping portion of other logcat.");
+ }
+ mergedEvents.add(event);
+ }
+
+ for (MiscLogcatItem event : logcat.getEvents()) {
+ final Date eventTime = event.getEventTime();
+ if (eventTime.after(overlapStart) && eventTime.before(overlapStop)) {
+ if (!getEvents().contains(event)) {
+ throw new ConflictingItemException("Event in first logcat not contained in " +
+ "overlapping portion of other logcat.");
+ }
+ } else {
+ mergedEvents.add(event);
+ }
+ }
+
+ LogcatItem mergedLogcat = new LogcatItem();
+ mergedLogcat.setStartTime(start);
+ mergedLogcat.setStopTime(stop);
+ mergedLogcat.setAttribute(EVENTS, mergedEvents);
+ return mergedLogcat;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public JSONObject toJson() {
+ JSONObject output = super.toJson();
+ JSONArray events = new JSONArray();
+ for (MiscLogcatItem event : getEvents()) {
+ events.put(event.toJson());
+ }
+
+ try {
+ output.put(EVENTS, events);
+ } catch (JSONException e) {
+ // Ignore
+ }
+ return output;
+ }
}
diff --git a/src/com/android/loganalysis/item/MiscKernelLogItem.java b/src/com/android/loganalysis/item/MiscKernelLogItem.java
index f5d853b..6897567 100644
--- a/src/com/android/loganalysis/item/MiscKernelLogItem.java
+++ b/src/com/android/loganalysis/item/MiscKernelLogItem.java
@@ -32,10 +32,10 @@ public class MiscKernelLogItem extends GenericItem {
/** Constant for JSON output */
public static final String CATEGORY = "CATEGORY";
/** Constant for JSON output */
- public static final String MESSAGE = "MESSAGE";
+ public static final String STACK = "STACK";
private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList(
- EVENT_TIME, PREAMBLE, CATEGORY, MESSAGE));
+ EVENT_TIME, PREAMBLE, CATEGORY, STACK));
/**
* Constructor for {@link MiscKernelLogItem}.
@@ -87,16 +87,16 @@ public class MiscKernelLogItem extends GenericItem {
}
/**
- * Get the message for the event.
+ * Get the stack for the event.
*/
- public String getMessage() {
- return (String) getAttribute(MESSAGE);
+ public String getStack() {
+ return (String) getAttribute(STACK);
}
/**
- * Set the message for the event.
+ * Set the stack for the event.
*/
- public void setMessage(String message) {
- setAttribute(MESSAGE, message);
+ public void setStack(String stack) {
+ setAttribute(STACK, stack);
}
}
diff --git a/src/com/android/loganalysis/item/MiscLogcatItem.java b/src/com/android/loganalysis/item/MiscLogcatItem.java
index fdc692a..831cb0c 100644
--- a/src/com/android/loganalysis/item/MiscLogcatItem.java
+++ b/src/com/android/loganalysis/item/MiscLogcatItem.java
@@ -16,30 +16,144 @@
package com.android.loganalysis.item;
import java.util.Arrays;
+import java.util.Date;
import java.util.HashSet;
import java.util.Set;
/**
* An {@link IItem} used to store miscellaneous logcat info.
*/
-public class MiscLogcatItem extends GenericLogcatItem {
-
+public class MiscLogcatItem extends GenericItem {
+ /** Constant for JSON output */
+ public static final String EVENT_TIME = "EVENT_TIME";
+ /** Constant for JSON output */
+ public static final String PID = "PID";
+ /** Constant for JSON output */
+ public static final String TID = "TID";
+ /** Constant for JSON output */
+ public static final String APP = "APP";
+ /** Constant for JSON output */
+ public static final String LAST_PREAMBLE = "LAST_PREAMBLE";
+ /** Constant for JSON output */
+ public static final String PROCESS_PREAMBLE = "PROCESS_PREAMBLE";
/** Constant for JSON output */
public static final String CATEGORY = "CATEGORY";
/** Constant for JSON output */
- public static final String MESSAGE = "MESSAGE";
+ public static final String STACK = "STACK";
private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList(
- CATEGORY, MESSAGE));
+ EVENT_TIME, PID, TID, APP, LAST_PREAMBLE, PROCESS_PREAMBLE, CATEGORY, STACK));
/**
- * The constructor for {@link MiscLogcatItem}.
+ * Constructor for {@link MiscLogcatItem}.
*/
public MiscLogcatItem() {
super(ATTRIBUTES);
}
/**
+ * Constructor for {@link MiscLogcatItem}.
+ *
+ * @param attributes A list of allowed attributes.
+ */
+ protected MiscLogcatItem(Set<String> attributes) {
+ super(getAllAttributes(attributes));
+ }
+
+ /**
+ * Get the {@link Date} object when the event happened.
+ */
+ public Date getEventTime() {
+ return (Date) getAttribute(EVENT_TIME);
+ }
+
+ /**
+ * Set the {@link Date} object when the event happened.
+ */
+ public void setEventTime(Date time) {
+ setAttribute(EVENT_TIME, time);
+ }
+
+ /**
+ * Get the PID of the event.
+ */
+ public Integer getPid() {
+ return (Integer) getAttribute(PID);
+ }
+
+ /**
+ * Set the PID of the event.
+ */
+ public void setPid(Integer pid) {
+ setAttribute(PID, pid);
+ }
+
+ /**
+ * Get the TID of the event.
+ */
+ public Integer getTid() {
+ return (Integer) getAttribute(TID);
+ }
+
+ /**
+ * Set the TID of the event.
+ */
+ public void setTid(Integer tid) {
+ setAttribute(TID, tid);
+ }
+
+ /**
+ * Get the app or package name of the event.
+ */
+ public String getApp() {
+ return (String) getAttribute(APP);
+ }
+
+ /**
+ * Set the app or package name of the event.
+ */
+ public void setApp(String app) {
+ setAttribute(APP, app);
+ }
+
+ /**
+ * Get the last preamble for the event.
+ */
+ public String getLastPreamble() {
+ return (String) getAttribute(LAST_PREAMBLE);
+ }
+
+ /**
+ * Set the last preamble for the event.
+ */
+ public void setLastPreamble(String preamble) {
+ setAttribute(LAST_PREAMBLE, preamble);
+ }
+
+ /**
+ * Get the process preamble for the event.
+ */
+ public String getProcessPreamble() {
+ return (String) getAttribute(PROCESS_PREAMBLE);
+ }
+
+ /**
+ * Set the process preamble for the event.
+ */
+ public void setProcessPreamble(String preamble) {
+ setAttribute(PROCESS_PREAMBLE, preamble);
+ }
+
+ /**
+ * Combine an array of attributes with the internal list of attributes.
+ */
+ private static Set<String> getAllAttributes(Set<String> attributes) {
+ Set<String> allAttributes = new HashSet<String>(ATTRIBUTES);
+ allAttributes.addAll(attributes);
+ return allAttributes;
+ }
+
+ /**
* Get the category of the event.
*/
public String getCategory() {
@@ -54,16 +168,16 @@ public class MiscLogcatItem extends GenericLogcatItem {
}
/**
- * Get the message for the event.
+ * Get the stack for the event.
*/
- public String getMessage() {
- return (String) getAttribute(MESSAGE);
+ public String getStack() {
+ return (String) getAttribute(STACK);
}
/**
- * Set the message for the event.
+ * Set the stack for the event.
*/
- public void setMessage(String message) {
- setAttribute(MESSAGE, message);
+ public void setStack(String stack) {
+ setAttribute(STACK, stack);
}
}
diff --git a/src/com/android/loganalysis/item/MonkeyLogItem.java b/src/com/android/loganalysis/item/MonkeyLogItem.java
index 7bc44f2..454e587 100644
--- a/src/com/android/loganalysis/item/MonkeyLogItem.java
+++ b/src/com/android/loganalysis/item/MonkeyLogItem.java
@@ -334,15 +334,15 @@ public class MonkeyLogItem extends GenericItem {
* Get the {@link AnrItem}, {@link JavaCrashItem}, or {@link NativeCrashItem} for the monkey run
* or null if there was no crash.
*/
- public GenericLogcatItem getCrash() {
- return (GenericLogcatItem) getAttribute(CRASH);
+ public MiscLogcatItem getCrash() {
+ return (MiscLogcatItem) getAttribute(CRASH);
}
/**
* Set the {@link AnrItem}, {@link JavaCrashItem}, or {@link NativeCrashItem} for the monkey
* run.
*/
- public void setCrash(GenericLogcatItem crash) {
+ public void setCrash(MiscLogcatItem crash) {
setAttribute(CRASH, crash);
}
diff --git a/src/com/android/loganalysis/item/NativeCrashItem.java b/src/com/android/loganalysis/item/NativeCrashItem.java
index e6679c2..762a1cc 100644
--- a/src/com/android/loganalysis/item/NativeCrashItem.java
+++ b/src/com/android/loganalysis/item/NativeCrashItem.java
@@ -15,6 +15,8 @@
*/
package com.android.loganalysis.item;
+import com.android.loganalysis.parser.LogcatParser;
+
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
@@ -22,21 +24,20 @@ import java.util.Set;
/**
* An {@link IItem} used to store native crash info.
*/
-public class NativeCrashItem extends GenericLogcatItem {
+public class NativeCrashItem extends MiscLogcatItem {
/** Constant for JSON output */
public static final String FINGERPRINT = "FINGERPRINT";
- /** Constant for JSON output */
- public static final String STACK = "STACK";
private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList(
- FINGERPRINT, STACK));
+ FINGERPRINT));
/**
* The constructor for {@link NativeCrashItem}.
*/
public NativeCrashItem() {
super(ATTRIBUTES);
+ setCategory(LogcatParser.NATIVE_CRASH);
}
/**
@@ -52,18 +53,4 @@ public class NativeCrashItem extends GenericLogcatItem {
public void setFingerprint(String fingerprint) {
setAttribute(FINGERPRINT, fingerprint);
}
-
- /**
- * Get the stack for the crash.
- */
- public String getStack() {
- return (String) getAttribute(STACK);
- }
-
- /**
- * Set the stack for the crash.
- */
- public void setStack(String stack) {
- setAttribute(STACK, stack);
- }
}
diff --git a/src/com/android/loganalysis/parser/BugreportParser.java b/src/com/android/loganalysis/parser/BugreportParser.java
index f4a7383..a42e8e4 100644
--- a/src/com/android/loganalysis/parser/BugreportParser.java
+++ b/src/com/android/loganalysis/parser/BugreportParser.java
@@ -18,11 +18,11 @@ package com.android.loganalysis.parser;
import com.android.loganalysis.item.AnrItem;
import com.android.loganalysis.item.BugreportItem;
import com.android.loganalysis.item.DumpsysItem;
-import com.android.loganalysis.item.GenericLogcatItem;
import com.android.loganalysis.item.IItem;
import com.android.loganalysis.item.KernelLogItem;
import com.android.loganalysis.item.LogcatItem;
import com.android.loganalysis.item.MemInfoItem;
+import com.android.loganalysis.item.MiscLogcatItem;
import com.android.loganalysis.item.ProcrankItem;
import com.android.loganalysis.item.SystemPropsItem;
import com.android.loganalysis.item.TopItem;
@@ -159,9 +159,9 @@ public class BugreportParser extends AbstractSectionParser {
if (mBugreport.getSystemLog() != null && mBugreport.getProcrank() != null) {
for (IItem item : mBugreport.getSystemLog().getEvents()) {
- if (item instanceof GenericLogcatItem &&
- ((GenericLogcatItem) item).getApp() == null) {
- GenericLogcatItem logcatItem = (GenericLogcatItem) item;
+ if (item instanceof MiscLogcatItem &&
+ ((MiscLogcatItem) item).getApp() == null) {
+ MiscLogcatItem logcatItem = (MiscLogcatItem) item;
logcatItem.setApp(mBugreport.getProcrank().getProcessName(
logcatItem.getPid()));
}
diff --git a/src/com/android/loganalysis/parser/KernelLogParser.java b/src/com/android/loganalysis/parser/KernelLogParser.java
index 635563f..5c7afe0 100644
--- a/src/com/android/loganalysis/parser/KernelLogParser.java
+++ b/src/com/android/loganalysis/parser/KernelLogParser.java
@@ -114,7 +114,7 @@ public class KernelLogParser implements IParser {
MiscKernelLogItem kernelLogItem = new MiscKernelLogItem();
kernelLogItem.setEventTime(mStopTime);
kernelLogItem.setPreamble(mPreambleUtil.getLastTail());
- kernelLogItem.setMessage(message);
+ kernelLogItem.setStack(message);
kernelLogItem.setCategory(category);
mKernelLog.addEvent(kernelLogItem);
}
diff --git a/src/com/android/loganalysis/parser/LogcatParser.java b/src/com/android/loganalysis/parser/LogcatParser.java
index 88f029a..229c6f6 100644
--- a/src/com/android/loganalysis/parser/LogcatParser.java
+++ b/src/com/android/loganalysis/parser/LogcatParser.java
@@ -15,7 +15,6 @@
*/
package com.android.loganalysis.parser;
-import com.android.loganalysis.item.GenericLogcatItem;
import com.android.loganalysis.item.LogcatItem;
import com.android.loganalysis.item.MiscLogcatItem;
import com.android.loganalysis.util.ArrayUtil;
@@ -45,6 +44,9 @@ import java.util.regex.Pattern;
* </p>
*/
public class LogcatParser implements IParser {
+ public static final String ANR = "ANR";
+ public static final String JAVA_CRASH = "JAVA_CRASH";
+ public static final String NATIVE_CRASH = "NATIVE_CRASH";
public static final String HIGH_CPU_USAGE = "HIGH_CPU_USAGE";
public static final String HIGH_MEMORY_USAGE = "HIGH_MEMORY_USAGE";
public static final String RUNTIME_RESTART = "RUNTIME_RESTART";
@@ -249,7 +251,7 @@ public class LogcatParser implements IParser {
*/
private void commit() {
for (LogcatData data : mDataList) {
- GenericLogcatItem item = null;
+ MiscLogcatItem item = null;
if ("E".equals(data.mLevel) && "ActivityManager".equals(data.mTag)) {
// CLog.v("Parsing ANR: %s", data.mLines);
item = new AnrParser().parse(data.mLines);
@@ -265,7 +267,7 @@ public class LogcatParser implements IParser {
if (category != null) {
MiscLogcatItem logcatItem = new MiscLogcatItem();
logcatItem.setCategory(category);
- logcatItem.setMessage(msg);
+ logcatItem.setStack(msg);
item = logcatItem;
}
}
diff --git a/src/com/android/loganalysis/parser/MonkeyLogParser.java b/src/com/android/loganalysis/parser/MonkeyLogParser.java
index e55e94a..3cb4c45 100644
--- a/src/com/android/loganalysis/parser/MonkeyLogParser.java
+++ b/src/com/android/loganalysis/parser/MonkeyLogParser.java
@@ -16,7 +16,7 @@
package com.android.loganalysis.parser;
import com.android.loganalysis.item.AnrItem;
-import com.android.loganalysis.item.GenericLogcatItem;
+import com.android.loganalysis.item.MiscLogcatItem;
import com.android.loganalysis.item.MonkeyLogItem;
import com.android.loganalysis.item.MonkeyLogItem.DroppedCategory;
import com.android.loganalysis.item.TracesItem;
@@ -145,7 +145,7 @@ public class MonkeyLogParser implements IParser {
mBlock.add(line);
return;
} else {
- GenericLogcatItem crash = null;
+ MiscLogcatItem crash = null;
if (mMatchingJavaCrash) {
crash = new JavaCrashParser().parse(mBlock);
} else if (mMatchingNativeCrash) {
@@ -267,7 +267,7 @@ public class MonkeyLogParser implements IParser {
/**
* Add a crash to the monkey log item and reset the parser state for crashes.
*/
- private void addCrashAndReset(GenericLogcatItem crash) {
+ private void addCrashAndReset(MiscLogcatItem crash) {
if (crash != null) {
crash.setPid(mPid);
crash.setApp(mApp);
diff --git a/tests/src/com/android/loganalysis/item/GenericItemTest.java b/tests/src/com/android/loganalysis/item/GenericItemTest.java
index 7532fd3..94e3236 100644
--- a/tests/src/com/android/loganalysis/item/GenericItemTest.java
+++ b/tests/src/com/android/loganalysis/item/GenericItemTest.java
@@ -71,49 +71,49 @@ public class GenericItemTest extends TestCase {
}
/**
- * Test for {@link GenericItem#mergeAttributes(IItem)}.
+ * Test for {@link GenericItem#mergeAttributes(IItem, Set)}.
*/
public void testMergeAttributes() throws ConflictingItemException {
Map<String, Object> attributes;
- attributes = mEmptyItem1.mergeAttributes(mEmptyItem1);
+ attributes = mEmptyItem1.mergeAttributes(mEmptyItem1, ATTRIBUTES);
assertNull(attributes.get("string"));
assertNull(attributes.get("integer"));
- attributes = mEmptyItem1.mergeAttributes(mEmptyItem2);
+ attributes = mEmptyItem1.mergeAttributes(mEmptyItem2, ATTRIBUTES);
assertNull(attributes.get("string"));
assertNull(attributes.get("integer"));
- attributes = mEmptyItem2.mergeAttributes(mEmptyItem1);
+ attributes = mEmptyItem2.mergeAttributes(mEmptyItem1, ATTRIBUTES);
assertNull(attributes.get("string"));
assertNull(attributes.get("integer"));
- attributes = mEmptyItem1.mergeAttributes(mStringItem);
+ attributes = mEmptyItem1.mergeAttributes(mStringItem, ATTRIBUTES);
assertEquals(mStringAttribute, attributes.get("string"));
assertNull(attributes.get("integer"));
- attributes = mStringItem.mergeAttributes(mEmptyItem1);
+ attributes = mStringItem.mergeAttributes(mEmptyItem1, ATTRIBUTES);
assertEquals(mStringAttribute, attributes.get("string"));
assertNull(attributes.get("integer"));
- attributes = mIntegerItem.mergeAttributes(mStringItem);
+ attributes = mIntegerItem.mergeAttributes(mStringItem, ATTRIBUTES);
assertEquals(mStringAttribute, attributes.get("string"));
assertEquals(mIntegerAttribute, attributes.get("integer"));
- attributes = mEmptyItem1.mergeAttributes(mFullItem1);
+ attributes = mEmptyItem1.mergeAttributes(mFullItem1, ATTRIBUTES);
assertEquals(mStringAttribute, attributes.get("string"));
assertEquals(mIntegerAttribute, attributes.get("integer"));
- attributes = mFullItem1.mergeAttributes(mEmptyItem1);
+ attributes = mFullItem1.mergeAttributes(mEmptyItem1, ATTRIBUTES);
assertEquals(mStringAttribute, attributes.get("string"));
assertEquals(mIntegerAttribute, attributes.get("integer"));
- attributes = mFullItem1.mergeAttributes(mFullItem2);
+ attributes = mFullItem1.mergeAttributes(mFullItem2, ATTRIBUTES);
assertEquals(mStringAttribute, attributes.get("string"));
assertEquals(mIntegerAttribute, attributes.get("integer"));
try {
- mFullItem1.mergeAttributes(mInconsistentItem);
+ mFullItem1.mergeAttributes(mInconsistentItem, ATTRIBUTES);
fail("Expecting a ConflictingItemException");
} catch (ConflictingItemException e) {
// Expected
@@ -228,9 +228,11 @@ public class GenericItemTest extends TestCase {
*/
public void testToJson() throws JSONException {
GenericItem item = new GenericItem(new HashSet<String>(Arrays.asList(
- "string", "date", "object", "integer", "long", "float", "double", "null")));
+ "string", "date", "object", "integer", "long", "float", "double", "item", "null")));
Date date = new Date();
Object object = new Object();
+ NativeCrashItem subItem = new NativeCrashItem();
+
item.setAttribute("string", "foo");
item.setAttribute("date", date);
item.setAttribute("object", object);
@@ -238,6 +240,7 @@ public class GenericItemTest extends TestCase {
item.setAttribute("long", 1L);
item.setAttribute("float", 2.5f);
item.setAttribute("double", 3.5);
+ item.setAttribute("item", subItem);
item.setAttribute("null", null);
// Convert to JSON string and back again
@@ -257,6 +260,8 @@ public class GenericItemTest extends TestCase {
assertEquals(2.5, output.get("float"));
assertTrue(output.has("double"));
assertEquals(3.5, output.get("double"));
+ assertTrue(output.has("item"));
+ assertTrue(output.get("item") instanceof JSONObject);
assertFalse(output.has("null"));
}
}
diff --git a/tests/src/com/android/loganalysis/parser/KernelLogParserTest.java b/tests/src/com/android/loganalysis/parser/KernelLogParserTest.java
index 0785269..32236b7 100644
--- a/tests/src/com/android/loganalysis/parser/KernelLogParserTest.java
+++ b/tests/src/com/android/loganalysis/parser/KernelLogParserTest.java
@@ -46,7 +46,7 @@ public class KernelLogParserTest extends TestCase {
MiscKernelLogItem item = kernelLog.getMiscEvents(KernelLogParser.KERNEL_RESET).get(0);
assertEquals(1.0, item.getEventTime(), 0.0000005);
assertEquals("[ 0.000000] Start", item.getPreamble());
- assertEquals("Kernel panic", item.getMessage());
+ assertEquals("Kernel panic", item.getStack());
}
/**
@@ -68,7 +68,7 @@ public class KernelLogParserTest extends TestCase {
MiscKernelLogItem item = kernelLog.getMiscEvents(KernelLogParser.KERNEL_RESET).get(0);
assertEquals(1.0, item.getEventTime(), 0.0000005);
assertEquals("<1>[ 0.000000] Start", item.getPreamble());
- assertEquals("Kernel panic", item.getMessage());
+ assertEquals("Kernel panic", item.getStack());
}
/**
@@ -90,7 +90,7 @@ public class KernelLogParserTest extends TestCase {
MiscKernelLogItem item = kernelLog.getMiscEvents(KernelLogParser.KERNEL_RESET).get(0);
assertEquals(2.0, item.getEventTime(), 0.0000005);
assertEquals("[ 0.000000] Start\n[ 2.000000] End", item.getPreamble());
- assertEquals("Last boot reason: hw_reset", item.getMessage());
+ assertEquals("Last boot reason: hw_reset", item.getStack());
}
/**
@@ -110,6 +110,6 @@ public class KernelLogParserTest extends TestCase {
MiscKernelLogItem item = kernelLog.getMiscEvents(KernelLogParser.KERNEL_RESET).get(0);
assertNull(item.getEventTime());
assertEquals("", item.getPreamble());
- assertEquals("Last boot reason: hw_reset", item.getMessage());
+ assertEquals("Last boot reason: hw_reset", item.getStack());
}
}