dumpsys.cpp revision 859aef6a32ba03aae8e487078deb469a3ff84e6b
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 29bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Lemestatic void usage() { 30bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme fprintf(stderr, 31bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme "usage: dumpsys\n" 32bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme " To dump all services.\n" 33bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme "or:\n" 34859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme " dumpsys [--help | -l | --skip SERVICES | SERVICE [ARGS]]\n" 35bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme " --help: shows this help\n" 36bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme " -l: only list services, do not dump them\n" 37859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme " --skip SERVICES: dumps all services but SERVICES (comma-separated list)\n" 38859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme " SERVICE [ARGS]: dumps only service SERVICE, optionally passing ARGS to it\n"); 39859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme} 40859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme 41859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Lemebool IsSkipped(const Vector<String16>& skipped, const String16& service) { 42859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme for (const auto& candidate : skipped) { 43859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme if (candidate == service) { 44859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme return true; 45859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme } 46859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme } 47859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme return false; 48bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme} 49bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme 50f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossint main(int argc, char* const argv[]) 51f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross{ 523e03d3fb6a4cb93f5f978f9d2eed7b7cc62a06a6JP Abgrall signal(SIGPIPE, SIG_IGN); 53f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross sp<IServiceManager> sm = defaultServiceManager(); 54f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fflush(stdout); 55f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (sm == NULL) { 56bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme ALOGE("Unable to get default service manager!"); 57f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aerr << "dumpsys: Unable to get default service manager!" << endl; 58f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross return 20; 59f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 60f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 61f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross Vector<String16> services; 62f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross Vector<String16> args; 63859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme Vector<String16> skippedServices; 64caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung bool showListOnly = false; 65bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme if (argc == 2) { 66859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme // 1 argument: check for special cases (-l or --help) 67bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme if (strcmp(argv[1], "--help") == 0) { 68bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme usage(); 69bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme return 0; 70bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme } 71bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme if (strcmp(argv[1], "-l") == 0) { 72bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme showListOnly = true; 73bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme } 74caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung } 75859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme if (argc == 3) { 76859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme // 2 arguments: check for special cases (--skip SERVICES) 77859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme if (strcmp(argv[1], "--skip") == 0) { 78859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme char* token = strtok(argv[2], ","); 79859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme while (token != NULL) { 80859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme skippedServices.add(String16(token)); 81859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme token = strtok(NULL, ","); 82859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme } 83859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme } 84859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme } 85859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme bool dumpAll = argc == 1; 86859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme if (dumpAll || !skippedServices.empty() || showListOnly) { 87859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme // gets all services 88f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross services = sm->listServices(); 89f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross services.sort(sort_func); 90f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross args.add(String16("-a")); 91f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } else { 92859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme // gets a specific service: 93859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme // first check if its name is not a special argument... 94859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme if (strcmp(argv[1], "--skip") == 0 || strcmp(argv[1], "-l") == 0) { 95859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme usage(); 96859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme return -1; 97859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme } 98859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme // ...then gets its arguments 99f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross services.add(String16(argv[1])); 100f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross for (int i=2; i<argc; i++) { 101f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross args.add(String16(argv[i])); 102f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 103f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 104f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 105f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross const size_t N = services.size(); 106f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 107f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (N > 1) { 108f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross // first print a list of the current services 109f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aout << "Currently running services:" << endl; 110bbfd2b89434e57cb0720d59383b5bf5339492028Felipe Leme 111f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross for (size_t i=0; i<N; i++) { 112f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross sp<IBinder> service = sm->checkService(services[i]); 113f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (service != NULL) { 114859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme bool skipped = IsSkipped(skippedServices, services[i]); 115859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme aout << " " << services[i] << (skipped ? " (skipped)" : "") << endl; 116f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 117f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 118f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 119f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 120caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung if (showListOnly) { 121caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung return 0; 122caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung } 123caad555f3efaf77941c4eacd4f6c84eb22d14f6dkeunyoung 124f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross for (size_t i=0; i<N; i++) { 125859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme if (IsSkipped(skippedServices, services[i])) continue; 126859aef6a32ba03aae8e487078deb469a3ff84e6bFelipe Leme 127f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross sp<IBinder> service = sm->checkService(services[i]); 128f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (service != NULL) { 129f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (N > 1) { 130f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aout << "------------------------------------------------------------" 131f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross "-------------------" << endl; 132f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aout << "DUMP OF SERVICE " << services[i] << ":" << endl; 133f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 134f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int err = service->dump(STDOUT_FILENO, args); 135f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (err != 0) { 136f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aerr << "Error dumping service info: (" << strerror(err) 137f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross << ") " << services[i] << endl; 138f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 139f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } else { 140f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross aerr << "Can't find service: " << services[i] << endl; 141f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 142f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 143f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 144f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross return 0; 145f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross} 146