Subversion Repositories HelenOS

Rev

Rev 3442 | Rev 3447 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3442 Rev 3444
Line 49... Line 49...
49
#include "../../srv/console/console.h"
49
#include "../../srv/console/console.h"
50
 
50
 
51
#include "syscalls.h"
51
#include "syscalls.h"
52
#include "ipcp.h"
52
#include "ipcp.h"
53
#include "errors.h"
53
#include "errors.h"
-
 
54
#include "trace.h"
54
 
55
 
55
#define THBUF_SIZE 64
56
#define THBUF_SIZE 64
56
unsigned thread_hash_buf[THBUF_SIZE];
57
unsigned thread_hash_buf[THBUF_SIZE];
57
unsigned n_threads;
58
unsigned n_threads;
58
 
59
 
Line 65... Line 66...
65
volatile int paused;
66
volatile int paused;
66
 
67
 
67
void thread_trace_start(unsigned thread_hash);
68
void thread_trace_start(unsigned thread_hash);
68
 
69
 
69
static proto_t *proto_console;
70
static proto_t *proto_console;
-
 
71
static task_id_t task_id;
-
 
72
 
-
 
73
/** Combination of events/data to print. */
-
 
74
display_mask_t display_mask;
70
 
75
 
71
static int task_connect(task_id_t task_id)
76
static int task_connect(task_id_t task_id)
72
{
77
{
73
    int rc;
78
    int rc;
74
 
79
 
Line 284... Line 289...
284
        printf("error\n");
289
        printf("error\n");
285
        async_serialize_end();
290
        async_serialize_end();
286
        return;
291
        return;
287
    }
292
    }
288
 
293
 
-
 
294
    if ((display_mask & DM_SYSCALL) != 0) {
289
    /* Print syscall name, id and arguments */
295
        /* Print syscall name and arguments */
290
    printf("%s", syscall_desc[sc_id].name);
296
        printf("%s", syscall_desc[sc_id].name);
291
    print_sc_args(sc_args, syscall_desc[sc_id].n_args);
297
        print_sc_args(sc_args, syscall_desc[sc_id].n_args);
-
 
298
    }
292
 
299
 
293
    async_serialize_end();
300
    async_serialize_end();
294
}
301
}
295
 
302
 
296
static void event_syscall_e(unsigned thread_id, unsigned thread_hash,  unsigned sc_id, int sc_rc)
303
static void event_syscall_e(unsigned thread_id, unsigned thread_hash,  unsigned sc_id, int sc_rc)
Line 310... Line 317...
310
        printf("error\n");
317
        printf("error\n");
311
        async_serialize_end();
318
        async_serialize_end();
312
        return;
319
        return;
313
    }
320
    }
314
 
321
 
-
 
322
    if ((display_mask & DM_SYSCALL) != 0) {
-
 
323
        /* Print syscall return value */
315
    rv_type = syscall_desc[sc_id].rv_type;
324
        rv_type = syscall_desc[sc_id].rv_type;
316
    print_sc_retval(sc_rc, rv_type);
325
        print_sc_retval(sc_rc, rv_type);
-
 
326
    }
317
 
327
 
318
    switch (sc_id) {
328
    switch (sc_id) {
319
    case SYS_IPC_CALL_ASYNC_FAST:
329
    case SYS_IPC_CALL_ASYNC_FAST:
320
        sc_ipc_call_async_fast(sc_args, sc_rc);
330
        sc_ipc_call_async_fast(sc_args, sc_rc);
321
        break;
331
        break;
Line 426... Line 436...
426
{
436
{
427
    int i;
437
    int i;
428
    int rc;
438
    int rc;
429
    int c;
439
    int c;
430
 
440
 
431
    printf("Syscall Tracer\n");
-
 
432
 
-
 
433
    rc = task_connect(task_id);
441
    rc = task_connect(task_id);
434
    if (rc < 0) {
442
    if (rc < 0) {
435
        printf("Failed to connect to task %lld\n", task_id);
443
        printf("Failed to connect to task %lld\n", task_id);
436
        return;
444
        return;
437
    }
445
    }
Line 530... Line 538...
530
    proto_register(SERVICE_CONSOLE, p);
538
    proto_register(SERVICE_CONSOLE, p);
531
}
539
}
532
 
540
 
533
static void print_syntax()
541
static void print_syntax()
534
{
542
{
535
    printf("Syntax: trace <task_id>\n");
543
    printf("Syntax: trace [+<events>] <task_id>\n");
-
 
544
    printf("Events: (default is +tp)\n");
-
 
545
    printf("\n");
-
 
546
    printf("\tt ... Thread creation and termination\n");
-
 
547
    printf("\ts ... System calls\n");
-
 
548
    printf("\ti ... Low-level IPC\n");
-
 
549
    printf("\tp ... Protocol level\n");
-
 
550
    printf("\n");
-
 
551
    printf("Example: trace +tsip 12\n");
-
 
552
}
-
 
553
 
-
 
554
static display_mask_t parse_display_mask(char *text)
-
 
555
{
-
 
556
    display_mask_t dm;
-
 
557
    char *c;
-
 
558
 
-
 
559
    c = text;
-
 
560
 
-
 
561
    while (*c) {
-
 
562
        switch (*c) {
-
 
563
        case 't': dm = dm | DM_THREAD; break;
-
 
564
        case 's': dm = dm | DM_SYSCALL; break;
-
 
565
        case 'i': dm = dm | DM_IPC; break;
-
 
566
        case 'p': dm = dm | DM_SYSTEM | DM_USER; break;
-
 
567
        default:
-
 
568
            printf("Unexpected event type '%c'\n", *c);
-
 
569
            exit(1);
-
 
570
        }
-
 
571
 
-
 
572
        ++c;
-
 
573
    }
-
 
574
 
-
 
575
    return dm;
536
}
576
}
537
 
577
 
538
int main(int argc, char *argv[])
578
static int parse_args(int argc, char *argv[])
539
{
579
{
540
    task_id_t task_id;
580
    char *arg;
541
    char *err_p;
581
    char *err_p;
542
 
582
 
-
 
583
    --argc; ++argv;
-
 
584
 
-
 
585
    while (argc > 1) {
-
 
586
        arg = *argv;
-
 
587
        if (arg[0] == '+') {
-
 
588
            display_mask = parse_display_mask(&arg[1]);
-
 
589
        } else {
-
 
590
            printf("Unexpected argument '%s'\n", arg);
-
 
591
            print_syntax();
-
 
592
            return -1;
-
 
593
        }
-
 
594
 
-
 
595
        --argc; ++argv;
-
 
596
    }
-
 
597
 
543
    if (argc != 2) {
598
    if (argc != 1) {
544
        printf("Mising argument\n");
599
        printf("Missing argument\n");
545
        print_syntax();
600
        print_syntax();
546
        return 1;
601
        return 1;
547
    }
602
    }
548
 
603
 
549
    task_id = strtol(argv[1], &err_p, 10);
604
    task_id = strtol(*argv, &err_p, 10);
550
 
605
 
551
    if (*err_p) {
606
    if (*err_p) {
552
        printf("Task ID syntax error\n");
607
        printf("Task ID syntax error\n");
553
        print_syntax();
608
        print_syntax();
554
        return 1;
609
        return -1;
555
    }
610
    }
556
 
611
 
-
 
612
    return 0;
-
 
613
}
-
 
614
 
-
 
615
int main(int argc, char *argv[])
-
 
616
{
-
 
617
    printf("System Call / IPC Tracer\n");
-
 
618
 
-
 
619
    display_mask = DM_THREAD | DM_SYSTEM | DM_USER;
-
 
620
 
-
 
621
    if (parse_args(argc, argv) < 0)
-
 
622
        return 1;
-
 
623
 
557
    main_init();
624
    main_init();
558
    trace_active_task(task_id);
625
    trace_active_task(task_id);
-
 
626
 
-
 
627
    return 0;
559
}
628
}
560
 
629
 
561
/** @}
630
/** @}
562
 */
631
 */