summaryrefslogtreecommitdiffstats
path: root/cmds
diff options
context:
space:
mode:
authorSan Mehat <san@google.com>2010-04-27 11:21:17 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2010-04-27 11:21:17 -0700
commitc65ede9bf1500b8b0920703bc76aba661d513f3a (patch)
tree207412e5eb3a086dc2915f94e55ce3d3e39553e7 /cmds
parentb6c459276f222e01777380c4c1e3a31680e561ec (diff)
parentbd5356468a5e6823fe4dce040ee75fbef66488dc (diff)
downloadframeworks_base-c65ede9bf1500b8b0920703bc76aba661d513f3a.zip
frameworks_base-c65ede9bf1500b8b0920703bc76aba661d513f3a.tar.gz
frameworks_base-c65ede9bf1500b8b0920703bc76aba661d513f3a.tar.bz2
am bd535646: am 57fff78a: dumpstate: Add blocked process wait-channel info to bugreport
Merge commit 'bd5356468a5e6823fe4dce040ee75fbef66488dc' into kraken * commit 'bd5356468a5e6823fe4dce040ee75fbef66488dc': dumpstate: Add blocked process wait-channel info to bugreport
Diffstat (limited to 'cmds')
-rw-r--r--cmds/dumpstate/dumpstate.c3
-rw-r--r--cmds/dumpstate/dumpstate.h6
-rw-r--r--cmds/dumpstate/utils.c58
3 files changed, 66 insertions, 1 deletions
diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c
index e8b5eaf..082e704 100644
--- a/cmds/dumpstate/dumpstate.c
+++ b/cmds/dumpstate/dumpstate.c
@@ -138,6 +138,8 @@ static void dumpstate() {
dump_file("LAST PANIC CONSOLE", "/data/dontpanic/apanic_console");
dump_file("LAST PANIC THREADS", "/data/dontpanic/apanic_threads");
+ for_each_pid(show_wchan, "BLOCKED PROCESS WAIT-CHANNELS");
+
printf("------ BACKLIGHTS ------\n");
printf("LCD brightness=");
dump_file(NULL, "/sys/class/leds/lcd-backlight/brightness");
@@ -161,7 +163,6 @@ static void dumpstate() {
run_command("DUMPSYS", 60, "dumpsys", NULL);
}
-
static void usage() {
fprintf(stderr, "usage: dumpstate [-d] [-o file] [-s] [-z]\n"
" -d: append date to filename (requires -o)\n"
diff --git a/cmds/dumpstate/dumpstate.h b/cmds/dumpstate/dumpstate.h
index 6d48a85..682eafd 100644
--- a/cmds/dumpstate/dumpstate.h
+++ b/cmds/dumpstate/dumpstate.h
@@ -38,4 +38,10 @@ pid_t redirect_to_file(FILE *redirect, char *path, int gzip_level);
/* dump Dalvik stack traces, return the trace file location (NULL if none) */
const char *dump_vm_traces();
+/* for each process in the system, run the specified function */
+void for_each_pid(void (*func)(int, const char *), const char *header);
+
+/* Displays a blocked processes in-kernel wait channel */
+void show_wchan(int pid, const char *name);
+
#endif /* _DUMPSTATE_H_ */
diff --git a/cmds/dumpstate/utils.c b/cmds/dumpstate/utils.c
index c21dace..c7a78cc 100644
--- a/cmds/dumpstate/utils.c
+++ b/cmds/dumpstate/utils.c
@@ -37,6 +37,64 @@
#include "dumpstate.h"
+void for_each_pid(void (*func)(int, const char *), const char *header) {
+ DIR *d;
+ struct dirent *de;
+
+ if (!(d = opendir("/proc"))) {
+ printf("Failed to open /proc (%s)\n", strerror(errno));
+ return;
+ }
+
+ printf("\n------ %s ------\n", header);
+ while ((de = readdir(d))) {
+ int pid;
+ int fd;
+ char cmdpath[255];
+ char cmdline[255];
+
+ if (!(pid = atoi(de->d_name))) {
+ continue;
+ }
+
+ sprintf(cmdpath,"/proc/%d/cmdline", pid);
+ memset(cmdline, 0, sizeof(cmdline));
+ if ((fd = open(cmdpath, O_RDONLY)) < 0) {
+ strcpy(cmdline, "N/A");
+ } else {
+ read(fd, cmdline, sizeof(cmdline));
+ close(fd);
+ }
+ func(pid, cmdline);
+ }
+
+ closedir(d);
+}
+
+void show_wchan(int pid, const char *name) {
+ char path[255];
+ char buffer[255];
+ int fd;
+
+ memset(buffer, 0, sizeof(buffer));
+
+ sprintf(path, "/proc/%d/wchan", pid);
+ if ((fd = open(path, O_RDONLY)) < 0) {
+ printf("Failed to open '%s' (%s)\n", path, strerror(errno));
+ return;
+ }
+
+ if (read(fd, buffer, sizeof(buffer)) < 0) {
+ printf("Failed to read '%s' (%s)\n", path, strerror(errno));
+ goto out_close;
+ }
+
+ printf("%-7d %-32s %s\n", pid, name, buffer);
+
+out_close:
+ close(fd);
+ return;
+}
/* prints the contents of a file */
int dump_file(const char *title, const char* path) {