dumpstate.cpp revision 515eb0db0a03de0a721ef034b3f3898e1d7e42e7
1f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross/* 2f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * Copyright (C) 2008 The Android Open Source Project 3f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * 4f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * Licensed under the Apache License, Version 2.0 (the "License"); 5f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * you may not use this file except in compliance with the License. 6f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * You may obtain a copy of the License at 7f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * 8f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * http://www.apache.org/licenses/LICENSE-2.0 9f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * 10f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * Unless required by applicable law or agreed to in writing, software 11f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * distributed under the License is distributed on an "AS IS" BASIS, 12f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * See the License for the specific language governing permissions and 14f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross * limitations under the License. 15f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross */ 16f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 172db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg#include <dirent.h> 18f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <errno.h> 19f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <fcntl.h> 20f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <limits.h> 218f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn#include <stdbool.h> 22f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <stdio.h> 23f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <stdlib.h> 24f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <string.h> 257dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris#include <sys/capability.h> 267dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris#include <sys/prctl.h> 27f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <sys/resource.h> 28f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <sys/stat.h> 29f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <sys/time.h> 30f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <sys/wait.h> 31f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <unistd.h> 32f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 33f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include <cutils/properties.h> 34f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 35f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include "private/android_filesystem_config.h" 36f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 37f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#define LOG_TAG "dumpstate" 38656a6b9e3645bfe2cf073b69cbb9d02832f62c26Alex Ray#include <cutils/log.h> 39f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 40f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#include "dumpstate.h" 41f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 42f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross/* read before root is shed */ 43f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossstatic char cmdline_buf[16384] = "(unknown)"; 44f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossstatic const char *dump_traces_path = NULL; 45f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 46f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossstatic char screenshot_path[PATH_MAX] = ""; 47f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 482a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor#define PSTORE_LAST_KMSG "/sys/fs/pstore/console-ramoops" 492a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor 508d4cb7ffc11050eebb4d06684e0eb14d9aadacb5Sharvil Nanavati#define RAFT_DIR "/data/misc/raft/" 517dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris#define TOMBSTONE_DIR "/data/tombstones" 527dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris#define TOMBSTONE_FILE_PREFIX TOMBSTONE_DIR "/tombstone_" 537dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris/* Can accomodate a tombstone number up to 9999. */ 547dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris#define TOMBSTONE_MAX_LEN (sizeof(TOMBSTONE_FILE_PREFIX) + 4) 557dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris#define NUM_TOMBSTONES 10 567dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris 577dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferristypedef struct { 587dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris char name[TOMBSTONE_MAX_LEN]; 597dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris int fd; 607dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris} tombstone_data_t; 617dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris 627dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferrisstatic tombstone_data_t tombstone_data[NUM_TOMBSTONES]; 637dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris 647dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris/* Get the fds of any tombstone that was modified in the last half an hour. */ 657dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferrisstatic void get_tombstone_fds(tombstone_data_t data[NUM_TOMBSTONES]) { 667dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris time_t thirty_minutes_ago = time(NULL) - 60*30; 677dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris for (size_t i = 0; i < NUM_TOMBSTONES; i++) { 687dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris snprintf(data[i].name, sizeof(data[i].name), "%s%02zu", TOMBSTONE_FILE_PREFIX, i); 6954bcc5ffd5a79f4f194089c58d3de571532bf39bChristopher Ferris int fd = TEMP_FAILURE_RETRY(open(data[i].name, 7054bcc5ffd5a79f4f194089c58d3de571532bf39bChristopher Ferris O_RDONLY | O_CLOEXEC | O_NOFOLLOW | O_NONBLOCK)); 717dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris struct stat st; 727dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris if (fstat(fd, &st) == 0 && S_ISREG(st.st_mode) && 737dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris (time_t) st.st_mtime >= thirty_minutes_ago) { 747dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris data[i].fd = fd; 757dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } else { 767dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris close(fd); 777dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris data[i].fd = -1; 787dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } 797dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } 807dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris} 817dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris 822db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevågstatic void dump_dev_files(const char *title, const char *driverpath, const char *filename) 832db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg{ 842db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg DIR *d; 852db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg struct dirent *de; 862db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg char path[PATH_MAX]; 872db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg 882db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg d = opendir(driverpath); 892db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg if (d == NULL) { 902db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg return; 912db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg } 922db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg 932db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg while ((de = readdir(d))) { 942db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg if (de->d_type != DT_LNK) { 952db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg continue; 962db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg } 972db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg snprintf(path, sizeof(path), "%s/%s/%s", driverpath, de->d_name, filename); 982db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg dump_file(title, path); 992db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg } 1002db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg 1012db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg closedir(d); 1022db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg} 1032db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg 104326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzynstatic bool skip_not_stat(const char *path) { 105326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn static const char stat[] = "/stat"; 106326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn size_t len = strlen(path); 107326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (path[len - 1] == '/') { /* Directory? */ 108326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn return false; 109326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 110326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn return strcmp(path + len - sizeof(stat) + 1, stat); /* .../stat? */ 111326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn} 112326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn 113326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzynstatic const char mmcblk0[] = "/sys/block/mmcblk0/"; 1148f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzynunsigned long worst_write_perf = 20000; /* in KB/s */ 115326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn 116326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzynstatic int dump_stat_from_fd(const char *title __unused, const char *path, int fd) { 117326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn unsigned long fields[11], read_perf, write_perf; 118326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn bool z; 119326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn char *cp, *buffer = NULL; 120326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn size_t i = 0; 121326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn FILE *fp = fdopen(fd, "rb"); 122326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn getline(&buffer, &i, fp); 123326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn fclose(fp); 124326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (!buffer) { 125326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn return -errno; 126326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 127326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn i = strlen(buffer); 128326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn while ((i > 0) && (buffer[i - 1] == '\n')) { 129326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn buffer[--i] = '\0'; 130326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 131326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (!*buffer) { 132326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn free(buffer); 133326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn return 0; 134326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 135326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn z = true; 136326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn for (cp = buffer, i = 0; i < (sizeof(fields) / sizeof(fields[0])); ++i) { 137326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn fields[i] = strtol(cp, &cp, 0); 138326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (fields[i] != 0) { 139326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn z = false; 140326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 141326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 142326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (z) { /* never accessed */ 143326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn free(buffer); 144326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn return 0; 145326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 146326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn 147326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (!strncmp(path, mmcblk0, sizeof(mmcblk0) - 1)) { 148326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn path += sizeof(mmcblk0) - 1; 149326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 150326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn 151326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn printf("%s: %s\n", path, buffer); 152326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn free(buffer); 153326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn 154326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn read_perf = 0; 155326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (fields[3]) { 156326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn read_perf = 512 * fields[2] / fields[3]; 157326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 158326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn write_perf = 0; 159326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (fields[7]) { 160326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn write_perf = 512 * fields[6] / fields[7]; 161326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 162326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn printf("%s: read: %luKB/s write: %luKB/s\n", path, read_perf, write_perf); 1638f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if ((write_perf > 1) && (write_perf < worst_write_perf)) { 1648f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn worst_write_perf = write_perf; 1658f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 166326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn return 0; 167326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn} 168326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn 1698f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn/* Copied policy from system/core/logd/LogBuffer.cpp */ 1708f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 1718f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn#define LOG_BUFFER_SIZE (256 * 1024) 1728f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn#define LOG_BUFFER_MIN_SIZE (64 * 1024UL) 1738f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn#define LOG_BUFFER_MAX_SIZE (256 * 1024 * 1024UL) 1748f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 1758f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzynstatic bool valid_size(unsigned long value) { 1768f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if ((value < LOG_BUFFER_MIN_SIZE) || (LOG_BUFFER_MAX_SIZE < value)) { 1778f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn return false; 1788f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 1798f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 1808f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn long pages = sysconf(_SC_PHYS_PAGES); 1818f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (pages < 1) { 1828f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn return true; 1838f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 1848f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 1858f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn long pagesize = sysconf(_SC_PAGESIZE); 1868f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (pagesize <= 1) { 1878f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn pagesize = PAGE_SIZE; 1888f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 1898f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 1908f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn // maximum memory impact a somewhat arbitrary ~3% 1918f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn pages = (pages + 31) / 32; 1928f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn unsigned long maximum = pages * pagesize; 1938f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 1948f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if ((maximum < LOG_BUFFER_MIN_SIZE) || (LOG_BUFFER_MAX_SIZE < maximum)) { 1958f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn return true; 1968f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 1978f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 1988f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn return value <= maximum; 1998f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn} 2008f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2018f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzynstatic unsigned long property_get_size(const char *key) { 2028f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn unsigned long value; 2038f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn char *cp, property[PROPERTY_VALUE_MAX]; 2048f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2058f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn property_get(key, property, ""); 2068f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn value = strtoul(property, &cp, 10); 2078f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2088f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn switch(*cp) { 2098f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn case 'm': 2108f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn case 'M': 2118f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn value *= 1024; 2128f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn /* FALLTHRU */ 2138f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn case 'k': 2148f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn case 'K': 2158f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn value *= 1024; 2168f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn /* FALLTHRU */ 2178f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn case '\0': 2188f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn break; 2198f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2208f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn default: 2218f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn value = 0; 2228f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 2238f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2248f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (!valid_size(value)) { 2258f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn value = 0; 2268f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 2278f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2288f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn return value; 2298f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn} 2308f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2318f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn/* timeout in ms */ 232515eb0db0a03de0a721ef034b3f3898e1d7e42e7Felipe Lemestatic unsigned long logcat_timeout(const char *name) { 2338f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn static const char global_tuneable[] = "persist.logd.size"; // Settings App 2348f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn static const char global_default[] = "ro.logd.size"; // BoardConfig.mk 2358f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn char key[PROP_NAME_MAX]; 2368f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn unsigned long property_size, default_size; 2378f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2388f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn default_size = property_get_size(global_tuneable); 2398f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (!default_size) { 2408f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn default_size = property_get_size(global_default); 2418f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 2428f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2438f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn snprintf(key, sizeof(key), "%s.%s", global_tuneable, name); 2448f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn property_size = property_get_size(key); 2458f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2468f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (!property_size) { 2478f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn snprintf(key, sizeof(key), "%s.%s", global_default, name); 2488f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn property_size = property_get_size(key); 2498f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 2508f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2518f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (!property_size) { 2528f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn property_size = default_size; 2538f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 2548f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2558f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (!property_size) { 2568f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn property_size = LOG_BUFFER_SIZE; 2578f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 2588f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2598f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn /* Engineering margin is ten-fold our guess */ 2608f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn return 10 * (property_size + worst_write_perf) / worst_write_perf; 2618f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn} 2628f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2638f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn/* End copy from system/core/logd/LogBuffer.cpp */ 2648f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 265f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross/* dumps the current system state to stdout */ 266f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossstatic void dumpstate() { 2678f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn unsigned long timeout; 268f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross time_t now = time(NULL); 269f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char build[PROPERTY_VALUE_MAX], fingerprint[PROPERTY_VALUE_MAX]; 270f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char radio[PROPERTY_VALUE_MAX], bootloader[PROPERTY_VALUE_MAX]; 271f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char network[PROPERTY_VALUE_MAX], date[80]; 272f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char build_type[PROPERTY_VALUE_MAX]; 273f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 274f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("ro.build.display.id", build, "(unknown)"); 275f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("ro.build.fingerprint", fingerprint, "(unknown)"); 276f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("ro.build.type", build_type, "(unknown)"); 277f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("ro.baseband", radio, "(unknown)"); 278f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("ro.bootloader", bootloader, "(unknown)"); 279f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("gsm.operator.alpha", network, "(unknown)"); 280f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&now)); 281f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 282f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 283f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== dumpstate: %s\n", date); 284f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 285f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 286f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("\n"); 287f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Build: %s\n", build); 288f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Build fingerprint: '%s'\n", fingerprint); /* format is important for other tools */ 289f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Bootloader: %s\n", bootloader); 290f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Radio: %s\n", radio); 291f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Network: %s\n", network); 292f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 293f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Kernel: "); 294f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file(NULL, "/proc/version"); 295f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Command line: %s\n", strtok(cmdline_buf, "\n")); 296f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("\n"); 297f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 2982db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg dump_dev_files("TRUSTY VERSION", "/sys/bus/platform/drivers/trusty", "trusty_version"); 299f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("UPTIME", 10, "uptime", NULL); 300326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn dump_files("UPTIME MMC PERF", mmcblk0, skip_not_stat, dump_stat_from_fd); 3018c8130eb68c89987a94db084608a4229bad06c18Mark Salyzyn dump_emmc_ecsd("/d/mmc0/mmc0:0001/ext_csd"); 302f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("MEMORY INFO", "/proc/meminfo"); 303b32c7e14ccc6507f6ce3fc02414ba04b797f4558Elliott Hughes run_command("CPU INFO", 10, "top", "-n", "1", "-d", "1", "-m", "30", "-H", NULL); 3042b1f88b6ac78e330ff006da6fecf8bc9d976ec67Nick Kralevich run_command("PROCRANK", 20, SU_PATH, "root", "procrank", NULL); 305f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("VIRTUAL MEMORY STATS", "/proc/vmstat"); 306f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("VMALLOC INFO", "/proc/vmallocinfo"); 307f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("SLAB INFO", "/proc/slabinfo"); 308f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("ZONEINFO", "/proc/zoneinfo"); 309f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("PAGETYPEINFO", "/proc/pagetypeinfo"); 310f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("BUDDYINFO", "/proc/buddyinfo"); 3112281af967dd840aade7bc55b19ea7df0e6da36f2Colin Cross dump_file("FRAGMENTATION INFO", "/d/extfrag/unusable_index"); 312f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 313f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("KERNEL WAKELOCKS", "/proc/wakelocks"); 31429e27a84c144fe3b941648094cad2a3f1e61e8b3Todd Poynor dump_file("KERNEL WAKE SOURCES", "/d/wakeup_sources"); 315f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("KERNEL CPUFREQ", "/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state"); 31685aea748861b5665e68b786b55f1c798f56fc0daMathias Agopian dump_file("KERNEL SYNC", "/d/sync"); 317f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 318a3533a3ae6bf8d0e1780c153cafdec86926ec22cElliott Hughes run_command("PROCESSES AND THREADS", 10, "ps", "-Z", "-t", "-p", "-P", NULL); 319f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("LIBRANK", 10, "librank", NULL); 320f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 321f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross do_dmesg(); 322f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 323f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("LIST OF OPEN FILES", 10, SU_PATH, "root", "lsof", NULL); 3241dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown for_each_pid(do_showmap, "SMAPS OF ALL PROCESSES"); 3251dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown for_each_tid(show_wchan, "BLOCKED PROCESS WAIT-CHANNELS"); 326f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 3275a93003d3f0d1808b6dcd9928041ec62ea7f67adJeff Sharkey if (screenshot_path[0]) { 3285a93003d3f0d1808b6dcd9928041ec62ea7f67adJeff Sharkey ALOGI("taking screenshot\n"); 3295a93003d3f0d1808b6dcd9928041ec62ea7f67adJeff Sharkey run_command(NULL, 10, "/system/bin/screencap", "-p", screenshot_path, NULL); 3305a93003d3f0d1808b6dcd9928041ec62ea7f67adJeff Sharkey ALOGI("wrote screenshot: %s\n", screenshot_path); 3315a93003d3f0d1808b6dcd9928041ec62ea7f67adJeff Sharkey } 3325a93003d3f0d1808b6dcd9928041ec62ea7f67adJeff Sharkey 333f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross // dump_file("EVENT LOG TAGS", "/etc/event-log-tags"); 3348f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn // calculate timeout 3358f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn timeout = logcat_timeout("main") + logcat_timeout("system") + logcat_timeout("crash"); 3368f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (timeout < 20000) { 3378f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn timeout = 20000; 3388f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 3397831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn run_command("SYSTEM LOG", timeout / 1000, "logcat", "-v", "threadtime", 3407831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "printable", 3417831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-d", 3427831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "*:v", NULL); 343c7ad8cb82f035576c28707a8cbeb16b7ead2a4e7Mark Salyzyn timeout = logcat_timeout("events") + logcat_timeout("security"); 3448f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (timeout < 20000) { 3458f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn timeout = 20000; 3468f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 3477831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn run_command("EVENT LOG", timeout / 1000, "logcat", "-b", "events", 348c7ad8cb82f035576c28707a8cbeb16b7ead2a4e7Mark Salyzyn "-b", "security", 3497831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "threadtime", 3507831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "printable", 3517831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-d", 3527831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "*:v", NULL); 3538f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn timeout = logcat_timeout("radio"); 3548f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (timeout < 20000) { 3558f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn timeout = 20000; 3568f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 3577831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn run_command("RADIO LOG", timeout / 1000, "logcat", "-b", "radio", 3587831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "threadtime", 3597831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "printable", 3607831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-d", 3617831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "*:v", NULL); 362f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 363ecc0763e6c96c418ea4ee6c993d58d16a58407b3Mark Salyzyn run_command("LOG STATISTICS", 10, "logcat", "-b", "all", "-S", NULL); 364ecc0763e6c96c418ea4ee6c993d58d16a58407b3Mark Salyzyn 36531baf8d3c2833d13056b0be679f66ed0e53c8d26Jason Parks run_command("RAFT LOGS", 300, SU_PATH, "root", "logcompressor", "-r", RAFT_DIR, NULL); 3668d4cb7ffc11050eebb4d06684e0eb14d9aadacb5Sharvil Nanavati 367f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* show the traces we collected in main(), if that was done */ 368f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (dump_traces_path != NULL) { 369f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("VM TRACES JUST NOW", dump_traces_path); 370f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 371f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 372f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* only show ANR traces if they're less than 15 minutes old */ 373f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross struct stat st; 374f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char anr_traces_path[PATH_MAX]; 375f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("dalvik.vm.stack-trace-file", anr_traces_path, ""); 376f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (!anr_traces_path[0]) { 377f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("*** NO VM TRACES FILE DEFINED (dalvik.vm.stack-trace-file)\n\n"); 378f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } else { 37954bcc5ffd5a79f4f194089c58d3de571532bf39bChristopher Ferris int fd = TEMP_FAILURE_RETRY(open(anr_traces_path, 38054bcc5ffd5a79f4f194089c58d3de571532bf39bChristopher Ferris O_RDONLY | O_CLOEXEC | O_NOFOLLOW | O_NONBLOCK)); 3817dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris if (fd < 0) { 3827dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris printf("*** NO ANR VM TRACES FILE (%s): %s\n\n", anr_traces_path, strerror(errno)); 3837dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } else { 3847dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris dump_file_from_fd("VM TRACES AT LAST ANR", anr_traces_path, fd); 3857dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } 386f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 387f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 388f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* slow traces for slow operations */ 389f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (anr_traces_path[0] != 0) { 390f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int tail = strlen(anr_traces_path)-1; 391f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross while (tail > 0 && anr_traces_path[tail] != '/') { 392f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross tail--; 393f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 394f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int i = 0; 395f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross while (1) { 396f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross sprintf(anr_traces_path+tail+1, "slow%02d.txt", i); 397f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (stat(anr_traces_path, &st)) { 398f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross // No traces file at this index, done with the files. 399f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross break; 400f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 401f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("VM TRACES WHEN SLOW", anr_traces_path); 402f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross i++; 403f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 404f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 405f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 4067dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris int dumped = 0; 4077dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris for (size_t i = 0; i < NUM_TOMBSTONES; i++) { 4087dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris if (tombstone_data[i].fd != -1) { 4097dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris dumped = 1; 4107dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris dump_file_from_fd("TOMBSTONE", tombstone_data[i].name, tombstone_data[i].fd); 4117dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris tombstone_data[i].fd = -1; 4127dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } 4137dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } 4147dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris if (!dumped) { 4157dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris printf("*** NO TOMBSTONES to dump in %s\n\n", TOMBSTONE_DIR); 4167dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } 4177dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris 418f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("NETWORK DEV INFO", "/proc/net/dev"); 419f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("QTAGUID NETWORK INTERFACES INFO", "/proc/net/xt_qtaguid/iface_stat_all"); 420012c2ea5651a56218a4359c78db26dd700d9930bJP Abgrall dump_file("QTAGUID NETWORK INTERFACES INFO (xt)", "/proc/net/xt_qtaguid/iface_stat_fmt"); 421f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("QTAGUID CTRL INFO", "/proc/net/xt_qtaguid/ctrl"); 422f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("QTAGUID STATS INFO", "/proc/net/xt_qtaguid/stats"); 423f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 4242a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor if (!stat(PSTORE_LAST_KMSG, &st)) { 4252a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor /* Also TODO: Make console-ramoops CAP_SYSLOG protected. */ 4262a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor dump_file("LAST KMSG", PSTORE_LAST_KMSG); 4272a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor } else { 4282a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor /* TODO: Make last_kmsg CAP_SYSLOG protected. b/5555691 */ 4292a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor dump_file("LAST KMSG", "/proc/last_kmsg"); 4302a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor } 4312a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor 4322262c16372570f57d3107d574abe2c80825d286eMark Salyzyn /* kernels must set CONFIG_PSTORE_PMSG, slice up pstore with device tree */ 4337831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn run_command("LAST LOGCAT", 10, "logcat", "-L", 4347831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-b", "all", 4357831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "threadtime", 4367831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "printable", 4377831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-d", 4387831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "*:v", NULL); 4392262c16372570f57d3107d574abe2c80825d286eMark Salyzyn 440f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* The following have a tendency to get wedged when wifi drivers/fw goes belly-up. */ 441a59828a5d2740433164872e9a0b44363e2ba0cd4Elliott Hughes 442a59828a5d2740433164872e9a0b44363e2ba0cd4Elliott Hughes run_command("NETWORK INTERFACES", 10, "ip", "link", NULL); 443d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti 444d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti run_command("IPv4 ADDRESSES", 10, "ip", "-4", "addr", "show", NULL); 445d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti run_command("IPv6 ADDRESSES", 10, "ip", "-6", "addr", "show", NULL); 446d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti 447f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("IP RULES", 10, "ip", "rule", "show", NULL); 448f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("IP RULES v6", 10, "ip", "-6", "rule", "show", NULL); 4492b3bba34aec65b612be8d1f52cd124d9c30955f9Sreeram Ramachandran 4502b3bba34aec65b612be8d1f52cd124d9c30955f9Sreeram Ramachandran dump_route_tables(); 4512b3bba34aec65b612be8d1f52cd124d9c30955f9Sreeram Ramachandran 452d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti run_command("ARP CACHE", 10, "ip", "-4", "neigh", "show", NULL); 453d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti run_command("IPv6 ND CACHE", 10, "ip", "-6", "neigh", "show", NULL); 454d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti 455f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("IPTABLES", 10, SU_PATH, "root", "iptables", "-L", "-nvx", NULL); 456f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("IP6TABLES", 10, SU_PATH, "root", "ip6tables", "-L", "-nvx", NULL); 457012c2ea5651a56218a4359c78db26dd700d9930bJP Abgrall run_command("IPTABLE NAT", 10, SU_PATH, "root", "iptables", "-t", "nat", "-L", "-nvx", NULL); 458012c2ea5651a56218a4359c78db26dd700d9930bJP Abgrall /* no ip6 nat */ 459012c2ea5651a56218a4359c78db26dd700d9930bJP Abgrall run_command("IPTABLE RAW", 10, SU_PATH, "root", "iptables", "-t", "raw", "-L", "-nvx", NULL); 460012c2ea5651a56218a4359c78db26dd700d9930bJP Abgrall run_command("IP6TABLE RAW", 10, SU_PATH, "root", "ip6tables", "-t", "raw", "-L", "-nvx", NULL); 461f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 462f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("WIFI NETWORKS", 20, 4631d6b97c869718001010cce3db387c73fd11bf32eDmitry Shmidt SU_PATH, "root", "wpa_cli", "IFNAME=wlan0", "list_networks", NULL); 464f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 465c11f56e5615c5d388c072705322df5bcf22c2012Dmitry Shmidt#ifdef FWDUMP_bcmdhd 4666afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti run_command("ND OFFLOAD TABLE", 5, 4676afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti SU_PATH, "root", "wlutil", "nd_hostip", NULL); 4686afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti 4696afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti run_command("DUMP WIFI INTERNAL COUNTERS (1)", 20, 470c11f56e5615c5d388c072705322df5bcf22c2012Dmitry Shmidt SU_PATH, "root", "wlutil", "counters", NULL); 4716afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti 4726afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti run_command("ND OFFLOAD STATUS (1)", 5, 4736afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti SU_PATH, "root", "wlutil", "nd_status", NULL); 4746afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti 475c11f56e5615c5d388c072705322df5bcf22c2012Dmitry Shmidt#endif 4760b2c9268265e9a165551eaa66cb461d3fab8b564Dmitry Shmidt dump_file("INTERRUPTS (1)", "/proc/interrupts"); 4770b2c9268265e9a165551eaa66cb461d3fab8b564Dmitry Shmidt 4786afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti run_command("NETWORK DIAGNOSTICS", 10, "dumpsys", "connectivity", "--diag", NULL); 4796afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti 480c11f56e5615c5d388c072705322df5bcf22c2012Dmitry Shmidt#ifdef FWDUMP_bcmdhd 481f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("DUMP WIFI STATUS", 20, 482f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross SU_PATH, "root", "dhdutil", "-i", "wlan0", "dump", NULL); 4836afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti 4846afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti run_command("DUMP WIFI INTERNAL COUNTERS (2)", 20, 485f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross SU_PATH, "root", "wlutil", "counters", NULL); 4866afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti 4876afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti run_command("ND OFFLOAD STATUS (2)", 5, 4886afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti SU_PATH, "root", "wlutil", "nd_status", NULL); 489f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#endif 4900b2c9268265e9a165551eaa66cb461d3fab8b564Dmitry Shmidt dump_file("INTERRUPTS (2)", "/proc/interrupts"); 491f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 492f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross print_properties(); 493f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 494f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("VOLD DUMP", 10, "vdc", "dump", NULL); 495f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("SECURE CONTAINERS", 10, "vdc", "asec", "list", NULL); 496f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 4978f75fa7bcfec553eddb59b919b44d7a93c9846a1Ken Sumrall run_command("FILESYSTEMS & FREE SPACE", 10, "df", NULL); 498f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 499f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("LAST RADIO LOG", 10, "parse_radio_log", "/proc/last_radio_log", NULL); 500f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 501f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("------ BACKLIGHTS ------\n"); 502f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("LCD brightness="); 503f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file(NULL, "/sys/class/leds/lcd-backlight/brightness"); 504f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Button brightness="); 505f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file(NULL, "/sys/class/leds/button-backlight/brightness"); 506f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Keyboard brightness="); 507f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file(NULL, "/sys/class/leds/keyboard-backlight/brightness"); 508f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("ALS mode="); 509f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file(NULL, "/sys/class/leds/lcd-backlight/als"); 510f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("LCD driver registers:\n"); 511f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file(NULL, "/sys/class/leds/lcd-backlight/registers"); 512f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("\n"); 513f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 514f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* Binder state is expensive to look at as it uses a lot of memory. */ 515f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("BINDER FAILED TRANSACTION LOG", "/sys/kernel/debug/binder/failed_transaction_log"); 516f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("BINDER TRANSACTION LOG", "/sys/kernel/debug/binder/transaction_log"); 517f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("BINDER TRANSACTIONS", "/sys/kernel/debug/binder/transactions"); 518f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("BINDER STATS", "/sys/kernel/debug/binder/stats"); 519f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("BINDER STATE", "/sys/kernel/debug/binder/state"); 520f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 521f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 522f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== Board\n"); 523f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 524f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 525f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dumpstate_board(); 526f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("\n"); 527f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 528f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* Migrate the ril_dumpstate to a dumpstate_board()? */ 529f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char ril_dumpstate_timeout[PROPERTY_VALUE_MAX] = {0}; 530f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("ril.dumpstate.timeout", ril_dumpstate_timeout, "30"); 531f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (strnlen(ril_dumpstate_timeout, PROPERTY_VALUE_MAX - 1) > 0) { 532f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (0 == strncmp(build_type, "user", PROPERTY_VALUE_MAX - 1)) { 533f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross // su does not exist on user builds, so try running without it. 534f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross // This way any implementations of vril-dump that do not require 535f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross // root can run on user builds. 536f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("DUMP VENDOR RIL LOGS", atoi(ril_dumpstate_timeout), 537f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross "vril-dump", NULL); 538f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } else { 539f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("DUMP VENDOR RIL LOGS", atoi(ril_dumpstate_timeout), 540f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross SU_PATH, "root", "vril-dump", NULL); 541f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 542f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 543f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 544f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 545f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== Android Framework Services\n"); 546f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 547f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 548f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* the full dumpsys is starting to take a long time, so we need 549f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross to increase its timeout. we really need to do the timeouts in 550f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dumpsys itself... */ 551f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("DUMPSYS", 60, "dumpsys", NULL); 552f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 553f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 55402bea9786d2ecc4c04f35fd7d9b73d4dd2b73735Dianne Hackborn printf("== Checkins\n"); 55502bea9786d2ecc4c04f35fd7d9b73d4dd2b73735Dianne Hackborn printf("========================================================\n"); 55602bea9786d2ecc4c04f35fd7d9b73d4dd2b73735Dianne Hackborn 55759b1516f4cefcfd599f4e5e9c4a227a48d1ace65Dianne Hackborn run_command("CHECKIN BATTERYSTATS", 30, "dumpsys", "batterystats", "-c", NULL); 5583e5fa73722c100fc9017c7a47b17a8e727aa34e1Dianne Hackborn run_command("CHECKIN MEMINFO", 30, "dumpsys", "meminfo", "--checkin", NULL); 55902bea9786d2ecc4c04f35fd7d9b73d4dd2b73735Dianne Hackborn run_command("CHECKIN NETSTATS", 30, "dumpsys", "netstats", "--checkin", NULL); 5605cd46aa3399ddeaf12a211390dfde66c796ab299Dianne Hackborn run_command("CHECKIN PROCSTATS", 30, "dumpsys", "procstats", "-c", NULL); 5611bd5068a5180ac12dda374e15c7b1f70e8334284Dianne Hackborn run_command("CHECKIN USAGESTATS", 30, "dumpsys", "usagestats", "-c", NULL); 5628b3e133e413774047da8005771f57c21dd31e1e3Ashish Sharma run_command("CHECKIN PACKAGE", 30, "dumpsys", "package", "--checkin", NULL); 56302bea9786d2ecc4c04f35fd7d9b73d4dd2b73735Dianne Hackborn 56402bea9786d2ecc4c04f35fd7d9b73d4dd2b73735Dianne Hackborn printf("========================================================\n"); 565f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== Running Application Activities\n"); 566f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 567f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 568f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("APP ACTIVITIES", 30, "dumpsys", "activity", "all", NULL); 569f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 570f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 571f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== Running Application Services\n"); 572f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 573f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 574f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("APP SERVICES", 30, "dumpsys", "activity", "service", "all", NULL); 575f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 576f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 577f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== Running Application Providers\n"); 578f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 579f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 580f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("APP SERVICES", 30, "dumpsys", "activity", "provider", "all", NULL); 581f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 582f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 583f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 584f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== dumpstate: done\n"); 585f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 586f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross} 587f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 588f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossstatic void usage() { 5891f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau fprintf(stderr, "usage: dumpstate [-b soundfile] [-e soundfile] [-o file [-d] [-p] [-z]] [-s] [-q]\n" 590f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross " -o: write to file (instead of stdout)\n" 591f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross " -d: append date to filename (requires -o)\n" 592f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross " -p: capture screenshot to filename.png (requires -o)\n" 593f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross " -s: write output to control socket (for init)\n" 594f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross " -b: play sound file instead of vibrate, at beginning of job\n" 595f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross " -e: play sound file instead of vibrate, at end of job\n" 5961f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau " -q: disable vibrate\n" 59727f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey " -B: send broadcast when finished (requires -o and -p)\n" 5982a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor ); 599f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross} 600f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 601885f888c55587e9366542b5155a06c321cde175aJohn Michelaustatic void sigpipe_handler(int n) { 6022e671bbdb741c2926b6df7b240fdc31c7361f330Andres Morales // don't complain to stderr or stdout 6032e671bbdb741c2926b6df7b240fdc31c7361f330Andres Morales _exit(EXIT_FAILURE); 604885f888c55587e9366542b5155a06c321cde175aJohn Michelau} 605885f888c55587e9366542b5155a06c321cde175aJohn Michelau 6061dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brownstatic void vibrate(FILE* vibrator, int ms) { 6071dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown fprintf(vibrator, "%d\n", ms); 6081dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown fflush(vibrator); 6091dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown} 6101dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown 611f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossint main(int argc, char *argv[]) { 612885f888c55587e9366542b5155a06c321cde175aJohn Michelau struct sigaction sigact; 613f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int do_add_date = 0; 6141f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau int do_vibrate = 1; 615f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char* use_outfile = 0; 616f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int use_socket = 0; 617f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int do_fb = 0; 61827f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey int do_broadcast = 0; 619f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 6201e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich if (getuid() != 0) { 6211e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich // Old versions of the adb client would call the 6221e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich // dumpstate command directly. Newer clients 6231e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich // call /system/bin/bugreport instead. If we detect 6241e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich // we're being called incorrectly, then exec the 6251e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich // correct program. 6261e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich return execl("/system/bin/bugreport", "/system/bin/bugreport", NULL); 6271e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich } 628f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 6291dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown ALOGI("begin\n"); 6302e671bbdb741c2926b6df7b240fdc31c7361f330Andres Morales 6311dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* clear SIGPIPE handler */ 632885f888c55587e9366542b5155a06c321cde175aJohn Michelau memset(&sigact, 0, sizeof(sigact)); 633885f888c55587e9366542b5155a06c321cde175aJohn Michelau sigact.sa_handler = sigpipe_handler; 634885f888c55587e9366542b5155a06c321cde175aJohn Michelau sigaction(SIGPIPE, &sigact, NULL); 6353e03d3fb6a4cb93f5f978f9d2eed7b7cc62a06a6JP Abgrall 636f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* set as high priority, and protect from OOM killer */ 637f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross setpriority(PRIO_PROCESS, 0, -20); 638cd67e9f059e270017d5defd8784c89dd8e6bcde7Nick Kralevich FILE *oom_adj = fopen("/proc/self/oom_adj", "we"); 639f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (oom_adj) { 640f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fputs("-17", oom_adj); 641f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fclose(oom_adj); 642f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 643f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 6441dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* parse arguments */ 645f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int c; 6461dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown while ((c = getopt(argc, argv, "dho:svqzpB")) != -1) { 647f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross switch (c) { 648f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case 'd': do_add_date = 1; break; 649f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case 'o': use_outfile = optarg; break; 650f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case 's': use_socket = 1; break; 651f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case 'v': break; // compatibility no-op 6521f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau case 'q': do_vibrate = 0; break; 653f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case 'p': do_fb = 1; break; 65427f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey case 'B': do_broadcast = 1; break; 655f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case '?': printf("\n"); 656f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case 'h': 657f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross usage(); 658f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross exit(1); 659f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 660f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 661f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 662ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris // If we are going to use a socket, do it as early as possible 663ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris // to avoid timeouts from bugreport. 664ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris if (use_socket) { 665ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris redirect_to_socket(stdout, "dumpstate"); 666ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris } 667ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris 6681dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* open the vibrator before dropping root */ 6691f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau FILE *vibrator = 0; 6701f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau if (do_vibrate) { 671cd67e9f059e270017d5defd8784c89dd8e6bcde7Nick Kralevich vibrator = fopen("/sys/class/timed_output/vibrator/enable", "we"); 6721dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown if (vibrator) { 6731dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown vibrate(vibrator, 150); 6741dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown } 6751f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau } 676f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 677f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* read /proc/cmdline before dropping root */ 678cd67e9f059e270017d5defd8784c89dd8e6bcde7Nick Kralevich FILE *cmdline = fopen("/proc/cmdline", "re"); 679f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (cmdline != NULL) { 680f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fgets(cmdline_buf, sizeof(cmdline_buf), cmdline); 681f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fclose(cmdline); 682f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 683f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 6841dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* collect stack traces from Dalvik and native processes (needs root) */ 6851dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown dump_traces_path = dump_traces(); 6861dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown 6871dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* Get the tombstone fds here while we are running as root. */ 6881dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown get_tombstone_fds(tombstone_data); 6891dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown 6901dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* ensure we will keep capabilities when we drop root */ 6911e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich if (prctl(PR_SET_KEEPCAPS, 1) < 0) { 6921e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich ALOGE("prctl(PR_SET_KEEPCAPS) failed: %s\n", strerror(errno)); 6931e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich return -1; 6941e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich } 695f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 6961e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich /* switch to non-root user and group */ 6971e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich gid_t groups[] = { AID_LOG, AID_SDCARD_R, AID_SDCARD_RW, 698ab46a4922655bc75848660da4268ab85d72a6010Nick Kralevich AID_MOUNT, AID_INET, AID_NET_BW_STATS, AID_READPROC }; 6991e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich if (setgroups(sizeof(groups)/sizeof(groups[0]), groups) != 0) { 7001e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich ALOGE("Unable to setgroups, aborting: %s\n", strerror(errno)); 7011e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich return -1; 7021e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich } 7031e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich if (setgid(AID_SHELL) != 0) { 7041e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich ALOGE("Unable to setgid, aborting: %s\n", strerror(errno)); 7051e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich return -1; 7061e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich } 7071e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich if (setuid(AID_SHELL) != 0) { 7081e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich ALOGE("Unable to setuid, aborting: %s\n", strerror(errno)); 7091e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich return -1; 7101e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich } 711f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 7121e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich struct __user_cap_header_struct capheader; 7131e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich struct __user_cap_data_struct capdata[2]; 7141e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich memset(&capheader, 0, sizeof(capheader)); 7151e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich memset(&capdata, 0, sizeof(capdata)); 7161e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich capheader.version = _LINUX_CAPABILITY_VERSION_3; 7171e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich capheader.pid = 0; 7181e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich 7191e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich capdata[CAP_TO_INDEX(CAP_SYSLOG)].permitted = CAP_TO_MASK(CAP_SYSLOG); 7201e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich capdata[CAP_TO_INDEX(CAP_SYSLOG)].effective = CAP_TO_MASK(CAP_SYSLOG); 7211e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich capdata[0].inheritable = 0; 7221e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich capdata[1].inheritable = 0; 7231e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich 7241e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich if (capset(&capheader, &capdata[0]) < 0) { 7251e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich ALOGE("capset failed: %s\n", strerror(errno)); 7261e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich return -1; 727f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 728f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 7291dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* redirect output if needed */ 730f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char path[PATH_MAX], tmp_path[PATH_MAX]; 731f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross pid_t gzip_pid = -1; 732f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 733ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris if (!use_socket && use_outfile) { 734f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcpy(path, use_outfile, sizeof(path)); 735f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (do_add_date) { 736f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char date[80]; 737f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross time_t now = time(NULL); 738f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strftime(date, sizeof(date), "-%Y-%m-%d-%H-%M-%S", localtime(&now)); 739f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcat(path, date, sizeof(path)); 740f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 741f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (do_fb) { 742f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcpy(screenshot_path, path, sizeof(screenshot_path)); 743f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcat(screenshot_path, ".png", sizeof(screenshot_path)); 744f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 745f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcat(path, ".txt", sizeof(path)); 746f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcpy(tmp_path, path, sizeof(tmp_path)); 747f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcat(tmp_path, ".tmp", sizeof(tmp_path)); 748ff4a4dc7e6e3ead12020b4dc17548d767a419ddeChristopher Ferris redirect_to_file(stdout, tmp_path); 749f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 750f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 751f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dumpstate(); 752f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 7531dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* done */ 7541dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown if (vibrator) { 7551dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown for (int i = 0; i < 3; i++) { 7561dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown vibrate(vibrator, 75); 757f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross usleep((75 + 50) * 1000); 758f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 759f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fclose(vibrator); 760f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 761f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 762f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* wait for gzip to finish, otherwise it might get killed when we exit */ 763f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (gzip_pid > 0) { 764f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fclose(stdout); 765f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross waitpid(gzip_pid, NULL, 0); 766f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 767f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 768f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* rename the (now complete) .tmp file to its final location */ 769f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (use_outfile && rename(tmp_path, path)) { 770f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fprintf(stderr, "rename(%s, %s): %s\n", tmp_path, path, strerror(errno)); 771f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 772f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 7731dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* tell activity manager we're done */ 77427f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey if (do_broadcast && use_outfile && do_fb) { 775aaaa57bf8904ef383a9e766ace09725bc392acebJeff Sharkey run_command(NULL, 5, "/system/bin/am", "broadcast", "--user", "0", 77627f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey "-a", "android.intent.action.BUGREPORT_FINISHED", 77727f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey "--es", "android.intent.extra.BUGREPORT", path, 77827f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey "--es", "android.intent.extra.SCREENSHOT", screenshot_path, 77927f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey "--receiver-permission", "android.permission.DUMP", NULL); 78027f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey } 78127f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey 782f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross ALOGI("done\n"); 783f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 784f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross return 0; 785f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross} 786