dumpstate.cpp revision 01d6c3935ace93f208fa3d93802b286e7484cfae
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 11601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 11701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// stat offsets 11801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// Name units description 11901d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// ---- ----- ----------- 12001d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// read I/Os requests number of read I/Os processed 12101d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define __STAT_READ_IOS 0 12201d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// read merges requests number of read I/Os merged with in-queue I/O 12301d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define __STAT_READ_MERGES 1 12401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// read sectors sectors number of sectors read 12501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define __STAT_READ_SECTORS 2 12601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// read ticks milliseconds total wait time for read requests 12701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define __STAT_READ_TICKS 3 12801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// write I/Os requests number of write I/Os processed 12901d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define __STAT_WRITE_IOS 4 13001d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// write merges requests number of write I/Os merged with in-queue I/O 13101d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define __STAT_WRITE_MERGES 5 13201d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// write sectors sectors number of sectors written 13301d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define __STAT_WRITE_SECTORS 6 13401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// write ticks milliseconds total wait time for write requests 13501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define __STAT_WRITE_TICKS 7 13601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// in_flight requests number of I/Os currently in flight 13701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define __STAT_IN_FLIGHT 8 13801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// io_ticks milliseconds total time this block device has been active 13901d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define __STAT_IO_TICKS 9 14001d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// time_in_queue milliseconds total wait time for all requests 14101d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define __STAT_IN_QUEUE 10 14201d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define __STAT_NUMBER_FIELD 11 14301d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 14401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// read I/Os, write I/Os 14501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// ===================== 14601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 14701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// These values increment when an I/O request completes. 14801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 14901d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// read merges, write merges 15001d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// ========================= 15101d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 15201d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// These values increment when an I/O request is merged with an 15301d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// already-queued I/O request. 15401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 15501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// read sectors, write sectors 15601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// =========================== 15701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 15801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// These values count the number of sectors read from or written to this 15901d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// block device. The "sectors" in question are the standard UNIX 512-byte 16001d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// sectors, not any device- or filesystem-specific block size. The 16101d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// counters are incremented when the I/O completes. 16201d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define SECTOR_SIZE 512 16301d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 16401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// read ticks, write ticks 16501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// ======================= 16601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 16701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// These values count the number of milliseconds that I/O requests have 16801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// waited on this block device. If there are multiple I/O requests waiting, 16901d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// these values will increase at a rate greater than 1000/second; for 17001d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// example, if 60 read requests wait for an average of 30 ms, the read_ticks 17101d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// field will increase by 60*30 = 1800. 17201d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 17301d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// in_flight 17401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// ========= 17501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 17601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// This value counts the number of I/O requests that have been issued to 17701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// the device driver but have not yet completed. It does not include I/O 17801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// requests that are in the queue but not yet issued to the device driver. 17901d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 18001d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// io_ticks 18101d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// ======== 18201d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 18301d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// This value counts the number of milliseconds during which the device has 18401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// had I/O requests queued. 18501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 18601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// time_in_queue 18701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// ============= 18801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 18901d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// This value counts the number of milliseconds that I/O requests have waited 19001d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// on this block device. If there are multiple I/O requests waiting, this 19101d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// value will increase as the product of the number of milliseconds times the 19201d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// number of requests waiting (see "read ticks" above for an example). 19301d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn#define S_TO_MS 1000 19401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn// 19501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn 196326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzynstatic int dump_stat_from_fd(const char *title __unused, const char *path, int fd) { 19701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn unsigned long long fields[__STAT_NUMBER_FIELD]; 198326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn bool z; 199326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn char *cp, *buffer = NULL; 200326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn size_t i = 0; 201326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn FILE *fp = fdopen(fd, "rb"); 202326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn getline(&buffer, &i, fp); 203326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn fclose(fp); 204326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (!buffer) { 205326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn return -errno; 206326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 207326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn i = strlen(buffer); 208326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn while ((i > 0) && (buffer[i - 1] == '\n')) { 209326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn buffer[--i] = '\0'; 210326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 211326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (!*buffer) { 212326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn free(buffer); 213326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn return 0; 214326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 215326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn z = true; 216326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn for (cp = buffer, i = 0; i < (sizeof(fields) / sizeof(fields[0])); ++i) { 21701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn fields[i] = strtoull(cp, &cp, 10); 218326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (fields[i] != 0) { 219326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn z = false; 220326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 221326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 222326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (z) { /* never accessed */ 223326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn free(buffer); 224326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn return 0; 225326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 226326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn 227326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn if (!strncmp(path, mmcblk0, sizeof(mmcblk0) - 1)) { 228326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn path += sizeof(mmcblk0) - 1; 229326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn } 230326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn 231326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn printf("%s: %s\n", path, buffer); 232326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn free(buffer); 233326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn 23401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn if (fields[__STAT_IO_TICKS]) { 23501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn unsigned long read_perf = 0; 23601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn unsigned long read_ios = 0; 23701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn if (fields[__STAT_READ_TICKS]) { 23801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn unsigned long long divisor = fields[__STAT_READ_TICKS] 23901d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn * fields[__STAT_IO_TICKS]; 24001d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn read_perf = ((unsigned long long)SECTOR_SIZE 24101d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn * fields[__STAT_READ_SECTORS] 24201d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn * fields[__STAT_IN_QUEUE] + (divisor >> 1)) 24301d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn / divisor; 24401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn read_ios = ((unsigned long long)S_TO_MS * fields[__STAT_READ_IOS] 24501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn * fields[__STAT_IN_QUEUE] + (divisor >> 1)) 24601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn / divisor; 24701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn } 24801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn 24901d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn unsigned long write_perf = 0; 25001d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn unsigned long write_ios = 0; 25101d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn if (fields[__STAT_WRITE_TICKS]) { 25201d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn unsigned long long divisor = fields[__STAT_WRITE_TICKS] 25301d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn * fields[__STAT_IO_TICKS]; 25401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn write_perf = ((unsigned long long)SECTOR_SIZE 25501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn * fields[__STAT_WRITE_SECTORS] 25601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn * fields[__STAT_IN_QUEUE] + (divisor >> 1)) 25701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn / divisor; 25801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn write_ios = ((unsigned long long)S_TO_MS * fields[__STAT_WRITE_IOS] 25901d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn * fields[__STAT_IN_QUEUE] + (divisor >> 1)) 26001d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn / divisor; 26101d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn } 26201d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn 26301d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn unsigned queue = (fields[__STAT_IN_QUEUE] 26401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn + (fields[__STAT_IO_TICKS] >> 1)) 26501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn / fields[__STAT_IO_TICKS]; 26601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn 26701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn if (!write_perf && !write_ios) { 26801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn printf("%s: perf(ios) rd: %luKB/s(%lu/s) q: %u\n", 26901d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn path, read_perf, read_ios, queue); 27001d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn } else { 27101d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn printf("%s: perf(ios) rd: %luKB/s(%lu/s) wr: %luKB/s(%lu/s) q: %u\n", 27201d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn path, read_perf, read_ios, write_perf, write_ios, queue); 27301d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn } 27401d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn 27501d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn /* bugreport timeout factor adjustment */ 27601d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn if ((write_perf > 1) && (write_perf < worst_write_perf)) { 27701d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn worst_write_perf = write_perf; 27801d6c3935ace93f208fa3d93802b286e7484cfaeMark Salyzyn } 2798f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 280326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn return 0; 281326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn} 282326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn 2838f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn/* Copied policy from system/core/logd/LogBuffer.cpp */ 2848f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2858f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn#define LOG_BUFFER_SIZE (256 * 1024) 2868f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn#define LOG_BUFFER_MIN_SIZE (64 * 1024UL) 2878f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn#define LOG_BUFFER_MAX_SIZE (256 * 1024 * 1024UL) 2888f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2898f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzynstatic bool valid_size(unsigned long value) { 2908f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if ((value < LOG_BUFFER_MIN_SIZE) || (LOG_BUFFER_MAX_SIZE < value)) { 2918f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn return false; 2928f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 2938f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2948f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn long pages = sysconf(_SC_PHYS_PAGES); 2958f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (pages < 1) { 2968f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn return true; 2978f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 2988f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 2998f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn long pagesize = sysconf(_SC_PAGESIZE); 3008f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (pagesize <= 1) { 3018f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn pagesize = PAGE_SIZE; 3028f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 3038f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3048f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn // maximum memory impact a somewhat arbitrary ~3% 3058f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn pages = (pages + 31) / 32; 3068f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn unsigned long maximum = pages * pagesize; 3078f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3088f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if ((maximum < LOG_BUFFER_MIN_SIZE) || (LOG_BUFFER_MAX_SIZE < maximum)) { 3098f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn return true; 3108f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 3118f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3128f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn return value <= maximum; 3138f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn} 3148f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3158f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzynstatic unsigned long property_get_size(const char *key) { 3168f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn unsigned long value; 3178f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn char *cp, property[PROPERTY_VALUE_MAX]; 3188f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3198f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn property_get(key, property, ""); 3208f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn value = strtoul(property, &cp, 10); 3218f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3228f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn switch(*cp) { 3238f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn case 'm': 3248f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn case 'M': 3258f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn value *= 1024; 3268f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn /* FALLTHRU */ 3278f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn case 'k': 3288f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn case 'K': 3298f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn value *= 1024; 3308f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn /* FALLTHRU */ 3318f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn case '\0': 3328f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn break; 3338f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3348f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn default: 3358f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn value = 0; 3368f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 3378f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3388f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (!valid_size(value)) { 3398f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn value = 0; 3408f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 3418f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3428f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn return value; 3438f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn} 3448f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3458f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn/* timeout in ms */ 346515eb0db0a03de0a721ef034b3f3898e1d7e42e7Felipe Lemestatic unsigned long logcat_timeout(const char *name) { 3478f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn static const char global_tuneable[] = "persist.logd.size"; // Settings App 3488f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn static const char global_default[] = "ro.logd.size"; // BoardConfig.mk 3498f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn char key[PROP_NAME_MAX]; 3508f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn unsigned long property_size, default_size; 3518f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3528f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn default_size = property_get_size(global_tuneable); 3538f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (!default_size) { 3548f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn default_size = property_get_size(global_default); 3558f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 3568f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3578f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn snprintf(key, sizeof(key), "%s.%s", global_tuneable, name); 3588f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn property_size = property_get_size(key); 3598f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3608f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (!property_size) { 3618f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn snprintf(key, sizeof(key), "%s.%s", global_default, name); 3628f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn property_size = property_get_size(key); 3638f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 3648f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3658f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (!property_size) { 3668f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn property_size = default_size; 3678f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 3688f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3698f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (!property_size) { 3708f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn property_size = LOG_BUFFER_SIZE; 3718f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 3728f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3738f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn /* Engineering margin is ten-fold our guess */ 3748f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn return 10 * (property_size + worst_write_perf) / worst_write_perf; 3758f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn} 3768f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 3778f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn/* End copy from system/core/logd/LogBuffer.cpp */ 3788f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn 379f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross/* dumps the current system state to stdout */ 380f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossstatic void dumpstate() { 3818f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn unsigned long timeout; 382f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross time_t now = time(NULL); 383f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char build[PROPERTY_VALUE_MAX], fingerprint[PROPERTY_VALUE_MAX]; 384f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char radio[PROPERTY_VALUE_MAX], bootloader[PROPERTY_VALUE_MAX]; 385f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char network[PROPERTY_VALUE_MAX], date[80]; 386f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char build_type[PROPERTY_VALUE_MAX]; 387f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 388f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("ro.build.display.id", build, "(unknown)"); 389f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("ro.build.fingerprint", fingerprint, "(unknown)"); 390f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("ro.build.type", build_type, "(unknown)"); 391f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("ro.baseband", radio, "(unknown)"); 392f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("ro.bootloader", bootloader, "(unknown)"); 393f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("gsm.operator.alpha", network, "(unknown)"); 394f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&now)); 395f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 396f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 397f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== dumpstate: %s\n", date); 398f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 399f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 400f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("\n"); 401f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Build: %s\n", build); 402f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Build fingerprint: '%s'\n", fingerprint); /* format is important for other tools */ 403f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Bootloader: %s\n", bootloader); 404f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Radio: %s\n", radio); 405f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Network: %s\n", network); 406f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 407f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Kernel: "); 408f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file(NULL, "/proc/version"); 409f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Command line: %s\n", strtok(cmdline_buf, "\n")); 410f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("\n"); 411f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 4122db0f5f31c015b5a89b619f8c95a9bf95c09c75bArve Hjønnevåg dump_dev_files("TRUSTY VERSION", "/sys/bus/platform/drivers/trusty", "trusty_version"); 413f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("UPTIME", 10, "uptime", NULL); 414326842fca4883f1256aa9ed019bb3206ee76fca7Mark Salyzyn dump_files("UPTIME MMC PERF", mmcblk0, skip_not_stat, dump_stat_from_fd); 4158c8130eb68c89987a94db084608a4229bad06c18Mark Salyzyn dump_emmc_ecsd("/d/mmc0/mmc0:0001/ext_csd"); 416f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("MEMORY INFO", "/proc/meminfo"); 417b32c7e14ccc6507f6ce3fc02414ba04b797f4558Elliott Hughes run_command("CPU INFO", 10, "top", "-n", "1", "-d", "1", "-m", "30", "-H", NULL); 4182b1f88b6ac78e330ff006da6fecf8bc9d976ec67Nick Kralevich run_command("PROCRANK", 20, SU_PATH, "root", "procrank", NULL); 419f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("VIRTUAL MEMORY STATS", "/proc/vmstat"); 420f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("VMALLOC INFO", "/proc/vmallocinfo"); 421f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("SLAB INFO", "/proc/slabinfo"); 422f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("ZONEINFO", "/proc/zoneinfo"); 423f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("PAGETYPEINFO", "/proc/pagetypeinfo"); 424f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("BUDDYINFO", "/proc/buddyinfo"); 4252281af967dd840aade7bc55b19ea7df0e6da36f2Colin Cross dump_file("FRAGMENTATION INFO", "/d/extfrag/unusable_index"); 426f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 427f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("KERNEL WAKELOCKS", "/proc/wakelocks"); 42829e27a84c144fe3b941648094cad2a3f1e61e8b3Todd Poynor dump_file("KERNEL WAKE SOURCES", "/d/wakeup_sources"); 429f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("KERNEL CPUFREQ", "/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state"); 43085aea748861b5665e68b786b55f1c798f56fc0daMathias Agopian dump_file("KERNEL SYNC", "/d/sync"); 431f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 432a3533a3ae6bf8d0e1780c153cafdec86926ec22cElliott Hughes run_command("PROCESSES AND THREADS", 10, "ps", "-Z", "-t", "-p", "-P", NULL); 433f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("LIBRANK", 10, "librank", NULL); 434f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 435f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross do_dmesg(); 436f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 437f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("LIST OF OPEN FILES", 10, SU_PATH, "root", "lsof", NULL); 4381dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown for_each_pid(do_showmap, "SMAPS OF ALL PROCESSES"); 4391dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown for_each_tid(show_wchan, "BLOCKED PROCESS WAIT-CHANNELS"); 440f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 4415a93003d3f0d1808b6dcd9928041ec62ea7f67adJeff Sharkey if (screenshot_path[0]) { 4425a93003d3f0d1808b6dcd9928041ec62ea7f67adJeff Sharkey ALOGI("taking screenshot\n"); 4435a93003d3f0d1808b6dcd9928041ec62ea7f67adJeff Sharkey run_command(NULL, 10, "/system/bin/screencap", "-p", screenshot_path, NULL); 4445a93003d3f0d1808b6dcd9928041ec62ea7f67adJeff Sharkey ALOGI("wrote screenshot: %s\n", screenshot_path); 4455a93003d3f0d1808b6dcd9928041ec62ea7f67adJeff Sharkey } 4465a93003d3f0d1808b6dcd9928041ec62ea7f67adJeff Sharkey 447f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross // dump_file("EVENT LOG TAGS", "/etc/event-log-tags"); 4488f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn // calculate timeout 4498f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn timeout = logcat_timeout("main") + logcat_timeout("system") + logcat_timeout("crash"); 4508f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (timeout < 20000) { 4518f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn timeout = 20000; 4528f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 4537831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn run_command("SYSTEM LOG", timeout / 1000, "logcat", "-v", "threadtime", 4547831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "printable", 4557831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-d", 4567831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "*:v", NULL); 45743afe5d0b537999d5de9613626eca24f34cc52efMark Salyzyn timeout = logcat_timeout("events"); 4588f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (timeout < 20000) { 4598f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn timeout = 20000; 4608f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 4617831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn run_command("EVENT LOG", timeout / 1000, "logcat", "-b", "events", 4627831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "threadtime", 4637831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "printable", 4647831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-d", 4657831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "*:v", NULL); 4668f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn timeout = logcat_timeout("radio"); 4678f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn if (timeout < 20000) { 4688f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn timeout = 20000; 4698f37aa5011bf5d8c0a67126b92e3b435ffd4dca0Mark Salyzyn } 4707831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn run_command("RADIO LOG", timeout / 1000, "logcat", "-b", "radio", 4717831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "threadtime", 4727831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "printable", 4737831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-d", 4747831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "*:v", NULL); 475f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 476ecc0763e6c96c418ea4ee6c993d58d16a58407b3Mark Salyzyn run_command("LOG STATISTICS", 10, "logcat", "-b", "all", "-S", NULL); 477ecc0763e6c96c418ea4ee6c993d58d16a58407b3Mark Salyzyn 47831baf8d3c2833d13056b0be679f66ed0e53c8d26Jason Parks run_command("RAFT LOGS", 300, SU_PATH, "root", "logcompressor", "-r", RAFT_DIR, NULL); 4798d4cb7ffc11050eebb4d06684e0eb14d9aadacb5Sharvil Nanavati 480f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* show the traces we collected in main(), if that was done */ 481f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (dump_traces_path != NULL) { 482f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("VM TRACES JUST NOW", dump_traces_path); 483f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 484f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 485f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* only show ANR traces if they're less than 15 minutes old */ 486f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross struct stat st; 487f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char anr_traces_path[PATH_MAX]; 488f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("dalvik.vm.stack-trace-file", anr_traces_path, ""); 489f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (!anr_traces_path[0]) { 490f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("*** NO VM TRACES FILE DEFINED (dalvik.vm.stack-trace-file)\n\n"); 491f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } else { 49254bcc5ffd5a79f4f194089c58d3de571532bf39bChristopher Ferris int fd = TEMP_FAILURE_RETRY(open(anr_traces_path, 49354bcc5ffd5a79f4f194089c58d3de571532bf39bChristopher Ferris O_RDONLY | O_CLOEXEC | O_NOFOLLOW | O_NONBLOCK)); 4947dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris if (fd < 0) { 4957dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris printf("*** NO ANR VM TRACES FILE (%s): %s\n\n", anr_traces_path, strerror(errno)); 4967dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } else { 4977dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris dump_file_from_fd("VM TRACES AT LAST ANR", anr_traces_path, fd); 4987dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } 499f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 500f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 501f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* slow traces for slow operations */ 502f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (anr_traces_path[0] != 0) { 503f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int tail = strlen(anr_traces_path)-1; 504f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross while (tail > 0 && anr_traces_path[tail] != '/') { 505f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross tail--; 506f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 507f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int i = 0; 508f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross while (1) { 509f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross sprintf(anr_traces_path+tail+1, "slow%02d.txt", i); 510f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (stat(anr_traces_path, &st)) { 511f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross // No traces file at this index, done with the files. 512f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross break; 513f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 514f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("VM TRACES WHEN SLOW", anr_traces_path); 515f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross i++; 516f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 517f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 518f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 5197dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris int dumped = 0; 5207dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris for (size_t i = 0; i < NUM_TOMBSTONES; i++) { 5217dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris if (tombstone_data[i].fd != -1) { 5227dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris dumped = 1; 5237dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris dump_file_from_fd("TOMBSTONE", tombstone_data[i].name, tombstone_data[i].fd); 5247dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris tombstone_data[i].fd = -1; 5257dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } 5267dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } 5277dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris if (!dumped) { 5287dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris printf("*** NO TOMBSTONES to dump in %s\n\n", TOMBSTONE_DIR); 5297dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris } 5307dc7f3221f26b771c266a26ec785eb74287922f1Christopher Ferris 531f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("NETWORK DEV INFO", "/proc/net/dev"); 532f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("QTAGUID NETWORK INTERFACES INFO", "/proc/net/xt_qtaguid/iface_stat_all"); 533012c2ea5651a56218a4359c78db26dd700d9930bJP Abgrall dump_file("QTAGUID NETWORK INTERFACES INFO (xt)", "/proc/net/xt_qtaguid/iface_stat_fmt"); 534f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("QTAGUID CTRL INFO", "/proc/net/xt_qtaguid/ctrl"); 535f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("QTAGUID STATS INFO", "/proc/net/xt_qtaguid/stats"); 536f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 5372a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor if (!stat(PSTORE_LAST_KMSG, &st)) { 5382a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor /* Also TODO: Make console-ramoops CAP_SYSLOG protected. */ 5392a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor dump_file("LAST KMSG", PSTORE_LAST_KMSG); 5402a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor } else { 5412a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor /* TODO: Make last_kmsg CAP_SYSLOG protected. b/5555691 */ 5422a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor dump_file("LAST KMSG", "/proc/last_kmsg"); 5432a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor } 5442a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor 5452262c16372570f57d3107d574abe2c80825d286eMark Salyzyn /* kernels must set CONFIG_PSTORE_PMSG, slice up pstore with device tree */ 5467831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn run_command("LAST LOGCAT", 10, "logcat", "-L", 5477831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-b", "all", 5487831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "threadtime", 5497831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-v", "printable", 5507831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "-d", 5517831638e2a142cbb082d63a60ad5c04ff63933e8Mark Salyzyn "*:v", NULL); 5522262c16372570f57d3107d574abe2c80825d286eMark Salyzyn 553f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* The following have a tendency to get wedged when wifi drivers/fw goes belly-up. */ 554a59828a5d2740433164872e9a0b44363e2ba0cd4Elliott Hughes 555a59828a5d2740433164872e9a0b44363e2ba0cd4Elliott Hughes run_command("NETWORK INTERFACES", 10, "ip", "link", NULL); 556d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti 557d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti run_command("IPv4 ADDRESSES", 10, "ip", "-4", "addr", "show", NULL); 558d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti run_command("IPv6 ADDRESSES", 10, "ip", "-6", "addr", "show", NULL); 559d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti 560f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("IP RULES", 10, "ip", "rule", "show", NULL); 561f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("IP RULES v6", 10, "ip", "-6", "rule", "show", NULL); 5622b3bba34aec65b612be8d1f52cd124d9c30955f9Sreeram Ramachandran 5632b3bba34aec65b612be8d1f52cd124d9c30955f9Sreeram Ramachandran dump_route_tables(); 5642b3bba34aec65b612be8d1f52cd124d9c30955f9Sreeram Ramachandran 565d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti run_command("ARP CACHE", 10, "ip", "-4", "neigh", "show", NULL); 566d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti run_command("IPv6 ND CACHE", 10, "ip", "-6", "neigh", "show", NULL); 567d4c3d38957870fa27423dbc55d99d68772fbd490Lorenzo Colitti 568f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("IPTABLES", 10, SU_PATH, "root", "iptables", "-L", "-nvx", NULL); 569f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("IP6TABLES", 10, SU_PATH, "root", "ip6tables", "-L", "-nvx", NULL); 570012c2ea5651a56218a4359c78db26dd700d9930bJP Abgrall run_command("IPTABLE NAT", 10, SU_PATH, "root", "iptables", "-t", "nat", "-L", "-nvx", NULL); 571012c2ea5651a56218a4359c78db26dd700d9930bJP Abgrall /* no ip6 nat */ 572012c2ea5651a56218a4359c78db26dd700d9930bJP Abgrall run_command("IPTABLE RAW", 10, SU_PATH, "root", "iptables", "-t", "raw", "-L", "-nvx", NULL); 573012c2ea5651a56218a4359c78db26dd700d9930bJP Abgrall run_command("IP6TABLE RAW", 10, SU_PATH, "root", "ip6tables", "-t", "raw", "-L", "-nvx", NULL); 574f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 575f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("WIFI NETWORKS", 20, 5761d6b97c869718001010cce3db387c73fd11bf32eDmitry Shmidt SU_PATH, "root", "wpa_cli", "IFNAME=wlan0", "list_networks", NULL); 577f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 578c11f56e5615c5d388c072705322df5bcf22c2012Dmitry Shmidt#ifdef FWDUMP_bcmdhd 5796afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti run_command("ND OFFLOAD TABLE", 5, 5806afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti SU_PATH, "root", "wlutil", "nd_hostip", NULL); 5816afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti 5826afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti run_command("DUMP WIFI INTERNAL COUNTERS (1)", 20, 583c11f56e5615c5d388c072705322df5bcf22c2012Dmitry Shmidt SU_PATH, "root", "wlutil", "counters", NULL); 5846afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti 5856afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti run_command("ND OFFLOAD STATUS (1)", 5, 5866afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti SU_PATH, "root", "wlutil", "nd_status", NULL); 5876afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti 588c11f56e5615c5d388c072705322df5bcf22c2012Dmitry Shmidt#endif 5890b2c9268265e9a165551eaa66cb461d3fab8b564Dmitry Shmidt dump_file("INTERRUPTS (1)", "/proc/interrupts"); 5900b2c9268265e9a165551eaa66cb461d3fab8b564Dmitry Shmidt 5916afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti run_command("NETWORK DIAGNOSTICS", 10, "dumpsys", "connectivity", "--diag", NULL); 5926afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti 593c11f56e5615c5d388c072705322df5bcf22c2012Dmitry Shmidt#ifdef FWDUMP_bcmdhd 594f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("DUMP WIFI STATUS", 20, 595f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross SU_PATH, "root", "dhdutil", "-i", "wlan0", "dump", NULL); 5966afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti 5976afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti run_command("DUMP WIFI INTERNAL COUNTERS (2)", 20, 598f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross SU_PATH, "root", "wlutil", "counters", NULL); 5996afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti 6006afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti run_command("ND OFFLOAD STATUS (2)", 5, 6016afc38c45af45eb8f64793bca2903b3f4c55579bLorenzo Colitti SU_PATH, "root", "wlutil", "nd_status", NULL); 602f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross#endif 6030b2c9268265e9a165551eaa66cb461d3fab8b564Dmitry Shmidt dump_file("INTERRUPTS (2)", "/proc/interrupts"); 604f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 605f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross print_properties(); 606f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 607f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("VOLD DUMP", 10, "vdc", "dump", NULL); 608f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("SECURE CONTAINERS", 10, "vdc", "asec", "list", NULL); 609f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 6108f75fa7bcfec553eddb59b919b44d7a93c9846a1Ken Sumrall run_command("FILESYSTEMS & FREE SPACE", 10, "df", NULL); 611f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 612f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("LAST RADIO LOG", 10, "parse_radio_log", "/proc/last_radio_log", NULL); 613f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 614f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("------ BACKLIGHTS ------\n"); 615f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("LCD brightness="); 616f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file(NULL, "/sys/class/leds/lcd-backlight/brightness"); 617f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Button brightness="); 618f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file(NULL, "/sys/class/leds/button-backlight/brightness"); 619f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("Keyboard brightness="); 620f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file(NULL, "/sys/class/leds/keyboard-backlight/brightness"); 621f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("ALS mode="); 622f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file(NULL, "/sys/class/leds/lcd-backlight/als"); 623f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("LCD driver registers:\n"); 624f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file(NULL, "/sys/class/leds/lcd-backlight/registers"); 625f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("\n"); 626f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 627f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* Binder state is expensive to look at as it uses a lot of memory. */ 628f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("BINDER FAILED TRANSACTION LOG", "/sys/kernel/debug/binder/failed_transaction_log"); 629f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("BINDER TRANSACTION LOG", "/sys/kernel/debug/binder/transaction_log"); 630f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("BINDER TRANSACTIONS", "/sys/kernel/debug/binder/transactions"); 631f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("BINDER STATS", "/sys/kernel/debug/binder/stats"); 632f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dump_file("BINDER STATE", "/sys/kernel/debug/binder/state"); 633f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 634f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 635f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== Board\n"); 636f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 637f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 638f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dumpstate_board(); 639f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("\n"); 640f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 641f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* Migrate the ril_dumpstate to a dumpstate_board()? */ 642f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char ril_dumpstate_timeout[PROPERTY_VALUE_MAX] = {0}; 643f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross property_get("ril.dumpstate.timeout", ril_dumpstate_timeout, "30"); 644f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (strnlen(ril_dumpstate_timeout, PROPERTY_VALUE_MAX - 1) > 0) { 645f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (0 == strncmp(build_type, "user", PROPERTY_VALUE_MAX - 1)) { 646f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross // su does not exist on user builds, so try running without it. 647f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross // This way any implementations of vril-dump that do not require 648f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross // root can run on user builds. 649f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("DUMP VENDOR RIL LOGS", atoi(ril_dumpstate_timeout), 650f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross "vril-dump", NULL); 651f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } else { 652f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("DUMP VENDOR RIL LOGS", atoi(ril_dumpstate_timeout), 653f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross SU_PATH, "root", "vril-dump", NULL); 654f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 655f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 656f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 657f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 658f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== Android Framework Services\n"); 659f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 660f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 661f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* the full dumpsys is starting to take a long time, so we need 662f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross to increase its timeout. we really need to do the timeouts in 663f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dumpsys itself... */ 664f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("DUMPSYS", 60, "dumpsys", NULL); 665f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 666f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 66702bea9786d2ecc4c04f35fd7d9b73d4dd2b73735Dianne Hackborn printf("== Checkins\n"); 66802bea9786d2ecc4c04f35fd7d9b73d4dd2b73735Dianne Hackborn printf("========================================================\n"); 66902bea9786d2ecc4c04f35fd7d9b73d4dd2b73735Dianne Hackborn 67059b1516f4cefcfd599f4e5e9c4a227a48d1ace65Dianne Hackborn run_command("CHECKIN BATTERYSTATS", 30, "dumpsys", "batterystats", "-c", NULL); 6713e5fa73722c100fc9017c7a47b17a8e727aa34e1Dianne Hackborn run_command("CHECKIN MEMINFO", 30, "dumpsys", "meminfo", "--checkin", NULL); 67202bea9786d2ecc4c04f35fd7d9b73d4dd2b73735Dianne Hackborn run_command("CHECKIN NETSTATS", 30, "dumpsys", "netstats", "--checkin", NULL); 6735cd46aa3399ddeaf12a211390dfde66c796ab299Dianne Hackborn run_command("CHECKIN PROCSTATS", 30, "dumpsys", "procstats", "-c", NULL); 6741bd5068a5180ac12dda374e15c7b1f70e8334284Dianne Hackborn run_command("CHECKIN USAGESTATS", 30, "dumpsys", "usagestats", "-c", NULL); 6758b3e133e413774047da8005771f57c21dd31e1e3Ashish Sharma run_command("CHECKIN PACKAGE", 30, "dumpsys", "package", "--checkin", NULL); 67602bea9786d2ecc4c04f35fd7d9b73d4dd2b73735Dianne Hackborn 67702bea9786d2ecc4c04f35fd7d9b73d4dd2b73735Dianne Hackborn printf("========================================================\n"); 678f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== Running Application Activities\n"); 679f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 680f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 681f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("APP ACTIVITIES", 30, "dumpsys", "activity", "all", NULL); 682f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 683f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 684f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== Running Application Services\n"); 685f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 686f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 687f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("APP SERVICES", 30, "dumpsys", "activity", "service", "all", NULL); 688f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 689f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 690f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== Running Application Providers\n"); 691f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 692f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 693f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross run_command("APP SERVICES", 30, "dumpsys", "activity", "provider", "all", NULL); 694f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 695f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 696f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 697f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("== dumpstate: done\n"); 698f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross printf("========================================================\n"); 699f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross} 700f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 701f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossstatic void usage() { 7021f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau fprintf(stderr, "usage: dumpstate [-b soundfile] [-e soundfile] [-o file [-d] [-p] [-z]] [-s] [-q]\n" 703f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross " -o: write to file (instead of stdout)\n" 704f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross " -d: append date to filename (requires -o)\n" 705f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross " -p: capture screenshot to filename.png (requires -o)\n" 706f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross " -s: write output to control socket (for init)\n" 707f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross " -b: play sound file instead of vibrate, at beginning of job\n" 708f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross " -e: play sound file instead of vibrate, at end of job\n" 7091f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau " -q: disable vibrate\n" 71027f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey " -B: send broadcast when finished (requires -o and -p)\n" 7112a83daa8a3e1eab292dc1464bbe78f025f4bc0e9Todd Poynor ); 712f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross} 713f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 714885f888c55587e9366542b5155a06c321cde175aJohn Michelaustatic void sigpipe_handler(int n) { 7152e671bbdb741c2926b6df7b240fdc31c7361f330Andres Morales // don't complain to stderr or stdout 7162e671bbdb741c2926b6df7b240fdc31c7361f330Andres Morales _exit(EXIT_FAILURE); 717885f888c55587e9366542b5155a06c321cde175aJohn Michelau} 718885f888c55587e9366542b5155a06c321cde175aJohn Michelau 7191dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brownstatic void vibrate(FILE* vibrator, int ms) { 7201dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown fprintf(vibrator, "%d\n", ms); 7211dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown fflush(vibrator); 7221dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown} 7231dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown 724f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Crossint main(int argc, char *argv[]) { 725885f888c55587e9366542b5155a06c321cde175aJohn Michelau struct sigaction sigact; 726f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int do_add_date = 0; 7271f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau int do_vibrate = 1; 728f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char* use_outfile = 0; 729f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int use_socket = 0; 730f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int do_fb = 0; 73127f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey int do_broadcast = 0; 732f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 7331e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich if (getuid() != 0) { 7341e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich // Old versions of the adb client would call the 7351e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich // dumpstate command directly. Newer clients 7361e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich // call /system/bin/bugreport instead. If we detect 7371e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich // we're being called incorrectly, then exec the 7381e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich // correct program. 7391e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich return execl("/system/bin/bugreport", "/system/bin/bugreport", NULL); 7401e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich } 741f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 7421dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown ALOGI("begin\n"); 7432e671bbdb741c2926b6df7b240fdc31c7361f330Andres Morales 7441dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* clear SIGPIPE handler */ 745885f888c55587e9366542b5155a06c321cde175aJohn Michelau memset(&sigact, 0, sizeof(sigact)); 746885f888c55587e9366542b5155a06c321cde175aJohn Michelau sigact.sa_handler = sigpipe_handler; 747885f888c55587e9366542b5155a06c321cde175aJohn Michelau sigaction(SIGPIPE, &sigact, NULL); 7483e03d3fb6a4cb93f5f978f9d2eed7b7cc62a06a6JP Abgrall 749f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* set as high priority, and protect from OOM killer */ 750f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross setpriority(PRIO_PROCESS, 0, -20); 751cd67e9f059e270017d5defd8784c89dd8e6bcde7Nick Kralevich FILE *oom_adj = fopen("/proc/self/oom_adj", "we"); 752f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (oom_adj) { 753f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fputs("-17", oom_adj); 754f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fclose(oom_adj); 755f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 756f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 7571dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* parse arguments */ 758f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross int c; 7591dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown while ((c = getopt(argc, argv, "dho:svqzpB")) != -1) { 760f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross switch (c) { 761f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case 'd': do_add_date = 1; break; 762f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case 'o': use_outfile = optarg; break; 763f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case 's': use_socket = 1; break; 764f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case 'v': break; // compatibility no-op 7651f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau case 'q': do_vibrate = 0; break; 766f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case 'p': do_fb = 1; break; 76727f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey case 'B': do_broadcast = 1; break; 768f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case '?': printf("\n"); 769f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross case 'h': 770f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross usage(); 771f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross exit(1); 772f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 773f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 774f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 775ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris // If we are going to use a socket, do it as early as possible 776ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris // to avoid timeouts from bugreport. 777ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris if (use_socket) { 778ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris redirect_to_socket(stdout, "dumpstate"); 779ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris } 780ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris 7811dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* open the vibrator before dropping root */ 7821f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau FILE *vibrator = 0; 7831f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau if (do_vibrate) { 784cd67e9f059e270017d5defd8784c89dd8e6bcde7Nick Kralevich vibrator = fopen("/sys/class/timed_output/vibrator/enable", "we"); 7851dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown if (vibrator) { 7861dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown vibrate(vibrator, 150); 7871dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown } 7881f794c442cc63f7962c21e8e712adeca338af63eJohn Michelau } 789f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 790f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* read /proc/cmdline before dropping root */ 791cd67e9f059e270017d5defd8784c89dd8e6bcde7Nick Kralevich FILE *cmdline = fopen("/proc/cmdline", "re"); 792f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (cmdline != NULL) { 793f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fgets(cmdline_buf, sizeof(cmdline_buf), cmdline); 794f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fclose(cmdline); 795f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 796f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 7971dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* collect stack traces from Dalvik and native processes (needs root) */ 7981dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown dump_traces_path = dump_traces(); 7991dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown 8001dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* Get the tombstone fds here while we are running as root. */ 8011dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown get_tombstone_fds(tombstone_data); 8021dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown 8031dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* ensure we will keep capabilities when we drop root */ 8041e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich if (prctl(PR_SET_KEEPCAPS, 1) < 0) { 8051e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich ALOGE("prctl(PR_SET_KEEPCAPS) failed: %s\n", strerror(errno)); 8061e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich return -1; 8071e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich } 808f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 8091e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich /* switch to non-root user and group */ 8101e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich gid_t groups[] = { AID_LOG, AID_SDCARD_R, AID_SDCARD_RW, 811ab46a4922655bc75848660da4268ab85d72a6010Nick Kralevich AID_MOUNT, AID_INET, AID_NET_BW_STATS, AID_READPROC }; 8121e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich if (setgroups(sizeof(groups)/sizeof(groups[0]), groups) != 0) { 8131e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich ALOGE("Unable to setgroups, aborting: %s\n", strerror(errno)); 8141e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich return -1; 8151e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich } 8161e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich if (setgid(AID_SHELL) != 0) { 8171e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich ALOGE("Unable to setgid, aborting: %s\n", strerror(errno)); 8181e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich return -1; 8191e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich } 8201e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich if (setuid(AID_SHELL) != 0) { 8211e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich ALOGE("Unable to setuid, aborting: %s\n", strerror(errno)); 8221e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich return -1; 8231e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich } 824f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 8251e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich struct __user_cap_header_struct capheader; 8261e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich struct __user_cap_data_struct capdata[2]; 8271e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich memset(&capheader, 0, sizeof(capheader)); 8281e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich memset(&capdata, 0, sizeof(capdata)); 8291e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich capheader.version = _LINUX_CAPABILITY_VERSION_3; 8301e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich capheader.pid = 0; 8311e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich 8321e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich capdata[CAP_TO_INDEX(CAP_SYSLOG)].permitted = CAP_TO_MASK(CAP_SYSLOG); 8331e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich capdata[CAP_TO_INDEX(CAP_SYSLOG)].effective = CAP_TO_MASK(CAP_SYSLOG); 8341e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich capdata[0].inheritable = 0; 8351e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich capdata[1].inheritable = 0; 8361e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich 8371e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich if (capset(&capheader, &capdata[0]) < 0) { 8381e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich ALOGE("capset failed: %s\n", strerror(errno)); 8391e339878c128ef47271278779c2685a8dfa49cd1Nick Kralevich return -1; 840f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 841f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 8421dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* redirect output if needed */ 843f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char path[PATH_MAX], tmp_path[PATH_MAX]; 844f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross pid_t gzip_pid = -1; 845f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 846ed9354fc846895dc53397fbb5323bef00b3a3834Christopher Ferris if (!use_socket && use_outfile) { 847f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcpy(path, use_outfile, sizeof(path)); 848f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (do_add_date) { 849f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross char date[80]; 850f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross time_t now = time(NULL); 851f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strftime(date, sizeof(date), "-%Y-%m-%d-%H-%M-%S", localtime(&now)); 852f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcat(path, date, sizeof(path)); 853f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 854f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (do_fb) { 855f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcpy(screenshot_path, path, sizeof(screenshot_path)); 856f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcat(screenshot_path, ".png", sizeof(screenshot_path)); 857f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 858f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcat(path, ".txt", sizeof(path)); 859f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcpy(tmp_path, path, sizeof(tmp_path)); 860f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross strlcat(tmp_path, ".tmp", sizeof(tmp_path)); 861ff4a4dc7e6e3ead12020b4dc17548d767a419ddeChristopher Ferris redirect_to_file(stdout, tmp_path); 862f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 863f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 864f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross dumpstate(); 865f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 8661dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* done */ 8671dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown if (vibrator) { 8681dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown for (int i = 0; i < 3; i++) { 8691dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown vibrate(vibrator, 75); 870f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross usleep((75 + 50) * 1000); 871f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 872f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fclose(vibrator); 873f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 874f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 875f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* wait for gzip to finish, otherwise it might get killed when we exit */ 876f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (gzip_pid > 0) { 877f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fclose(stdout); 878f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross waitpid(gzip_pid, NULL, 0); 879f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 880f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 881f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross /* rename the (now complete) .tmp file to its final location */ 882f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross if (use_outfile && rename(tmp_path, path)) { 883f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross fprintf(stderr, "rename(%s, %s): %s\n", tmp_path, path, strerror(errno)); 884f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross } 885f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 8861dc94e315680b47fe430ef90f46c50a25c92fb6dJeff Brown /* tell activity manager we're done */ 88727f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey if (do_broadcast && use_outfile && do_fb) { 888aaaa57bf8904ef383a9e766ace09725bc392acebJeff Sharkey run_command(NULL, 5, "/system/bin/am", "broadcast", "--user", "0", 88927f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey "-a", "android.intent.action.BUGREPORT_FINISHED", 89027f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey "--es", "android.intent.extra.BUGREPORT", path, 89127f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey "--es", "android.intent.extra.SCREENSHOT", screenshot_path, 89227f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey "--receiver-permission", "android.permission.DUMP", NULL); 89327f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey } 89427f9e6d849fce956c9b8f1ad5c3d9a954501a76bJeff Sharkey 895f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross ALOGI("done\n"); 896f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross 897f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross return 0; 898f45fa6b2853cc32385375a0b63ee39ad6a968869Colin Cross} 899