Loading core/jni/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -220,6 +220,7 @@ LOCAL_C_INCLUDES += \ LOCAL_SHARED_LIBRARIES := \ libmemtrack \ libandroidfw \ libbase \ libexpat \ libnativehelper \ liblog \ Loading core/jni/android_os_Debug.cpp +70 −75 Original line number Diff line number Diff line Loading @@ -15,15 +15,7 @@ */ #define LOG_TAG "android.os.Debug" #include "JNIHelp.h" #include "jni.h" #include <utils/String8.h> #include "utils/misc.h" #include "cutils/debugger.h" #include <memtrack/memtrack.h> #include <memunreachable/memunreachable.h> #include <cutils/log.h> #include <fcntl.h> #include <inttypes.h> #include <stdio.h> Loading @@ -40,9 +32,26 @@ #include <iomanip> #include <string> #include "jni.h" #include "android-base/stringprintf.h" #include "cutils/debugger.h" #include "cutils/log.h" #include "JNIHelp.h" #include "memtrack/memtrack.h" #include "memunreachable/memunreachable.h" #include "utils/misc.h" #include "utils/String8.h" namespace android { using UniqueFile = std::unique_ptr<FILE, decltype(&fclose)>; static inline UniqueFile MakeUniqueFile(const char* path, const char* mode) { return UniqueFile(fopen(path, mode), fclose); } enum { HEAP_UNKNOWN, HEAP_DALVIK, Loading Loading @@ -427,17 +436,13 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) static void load_maps(int pid, stats_t* stats, bool* foundSwapPss) { char tmp[128]; FILE *fp; *foundSwapPss = false; sprintf(tmp, "/proc/%d/smaps", pid); fp = fopen(tmp, "r"); if (fp == 0) return; std::string smaps_path = base::StringPrintf("/proc/%d/smaps", pid); UniqueFile fp = MakeUniqueFile(smaps_path.c_str(), "re"); if (fp == nullptr) return; read_mapinfo(fp, stats, foundSwapPss); fclose(fp); read_mapinfo(fp.get(), stats, foundSwapPss); } static void android_os_Debug_getDirtyPagesPid(JNIEnv *env, jobject clazz, Loading Loading @@ -519,20 +524,18 @@ static jlong android_os_Debug_getPssPid(JNIEnv *env, jobject clazz, jint pid, jlong uss = 0; jlong memtrack = 0; char tmp[128]; FILE *fp; struct graphics_memory_pss graphics_mem; if (read_memtrack_memory(pid, &graphics_mem) == 0) { pss = uss = memtrack = graphics_mem.graphics + graphics_mem.gl + graphics_mem.other; } sprintf(tmp, "/proc/%d/smaps", pid); fp = fopen(tmp, "r"); { std::string smaps_path = base::StringPrintf("/proc/%d/smaps", pid); UniqueFile fp = MakeUniqueFile(smaps_path.c_str(), "re"); if (fp != 0) { if (fp != nullptr) { while (true) { if (fgets(line, 1024, fp) == NULL) { if (fgets(line, 1024, fp.get()) == NULL) { break; } Loading Loading @@ -562,8 +565,7 @@ static jlong android_os_Debug_getPssPid(JNIEnv *env, jobject clazz, jint pid, pss += lSwapPss; // Also in swap, those pages would be accounted as Pss without SWAP } } fclose(fp); } } if (outUssSwapPss != NULL) { Loading Loading @@ -607,12 +609,14 @@ static long get_allocated_vmalloc_memory() { NULL }; long size, vmalloc_allocated_size = 0; FILE* fp = fopen("/proc/vmallocinfo", "r"); if (fp == NULL) { UniqueFile fp = MakeUniqueFile("/proc/vmallocinfo", "re"); if (fp == nullptr) { return 0; } while (true) { if (fgets(line, 1024, fp) == NULL) { if (fgets(line, 1024, fp.get()) == NULL) { break; } bool valid_line = true; Loading @@ -628,7 +632,6 @@ static long get_allocated_vmalloc_memory() { vmalloc_allocated_size += size; } } fclose(fp); return vmalloc_allocated_size; } Loading @@ -652,27 +655,25 @@ enum { static long long get_zram_mem_used() { #define ZRAM_SYSFS "/sys/block/zram0/" FILE *f = fopen(ZRAM_SYSFS "mm_stat", "r"); if (f) { UniqueFile mm_stat_file = MakeUniqueFile(ZRAM_SYSFS "mm_stat", "re"); if (mm_stat_file) { long long mem_used_total = 0; int matched = fscanf(f, "%*d %*d %lld %*d %*d %*d %*d", &mem_used_total); int matched = fscanf(mm_stat_file.get(), "%*d %*d %lld %*d %*d %*d %*d", &mem_used_total); if (matched != 1) ALOGW("failed to parse " ZRAM_SYSFS "mm_stat"); fclose(f); return mem_used_total; } f = fopen(ZRAM_SYSFS "mem_used_total", "r"); if (f) { UniqueFile mem_used_total_file = MakeUniqueFile(ZRAM_SYSFS "mem_used_total", "re"); if (mem_used_total_file) { long long mem_used_total = 0; int matched = fscanf(f, "%lld", &mem_used_total); int matched = fscanf(mem_used_total_file.get(), "%lld", &mem_used_total); if (matched != 1) ALOGW("failed to parse " ZRAM_SYSFS "mem_used_total"); fclose(f); return mem_used_total; } Loading Loading @@ -785,8 +786,8 @@ static void android_os_Debug_getMemInfo(JNIEnv *env, jobject clazz, jlongArray o static jint read_binder_stat(const char* stat) { FILE* fp = fopen(BINDER_STATS, "r"); if (fp == NULL) { UniqueFile fp = MakeUniqueFile(BINDER_STATS, "re"); if (fp == nullptr) { return -1; } Loading @@ -797,8 +798,7 @@ static jint read_binder_stat(const char* stat) // loop until we have the block that represents this process do { if (fgets(line, 1024, fp) == 0) { fclose(fp); if (fgets(line, 1024, fp.get()) == 0) { return -1; } } while (strncmp(compare, line, len)); Loading @@ -807,8 +807,7 @@ static jint read_binder_stat(const char* stat) len = snprintf(compare, 128, " %s: ", stat); do { if (fgets(line, 1024, fp) == 0) { fclose(fp); if (fgets(line, 1024, fp.get()) == 0) { return -1; } } while (strncmp(compare, line, len)); Loading @@ -816,7 +815,6 @@ static jint read_binder_stat(const char* stat) // we have the line, now increment the line ptr to the value char* ptr = line + len; jint result = atoi(ptr); fclose(fp); return result; } Loading Loading @@ -962,16 +960,15 @@ static void dumpNativeHeap(FILE* fp) fprintf(fp, "MAPS\n"); const char* maps = "/proc/self/maps"; FILE* in = fopen(maps, "r"); if (in == NULL) { UniqueFile in = MakeUniqueFile(maps, "re"); if (in == nullptr) { fprintf(fp, "Could not open %s\n", maps); return; } char buf[BUFSIZ]; while (size_t n = fread(buf, sizeof(char), BUFSIZ, in)) { while (size_t n = fread(buf, sizeof(char), BUFSIZ, in.get())) { fwrite(buf, sizeof(char), n, fp); } fclose(in); fprintf(fp, "END\n"); } Loading Loading @@ -1001,8 +998,8 @@ static void android_os_Debug_dumpNativeHeap(JNIEnv* env, jobject clazz, return; } FILE* fp = fdopen(fd, "w"); if (fp == NULL) { UniqueFile fp(fdopen(fd, "w"), fclose); if (fp == nullptr) { ALOGW("fdopen(%d) failed: %s\n", fd, strerror(errno)); close(fd); jniThrowRuntimeException(env, "fdopen() failed"); Loading @@ -1010,10 +1007,8 @@ static void android_os_Debug_dumpNativeHeap(JNIEnv* env, jobject clazz, } ALOGD("Native heap dump starting...\n"); dumpNativeHeap(fp); dumpNativeHeap(fp.get()); ALOGD("Native heap dump complete.\n"); fclose(fp); } Loading Loading
core/jni/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -220,6 +220,7 @@ LOCAL_C_INCLUDES += \ LOCAL_SHARED_LIBRARIES := \ libmemtrack \ libandroidfw \ libbase \ libexpat \ libnativehelper \ liblog \ Loading
core/jni/android_os_Debug.cpp +70 −75 Original line number Diff line number Diff line Loading @@ -15,15 +15,7 @@ */ #define LOG_TAG "android.os.Debug" #include "JNIHelp.h" #include "jni.h" #include <utils/String8.h> #include "utils/misc.h" #include "cutils/debugger.h" #include <memtrack/memtrack.h> #include <memunreachable/memunreachable.h> #include <cutils/log.h> #include <fcntl.h> #include <inttypes.h> #include <stdio.h> Loading @@ -40,9 +32,26 @@ #include <iomanip> #include <string> #include "jni.h" #include "android-base/stringprintf.h" #include "cutils/debugger.h" #include "cutils/log.h" #include "JNIHelp.h" #include "memtrack/memtrack.h" #include "memunreachable/memunreachable.h" #include "utils/misc.h" #include "utils/String8.h" namespace android { using UniqueFile = std::unique_ptr<FILE, decltype(&fclose)>; static inline UniqueFile MakeUniqueFile(const char* path, const char* mode) { return UniqueFile(fopen(path, mode), fclose); } enum { HEAP_UNKNOWN, HEAP_DALVIK, Loading Loading @@ -427,17 +436,13 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) static void load_maps(int pid, stats_t* stats, bool* foundSwapPss) { char tmp[128]; FILE *fp; *foundSwapPss = false; sprintf(tmp, "/proc/%d/smaps", pid); fp = fopen(tmp, "r"); if (fp == 0) return; std::string smaps_path = base::StringPrintf("/proc/%d/smaps", pid); UniqueFile fp = MakeUniqueFile(smaps_path.c_str(), "re"); if (fp == nullptr) return; read_mapinfo(fp, stats, foundSwapPss); fclose(fp); read_mapinfo(fp.get(), stats, foundSwapPss); } static void android_os_Debug_getDirtyPagesPid(JNIEnv *env, jobject clazz, Loading Loading @@ -519,20 +524,18 @@ static jlong android_os_Debug_getPssPid(JNIEnv *env, jobject clazz, jint pid, jlong uss = 0; jlong memtrack = 0; char tmp[128]; FILE *fp; struct graphics_memory_pss graphics_mem; if (read_memtrack_memory(pid, &graphics_mem) == 0) { pss = uss = memtrack = graphics_mem.graphics + graphics_mem.gl + graphics_mem.other; } sprintf(tmp, "/proc/%d/smaps", pid); fp = fopen(tmp, "r"); { std::string smaps_path = base::StringPrintf("/proc/%d/smaps", pid); UniqueFile fp = MakeUniqueFile(smaps_path.c_str(), "re"); if (fp != 0) { if (fp != nullptr) { while (true) { if (fgets(line, 1024, fp) == NULL) { if (fgets(line, 1024, fp.get()) == NULL) { break; } Loading Loading @@ -562,8 +565,7 @@ static jlong android_os_Debug_getPssPid(JNIEnv *env, jobject clazz, jint pid, pss += lSwapPss; // Also in swap, those pages would be accounted as Pss without SWAP } } fclose(fp); } } if (outUssSwapPss != NULL) { Loading Loading @@ -607,12 +609,14 @@ static long get_allocated_vmalloc_memory() { NULL }; long size, vmalloc_allocated_size = 0; FILE* fp = fopen("/proc/vmallocinfo", "r"); if (fp == NULL) { UniqueFile fp = MakeUniqueFile("/proc/vmallocinfo", "re"); if (fp == nullptr) { return 0; } while (true) { if (fgets(line, 1024, fp) == NULL) { if (fgets(line, 1024, fp.get()) == NULL) { break; } bool valid_line = true; Loading @@ -628,7 +632,6 @@ static long get_allocated_vmalloc_memory() { vmalloc_allocated_size += size; } } fclose(fp); return vmalloc_allocated_size; } Loading @@ -652,27 +655,25 @@ enum { static long long get_zram_mem_used() { #define ZRAM_SYSFS "/sys/block/zram0/" FILE *f = fopen(ZRAM_SYSFS "mm_stat", "r"); if (f) { UniqueFile mm_stat_file = MakeUniqueFile(ZRAM_SYSFS "mm_stat", "re"); if (mm_stat_file) { long long mem_used_total = 0; int matched = fscanf(f, "%*d %*d %lld %*d %*d %*d %*d", &mem_used_total); int matched = fscanf(mm_stat_file.get(), "%*d %*d %lld %*d %*d %*d %*d", &mem_used_total); if (matched != 1) ALOGW("failed to parse " ZRAM_SYSFS "mm_stat"); fclose(f); return mem_used_total; } f = fopen(ZRAM_SYSFS "mem_used_total", "r"); if (f) { UniqueFile mem_used_total_file = MakeUniqueFile(ZRAM_SYSFS "mem_used_total", "re"); if (mem_used_total_file) { long long mem_used_total = 0; int matched = fscanf(f, "%lld", &mem_used_total); int matched = fscanf(mem_used_total_file.get(), "%lld", &mem_used_total); if (matched != 1) ALOGW("failed to parse " ZRAM_SYSFS "mem_used_total"); fclose(f); return mem_used_total; } Loading Loading @@ -785,8 +786,8 @@ static void android_os_Debug_getMemInfo(JNIEnv *env, jobject clazz, jlongArray o static jint read_binder_stat(const char* stat) { FILE* fp = fopen(BINDER_STATS, "r"); if (fp == NULL) { UniqueFile fp = MakeUniqueFile(BINDER_STATS, "re"); if (fp == nullptr) { return -1; } Loading @@ -797,8 +798,7 @@ static jint read_binder_stat(const char* stat) // loop until we have the block that represents this process do { if (fgets(line, 1024, fp) == 0) { fclose(fp); if (fgets(line, 1024, fp.get()) == 0) { return -1; } } while (strncmp(compare, line, len)); Loading @@ -807,8 +807,7 @@ static jint read_binder_stat(const char* stat) len = snprintf(compare, 128, " %s: ", stat); do { if (fgets(line, 1024, fp) == 0) { fclose(fp); if (fgets(line, 1024, fp.get()) == 0) { return -1; } } while (strncmp(compare, line, len)); Loading @@ -816,7 +815,6 @@ static jint read_binder_stat(const char* stat) // we have the line, now increment the line ptr to the value char* ptr = line + len; jint result = atoi(ptr); fclose(fp); return result; } Loading Loading @@ -962,16 +960,15 @@ static void dumpNativeHeap(FILE* fp) fprintf(fp, "MAPS\n"); const char* maps = "/proc/self/maps"; FILE* in = fopen(maps, "r"); if (in == NULL) { UniqueFile in = MakeUniqueFile(maps, "re"); if (in == nullptr) { fprintf(fp, "Could not open %s\n", maps); return; } char buf[BUFSIZ]; while (size_t n = fread(buf, sizeof(char), BUFSIZ, in)) { while (size_t n = fread(buf, sizeof(char), BUFSIZ, in.get())) { fwrite(buf, sizeof(char), n, fp); } fclose(in); fprintf(fp, "END\n"); } Loading Loading @@ -1001,8 +998,8 @@ static void android_os_Debug_dumpNativeHeap(JNIEnv* env, jobject clazz, return; } FILE* fp = fdopen(fd, "w"); if (fp == NULL) { UniqueFile fp(fdopen(fd, "w"), fclose); if (fp == nullptr) { ALOGW("fdopen(%d) failed: %s\n", fd, strerror(errno)); close(fd); jniThrowRuntimeException(env, "fdopen() failed"); Loading @@ -1010,10 +1007,8 @@ static void android_os_Debug_dumpNativeHeap(JNIEnv* env, jobject clazz, } ALOGD("Native heap dump starting...\n"); dumpNativeHeap(fp); dumpNativeHeap(fp.get()); ALOGD("Native heap dump complete.\n"); fclose(fp); } Loading