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