Merge "HwBinder: log exceptions from Java" am: 0226e89332 am: f50a6304e4
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1501474 Change-Id: Ic1b5eca686f884d21dfdc13ac09524a505ff7371
This commit is contained in:
@@ -20,6 +20,8 @@
|
|||||||
|
|
||||||
#include "android_os_HwBinder.h"
|
#include "android_os_HwBinder.h"
|
||||||
|
|
||||||
|
#include "android_util_Binder.h" // for binder_report_exception
|
||||||
|
|
||||||
#include "android_os_HwParcel.h"
|
#include "android_os_HwParcel.h"
|
||||||
#include "android_os_HwRemoteBinder.h"
|
#include "android_os_HwRemoteBinder.h"
|
||||||
|
|
||||||
@@ -183,15 +185,7 @@ status_t JHwBinder::onTransact(
|
|||||||
env->ExceptionDescribe();
|
env->ExceptionDescribe();
|
||||||
env->ExceptionClear();
|
env->ExceptionClear();
|
||||||
|
|
||||||
// It is illegal to call IsInstanceOf if there is a pending exception.
|
binder_report_exception(env, excep, "Uncaught error or exception in hwbinder!");
|
||||||
// Attempting to do so results in a JniAbort which crashes the entire process.
|
|
||||||
if (env->IsInstanceOf(excep, gErrorClass)) {
|
|
||||||
/* It's an error */
|
|
||||||
LOG(ERROR) << "Forcefully exiting";
|
|
||||||
_exit(1);
|
|
||||||
} else {
|
|
||||||
LOG(ERROR) << "Uncaught exception!";
|
|
||||||
}
|
|
||||||
|
|
||||||
env->DeleteLocalRef(excep);
|
env->DeleteLocalRef(excep);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -302,8 +302,9 @@ static void report_java_lang_error(JNIEnv* env, jthrowable error, const char* ms
|
|||||||
report_java_lang_error_fatal_error(env, error, msg);
|
report_java_lang_error_fatal_error(env, error, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void report_exception(JNIEnv* env, jthrowable excep, const char* msg)
|
namespace android {
|
||||||
{
|
|
||||||
|
void binder_report_exception(JNIEnv* env, jthrowable excep, const char* msg) {
|
||||||
env->ExceptionClear();
|
env->ExceptionClear();
|
||||||
|
|
||||||
ScopedLocalRef<jstring> tagstr(env, env->NewStringUTF(LOG_TAG));
|
ScopedLocalRef<jstring> tagstr(env, env->NewStringUTF(LOG_TAG));
|
||||||
@@ -331,6 +332,8 @@ static void report_exception(JNIEnv* env, jthrowable excep, const char* msg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace android
|
||||||
|
|
||||||
class JavaBBinderHolder;
|
class JavaBBinderHolder;
|
||||||
|
|
||||||
class JavaBBinder : public BBinder
|
class JavaBBinder : public BBinder
|
||||||
@@ -405,9 +408,9 @@ protected:
|
|||||||
|
|
||||||
if (env->ExceptionCheck()) {
|
if (env->ExceptionCheck()) {
|
||||||
ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
|
ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
|
||||||
report_exception(env, excep.get(),
|
binder_report_exception(env, excep.get(),
|
||||||
"*** Uncaught remote exception! "
|
"*** Uncaught remote exception! "
|
||||||
"(Exceptions are not yet supported across processes.)");
|
"(Exceptions are not yet supported across processes.)");
|
||||||
res = JNI_FALSE;
|
res = JNI_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -421,8 +424,8 @@ protected:
|
|||||||
|
|
||||||
if (env->ExceptionCheck()) {
|
if (env->ExceptionCheck()) {
|
||||||
ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
|
ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
|
||||||
report_exception(env, excep.get(),
|
binder_report_exception(env, excep.get(),
|
||||||
"*** Uncaught exception in onBinderStrictModePolicyChange");
|
"*** Uncaught exception in onBinderStrictModePolicyChange");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Need to always call through the native implementation of
|
// Need to always call through the native implementation of
|
||||||
@@ -567,8 +570,8 @@ public:
|
|||||||
jBinderProxy.get());
|
jBinderProxy.get());
|
||||||
if (env->ExceptionCheck()) {
|
if (env->ExceptionCheck()) {
|
||||||
jthrowable excep = env->ExceptionOccurred();
|
jthrowable excep = env->ExceptionOccurred();
|
||||||
report_exception(env, excep,
|
binder_report_exception(env, excep,
|
||||||
"*** Uncaught exception returned from death notification!");
|
"*** Uncaught exception returned from death notification!");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Serialize with our containing DeathRecipientList so that we can't
|
// Serialize with our containing DeathRecipientList so that we can't
|
||||||
@@ -1163,8 +1166,8 @@ static void android_os_BinderInternal_proxyLimitcallback(int uid)
|
|||||||
|
|
||||||
if (env->ExceptionCheck()) {
|
if (env->ExceptionCheck()) {
|
||||||
ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
|
ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred());
|
||||||
report_exception(env, excep.get(),
|
binder_report_exception(env, excep.get(),
|
||||||
"*** Uncaught exception in binderProxyLimitCallbackFromNative");
|
"*** Uncaught exception in binderProxyLimitCallbackFromNative");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ extern void set_dalvik_blockguard_policy(JNIEnv* env, jint strict_policy);
|
|||||||
extern void signalExceptionForError(JNIEnv* env, jobject obj, status_t err,
|
extern void signalExceptionForError(JNIEnv* env, jobject obj, status_t err,
|
||||||
bool canThrowRemoteException = false, int parcelSize = 0);
|
bool canThrowRemoteException = false, int parcelSize = 0);
|
||||||
|
|
||||||
|
// does not take ownership of the exception, aborts if this is an error
|
||||||
|
void binder_report_exception(JNIEnv* env, jthrowable excep, const char* msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user