Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c65ede9b authored by San Mehat's avatar San Mehat Committed by Android Git Automerger
Browse files

am bd535646: am 57fff78a: dumpstate: Add blocked process wait-channel info to bugreport

Merge commit 'bd535646' into kraken

* commit 'bd535646':
  dumpstate: Add blocked process wait-channel info to bugreport
parents b6c45927 bd535646
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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"
+6 −0
Original line number Diff line number Diff line
@@ -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_ */
+58 −0
Original line number Diff line number Diff line
@@ -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) {