Loading cmds/dumpstate/dumpstate.c +6 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <sys/resource.h> #include <sys/stat.h> #include <sys/time.h> #include <sys/wait.h> #include <unistd.h> #include <cutils/properties.h> Loading Loading @@ -86,7 +87,11 @@ static void dumpstate() { struct stat st; char anr_traces_path[PATH_MAX]; property_get("dalvik.vm.stack-trace-file", anr_traces_path, ""); if (anr_traces_path[0] && !stat(anr_traces_path, &st) && time(NULL) - st.st_mtime < 15 * 60) { if (!anr_traces_path[0]) { printf("*** NO VM TRACES FILE DEFINED (dalvik.vm.stack-trace-file)\n\n"); } else if (stat(anr_traces_path, &st)) { printf("*** NO ANR VM TRACES FILE (%s): %s\n\n", anr_traces_path, strerror(errno)); } else { dump_file("VM TRACES AT LAST ANR", anr_traces_path); } Loading cmds/dumpstate/utils.c +20 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ #include <cutils/properties.h> #include <cutils/sockets.h> #include <private/android_filesystem_config.h> #include "dumpstate.h" Loading Loading @@ -273,6 +274,20 @@ const char *dump_vm_traces() { return NULL; // Can't rename old traces.txt -- no permission? -- leave it alone instead } /* make the directory if necessary */ char anr_traces_dir[PATH_MAX]; strlcpy(anr_traces_dir, traces_path, sizeof(anr_traces_dir)); char *slash = strrchr(anr_traces_dir, '/'); if (slash != NULL) { *slash = '\0'; if (!mkdir(anr_traces_dir, 0775)) { chown(anr_traces_dir, AID_SYSTEM, AID_SYSTEM); } else if (errno != EEXIST) { fprintf(stderr, "mkdir(%s): %s\n", anr_traces_dir, strerror(errno)); return NULL; } } /* create a new, empty traces.txt file to receive stack dumps */ int fd = open(traces_path, O_CREAT | O_WRONLY | O_TRUNC, 0666); /* -rw-rw-rw- */ if (fd < 0) { Loading Loading @@ -302,6 +317,7 @@ const char *dump_vm_traces() { } struct dirent *d; int dalvik_found = 0; while ((d = readdir(proc))) { int pid = atoi(d->d_name); if (pid <= 0) continue; Loading @@ -319,6 +335,7 @@ const char *dump_vm_traces() { close(fd); if (len <= 0 || !memcmp(data, "zygote", 6)) continue; ++dalvik_found; if (kill(pid, SIGQUIT)) { fprintf(stderr, "kill(%d, SIGQUIT): %s\n", pid, strerror(errno)); continue; Loading @@ -338,6 +355,9 @@ const char *dump_vm_traces() { } close(ifd); if (dalvik_found == 0) { fprintf(stderr, "Warning: no Dalvik processes found to dump stacks\n"); } static char dump_traces_path[PATH_MAX]; strlcpy(dump_traces_path, traces_path, sizeof(dump_traces_path)); Loading Loading
cmds/dumpstate/dumpstate.c +6 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <sys/resource.h> #include <sys/stat.h> #include <sys/time.h> #include <sys/wait.h> #include <unistd.h> #include <cutils/properties.h> Loading Loading @@ -86,7 +87,11 @@ static void dumpstate() { struct stat st; char anr_traces_path[PATH_MAX]; property_get("dalvik.vm.stack-trace-file", anr_traces_path, ""); if (anr_traces_path[0] && !stat(anr_traces_path, &st) && time(NULL) - st.st_mtime < 15 * 60) { if (!anr_traces_path[0]) { printf("*** NO VM TRACES FILE DEFINED (dalvik.vm.stack-trace-file)\n\n"); } else if (stat(anr_traces_path, &st)) { printf("*** NO ANR VM TRACES FILE (%s): %s\n\n", anr_traces_path, strerror(errno)); } else { dump_file("VM TRACES AT LAST ANR", anr_traces_path); } Loading
cmds/dumpstate/utils.c +20 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ #include <cutils/properties.h> #include <cutils/sockets.h> #include <private/android_filesystem_config.h> #include "dumpstate.h" Loading Loading @@ -273,6 +274,20 @@ const char *dump_vm_traces() { return NULL; // Can't rename old traces.txt -- no permission? -- leave it alone instead } /* make the directory if necessary */ char anr_traces_dir[PATH_MAX]; strlcpy(anr_traces_dir, traces_path, sizeof(anr_traces_dir)); char *slash = strrchr(anr_traces_dir, '/'); if (slash != NULL) { *slash = '\0'; if (!mkdir(anr_traces_dir, 0775)) { chown(anr_traces_dir, AID_SYSTEM, AID_SYSTEM); } else if (errno != EEXIST) { fprintf(stderr, "mkdir(%s): %s\n", anr_traces_dir, strerror(errno)); return NULL; } } /* create a new, empty traces.txt file to receive stack dumps */ int fd = open(traces_path, O_CREAT | O_WRONLY | O_TRUNC, 0666); /* -rw-rw-rw- */ if (fd < 0) { Loading Loading @@ -302,6 +317,7 @@ const char *dump_vm_traces() { } struct dirent *d; int dalvik_found = 0; while ((d = readdir(proc))) { int pid = atoi(d->d_name); if (pid <= 0) continue; Loading @@ -319,6 +335,7 @@ const char *dump_vm_traces() { close(fd); if (len <= 0 || !memcmp(data, "zygote", 6)) continue; ++dalvik_found; if (kill(pid, SIGQUIT)) { fprintf(stderr, "kill(%d, SIGQUIT): %s\n", pid, strerror(errno)); continue; Loading @@ -338,6 +355,9 @@ const char *dump_vm_traces() { } close(ifd); if (dalvik_found == 0) { fprintf(stderr, "Warning: no Dalvik processes found to dump stacks\n"); } static char dump_traces_path[PATH_MAX]; strlcpy(dump_traces_path, traces_path, sizeof(dump_traces_path)); Loading