diff options
author | Dianne Hackborn <hackbod@google.com> | 2014-10-01 17:10:04 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-10-01 17:10:04 +0000 |
commit | 67787a82a01460f0d68c154fdf3045bdc1ee572f (patch) | |
tree | 97a4ae5cfb07106b96bf86149c0d0c4e748dacbf | |
parent | 047ab3b2e583dcaacb6b67fd0569bfa3ecb477c2 (diff) | |
parent | cb5fc84b554aa82a98867f997caffea3d7067033 (diff) | |
download | frameworks_base-67787a82a01460f0d68c154fdf3045bdc1ee572f.zip frameworks_base-67787a82a01460f0d68c154fdf3045bdc1ee572f.tar.gz frameworks_base-67787a82a01460f0d68c154fdf3045bdc1ee572f.tar.bz2 |
am cb5fc84b: am 16b6a8f7: am 962e3e83: am 9cf01b63: Merge "More work on issue #17656716: Unhandled exception in Window Manager" into lmp-dev
* commit 'cb5fc84b554aa82a98867f997caffea3d7067033':
More work on issue #17656716: Unhandled exception in Window Manager
-rw-r--r-- | core/java/android/app/ApplicationErrorReport.java | 2 | ||||
-rw-r--r-- | core/java/android/os/Binder.java | 18 | ||||
-rw-r--r-- | core/java/android/os/StrictMode.java | 9 | ||||
-rw-r--r-- | core/jni/android_util_Binder.cpp | 17 |
4 files changed, 28 insertions, 18 deletions
diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java index be4e80e..841bd16 100644 --- a/core/java/android/app/ApplicationErrorReport.java +++ b/core/java/android/app/ApplicationErrorReport.java @@ -388,7 +388,7 @@ public class ApplicationErrorReport implements Parcelable { dest.writeInt(throwLineNumber); dest.writeString(stackTrace); int total = dest.dataPosition()-start; - if (total > 100*1024) { + if (total > 10*1024) { Slog.d("Error", "ERR: exClass=" + exceptionClassName); Slog.d("Error", "ERR: exMsg=" + exceptionMessage); Slog.d("Error", "ERR: file=" + throwFileName); diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index f5fc0d7..bbf6ed8 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -430,16 +430,18 @@ public class Binder implements IBinder { } catch (RemoteException e) { if ((flags & FLAG_ONEWAY) != 0) { Log.w(TAG, "Binder call failed.", e); + } else { + reply.setDataPosition(0); + reply.writeException(e); } - reply.setDataPosition(0); - reply.writeException(e); res = true; } catch (RuntimeException e) { if ((flags & FLAG_ONEWAY) != 0) { Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e); + } else { + reply.setDataPosition(0); + reply.writeException(e); } - reply.setDataPosition(0); - reply.writeException(e); res = true; } catch (OutOfMemoryError e) { // Unconditionally log this, since this is generally unrecoverable. @@ -452,6 +454,14 @@ public class Binder implements IBinder { checkParcel(this, code, reply, "Unreasonably large binder reply buffer"); reply.recycle(); data.recycle(); + + // Just in case -- we are done with the IPC, so there should be no more strict + // mode violations that have gathered for this thread. Either they have been + // parceled and are now in transport off to the caller, or we are returning back + // to the main transaction loop to wait for another incoming transaction. Either + // way, strict mode begone! + StrictMode.clearGatheredViolations(); + return res; } } diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index 4e9d1f0..0e561bd 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -1693,7 +1693,7 @@ public final class StrictMode { int start = p.dataPosition(); violations.get(i).writeToParcel(p, 0 /* unused flags? */); int size = p.dataPosition()-start; - if (size > 100*1024) { + if (size > 10*1024) { Slog.d(TAG, "Wrote violation #" + i + " of " + violations.size() + ": " + (p.dataPosition()-start) + " bytes"); } @@ -1725,6 +1725,11 @@ public final class StrictMode { for (int i = 0; i < numViolations; ++i) { if (LOG_V) Log.d(TAG, "strict mode violation stacks read from binder call. i=" + i); ViolationInfo info = new ViolationInfo(p, !currentlyGathering); + if (info.crashInfo.stackTrace.length() > 5000) { + RuntimeException here = new RuntimeException("here"); + here.fillInStackTrace(); + Slog.w(TAG, "Stack is getting large: " + info.crashInfo.stackTrace, here); + } info.crashInfo.stackTrace += "# via Binder call with stack:\n" + ourStack; BlockGuard.Policy policy = BlockGuard.getThreadPolicy(); if (policy instanceof AndroidBlockGuardPolicy) { @@ -2194,7 +2199,7 @@ public final class StrictMode { dest.writeString(broadcastIntentAction); dest.writeStringArray(tags); int total = dest.dataPosition()-start; - if (total > 100*1024) { + if (total > 10*1024) { Slog.d(TAG, "VIO: policy=" + policy + " dur=" + durationMillis + " numLoop=" + violationNumThisLoop + " anim=" + numAnimationsRunning diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 5d7dbe8..a78c386 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -264,8 +264,7 @@ protected: ALOGV("onTransact() on %p calling object %p in env %p vm %p\n", this, mObject, env, mVM); IPCThreadState* thread_state = IPCThreadState::self(); - const int strict_policy_before = thread_state->getStrictModePolicy(); - thread_state->setLastTransactionBinderFlags(flags); + const int32_t strict_policy_before = thread_state->getStrictModePolicy(); //printf("Transact from %p to Java code sending: ", this); //data.print(); @@ -284,15 +283,11 @@ protected: env->DeleteLocalRef(excep); } - // Restore the Java binder thread's state if it changed while - // processing a call (as it would if the Parcel's header had a - // new policy mask and Parcel.enforceInterface() changed - // it...) - const int strict_policy_after = thread_state->getStrictModePolicy(); - if (strict_policy_after != strict_policy_before) { - // Our thread-local... - thread_state->setStrictModePolicy(strict_policy_before); - // And the Java-level thread-local... + // Check if the strict mode state changed while processing the + // call. The Binder state will be restored by the underlying + // Binder system in IPCThreadState, however we need to take care + // of the parallel Java state as well. + if (thread_state->getStrictModePolicy() != strict_policy_before) { set_dalvik_blockguard_policy(env, strict_policy_before); } |