Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a53d8c1 authored by Yandry Perez Clemente's avatar Yandry Perez Clemente
Browse files

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
parent b9643ac4
Loading
Loading
Loading
Loading
+21 −5
Original line number Diff line number Diff line
@@ -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();
+1 −1
Original line number Diff line number Diff line
@@ -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;