diff options
| author | 2024-06-20 11:56:45 +0000 | |
|---|---|---|
| committer | 2024-07-04 16:07:34 +0000 | |
| commit | e414dc1d0428b79586fcff355da02e4b8043e21c (patch) | |
| tree | dfa817e8f285bdc1fbbf1814ef354c98ac9d5f12 | |
| parent | 621ff5c4b261f848d0d78f08d0b9b894de2a3e1e (diff) | |
Collect the stacktrace before entering the background thread
Flag: android.tracing.perfetto_protolog_tracing
Test: atest com.android.internal.protolog.PerfettoProtoLogImplTest
Change-Id: Id5811efd2fcf7345d177225a8ae2306cf3229a41
| -rw-r--r-- | core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java index daf594b755d3..b134b2d6b991 100644 --- a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java @@ -106,6 +106,7 @@ public class PerfettoProtoLogImpl implements IProtoLog { private final int[] mDefaultLogLevelCounts = new int[LogLevel.values().length]; private final Map<IProtoLogGroup, int[]> mLogLevelCounts = new ArrayMap<>(); + private final Map<IProtoLogGroup, Integer> mCollectStackTraceGroupCounts = new ArrayMap<>(); private final Lock mBackgroundServiceLock = new ReentrantLock(); private ExecutorService mBackgroundLoggingService = Executors.newSingleThreadExecutor(); @@ -162,8 +163,15 @@ public class PerfettoProtoLogImpl implements IProtoLog { @Nullable Object[] args) { if (isProtoEnabled()) { long tsNanos = SystemClock.elapsedRealtimeNanos(); + final String stacktrace; + if (mCollectStackTraceGroupCounts.getOrDefault(group, 0) > 0) { + stacktrace = collectStackTrace(); + } else { + stacktrace = null; + } mBackgroundLoggingService.execute(() -> - logToProto(level, group, messageHash, paramsMask, args, tsNanos)); + logToProto(level, group, messageHash, paramsMask, args, tsNanos, + stacktrace)); } if (group.isLogToLogcat()) { logToLogcat(group.getTag(), level, messageHash, args); @@ -174,9 +182,15 @@ public class PerfettoProtoLogImpl implements IProtoLog { public void log(LogLevel logLevel, IProtoLogGroup group, String messageString, Object... args) { if (isProtoEnabled()) { long tsNanos = SystemClock.elapsedRealtimeNanos(); + final String stacktrace; + if (mCollectStackTraceGroupCounts.getOrDefault(group, 0) > 0) { + stacktrace = collectStackTrace(); + } else { + stacktrace = null; + } mBackgroundLoggingService.execute( () -> logStringMessageToProto(logLevel, group, messageString, args, - tsNanos)); + tsNanos, stacktrace)); } if (group.isLogToLogcat()) { logToLogcat(group.getTag(), logLevel, messageString, args); @@ -372,30 +386,32 @@ public class PerfettoProtoLogImpl implements IProtoLog { } private void logToProto(LogLevel level, IProtoLogGroup logGroup, long messageHash, - int paramsMask, Object[] args, long tsNanos) { + int paramsMask, Object[] args, long tsNanos, @Nullable String stacktrace) { Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "logToProto"); try { - doLogToProto(level, logGroup, new Message(messageHash), paramsMask, args, tsNanos); + doLogToProto(level, logGroup, new Message(messageHash), paramsMask, args, tsNanos, + stacktrace); } finally { Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); } } private void logStringMessageToProto(LogLevel logLevel, IProtoLogGroup group, - String messageString, Object[] args, long tsNanos) { + String messageString, Object[] args, long tsNanos, @Nullable String stacktrace) { Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "logStringMessageToProto"); try { - doLogToProto(logLevel, group, messageString, args, tsNanos); + doLogToProto(logLevel, group, messageString, args, tsNanos, stacktrace); } finally { Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); } } private void doLogToProto(LogLevel level, IProtoLogGroup logGroup, String messageString, - Object[] args, long tsNanos) { + Object[] args, long tsNanos, @Nullable String stacktrace) { final List<Integer> argTypes = LogDataType.parseFormatString(messageString); final int typeMask = LogDataType.logDataTypesToBitMask(argTypes); - doLogToProto(level, logGroup, new Message(messageString), typeMask, args, tsNanos); + doLogToProto(level, logGroup, new Message(messageString), typeMask, args, tsNanos, + stacktrace); } private static class Message { @@ -414,7 +430,7 @@ public class PerfettoProtoLogImpl implements IProtoLog { } private void doLogToProto(LogLevel level, IProtoLogGroup logGroup, Message message, - int paramsMask, Object[] args, long tsNanos) { + int paramsMask, Object[] args, long tsNanos, @Nullable String stacktrace) { mDataSource.trace(ctx -> { final ProtoLogDataSource.TlsState tlsState = ctx.getCustomTlsState(); final LogLevel logFrom = tlsState.getLogFromLevel(logGroup.name()); @@ -442,7 +458,6 @@ public class PerfettoProtoLogImpl implements IProtoLog { // Intern stackstraces before creating the trace packet for the proto message so // that the interned stacktrace strings appear before in the trace to make the // trace processing easier. - String stacktrace = collectStackTrace(); internedStacktrace = internStacktraceString(ctx, stacktrace); } @@ -778,6 +793,11 @@ public class PerfettoProtoLogImpl implements IProtoLog { for (int i = defaultLogFrom.ordinal(); i < LogLevel.values().length; i++) { logLevelsCountsForGroup[logFromLevel.ordinal()]++; } + + if (config.getConfigFor(overriddenGroupTag).collectStackTrace) { + mCollectStackTraceGroupCounts.put(group, + mCollectStackTraceGroupCounts.getOrDefault(group, 0) + 1); + } } mCacheUpdater.run(); @@ -805,6 +825,15 @@ public class PerfettoProtoLogImpl implements IProtoLog { if (Arrays.stream(logLevelsCountsForGroup).allMatch(it -> it == 0)) { mLogLevelCounts.remove(group); } + + if (config.getConfigFor(overriddenGroupTag).collectStackTrace) { + mCollectStackTraceGroupCounts.put(group, + mCollectStackTraceGroupCounts.get(group) - 1); + + if (mCollectStackTraceGroupCounts.get(group) == 0) { + mCollectStackTraceGroupCounts.remove(group); + } + } } mCacheUpdater.run(); |