18,6 → 18,7 |
|
#define TIDBUF_SIZE 64 |
unsigned threadid_buf[TIDBUF_SIZE]; |
unsigned n_threads; |
|
int phoneid; |
int abort_trace; |
54,8 → 55,10 |
printf("-> %d\n", rc); |
if (rc < 0) return rc; |
|
n_threads = tb_copied / sizeof(unsigned); |
|
printf("thread IDs:"); |
for (i=0; i<tb_copied / sizeof(unsigned); i++) { |
for (i=0; i<n_threads; i++) { |
printf(" %u", threadid_buf[i]); |
} |
printf("\ntotal of %u threads\n", tb_needed/sizeof(unsigned)); |
117,26 → 120,8 |
} |
} |
|
int keyboard_fibril(void *arg) |
void trace_loop(void *thread_idx_arg) |
{ |
(void)arg; |
|
printf("keyboard fibril started\n"); |
|
getchar(); |
printf("keyboard fibril setting abort_trace\n"); |
abort_trace = 1; |
printf("keyboard fibril sending debug_end()\n"); |
debug_end(phoneid); |
printf("keyboard fibril hanging up phone\n"); |
ipc_hangup(phoneid); |
printf("keyboard fibril exitting\n"); |
|
return EOK; |
} |
|
void trace_loop(void) |
{ |
int rc; |
unsigned sc_args[6]; |
unsigned copied; |
144,34 → 129,31 |
unsigned sc_id; |
int sc_rc; |
int rv_type; |
fid_t kb_fid; |
unsigned thread_idx; |
|
abort_trace = 0; |
kb_fid = fibril_create(keyboard_fibril, NULL); |
if (kb_fid == 0) { |
printf("Failed creating keyboard fibril\n"); |
return; |
} |
fibril_add_ready(kb_fid); |
thread_idx = (unsigned)thread_idx_arg; |
printf("trace_loop(%d)\n", thread_idx); |
|
while (!abort_trace) { |
|
/* Run thread until a syscall is executed */ |
rc = debug_go(phoneid, threadid_buf[0], |
rc = debug_go(phoneid, threadid_buf[thread_idx], |
&ev_type, &sc_id, &sc_rc); |
|
printf("rc = %d, ev_type=%d\n", rc, ev_type); |
if (ev_type == UDEBUG_EVENT_FINISHED) { |
printf("thread %u debugging finished\n", threadid_buf[0]); |
printf("thread %u debugging finished\n", threadid_buf[thread_idx]); |
break; |
} |
|
/* Read syscall arguments */ |
if (rc >= 0) { |
rc = debug_args_read(phoneid, threadid_buf[0], |
rc = debug_args_read(phoneid, threadid_buf[thread_idx], |
sc_args); |
} |
|
printf("[%d] ", thread_idx); |
|
/* Print syscall name, id and arguments */ |
if (rc >= 0) { |
printf("%s", syscall_desc[sc_id].name); |
189,7 → 171,7 |
} |
} |
|
printf("trace_loop() exiting\n"); |
printf("trace_loop(%d) exiting\n", thread_idx); |
} |
|
|
198,6 → 180,7 |
int taskid; |
int i; |
int rc; |
fid_t fid; |
|
printf("Syscall Tracer\n"); |
printf("Press 'c' to connect\n"); |
204,7 → 187,7 |
while ((i = getchar()) != 'c') |
putchar(i); |
|
taskid = 13; |
taskid = 14; |
rc = task_connect(taskid); |
if (rc < 0) { |
printf("Failed to connect to task %d\n", taskid); |
219,15 → 202,23 |
return; |
} |
|
trace_loop(); |
/* |
printf("press 'd' to disconnect\n"); |
while ((i = getchar()) != 'd') |
putchar(i); |
abort_trace = 0; |
|
printf("call debug_end()\n"); |
for (i = 0; i < n_threads; i++) { |
fid = fibril_create(trace_loop, (void *)0); |
if (fid == 0) { |
printf("Warning: Failed creating fibril\n"); |
} |
fibril_add_ready(fid); |
} |
|
getchar(); |
|
printf("terminate debugging session...\n"); |
abort_trace = 1; |
debug_end(phoneid); |
*/ |
ipc_hangup(phoneid); |
|
printf("done\n"); |
return; |
} |