Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e02e3ea7 authored by songjinshi's avatar songjinshi Committed by Josh Gao
Browse files

[Debug]: Add timeout for dumpNativeBacktraceToFile.



If the debuggerd be blocked, the watchdog and
activitymanager thread will be blocked when the
ANR or watchdog occurs,so we needed to add
timeout for dumpNativeBacktraceToFile.

Change-Id: Iab1a64328e70257025d860638d93a4fb8eaaeea2
Signed-off-by: default avatarsongjinshi <songjinshi@xiaomi.com>
parent e724f82b
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -2219,11 +2219,13 @@ public final class Debug
    }

    /**
     * Have the stack traces of the given native process dumped to the
     * specified file.  Will be appended to the file.
     * Append the stack traces of a given native process to a specified file.
     * @param pid pid to dump.
     * @param file path of file to append dump to.
     * @param timeoutSecs time to wait in seconds, or 0 to wait forever.
     * @hide
     */
    public static native void dumpNativeBacktraceToFile(int pid, String file);
    public static native void dumpNativeBacktraceToFileTimeout(int pid, String file, int timeoutSecs);

    /**
     * Get description of unreachable native memory.
+5 −6
Original line number Diff line number Diff line
@@ -1012,9 +1012,8 @@ static void android_os_Debug_dumpNativeHeap(JNIEnv* env, jobject clazz,
    ALOGD("Native heap dump complete.\n");
}


static void android_os_Debug_dumpNativeBacktraceToFile(JNIEnv* env, jobject clazz,
    jint pid, jstring fileName)
static void android_os_Debug_dumpNativeBacktraceToFileTimeout(JNIEnv* env, jobject clazz,
    jint pid, jstring fileName, jint timeoutSecs)
{
    if (fileName == NULL) {
        jniThrowNullPointerException(env, "file == null");
@@ -1037,7 +1036,7 @@ static void android_os_Debug_dumpNativeBacktraceToFile(JNIEnv* env, jobject claz
    if (lseek(fd, 0, SEEK_END) < 0) {
        fprintf(stderr, "lseek: %s\n", strerror(errno));
    } else {
        dump_backtrace_to_file(pid, fd);
        dump_backtrace_to_file_timeout(pid, fd, timeoutSecs);
    }

    close(fd);
@@ -1083,8 +1082,8 @@ static const JNINativeMethod gMethods[] = {
            (void*)android_os_Debug_getProxyObjectCount },
    { "getBinderDeathObjectCount", "()I",
            (void*)android_os_Debug_getDeathObjectCount },
    { "dumpNativeBacktraceToFile", "(ILjava/lang/String;)V",
            (void*)android_os_Debug_dumpNativeBacktraceToFile },
    { "dumpNativeBacktraceToFileTimeout", "(ILjava/lang/String;I)V",
            (void*)android_os_Debug_dumpNativeBacktraceToFileTimeout },
    { "getUnreachableMemory", "(IZ)Ljava/lang/String;",
            (void*)android_os_Debug_getUnreachableMemory },
};
+2 −1
Original line number Diff line number Diff line
@@ -5357,7 +5357,8 @@ public final class ActivityManagerService extends ActivityManagerNative
                    for (int pid : pids) {
                        if (DEBUG_ANR) Slog.d(TAG, "Collecting stacks for native pid " + pid);
                        final long sime = SystemClock.elapsedRealtime();
                        Debug.dumpNativeBacktraceToFile(pid, tracesPath);
                        Debug.dumpNativeBacktraceToFileTimeout(pid, tracesPath, 10);
                        if (DEBUG_ANR) Slog.d(TAG, "Done with native pid " + pid
                                + " in " + (SystemClock.elapsedRealtime()-sime) + "ms");
                    }