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