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

Commit 2de144e9 authored by Mohamad Mahmoud's avatar Mohamad Mahmoud
Browse files

Include Subject and the critical event log in the /data/system/procexitstore file

Include the subject line and the critical event log sections in the first pid offset range, this will make AppExitInfoTracker.handleLogAnrTrace copy these sections to the ANR's
/data/system/procexitstore file

Bug: 236617029
Test: tested on a device

Change-Id: Id8e30f540b57ad094e48bc87a09ed45e25366433
parent 13ed2e29
Loading
Loading
Loading
Loading
+13 −23
Original line number Diff line number Diff line
@@ -470,6 +470,7 @@ import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.BiFunction;
public class ActivityManagerService extends IActivityManager.Stub
@@ -3455,13 +3456,13 @@ public class ActivityManagerService extends IActivityManager.Stub
    }
    /**
     * @param firstPidOffsets Optional, when it's set, it receives the start/end offset
     * @param firstPidEndOffset Optional, when it's set, it receives the start/end offset
     *                        of the very first pid to be dumped.
     */
    /* package */ static File dumpStackTraces(ArrayList<Integer> firstPids,
            ProcessCpuTracker processCpuTracker, SparseArray<Boolean> lastPids,
            ArrayList<Integer> nativePids, StringWriter logExceptionCreatingFile,
            long[] firstPidOffsets, String subject, String criticalEventSection,
            AtomicLong firstPidEndOffset, String subject, String criticalEventSection,
            AnrLatencyTracker latencyTracker) {
        try {
            if (latencyTracker != null) {
@@ -3534,15 +3535,10 @@ public class ActivityManagerService extends IActivityManager.Stub
                        + (criticalEventSection != null ? criticalEventSection : ""));
            }
            Pair<Long, Long> offsets = dumpStackTraces(
            long firstPidEndPos = dumpStackTraces(
                    tracesFile.getAbsolutePath(), firstPids, nativePids, extraPids, latencyTracker);
            if (firstPidOffsets != null) {
                if (offsets == null) {
                    firstPidOffsets[0] = firstPidOffsets[1] = -1;
                } else {
                    firstPidOffsets[0] = offsets.first; // Start offset to the ANR trace file
                    firstPidOffsets[1] = offsets.second; // End offset to the ANR trace file
                }
            if (firstPidEndOffset != null) {
                firstPidEndOffset.set(firstPidEndPos);
            }
            return tracesFile;
@@ -3661,9 +3657,9 @@ public class ActivityManagerService extends IActivityManager.Stub
    /**
     * @return The start/end offset of the trace of the very first PID
     * @return The end offset of the trace of the very first PID
     */
    public static Pair<Long, Long> dumpStackTraces(String tracesFile,
    public static long dumpStackTraces(String tracesFile,
            ArrayList<Integer> firstPids, ArrayList<Integer> nativePids,
            ArrayList<Integer> extraPids, AnrLatencyTracker latencyTracker) {
@@ -3679,7 +3675,6 @@ public class ActivityManagerService extends IActivityManager.Stub
        // As applications are usually interested with the ANR stack traces, but we can't share with
        // them the stack traces other than their own stacks. So after the very first PID is
        // dumped, remember the current file size.
        long firstPidStart = -1;
        long firstPidEnd = -1;
        // First collect all of the stacks of the most important pids.
@@ -3692,11 +3687,6 @@ public class ActivityManagerService extends IActivityManager.Stub
                final int pid = firstPids.get(i);
                // We don't copy ANR traces from the system_server intentionally.
                final boolean firstPid = i == 0 && MY_PID != pid;
                File tf = null;
                if (firstPid) {
                    tf = new File(tracesFile);
                    firstPidStart = tf.exists() ? tf.length() : 0;
                }
                if (latencyTracker != null) {
                    latencyTracker.dumpingPidStarted(pid);
                }
@@ -3712,11 +3702,11 @@ public class ActivityManagerService extends IActivityManager.Stub
                if (remainingTime <= 0) {
                    Slog.e(TAG, "Aborting stack trace dump (current firstPid=" + pid
                            + "); deadline exceeded.");
                    return firstPidStart >= 0 ? new Pair<>(firstPidStart, firstPidEnd) : null;
                    return firstPidEnd;
                }
                if (firstPid) {
                    firstPidEnd = tf.length();
                    firstPidEnd = new File(tracesFile).length();
                    // Full latency dump
                    if (latencyTracker != null) {
                        appendtoANRFile(tracesFile,
@@ -3755,7 +3745,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                if (remainingTime <= 0) {
                    Slog.e(TAG, "Aborting stack trace dump (current native pid=" + pid +
                        "); deadline exceeded.");
                    return firstPidStart >= 0 ? new Pair<>(firstPidStart, firstPidEnd) : null;
                    return firstPidEnd;
                }
                if (DEBUG_ANR) {
@@ -3785,7 +3775,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                if (remainingTime <= 0) {
                    Slog.e(TAG, "Aborting stack trace dump (current extra pid=" + pid +
                            "); deadline exceeded.");
                    return firstPidStart >= 0 ? new Pair<>(firstPidStart, firstPidEnd) : null;
                    return firstPidEnd;
                }
                if (DEBUG_ANR) {
@@ -3800,7 +3790,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        appendtoANRFile(tracesFile, "----- dumping ended at " + SystemClock.uptimeMillis() + "\n");
        Slog.i(TAG, "Done dumping");
        return firstPidStart >= 0 ? new Pair<>(firstPidStart, firstPidEnd) : null;
        return firstPidEnd;
    }
    @Override
+10 −4
Original line number Diff line number Diff line
@@ -62,6 +62,8 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;

/**
 * The error state of the process, such as if it's crashing/ANR etc.
 */
@@ -458,10 +460,10 @@ class ProcessErrorStateRecord {
        // avoid spending 1/2 second collecting stats to rank lastPids.
        StringWriter tracesFileException = new StringWriter();
        // To hold the start and end offset to the ANR trace file respectively.
        final long[] offsets = new long[2];
        final AtomicLong firstPidEndOffset = new AtomicLong(-1);
        File tracesFile = ActivityManagerService.dumpStackTraces(firstPids,
                isSilentAnr ? null : processCpuTracker, isSilentAnr ? null : lastPids,
                nativePids, tracesFileException, offsets, annotation, criticalEventLog,
                nativePids, tracesFileException, firstPidEndOffset, annotation, criticalEventLog,
                latencyTracker);

        if (isMonitorCpuUsage()) {
@@ -478,10 +480,14 @@ class ProcessErrorStateRecord {
        if (tracesFile == null) {
            // There is no trace file, so dump (only) the alleged culprit's threads to the log
            Process.sendSignal(pid, Process.SIGNAL_QUIT);
        } else if (offsets[1] > 0) {
        } else if (firstPidEndOffset.get() > 0) {
            // We've dumped into the trace file successfully
            // We pass the start and end offsets of the first section of
            // the ANR file (the headers and first process dump)
            final long startOffset = 0L;
            final long endOffset = firstPidEndOffset.get();
            mService.mProcessList.mAppExitInfoTracker.scheduleLogAnrTrace(
                    pid, mApp.uid, mApp.getPackageList(), tracesFile, offsets[0], offsets[1]);
                    pid, mApp.uid, mApp.getPackageList(), tracesFile, startOffset, endOffset);
        }

        // Check if package is still being loaded