summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yandry Perez Clemente <yandry@google.com> 2021-05-18 13:59:34 +0100
committer Yandry Perez Clemente <yandry@google.com> 2021-05-21 13:26:29 +0000
commit5a53d8c1721950e4e8f4b5157215e187dd3a79b6 (patch)
tree4753d30892c4f2eec4ba58ea7c0a3a6db4576738
parentb9643ac4ef34825747da2f9745914fd31975447b (diff)
Add a unique id to Perfetto trace and Watchdog dropbox header.
The unique id is added so that the trace and Watchdog can be easily linked server side. Also moves the logging of the Watchdog atom before the Watchdog dump takes place so that the Perfetto trace captures data closer to the point in time when the Watchdog happens. Bug: b/188122403 Test: Manual. 1. Enabled the flag: adb shell device_config put trace_error_logger add_error_id true 2. Triggered a Watchdog: adb shell am hang --allow-restart 3. The UUID is present in the Watchdog dropbox headers: adb shell dumpsys dropbox system_server_watchdog --print | grep ErrorId ErrorId: d27cdeee-8a6a-452b-bb0e-8cfb3eb367fa Change-Id: I83759d905fe8626ec98595ba501e99e02e2070bf
-rw-r--r--services/core/java/com/android/server/Watchdog.java26
-rw-r--r--services/core/java/com/android/server/am/TraceErrorLogger.java2
2 files changed, 22 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java
index 6644b28f1c4d..0f9a6fa2a8da 100644
--- a/services/core/java/com/android/server/Watchdog.java
+++ b/services/core/java/com/android/server/Watchdog.java
@@ -45,6 +45,7 @@ import com.android.internal.os.ProcessCpuTracker;
import com.android.internal.os.ZygoteConnectionConstants;
import com.android.internal.util.FrameworkStatsLog;
import com.android.server.am.ActivityManagerService;
+import com.android.server.am.TraceErrorLogger;
import com.android.server.wm.SurfaceAnimationThread;
import java.io.BufferedReader;
@@ -59,6 +60,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
+import java.util.UUID;
import java.util.concurrent.TimeUnit;
/** This class calls its monitor every minute. Killing this process if they don't return **/
@@ -159,6 +161,8 @@ public class Watchdog {
private boolean mAllowRestart = true;
private final List<Integer> mInterestingJavaPids = new ArrayList<>();
+ private final TraceErrorLogger mTraceErrorLogger;
+
/**
* Used for checking status of handle threads and scheduling monitor callbacks.
*/
@@ -367,6 +371,8 @@ public class Watchdog {
// See the notes on DEFAULT_TIMEOUT.
assert DB ||
DEFAULT_TIMEOUT > ZygoteConnectionConstants.WRAPPED_PID_TIMEOUT_MILLIS;
+
+ mTraceErrorLogger = new TraceErrorLogger();
}
/**
@@ -667,6 +673,19 @@ public class Watchdog {
// Then kill this process so that the system will restart.
EventLog.writeEvent(EventLogTags.WATCHDOG, subject);
+ final UUID errorId;
+ if (mTraceErrorLogger.isAddErrorIdEnabled()) {
+ errorId = mTraceErrorLogger.generateErrorId();
+ mTraceErrorLogger.addErrorIdToTrace(errorId);
+ } else {
+ errorId = null;
+ }
+
+ // Log the atom as early as possible since it is used as a mechanism to trigger
+ // Perfetto. Ideally, the Perfetto trace capture should happen as close to the
+ // point in time when the Watchdog happens as possible.
+ FrameworkStatsLog.write(FrameworkStatsLog.SYSTEM_SERVER_WATCHDOG_OCCURRED, subject);
+
long anrTime = SystemClock.uptimeMillis();
StringBuilder report = new StringBuilder();
report.append(MemoryPressureUtil.currentPsiState());
@@ -691,7 +710,6 @@ public class Watchdog {
// Try to add the error to the dropbox, but assuming that the ActivityManager
// itself may be deadlocked. (which has happened, causing this statement to
// deadlock and the watchdog as a whole to be ineffective)
- final String localSubject = subject;
Thread dropboxThread = new Thread("watchdogWriteToDropbox") {
public void run() {
// If a watched thread hangs before init() is called, we don't have a
@@ -699,11 +717,9 @@ public class Watchdog {
if (mActivity != null) {
mActivity.addErrorToDropBox(
"watchdog", null, "system_server", null, null, null,
- null, report.toString(), stack, null, null, null, null);
-
+ null, report.toString(), stack, null, null, null,
+ errorId);
}
- FrameworkStatsLog.write(FrameworkStatsLog.SYSTEM_SERVER_WATCHDOG_OCCURRED,
- localSubject);
}
};
dropboxThread.start();
diff --git a/services/core/java/com/android/server/am/TraceErrorLogger.java b/services/core/java/com/android/server/am/TraceErrorLogger.java
index f055be235716..02e5f6dc5d8c 100644
--- a/services/core/java/com/android/server/am/TraceErrorLogger.java
+++ b/services/core/java/com/android/server/am/TraceErrorLogger.java
@@ -26,7 +26,7 @@ import java.util.UUID;
*
* @hide
*/
-class TraceErrorLogger {
+public class TraceErrorLogger {
private static final String COUNTER_PREFIX = "ErrorId:";
private static final String ADD_ERROR_ID = "add_error_id";
private static final int PLACEHOLDER_VALUE = 1;