debug.c

来自「lustre 1.6.5 source code」· C语言 代码 · 共 928 行 · 第 1/2 页

C
928
字号
        int rc, raw = 0, fd;        FILE *in, *out = stdout;        if (argc > 3) {                fprintf(stderr, "usage: %s [file] [raw]\n", argv[0]);                return 0;        }        if (argc > 2) {                raw = atoi(argv[2]);        } else if (argc > 1 && (argv[1][0] == '0' || argv[1][0] == '1')) {                raw = atoi(argv[1]);                argc--;        }        /* If we are dumping raw (which means no conversion step to ASCII)         * then dump directly to any supplied filename, otherwise this is         * just a temp file and we dump to the real file at convert time. */        if (argc > 1 && raw)                strcpy(filename, argv[1]);        else                sprintf(filename, "/tmp/lustre-log.%lu.%u",time(NULL),getpid());        if (stat(filename, &st) == 0 && S_ISREG(st.st_mode))                unlink(filename);        fd = dbg_open_ctlhandle(DUMP_KERNEL_CTL_NAME);        if (fd < 0) {                fprintf(stderr, "open(dump_kernel) failed: %s\n",                        strerror(errno));                return 1;        }        rc = dbg_write_cmd(fd, filename, strlen(filename));        if (rc != 0) {                fprintf(stderr, "write(%s) failed: %s\n", filename,                        strerror(errno));                close(fd);                return 1;        }        dbg_close_ctlhandle(fd);        if (raw)                return 0;        in = fopen(filename, "r");        if (in == NULL) {                if (errno == ENOENT) /* no dump file created */                        return 0;                fprintf(stderr, "fopen(%s) failed: %s\n", filename,                        strerror(errno));                return 1;        }        if (argc > 1) {                out = fopen(argv[1], "w");                if (out == NULL) {                        fprintf(stderr, "fopen(%s) failed: %s\n", argv[1],                                strerror(errno));                        fclose(in);                        return 1;                }        }        rc = parse_buffer(in, out);        fclose(in);        if (argc > 1)                fclose(out);        if (rc) {                fprintf(stderr, "parse_buffer failed; leaving tmp file %s "                        "behind.\n", filename);        } else {                rc = unlink(filename);                if (rc)                        fprintf(stderr, "dumped successfully, but couldn't "                                "unlink tmp file %s: %s\n", filename,                                strerror(errno));        }        return rc;}int jt_dbg_debug_file(int argc, char **argv){        int    fdin;        int    fdout;        FILE  *in;        FILE  *out = stdout;        int    rc;        if (argc > 3 || argc < 2) {                fprintf(stderr, "usage: %s <input> [output]\n", argv[0]);                return 0;        }        fdin = open(argv[1], O_RDONLY | O_LARGEFILE);        if (fdin == -1) {                fprintf(stderr, "open(%s) failed: %s\n", argv[1],                        strerror(errno));                return 1;        }        in = fdopen(fdin, "r");        if (in == NULL) {                fprintf(stderr, "fopen(%s) failed: %s\n", argv[1],                        strerror(errno));                close(fdin);                return 1;        }        if (argc > 2) {                fdout = open(argv[2],                             O_CREAT | O_TRUNC | O_WRONLY | O_LARGEFILE,                             0600);                if (fdout == -1) {                        fprintf(stderr, "open(%s) failed: %s\n", argv[2],                                strerror(errno));                        fclose(in);                        return 1;                }                out = fdopen(fdout, "w");                if (out == NULL) {                        fprintf(stderr, "fopen(%s) failed: %s\n", argv[2],                                strerror(errno));                        fclose(in);                        close(fdout);                        return 1;                }        }        rc = parse_buffer(in, out);        fclose(in);        if (out != stdout)                fclose(out);        return rc;}const char debug_daemon_usage[] = "usage: %s {start file [MB]|stop}\n";int jt_dbg_debug_daemon(int argc, char **argv){        int  rc;        int  fd;        if (argc <= 1) {                fprintf(stderr, debug_daemon_usage, argv[0]);                return 1;        }        fd = dbg_open_ctlhandle(DAEMON_CTL_NAME);        if (fd < 0)                return -1;        rc = -1;        if (strcasecmp(argv[1], "start") == 0) {             if (argc < 3 || argc > 4 ||                    (argc == 4 && strlen(argv[3]) > 5)) {                        fprintf(stderr, debug_daemon_usage, argv[0]);                        goto out;                }                if (argc == 4) {                        char       buf[12];                        const long min_size = 10;                        const long max_size = 20480;                        long       size;                        char      *end;                        size = strtoul(argv[3], &end, 0);                        if (size < min_size ||                            size > max_size ||                            *end != 0) {                                fprintf(stderr, "size %s invalid, must be in "                                        "the range %ld-%ld MB\n", argv[3],                                        min_size, max_size);                                goto out;                        }                        snprintf(buf, sizeof(buf), "size=%ld", size);                        rc = dbg_write_cmd(fd, buf, strlen(buf));                        if (rc != 0) {                                fprintf(stderr, "set %s failed: %s\n",                                        buf, strerror(errno));                                goto out;                        }                }                rc = dbg_write_cmd(fd, argv[2], strlen(argv[2]));                if (rc != 0) {                        fprintf(stderr, "start debug_daemon on %s failed: %s\n",                                argv[2], strerror(errno));                        goto out;                }                rc = 0;                goto out;        }        if (strcasecmp(argv[1], "stop") == 0) {                rc = dbg_write_cmd(fd, "stop", 4);                if (rc != 0) {                        fprintf(stderr, "stopping debug_daemon failed: %s\n",                                strerror(errno));                        goto out;                }                rc = 0;                goto out;        }        fprintf(stderr, debug_daemon_usage, argv[0]);        rc = -1;out:        dbg_close_ctlhandle(fd);        return rc;}int jt_dbg_clear_debug_buf(int argc, char **argv){        int rc;        struct libcfs_ioctl_data data;        if (argc != 1) {                fprintf(stderr, "usage: %s\n", argv[0]);                return 0;        }        memset(&data, 0, sizeof(data));        if (libcfs_ioctl_pack(&data, &buf, max) != 0) {                fprintf(stderr, "libcfs_ioctl_pack failed.\n");                return -1;        }        rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_CLEAR_DEBUG, buf);        if (rc) {                fprintf(stderr, "IOC_LIBCFS_CLEAR_DEBUG failed: %s\n",                        strerror(errno));                return -1;        }        return 0;}int jt_dbg_mark_debug_buf(int argc, char **argv){        static char scratch[MAX_MARK_SIZE] = { '\0' };        int rc, max_size = MAX_MARK_SIZE-1;        struct libcfs_ioctl_data data = { 0 };        char *text;        time_t now = time(NULL);        if (argc > 1) {                int count;                text = scratch;                strncpy(text, argv[1], max_size);                max_size-=strlen(argv[1]);                for (count = 2; (count < argc) && (max_size > 0); count++){                        strncat(text, " ", max_size);                        max_size -= 1;                        strncat(text, argv[count], max_size);                        max_size -= strlen(argv[count]);                }        } else {                text = ctime(&now);        }        data.ioc_inllen1 = strlen(text) + 1;        data.ioc_inlbuf1 = text;        if (libcfs_ioctl_pack(&data, &buf, max) != 0) {                fprintf(stderr, "libcfs_ioctl_pack failed.\n");                return -1;        }        rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_MARK_DEBUG, buf);        if (rc) {                fprintf(stderr, "IOC_LIBCFS_MARK_DEBUG failed: %s\n",                        strerror(errno));                return -1;        }        return 0;}static struct mod_paths {        char *name, *path;} mod_paths[] = {        {"libcfs", "lnet/libcfs"},        {"lnet", "lnet/lnet"},        {"kciblnd", "lnet/klnds/ciblnd"},        {"kgmlnd", "lnet/klnds/gmlnd"},        {"kmxlnd", "lnet/klnds/mxlnd"},        {"kiiblnd", "lnet/klnds/iiblnd"},        {"ko2iblnd", "lnet/klnds/o2iblnd"},        {"kopeniblnd", "lnet/klnds/openiblnd"},        {"kptllnd", "lnet/klnds/ptllnd"},        {"kqswlnd", "lnet/klnds/qswlnd"},        {"kralnd", "lnet/klnds/ralnd"},        {"ksocklnd", "lnet/klnds/socklnd"},        {"ktdilnd", "lnet/klnds/tdilnd"},        {"kviblnd", "lnet/klnds/viblnd"},        {"lvfs", "lustre/lvfs"},        {"obdclass", "lustre/obdclass"},        {"llog_test", "lustre/obdclass"},        {"ptlrpc_gss", "lustre/ptlrpc/gss"},        {"ptlrpc", "lustre/ptlrpc"},        {"gks", "lustre/sec/gks"},        {"gkc", "lustre/sec/gks"},        {"ost", "lustre/ost"},        {"osc", "lustre/osc"},        {"mds", "lustre/mds"},        {"mdc", "lustre/mdc"},        {"llite", "lustre/llite"},        {"lustre", "lustre/llite"},        {"llite_lloop", "lustre/llite"},        {"ldiskfs", "ldiskfs/ldiskfs"},        {"smfs", "lustre/smfs"},        {"obdecho", "lustre/obdecho"},        {"ldlm", "lustre/ldlm"},        {"obdfilter", "lustre/obdfilter"},        {"lov", "lustre/lov"},        {"lmv", "lustre/lmv"},        {"fsfilt_ext3", "lustre/lvfs"},        {"fsfilt_reiserfs", "lustre/lvfs"},        {"fsfilt_smfs", "lustre/lvfs"},        {"fsfilt_ldiskfs", "lustre/lvfs"},        {"mds_ext3", "lustre/mds"},        {"cobd", "lustre/cobd"},        {"cmobd", "lustre/cmobd"},        {"lquota", "lustre/quota"},        {"mgs", "lustre/mgs"},        {"mgc", "lustre/mgc"},        {"mdt", "lustre/mdt"},        {"mdd", "lustre/mdd"},        {"osd", "lustre/osd"},        {"cmm", "lustre/cmm"},        {"fid", "lustre/fid"},        {"fld", "lustre/fld"},        {NULL, NULL}};static int jt_dbg_modules_2_4(int argc, char **argv){#ifdef HAVE_LINUX_VERSION_H#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))        struct mod_paths *mp;        char *path = "";        char *kernel = "linux";        if (argc >= 2)                path = argv[1];        if (argc == 3)                kernel = argv[2];        if (argc > 3) {                printf("%s [path] [kernel]\n", argv[0]);                return 0;        }        for (mp = mod_paths; mp->name != NULL; mp++) {                struct module_info info;                int rc;                size_t crap;                int query_module(const char *name, int which, void *buf,                                 size_t bufsize, size_t *ret);                rc = query_module(mp->name, QM_INFO, &info, sizeof(info),                                  &crap);                if (rc < 0) {                        if (errno != ENOENT)                                printf("query_module(%s) failed: %s\n",                                       mp->name, strerror(errno));                } else {                        printf("add-symbol-file %s%s%s/%s.o 0x%0lx\n", path,                               path[0] ? "/" : "", mp->path, mp->name,                               info.addr + sizeof(struct module));                }        }        return 0;#endif // Headers are 2.6-only#endif // !HAVE_LINUX_VERSION_H        return -EINVAL;}static int jt_dbg_modules_2_5(int argc, char **argv){        struct mod_paths *mp;        char *path = "";        char *kernel = "linux";        const char *proc = "/proc/modules";        char modname[128], others[4096];        long modaddr;        int rc;        FILE *file;        if (argc >= 2)                path = argv[1];        if (argc == 3)                kernel = argv[2];        if (argc > 3) {                printf("%s [path] [kernel]\n", argv[0]);                return 0;        }        file = fopen(proc, "r");        if (!file) {                printf("failed open %s: %s\n", proc, strerror(errno));                return 0;        }        while ((rc = fscanf(file, "%s %s %s %s %s %lx\n",                modname, others, others, others, others, &modaddr)) == 6) {                for (mp = mod_paths; mp->name != NULL; mp++) {                        if (!strcmp(mp->name, modname))                                break;                }                if (mp->name) {                        printf("add-symbol-file %s%s%s/%s.o 0x%0lx\n", path,                               path[0] ? "/" : "", mp->path, mp->name, modaddr);                }        }        fclose(file);        return 0;}int jt_dbg_modules(int argc, char **argv){        int rc = 0;        struct utsname sysinfo;        rc = uname(&sysinfo);        if (rc) {                printf("uname() failed: %s\n", strerror(errno));                return 0;        }        if (sysinfo.release[2] > '4') {                return jt_dbg_modules_2_5(argc, argv);        } else {                return jt_dbg_modules_2_4(argc, argv);        }        return 0;}int jt_dbg_panic(int argc, char **argv){        int rc;        struct libcfs_ioctl_data data;        if (argc != 1) {                fprintf(stderr, "usage: %s\n", argv[0]);                return 0;        }        memset(&data, 0, sizeof(data));        if (libcfs_ioctl_pack(&data, &buf, max) != 0) {                fprintf(stderr, "libcfs_ioctl_pack failed.\n");                return -1;        }        rc = l_ioctl(LNET_DEV_ID, IOC_LIBCFS_PANIC, buf);        if (rc) {                fprintf(stderr, "IOC_LIBCFS_PANIC failed: %s\n",                        strerror(errno));                return -1;        }        return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?