diff options
| author | 2022-05-23 22:24:48 +0000 | |
|---|---|---|
| committer | 2022-05-23 22:24:48 +0000 | |
| commit | 9ff3c6b64cfe6043d4e29326f5ebdff286b047d2 (patch) | |
| tree | 2f29a085c4dd197cb5ac0139b448c7ed8a0ebc20 | |
| parent | 32cc80fe8849530186a97e84e3f648ea2f89a6a7 (diff) | |
| parent | 3103fbdd74d85da9ac3e76a0d6b914eec98e79cc (diff) | |
Merge "Add ANR annotation to AppExitInfo reason" into tm-dev
| -rw-r--r-- | services/core/java/com/android/server/am/ProcessErrorStateRecord.java | 21 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ProcessRecord.java | 4 |
2 files changed, 25 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java index 7fe270084e25..653ece4a883c 100644 --- a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java +++ b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java @@ -126,6 +126,12 @@ class ProcessErrorStateRecord { private AppNotRespondingDialog.Data mAnrData; /** + * Annotation from process killed due to an ANR. + */ + @GuardedBy("mService") + private String mAnrAnnotation; + + /** * Optional local handler to be invoked in the process crash. */ @CompositeRWLock({"mService", "mProcLock"}) @@ -193,6 +199,16 @@ class ProcessErrorStateRecord { mCrashingReport = crashingReport; } + @GuardedBy("mService") + String getAnrAnnotation() { + return mAnrAnnotation; + } + + @GuardedBy("mService") + void setAnrAnnotation(String anrAnnotation) { + mAnrAnnotation = anrAnnotation; + } + @GuardedBy(anyOf = {"mService", "mProcLock"}) ActivityManager.ProcessErrorStateInfo getNotRespondingReport() { return mNotRespondingReport; @@ -243,6 +259,8 @@ class ProcessErrorStateRecord { mApp.getWindowProcessController().appEarlyNotResponding(annotation, () -> { synchronized (mService) { + // Store annotation here as instance below races with this killLocked. + setAnrAnnotation(annotation); mApp.killLocked("anr", ApplicationExitInfo.REASON_ANR, true); } }); @@ -256,6 +274,9 @@ class ProcessErrorStateRecord { final int pid = mApp.getPid(); final UUID errorId; synchronized (mService) { + // Store annotation here as instance above will not be hit on all paths. + setAnrAnnotation(annotation); + // PowerManager.reboot() can block for a long time, so ignore ANRs while shutting down. if (mService.mAtmInternal.isShuttingDown()) { Slog.i(TAG, "During shutdown skipping ANR: " + this + " " + annotation); diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index ac5cb2da6945..07b6fcdcb0ca 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -1071,6 +1071,10 @@ class ProcessRecord implements WindowProcessListener { @SubReason int subReason, boolean noisy) { if (!mKilledByAm) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "kill"); + if (reasonCode == ApplicationExitInfo.REASON_ANR + && mErrorState.getAnrAnnotation() != null) { + description = description + ": " + mErrorState.getAnrAnnotation(); + } if (mService != null && (noisy || info.uid == mService.mCurOomAdjUid)) { mService.reportUidInfoMessageLocked(TAG, "Killing " + toShortString() + " (adj " + mState.getSetAdj() |