19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Command that dumps interesting system state to the log.
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "dumpsys"
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
90795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Parcel.h>
100795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/ProcessState.h>
110795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IServiceManager.h>
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/TextOutput.h>
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Vector.h>
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <getopt.h>
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h>
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/time.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int sort_func(const String16* lhs, const String16* rhs)
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return lhs->compare(*rhs);
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint main(int argc, char* const argv[])
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IServiceManager> sm = defaultServiceManager();
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    fflush(stdout);
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (sm == NULL) {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		LOGE("Unable to get default service manager!");
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        aerr << "dumpsys: Unable to get default service manager!" << endl;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 20;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<String16> services;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<String16> args;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (argc == 1) {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        services = sm->listServices();
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        services.sort(sort_func);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        args.add(String16("-a"));
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        services.add(String16(argv[1]));
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=2; i<argc; i++) {
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            args.add(String16(argv[i]));
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t N = services.size();
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn    if (N > 1) {
55c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn        // first print a list of the current services
56c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn        aout << "Currently running services:" << endl;
57c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn
58c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn        for (size_t i=0; i<N; i++) {
59c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn            sp<IBinder> service = sm->checkService(services[i]);
60c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn            if (service != NULL) {
61c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn                aout << "  " << services[i] << endl;
62c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn            }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; i<N; i++) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<IBinder> service = sm->checkService(services[i]);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (service != NULL) {
69c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn            if (N > 1) {
70c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn                aout << "------------------------------------------------------------"
71c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn                        "-------------------" << endl;
72c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn                aout << "DUMP OF SERVICE " << services[i] << ":" << endl;
73c59411b17670ae9b5a6eb33e0fd62ca0e80d1578Dianne Hackborn            }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int err = service->dump(STDOUT_FILENO, args);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (err != 0) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                aerr << "Error dumping service info: (" << strerror(err)
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        << ") " << services[i] << endl;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            aerr << "Can't find service: " << services[i] << endl;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
86