From 5a53d8c1721950e4e8f4b5157215e187dd3a79b6 Mon Sep 17 00:00:00 2001 From: Yandry Perez Clemente Date: Tue, 18 May 2021 13:59:34 +0100 Subject: [PATCH] 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 --- .../java/com/android/server/Watchdog.java | 26 +++++++++++++++---- .../android/server/am/TraceErrorLogger.java | 2 +- 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 6644b28f1c4d4..0f9a6fa2a8dac 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 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 f055be2357169..02e5f6dc5d8c3 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;