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

Commit 0fdee55b authored by Mythri Alle's avatar Mythri Alle Committed by Android (Google) Code Review
Browse files

Merge "Extend am profile command to trace long running methods" into main

parents 3ef9ab11 54ccbde9
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -7265,7 +7265,14 @@ public final class ActivityThread extends ClientTransactionHandler
                        Slog.w(TAG, "Low overhead tracing feature is not enabled");
                        Slog.w(TAG, "Low overhead tracing feature is not enabled");
                        break;
                        break;
                    }
                    }

                    if (profilerInfo.profileLongRunningMethods) {
                        long microToNano = 1000;
                        VMDebug.startLowOverheadTraceForLongRunningMethods(
                                profilerInfo.durationMicros * microToNano);
                    } else {
                        VMDebug.startLowOverheadTraceForAllMethods();
                        VMDebug.startLowOverheadTraceForAllMethods();
                    }
                    break;
                    break;
                default:
                default:
                    try {
                    try {
+28 −3
Original line number Original line Diff line number Diff line
@@ -98,9 +98,19 @@ public class ProfilerInfo implements Parcelable {
     */
     */
    public final int profilerOutputVersion;
    public final int profilerOutputVersion;


    /**
     * Indicates if we should trace long running methods for lowoverhead tracing
     */
    public final boolean profileLongRunningMethods;

    /**
     * The duration in microseconds for which the lowoverhed tracing has to be run
     */
    public final long durationMicros;

    public ProfilerInfo(String filename, ParcelFileDescriptor fd, int interval, boolean autoStop,
    public ProfilerInfo(String filename, ParcelFileDescriptor fd, int interval, boolean autoStop,
            boolean streaming, String agent, boolean attachAgentDuringBind, int clockType,
            boolean streaming, String agent, boolean attachAgentDuringBind, int clockType,
            int profilerOutputVersion) {
            int profilerOutputVersion, boolean profileLongRunningMethods, long durationMicros) {
        profileFile = filename;
        profileFile = filename;
        profileFd = fd;
        profileFd = fd;
        samplingInterval = interval;
        samplingInterval = interval;
@@ -110,6 +120,8 @@ public class ProfilerInfo implements Parcelable {
        this.agent = agent;
        this.agent = agent;
        this.attachAgentDuringBind = attachAgentDuringBind;
        this.attachAgentDuringBind = attachAgentDuringBind;
        this.profilerOutputVersion = profilerOutputVersion;
        this.profilerOutputVersion = profilerOutputVersion;
        this.profileLongRunningMethods = profileLongRunningMethods;
        this.durationMicros = durationMicros;
    }
    }


    public ProfilerInfo(ProfilerInfo in) {
    public ProfilerInfo(ProfilerInfo in) {
@@ -122,6 +134,8 @@ public class ProfilerInfo implements Parcelable {
        attachAgentDuringBind = in.attachAgentDuringBind;
        attachAgentDuringBind = in.attachAgentDuringBind;
        clockType = in.clockType;
        clockType = in.clockType;
        profilerOutputVersion = in.profilerOutputVersion;
        profilerOutputVersion = in.profilerOutputVersion;
        profileLongRunningMethods = in.profileLongRunningMethods;
        durationMicros = in.durationMicros;
    }
    }


    /**
    /**
@@ -165,7 +179,8 @@ public class ProfilerInfo implements Parcelable {
    public ProfilerInfo setAgent(String agent, boolean attachAgentDuringBind) {
    public ProfilerInfo setAgent(String agent, boolean attachAgentDuringBind) {
        return new ProfilerInfo(this.profileFile, this.profileFd, this.samplingInterval,
        return new ProfilerInfo(this.profileFile, this.profileFd, this.samplingInterval,
                this.autoStopProfiler, this.streamingOutput, agent, attachAgentDuringBind,
                this.autoStopProfiler, this.streamingOutput, agent, attachAgentDuringBind,
                this.clockType, this.profilerOutputVersion);
                this.clockType, this.profilerOutputVersion, this.profileLongRunningMethods,
                this.durationMicros);
    }
    }


    /**
    /**
@@ -207,6 +222,8 @@ public class ProfilerInfo implements Parcelable {
        out.writeBoolean(attachAgentDuringBind);
        out.writeBoolean(attachAgentDuringBind);
        out.writeInt(clockType);
        out.writeInt(clockType);
        out.writeInt(profilerOutputVersion);
        out.writeInt(profilerOutputVersion);
        out.writeBoolean(profileLongRunningMethods);
        out.writeLong(durationMicros);
    }
    }


    /** @hide */
    /** @hide */
@@ -222,6 +239,8 @@ public class ProfilerInfo implements Parcelable {
        proto.write(ProfilerInfoProto.AGENT, agent);
        proto.write(ProfilerInfoProto.AGENT, agent);
        proto.write(ProfilerInfoProto.CLOCK_TYPE, clockType);
        proto.write(ProfilerInfoProto.CLOCK_TYPE, clockType);
        proto.write(ProfilerInfoProto.PROFILER_OUTPUT_VERSION, profilerOutputVersion);
        proto.write(ProfilerInfoProto.PROFILER_OUTPUT_VERSION, profilerOutputVersion);
        proto.write(ProfilerInfoProto.PROFILE_LONG_RUNNING_METHODS, profileLongRunningMethods);
        proto.write(ProfilerInfoProto.DURATION_MICROS, durationMicros);
        proto.end(token);
        proto.end(token);
    }
    }


@@ -248,6 +267,8 @@ public class ProfilerInfo implements Parcelable {
        attachAgentDuringBind = in.readBoolean();
        attachAgentDuringBind = in.readBoolean();
        clockType = in.readInt();
        clockType = in.readInt();
        profilerOutputVersion = in.readInt();
        profilerOutputVersion = in.readInt();
        profileLongRunningMethods = in.readBoolean();
        durationMicros = in.readLong();
    }
    }


    @Override
    @Override
@@ -265,7 +286,9 @@ public class ProfilerInfo implements Parcelable {
                && samplingInterval == other.samplingInterval
                && samplingInterval == other.samplingInterval
                && streamingOutput == other.streamingOutput && Objects.equals(agent, other.agent)
                && streamingOutput == other.streamingOutput && Objects.equals(agent, other.agent)
                && clockType == other.clockType
                && clockType == other.clockType
                && profilerOutputVersion == other.profilerOutputVersion;
                && profilerOutputVersion == other.profilerOutputVersion
                && profileLongRunningMethods == other.profileLongRunningMethods
                && durationMicros == other.durationMicros;
    }
    }


    @Override
    @Override
@@ -278,6 +301,8 @@ public class ProfilerInfo implements Parcelable {
        result = 31 * result + Objects.hashCode(agent);
        result = 31 * result + Objects.hashCode(agent);
        result = 31 * result + clockType;
        result = 31 * result + clockType;
        result = 31 * result + profilerOutputVersion;
        result = 31 * result + profilerOutputVersion;
        result = 31 * result + (profileLongRunningMethods ? 1 : 0);
        result = 31 * result + Long.hashCode(durationMicros);
        return result;
        return result;
    }
    }
}
}
+4 −0
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@ message ProfilerInfoProto {
    // Name of profile output file.
    // Name of profile output file.
    optional string profile_file = 1;
    optional string profile_file = 1;
    optional int32 profile_fd = 2;
    optional int32 profile_fd = 2;
    // The sampling interval rate in microseconds.
    optional int32 sampling_interval = 3;
    optional int32 sampling_interval = 3;
    optional bool auto_stop_profiler = 4;
    optional bool auto_stop_profiler = 4;
    optional bool streaming_output = 5;
    optional bool streaming_output = 5;
@@ -37,4 +38,7 @@ message ProfilerInfoProto {
    optional string agent = 6;
    optional string agent = 6;
    optional int32 clock_type = 7;
    optional int32 clock_type = 7;
    optional int32 profiler_output_version = 8;
    optional int32 profiler_output_version = 8;
    optional bool profile_long_running_methods = 9;
    // Duration in microseconds for which the tracing needs to run.
    optional int64 duration_micros = 10;
}
}
+4 −2
Original line number Original line Diff line number Diff line
@@ -15916,8 +15916,10 @@ public class ActivityManagerService extends IActivityManager.Stub
                    + android.Manifest.permission.SET_ACTIVITY_WATCHER);
                    + android.Manifest.permission.SET_ACTIVITY_WATCHER);
        }
        }
        if (start && profileType == ProfilerInfo.PROFILE_TYPE_REGULAR
        if (start
                && (profilerInfo == null || profilerInfo.profileFd == null)) {
                && (profilerInfo == null
                        || (profileType == ProfilerInfo.PROFILE_TYPE_REGULAR
                                && profilerInfo.profileFd == null))) {
            throw new IllegalArgumentException("null profile info or fd");
            throw new IllegalArgumentException("null profile info or fd");
        }
        }
+41 −7
Original line number Original line Diff line number Diff line
@@ -223,6 +223,8 @@ final class ActivityManagerShellCommand extends ShellCommand {
    private boolean mAttachAgentDuringBind;  // Whether agent should be attached late.
    private boolean mAttachAgentDuringBind;  // Whether agent should be attached late.
    private int mClockType; // Whether we need thread cpu / wall clock / both.
    private int mClockType; // Whether we need thread cpu / wall clock / both.
    private int mProfilerOutputVersion; // The version of the profiler output.
    private int mProfilerOutputVersion; // The version of the profiler output.
    private boolean mLongRunningMethods; // Whether we need to trace only long running methods
    private long mDurationMicros; // duration in microseconds that specifies how long to trace.
    private int mDisplayId;
    private int mDisplayId;
    private int mTaskDisplayAreaFeatureId;
    private int mTaskDisplayAreaFeatureId;
    private int mWindowingMode;
    private int mWindowingMode;
@@ -608,6 +610,8 @@ final class ActivityManagerShellCommand extends ShellCommand {
        mSamplingInterval = 0;
        mSamplingInterval = 0;
        mAutoStop = false;
        mAutoStop = false;
        mStreaming = false;
        mStreaming = false;
        mLongRunningMethods = false;
        mDurationMicros = 0;
        mUserId = defUser;
        mUserId = defUser;
        mDisplayId = INVALID_DISPLAY;
        mDisplayId = INVALID_DISPLAY;
        mTaskDisplayAreaFeatureId = FEATURE_UNDEFINED;
        mTaskDisplayAreaFeatureId = FEATURE_UNDEFINED;
@@ -808,9 +812,9 @@ final class ActivityManagerShellCommand extends ShellCommand {
                        return 1;
                        return 1;
                    }
                    }
                }
                }
                profilerInfo =
                profilerInfo = new ProfilerInfo(mProfileFile, fd, mSamplingInterval, mAutoStop,
                        new ProfilerInfo(mProfileFile, fd, mSamplingInterval, mAutoStop, mStreaming,
                        mStreaming, mAgent, mAttachAgentDuringBind, mClockType,
                                mAgent, mAttachAgentDuringBind, mClockType, mProfilerOutputVersion);
                        mProfilerOutputVersion, mLongRunningMethods, mDurationMicros);
            }
            }


            pw.println("Starting: " + intent);
            pw.println("Starting: " + intent);
@@ -1173,6 +1177,8 @@ final class ActivityManagerShellCommand extends ShellCommand {
        mSamplingInterval = 0;
        mSamplingInterval = 0;
        mStreaming = false;
        mStreaming = false;
        mClockType = ProfilerInfo.CLOCK_TYPE_DEFAULT;
        mClockType = ProfilerInfo.CLOCK_TYPE_DEFAULT;
        mLongRunningMethods = false;
        mDurationMicros = 0;
        mProfilerOutputVersion = ProfilerInfo.OUTPUT_VERSION_DEFAULT;
        mProfilerOutputVersion = ProfilerInfo.OUTPUT_VERSION_DEFAULT;


        String process = null;
        String process = null;
@@ -1217,6 +1223,16 @@ final class ActivityManagerShellCommand extends ShellCommand {
            cmd = getNextArgRequired();
            cmd = getNextArgRequired();
            if ("start".equals(cmd)) {
            if ("start".equals(cmd)) {
                start = true;
                start = true;
                String opt;
                while ((opt = getNextOption()) != null) {
                    if (opt.equals("--longrunning")) {
                        mLongRunningMethods = true;
                    } else if (opt.equals("--duration")) {
                        // Convert milliseconds to micro seconds
                        long milliToMicro = 1000;
                        mDurationMicros = Long.parseLong(getNextArgRequired()) * milliToMicro;
                    }
                }
            } else if ("stop".equals(cmd)) {
            } else if ("stop".equals(cmd)) {
                start = false;
                start = false;
            } else {
            } else {
@@ -1245,16 +1261,21 @@ final class ActivityManagerShellCommand extends ShellCommand {
        // For regular method tracing  profileFile should be provided with the start command. For
        // For regular method tracing  profileFile should be provided with the start command. For
        // low overhead method tracing the profileFile is optional and provided with the stop
        // low overhead method tracing the profileFile is optional and provided with the stop
        // command.
        // command.
        if ((start && profileType == ProfilerInfo.PROFILE_TYPE_REGULAR)
        boolean hasFileArg = (profileType == ProfilerInfo.PROFILE_TYPE_REGULAR && start)
                || (profileType == ProfilerInfo.PROFILE_TYPE_LOW_OVERHEAD
                || (profileType == ProfilerInfo.PROFILE_TYPE_LOW_OVERHEAD && !start
                  && !start && getRemainingArgsCount() > 0)) {
                        && getRemainingArgsCount() > 0);
        if (hasFileArg) {
            profileFile = getNextArgRequired();
            profileFile = getNextArgRequired();
            fd = openFileForSystem(profileFile, "w");
            fd = openFileForSystem(profileFile, "w");
            if (fd == null) {
            if (fd == null) {
                return -1;
                return -1;
            }
            }
        }

        if (start || hasFileArg) {
            profilerInfo = new ProfilerInfo(profileFile, fd, mSamplingInterval, false, mStreaming,
            profilerInfo = new ProfilerInfo(profileFile, fd, mSamplingInterval, false, mStreaming,
                    null, false, mClockType, mProfilerOutputVersion);
                    null, false, mClockType, mProfilerOutputVersion, mLongRunningMethods,
                    mDurationMicros);
        }
        }


        if (!mInterface.profileControl(process, userId, start, profilerInfo, profileType)) {
        if (!mInterface.profileControl(process, userId, start, profilerInfo, profileType)) {
@@ -4842,6 +4863,19 @@ final class ActivityManagerShellCommand extends ShellCommand {
            pw.println("      --user <USER_ID> | current: When supplying a process name,");
            pw.println("      --user <USER_ID> | current: When supplying a process name,");
            pw.println("          specify user of process to profile; uses current user if not");
            pw.println("          specify user of process to profile; uses current user if not");
            pw.println("          specified.");
            pw.println("          specified.");
            pw.println("  profile lowoverhead start [--longrunning --duration DURATION] <PROCESS>");
            pw.println("      Starts a lowoverhead trace on a process. The given <PROCESS>");
            pw.println("        argument may be either a process name or pid.  Options are:");
            pw.println("      --longrunning: Traces methods that run longer than a specific");
            pw.println("          threshold. This threshold is a build-time constant");
            pw.println("      --duration DURATION: trace for the specified DURATION milliseconds.");
            pw.println("          This argument only applies for long running traces. A default");
            pw.println("          value is used when duration is not specified.");
            pw.println("  profile lowoverhead stop <PROCESS> [<FILE>]");
            pw.println("      Stops an ongoing lowoverhead trace on a process. The given");
            pw.println("        <PROCESS> argument may be either a process name or pid.");
            pw.println("        An optional <FILE> argument may be provided to dump the");
            pw.println("        collected trace");
            pw.println("  dumpheap [--user <USER_ID> current] [-n] [-g] [-b <format>] ");
            pw.println("  dumpheap [--user <USER_ID> current] [-n] [-g] [-b <format>] ");
            pw.println("           <PROCESS> <FILE>");
            pw.println("           <PROCESS> <FILE>");
            pw.println("      Dump the heap of a process.  The given <PROCESS> argument may");
            pw.println("      Dump the heap of a process.  The given <PROCESS> argument may");
Loading