Rev 3444 | Rev 3452 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3444 | Rev 3447 | ||
---|---|---|---|
Line 39... | Line 39... | ||
39 | #include <ipc/ipc.h> |
39 | #include <ipc/ipc.h> |
40 | #include <fibril.h> |
40 | #include <fibril.h> |
41 | #include <errno.h> |
41 | #include <errno.h> |
42 | #include <udebug.h> |
42 | #include <udebug.h> |
43 | #include <async.h> |
43 | #include <async.h> |
- | 44 | #include <task.h> |
|
44 | 45 | ||
45 | // Temporary: service and method names |
46 | // Temporary: service and method names |
46 | #include "proto.h" |
47 | #include "proto.h" |
47 | #include <ipc/services.h> |
48 | #include <ipc/services.h> |
48 | #include "../../srv/vfs/vfs.h" |
49 | #include "../../srv/vfs/vfs.h" |
Line 126... | Line 127... | ||
126 | 127 | ||
127 | n_threads = tb_copied / sizeof(unsigned); |
128 | n_threads = tb_copied / sizeof(unsigned); |
128 | 129 | ||
129 | printf("Threads:"); |
130 | printf("Threads:"); |
130 | for (i = 0; i < n_threads; i++) { |
131 | for (i = 0; i < n_threads; i++) { |
131 | printf(" [%d] (hash 0x%u)", 1+i, thread_hash_buf[i]); |
132 | printf(" [%d] (hash 0x%x)", 1+i, thread_hash_buf[i]); |
132 | } |
133 | } |
133 | printf("\ntotal of %u threads\n", tb_needed/sizeof(unsigned)); |
134 | printf("\ntotal of %u threads\n", tb_needed/sizeof(unsigned)); |
134 | 135 | ||
135 | return 0; |
136 | return 0; |
136 | } |
137 | } |
Line 538... | Line 539... | ||
538 | proto_register(SERVICE_CONSOLE, p); |
539 | proto_register(SERVICE_CONSOLE, p); |
539 | } |
540 | } |
540 | 541 | ||
541 | static void print_syntax() |
542 | static void print_syntax() |
542 | { |
543 | { |
- | 544 | printf("Syntax:\n"); |
|
- | 545 | printf("\ttrace [+<events>] <executable> [<arg1> [...]]\n"); |
|
543 | printf("Syntax: trace [+<events>] <task_id>\n"); |
546 | printf("or\ttrace [+<events>] -t <task_id>\n"); |
544 | printf("Events: (default is +tp)\n"); |
547 | printf("Events: (default is +tp)\n"); |
545 | printf("\n"); |
548 | printf("\n"); |
546 | printf("\tt ... Thread creation and termination\n"); |
549 | printf("\tt ... Thread creation and termination\n"); |
547 | printf("\ts ... System calls\n"); |
550 | printf("\ts ... System calls\n"); |
548 | printf("\ti ... Low-level IPC\n"); |
551 | printf("\ti ... Low-level IPC\n"); |
549 | printf("\tp ... Protocol level\n"); |
552 | printf("\tp ... Protocol level\n"); |
550 | printf("\n"); |
553 | printf("\n"); |
- | 554 | printf("Examples:\n"); |
|
- | 555 | printf("\ttrace +s /app/tetris\n"); |
|
551 | printf("Example: trace +tsip 12\n"); |
556 | printf("\ttrace +tsip -t 12\n"); |
552 | } |
557 | } |
553 | 558 | ||
554 | static display_mask_t parse_display_mask(char *text) |
559 | static display_mask_t parse_display_mask(char *text) |
555 | { |
560 | { |
556 | display_mask_t dm; |
561 | display_mask_t dm; |
Line 578... | Line 583... | ||
578 | static int parse_args(int argc, char *argv[]) |
583 | static int parse_args(int argc, char *argv[]) |
579 | { |
584 | { |
580 | char *arg; |
585 | char *arg; |
581 | char *err_p; |
586 | char *err_p; |
582 | 587 | ||
- | 588 | task_id = 0; |
|
- | 589 | ||
583 | --argc; ++argv; |
590 | --argc; ++argv; |
584 | 591 | ||
585 | while (argc > 1) { |
592 | while (argc > 0) { |
586 | arg = *argv; |
593 | arg = *argv; |
587 | if (arg[0] == '+') { |
594 | if (arg[0] == '+') { |
588 | display_mask = parse_display_mask(&arg[1]); |
595 | display_mask = parse_display_mask(&arg[1]); |
- | 596 | } else if (arg[0] == '-') { |
|
- | 597 | if (arg[1] == 't') { |
|
- | 598 | /* Trace an already running task */ |
|
- | 599 | --argc; ++argv; |
|
- | 600 | task_id = strtol(*argv, &err_p, 10); |
|
- | 601 | if (*err_p) { |
|
- | 602 | printf("Task ID syntax error\n"); |
|
- | 603 | print_syntax(); |
|
- | 604 | return -1; |
|
- | 605 | } |
|
- | 606 | } else { |
|
- | 607 | printf("Uknown option '%s'\n", arg[0]); |
|
- | 608 | print_syntax(); |
|
- | 609 | return -1; |
|
- | 610 | } |
|
589 | } else { |
611 | } else { |
590 | printf("Unexpected argument '%s'\n", arg); |
- | |
591 | print_syntax(); |
- | |
592 | return -1; |
612 | break; |
593 | } |
613 | } |
594 | 614 | ||
595 | --argc; ++argv; |
615 | --argc; ++argv; |
596 | } |
616 | } |
597 | 617 | ||
598 | if (argc != 1) { |
618 | if (task_id != 0) { |
- | 619 | if (argc == 0) return; |
|
599 | printf("Missing argument\n"); |
620 | printf("Extra arguments\n"); |
600 | print_syntax(); |
621 | print_syntax(); |
601 | return 1; |
622 | return -1; |
602 | } |
623 | } |
603 | 624 | ||
604 | task_id = strtol(*argv, &err_p, 10); |
- | |
605 | - | ||
606 | if (*err_p) { |
625 | if (argc < 1) { |
607 | printf("Task ID syntax error\n"); |
626 | printf("Missing argument\n"); |
608 | print_syntax(); |
627 | print_syntax(); |
609 | return -1; |
628 | return -1; |
610 | } |
629 | } |
611 | 630 | ||
- | 631 | /* Execute the specified command and trace the new task. */ |
|
- | 632 | printf("Spawning '%s' with arguments:\n", *argv); |
|
- | 633 | { |
|
- | 634 | char **cp = argv; |
|
- | 635 | while (*cp) printf("'%s'\n", *cp++); |
|
- | 636 | } |
|
- | 637 | task_id = task_spawn(*argv, argv); |
|
- | 638 | ||
612 | return 0; |
639 | return 0; |
613 | } |
640 | } |
614 | 641 | ||
615 | int main(int argc, char *argv[]) |
642 | int main(int argc, char *argv[]) |
616 | { |
643 | { |