Chromium Code Reviews| Index: build/android/stacktrace/java/org/chromium/build/FlushingReTrace.java |
| diff --git a/build/android/stacktrace/java/org/chromium/build/FlushingReTrace.java b/build/android/stacktrace/java/org/chromium/build/FlushingReTrace.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..1402511ac8f1aa3a5b386c0c8b577a51239113d8 |
| --- /dev/null |
| +++ b/build/android/stacktrace/java/org/chromium/build/FlushingReTrace.java |
| @@ -0,0 +1,60 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package org.chromium.build; |
| + |
| +import java.io.BufferedReader; |
| +import java.io.File; |
| +import java.io.IOException; |
| +import java.io.InputStreamReader; |
| +import java.io.LineNumberReader; |
| +import java.io.OutputStreamWriter; |
| +import java.io.PrintWriter; |
| + |
| +import proguard.retrace.ReTrace; |
| + |
| +/** |
| + * A wrapper around ReTrace that: |
| + * 1. Hardcodes a more useful line regular expression |
| + * 2. Disables output buffering |
| + */ |
| +public class FlushingReTrace { |
| + // This regex is based on the one from: |
| + // http://proguard.sourceforge.net/manual/retrace/usage.html. |
| + // But with the "at" part changed to "(?::|\bat)", to account for lines like: |
| + // 06-22 13:58:02.895 4674 4674 E THREAD_STATE: bLA.a(PG:173) |
| + // Normal stack trace lines look like: |
| + // java.lang.RuntimeException: Intentional Java Crash |
| + // at org.chromium.chrome.browser.tab.Tab.handleJavaCrash(Tab.java:682) |
| + // at org.chromium.chrome.browser.tab.Tab.loadUrl(Tab.java:644) |
| + private static final String LINE_PARSE_REGEX = |
| + "(?:.*?(?::|\\bat)\\s+%c\\.%m\\s*\\(%s(?::%l)?\\)\\s*)|(?:(?:.*?[:\"]\\s+)?%c(?::.*)?)"; |
| + |
| + public static void main(String[] args) { |
| + if (args.length != 1) { |
|
jbudorick
2017/06/28 16:11:38
I'm surprised that the java standard library doesn
agrieve
2017/06/29 01:59:20
:( indeed.
|
| + System.err.println("Usage: retrace Foo.apk.map < foo.log > bar.log"); |
| + System.exit(1); |
| + } |
| + |
| + File mappingFile = new File(args[0]); |
| + try { |
| + LineNumberReader reader = new LineNumberReader( |
| + new BufferedReader(new InputStreamReader(System.in, "UTF-8"))); |
| + |
| + // Enabling autoFlush is the main difference from ReTrace.main(). |
| + boolean autoFlush = true; |
| + PrintWriter writer = |
| + new PrintWriter(new OutputStreamWriter(System.out, "UTF-8"), autoFlush); |
| + |
| + boolean verbose = false; |
| + new ReTrace(LINE_PARSE_REGEX, verbose, mappingFile).retrace(reader, writer); |
| + } catch (IOException ex) { |
| + // Print a verbose stack trace. |
| + ex.printStackTrace(); |
| + System.exit(1); |
| + } |
| + |
| + System.exit(0); |
|
Yaron
2017/06/28 15:55:25
unnecessary?
agrieve
2017/06/29 01:59:20
It's necessary if there are any non-daemon threads
|
| + } |
| +} |