Merge "Log subject in ANR dump file for ANRs + watchdogs" into sc-dev
This commit is contained in:
@@ -192,7 +192,7 @@ public final class SystemServerInitThreadPool implements Dumpable {
|
|||||||
final ArrayList<Integer> pids = new ArrayList<>();
|
final ArrayList<Integer> pids = new ArrayList<>();
|
||||||
pids.add(Process.myPid());
|
pids.add(Process.myPid());
|
||||||
ActivityManagerService.dumpStackTraces(pids, null, null,
|
ActivityManagerService.dumpStackTraces(pids, null, null,
|
||||||
Watchdog.getInterestingNativePids(), null);
|
Watchdog.getInterestingNativePids(), null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -658,7 +658,7 @@ public class Watchdog {
|
|||||||
// We've waited half the deadlock-detection interval. Pull a stack
|
// We've waited half the deadlock-detection interval. Pull a stack
|
||||||
// trace and wait another half.
|
// trace and wait another half.
|
||||||
ActivityManagerService.dumpStackTraces(pids, null, null,
|
ActivityManagerService.dumpStackTraces(pids, null, null,
|
||||||
getInterestingNativePids(), null);
|
getInterestingNativePids(), null, subject);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -674,7 +674,7 @@ public class Watchdog {
|
|||||||
StringWriter tracesFileException = new StringWriter();
|
StringWriter tracesFileException = new StringWriter();
|
||||||
final File stack = ActivityManagerService.dumpStackTraces(
|
final File stack = ActivityManagerService.dumpStackTraces(
|
||||||
pids, processCpuTracker, new SparseArray<>(), getInterestingNativePids(),
|
pids, processCpuTracker, new SparseArray<>(), getInterestingNativePids(),
|
||||||
tracesFileException);
|
tracesFileException, subject);
|
||||||
|
|
||||||
// Give some extra time to make sure the stack traces get written.
|
// Give some extra time to make sure the stack traces get written.
|
||||||
// The system's been hanging for a minute, another second or two won't hurt much.
|
// The system's been hanging for a minute, another second or two won't hurt much.
|
||||||
@@ -699,7 +699,8 @@ public class Watchdog {
|
|||||||
if (mActivity != null) {
|
if (mActivity != null) {
|
||||||
mActivity.addErrorToDropBox(
|
mActivity.addErrorToDropBox(
|
||||||
"watchdog", null, "system_server", null, null, null,
|
"watchdog", null, "system_server", null, null, null,
|
||||||
localSubject, report.toString(), stack, null, null, null, null);
|
null, report.toString(), stack, null, null, null, null);
|
||||||
|
|
||||||
}
|
}
|
||||||
FrameworkStatsLog.write(FrameworkStatsLog.SYSTEM_SERVER_WATCHDOG_OCCURRED,
|
FrameworkStatsLog.write(FrameworkStatsLog.SYSTEM_SERVER_WATCHDOG_OCCURRED,
|
||||||
localSubject);
|
localSubject);
|
||||||
|
|||||||
@@ -407,6 +407,7 @@ import java.io.IOException;
|
|||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -3153,7 +3154,23 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
ProcessCpuTracker processCpuTracker, SparseArray<Boolean> lastPids,
|
ProcessCpuTracker processCpuTracker, SparseArray<Boolean> lastPids,
|
||||||
ArrayList<Integer> nativePids, StringWriter logExceptionCreatingFile) {
|
ArrayList<Integer> nativePids, StringWriter logExceptionCreatingFile) {
|
||||||
return dumpStackTraces(firstPids, processCpuTracker, lastPids, nativePids,
|
return dumpStackTraces(firstPids, processCpuTracker, lastPids, nativePids,
|
||||||
logExceptionCreatingFile, null);
|
logExceptionCreatingFile, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If a stack trace dump file is configured, dump process stack traces.
|
||||||
|
* @param firstPids of dalvik VM processes to dump stack traces for first
|
||||||
|
* @param lastPids of dalvik VM processes to dump stack traces for last
|
||||||
|
* @param nativePids optional list of native pids to dump stack crawls
|
||||||
|
* @param logExceptionCreatingFile optional writer to which we log errors creating the file
|
||||||
|
* @param subject optional line related to the error
|
||||||
|
*/
|
||||||
|
public static File dumpStackTraces(ArrayList<Integer> firstPids,
|
||||||
|
ProcessCpuTracker processCpuTracker, SparseArray<Boolean> lastPids,
|
||||||
|
ArrayList<Integer> nativePids, StringWriter logExceptionCreatingFile,
|
||||||
|
String subject) {
|
||||||
|
return dumpStackTraces(firstPids, processCpuTracker, lastPids, nativePids,
|
||||||
|
logExceptionCreatingFile, null, subject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3163,7 +3180,7 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
/* package */ static File dumpStackTraces(ArrayList<Integer> firstPids,
|
/* package */ static File dumpStackTraces(ArrayList<Integer> firstPids,
|
||||||
ProcessCpuTracker processCpuTracker, SparseArray<Boolean> lastPids,
|
ProcessCpuTracker processCpuTracker, SparseArray<Boolean> lastPids,
|
||||||
ArrayList<Integer> nativePids, StringWriter logExceptionCreatingFile,
|
ArrayList<Integer> nativePids, StringWriter logExceptionCreatingFile,
|
||||||
long[] firstPidOffsets) {
|
long[] firstPidOffsets, String subject) {
|
||||||
ArrayList<Integer> extraPids = null;
|
ArrayList<Integer> extraPids = null;
|
||||||
|
|
||||||
Slog.i(TAG, "dumpStackTraces pids=" + lastPids + " nativepids=" + nativePids);
|
Slog.i(TAG, "dumpStackTraces pids=" + lastPids + " nativepids=" + nativePids);
|
||||||
@@ -3215,6 +3232,15 @@ public class ActivityManagerService extends IActivityManager.Stub
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (subject != null) {
|
||||||
|
try (FileOutputStream fos = new FileOutputStream(tracesFile, true)) {
|
||||||
|
String header = "Subject: " + subject + "\n";
|
||||||
|
fos.write(header.getBytes(StandardCharsets.UTF_8));
|
||||||
|
} catch (IOException e) {
|
||||||
|
Slog.w(TAG, "Exception writing subject to ANR dump file:", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Pair<Long, Long> offsets = dumpStackTraces(
|
Pair<Long, Long> offsets = dumpStackTraces(
|
||||||
tracesFile.getAbsolutePath(), firstPids, nativePids, extraPids);
|
tracesFile.getAbsolutePath(), firstPids, nativePids, extraPids);
|
||||||
if (firstPidOffsets != null) {
|
if (firstPidOffsets != null) {
|
||||||
|
|||||||
@@ -377,7 +377,7 @@ class ProcessErrorStateRecord {
|
|||||||
final long[] offsets = new long[2];
|
final long[] offsets = new long[2];
|
||||||
File tracesFile = ActivityManagerService.dumpStackTraces(firstPids,
|
File tracesFile = ActivityManagerService.dumpStackTraces(firstPids,
|
||||||
isSilentAnr ? null : processCpuTracker, isSilentAnr ? null : lastPids,
|
isSilentAnr ? null : processCpuTracker, isSilentAnr ? null : lastPids,
|
||||||
nativePids, tracesFileException, offsets);
|
nativePids, tracesFileException, offsets, annotation);
|
||||||
|
|
||||||
if (isMonitorCpuUsage()) {
|
if (isMonitorCpuUsage()) {
|
||||||
mService.updateCpuStatsNow();
|
mService.updateCpuStatsNow();
|
||||||
@@ -467,7 +467,7 @@ class ProcessErrorStateRecord {
|
|||||||
final ProcessRecord parentPr = parentProcess != null
|
final ProcessRecord parentPr = parentProcess != null
|
||||||
? (ProcessRecord) parentProcess.mOwner : null;
|
? (ProcessRecord) parentProcess.mOwner : null;
|
||||||
mService.addErrorToDropBox("anr", mApp, mApp.processName, activityShortComponentName,
|
mService.addErrorToDropBox("anr", mApp, mApp.processName, activityShortComponentName,
|
||||||
parentShortComponentName, parentPr, annotation, report.toString(), tracesFile,
|
parentShortComponentName, parentPr, null, report.toString(), tracesFile,
|
||||||
null, new Float(loadingProgress), incrementalMetrics, errorId);
|
null, new Float(loadingProgress), incrementalMetrics, errorId);
|
||||||
|
|
||||||
if (mApp.getWindowProcessController().appNotResponding(info.toString(),
|
if (mApp.getWindowProcessController().appNotResponding(info.toString(),
|
||||||
|
|||||||
Reference in New Issue
Block a user