summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/ProcessErrorStateRecord.java21
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java4
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()