Bug 863777 - Get native stack in ANR report; r=blassey

This commit is contained in:
Jim Chen 2013-06-14 12:42:10 -04:00
parent d106559612
commit 43b7d54799

View File

@ -30,6 +30,7 @@ import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.Reader; import java.io.Reader;
import java.io.StringReader;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.util.UUID; import java.util.UUID;
@ -445,7 +446,8 @@ public final class ANRReporter extends BroadcastReceiver
return total; return total;
} }
private static void fillPingFooter(OutputStream ping, MessageDigest checksum) private static void fillPingFooter(OutputStream ping, MessageDigest checksum,
boolean haveNativeStack)
throws IOException { throws IOException {
// We are at the end of ANR data // We are at the end of ANR data
@ -473,6 +475,17 @@ public final class ANRReporter extends BroadcastReceiver
Log.w(LOGTAG, e); Log.w(LOGTAG, e);
} }
if (haveNativeStack) {
total += writePingPayload(ping, checksum, ("\"," +
"\"androidNativeStack\":\""));
String nativeStack = String.valueOf(getNativeStack());
int size = fillPingBlock(ping, checksum, new StringReader(nativeStack), null);
if (DEBUG) {
Log.d(LOGTAG, "wrote native stack, size = " + String.valueOf(size));
}
}
total += writePingPayload(ping, checksum, "\"}"); total += writePingPayload(ping, checksum, "\"}");
String base64Checksum = Base64.encodeToString(checksum.digest(), Base64.NO_WRAP); String base64Checksum = Base64.encodeToString(checksum.digest(), Base64.NO_WRAP);
@ -490,6 +503,8 @@ public final class ANRReporter extends BroadcastReceiver
} }
private static void processTraces(Reader traces, File pingFile) { private static void processTraces(Reader traces, File pingFile) {
boolean haveNativeStack = requestNativeStack();
try { try {
OutputStream ping = new BufferedOutputStream( OutputStream ping = new BufferedOutputStream(
new FileOutputStream(pingFile), TRACES_BLOCK_SIZE); new FileOutputStream(pingFile), TRACES_BLOCK_SIZE);
@ -511,13 +526,16 @@ public final class ANRReporter extends BroadcastReceiver
if (DEBUG) { if (DEBUG) {
Log.d(LOGTAG, "wrote traces, size = " + String.valueOf(size)); Log.d(LOGTAG, "wrote traces, size = " + String.valueOf(size));
} }
fillPingFooter(ping, checksum); fillPingFooter(ping, checksum, haveNativeStack);
if (DEBUG) { if (DEBUG) {
Log.d(LOGTAG, "finished creating ping file"); Log.d(LOGTAG, "finished creating ping file");
} }
return; return;
} finally { } finally {
ping.close(); ping.close();
if (haveNativeStack) {
releaseNativeStack();
}
} }
} catch (GeneralSecurityException e) { } catch (GeneralSecurityException e) {
Log.w(LOGTAG, e); Log.w(LOGTAG, e);