Merge "Camera: Add dumpsys --unreachable support" into nyc-dev
am: 7e52fc604b
* commit '7e52fc604bab7e401aa6a3473d94aa891d3808c8':
Camera: Add dumpsys --unreachable support
Change-Id: I6c8aeada750544610fd03320965521021051896d
diff --git a/services/camera/libcameraservice/Android.mk b/services/camera/libcameraservice/Android.mk
index a5afa2d..a2ca3a8 100644
--- a/services/camera/libcameraservice/Android.mk
+++ b/services/camera/libcameraservice/Android.mk
@@ -66,7 +66,8 @@
libhardware \
libsync \
libcamera_metadata \
- libjpeg
+ libjpeg \
+ libmemunreachable
LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libbinder
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index fb71142..5464b8b 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -41,6 +41,7 @@
#include <cutils/properties.h>
#include <gui/Surface.h>
#include <hardware/hardware.h>
+#include <memunreachable/memunreachable.h>
#include <media/AudioSystem.h>
#include <media/IMediaHTTPService.h>
#include <media/mediaplayer.h>
@@ -2613,16 +2614,32 @@
write(fd, "\n", 1);
camera3::CameraTraces::dump(fd, args);
- // change logging level
+ // Process dump arguments, if any
int n = args.size();
- for (int i = 0; i + 1 < n; i++) {
- String16 verboseOption("-v");
+ String16 verboseOption("-v");
+ String16 unreachableOption("--unreachable");
+ for (int i = 0; i < n; i++) {
if (args[i] == verboseOption) {
+ // change logging level
+ if (i + 1 >= n) continue;
String8 levelStr(args[i+1]);
int level = atoi(levelStr.string());
result = String8::format("\nSetting log level to %d.\n", level);
setLogLevel(level);
write(fd, result.string(), result.size());
+ } else if (args[i] == unreachableOption) {
+ // Dump memory analysis
+ // TODO - should limit be an argument parameter?
+ UnreachableMemoryInfo info;
+ bool success = GetUnreachableMemory(info, /*limit*/ 10000);
+ if (!success) {
+ dprintf(fd, "\nUnable to dump unreachable memory. "
+ "Try disabling SELinux enforcement.\n");
+ } else {
+ dprintf(fd, "\nDumping unreachable memory:\n");
+ std::string s = info.ToString(/*log_contents*/ true);
+ write(fd, s.c_str(), s.size());
+ }
}
}
}