/* * Copyright (C) 2011 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.parser; import com.android.loganalysis.item.TracesItem; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * A {@link IParser} to parse Android traces files. *

* For now, this only extracts the main stack trace from the first process. It is used to get a * stack from {@code /data/anr/traces.txt} which can be used to give some context about the ANR. If * there is a need, this parser can be expanded to parse all stacks from all processes. */ public class TracesParser implements IParser { /** * Matches: ----- pid PID at YYYY-MM-DD hh:mm:ss ----- */ private static final Pattern PID = Pattern.compile( "^----- pid (\\d+) at \\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2} -----$"); /** * Matches: Cmd line: APP */ private static final Pattern APP = Pattern.compile("^Cmd ?line: (\\S+).*$"); /** * Matches: "main" prio=5 tid=1 STATE */ private static final Pattern STACK = Pattern.compile("^\"main\" .*$"); /** * {@inheritDoc} * * @return The {@link TracesItem}. */ @Override public TracesItem parse(List lines) { TracesItem traces = new TracesItem(); StringBuffer stack = null; for (String line : lines) { if (stack == null) { Matcher m = PID.matcher(line); if (m.matches()) { traces.setPid(Integer.parseInt(m.group(1))); } m = APP.matcher(line); if (m.matches()) { traces.setApp(m.group(1)); } m = STACK.matcher(line); if (m.matches()) { stack = new StringBuffer(); stack.append(line); stack.append("\n"); } } else if (!"".equals(line)) { stack.append(line); stack.append("\n"); } else { traces.setStack(stack.toString().trim()); return traces; } } if (stack == null) { return null; } traces.setStack(stack.toString().trim()); return traces; } }