dumpsys.cpp revision caad555f3efaf77941c4eacd4f6c84eb22d14f6d
1f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross/* 2f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * Command that dumps interesting system state to the log. 3f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * 4f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross */ 5f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 6f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#define LOG_TAG "dumpsys" 7f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 8f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <utils/Log.h> 9f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <binder/Parcel.h> 10f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <binder/ProcessState.h> 11f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <binder/IServiceManager.h> 12002e1e58dfe19dd3e49a59c6827cbf51573941a2Mathias Agopian#include <binder/TextOutput.h> 13f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <utils/Vector.h> 14f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 15f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <getopt.h> 16f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <stdlib.h> 17f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <stdio.h> 18f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <string.h> 19f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <unistd.h> 20f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <sys/time.h> 21f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 22f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossusing namespace android; 23f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 24f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossstatic int sort_func(const String16* lhs, const String16* rhs) 25f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross{ 26f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross return lhs->compare(*rhs); 27f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross} 28f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 29f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossint main(int argc, char* const argv[]) 30f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross{ 313e03d3fb6a4cb93f5f978f9d2eed7b7cc62a06a6JP Abgrall signal(SIGPIPE, SIG_IGN); 32f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross sp<IServiceManager> sm = defaultServiceManager(); 33f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fflush(stdout); 34f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (sm == NULL) { 35f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross ALOGE("Unable to get default service manager!"); 36f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aerr << "dumpsys: Unable to get default service manager!" << endl; 37f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross return 20; 38f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 39f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 40f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross Vector<String16> services; 41f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross Vector<String16> args; 42caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung bool showListOnly = false; 43caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung if ((argc == 2) && (strcmp(argv[1], "-l") == 0)) { 44caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung showListOnly = true; 45caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung } 46caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung if ((argc == 1) || showListOnly) { 47f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross services = sm->listServices(); 48f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross services.sort(sort_func); 49f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross args.add(String16("-a")); 50f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } else { 51f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross services.add(String16(argv[1])); 52f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross for (int i=2; i<argc; i++) { 53f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross args.add(String16(argv[i])); 54f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 55f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 56f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 57f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross const size_t N = services.size(); 58f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 59f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (N > 1) { 60f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross // first print a list of the current services 61f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aout << "Currently running services:" << endl; 62f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 63f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross for (size_t i=0; i<N; i++) { 64f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross sp<IBinder> service = sm->checkService(services[i]); 65f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (service != NULL) { 66f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aout << " " << services[i] << endl; 67f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 68f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 69f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 70f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 71caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung if (showListOnly) { 72caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung return 0; 73caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung } 74caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung 75f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross for (size_t i=0; i<N; i++) { 76f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross sp<IBinder> service = sm->checkService(services[i]); 77f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (service != NULL) { 78f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (N > 1) { 79f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aout << "------------------------------------------------------------" 80f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross "-------------------" << endl; 81f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aout << "DUMP OF SERVICE " << services[i] << ":" << endl; 82f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 83f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int err = service->dump(STDOUT_FILENO, args); 84f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (err != 0) { 85f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aerr << "Error dumping service info: (" << strerror(err) 86f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross << ") " << services[i] << endl; 87f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 88f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } else { 89f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aerr << "Can't find service: " << services[i] << endl; 90f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 91f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 92f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 93f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross return 0; 94f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross} 95