diff options
| author | 2021-05-18 13:59:34 +0100 | |
|---|---|---|
| committer | 2021-05-21 13:26:29 +0000 | |
| commit | 5a53d8c1721950e4e8f4b5157215e187dd3a79b6 (patch) | |
| tree | 4753d30892c4f2eec4ba58ea7c0a3a6db4576738 | |
| parent | b9643ac4ef34825747da2f9745914fd31975447b (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.java | 26 | ||||
| -rw-r--r-- | services/core/java/com/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 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; |