17,13 → 17,18 |
#include "errors.h" |
#include "debug_api.h" |
|
#define TIDBUF_SIZE 64 |
unsigned threadid_buf[TIDBUF_SIZE]; |
#define THBUF_SIZE 64 |
unsigned thread_hash_buf[THBUF_SIZE]; |
unsigned n_threads; |
|
int next_thread_id; |
|
int phoneid; |
int abort_trace; |
|
void thread_trace_start(unsigned thread_hash); |
|
|
int task_connect(int taskid) |
{ |
int rc; |
51,8 → 56,8 |
|
|
printf("send IPC_M_DEBUG_THREAD_READ message\n"); |
rc = debug_thread_read(phoneid, (unsigned)threadid_buf, |
TIDBUF_SIZE*sizeof(unsigned), &tb_copied, &tb_needed); |
rc = debug_thread_read(phoneid, (unsigned)thread_hash_buf, |
THBUF_SIZE*sizeof(unsigned), &tb_copied, &tb_needed); |
printf("-> %d\n", rc); |
if (rc < 0) return rc; |
|
60,7 → 65,7 |
|
printf("thread IDs:"); |
for (i=0; i<n_threads; i++) { |
printf(" %u", threadid_buf[i]); |
printf(" %u", thread_hash_buf[i]); |
} |
printf("\ntotal of %u threads\n", tb_needed/sizeof(unsigned)); |
|
121,7 → 126,7 |
} |
} |
|
void event_syscall(unsigned thread_idx, unsigned sc_id, int sc_rc) |
void event_syscall(unsigned thread_id, unsigned thread_hash, unsigned sc_id, int sc_rc) |
{ |
unsigned sc_args[6]; |
int rv_type; |
128,11 → 133,11 |
int rc; |
|
/* Read syscall arguments */ |
rc = debug_args_read(phoneid, threadid_buf[thread_idx], sc_args); |
rc = debug_args_read(phoneid, thread_hash, sc_args); |
|
async_serialize_start(); |
|
printf("[%d] ", thread_idx); |
printf("[%d] ", thread_id); |
|
if (rc < 0) { |
printf("error\n"); |
162,27 → 167,32 |
async_serialize_start(); |
printf("new thread, hash 0x%x\n", hash); |
async_serialize_end(); |
|
thread_trace_start(hash); |
} |
|
void trace_loop(void *thread_idx_arg) |
void trace_loop(void *thread_hash_arg) |
{ |
int rc; |
unsigned ev_type; |
unsigned thread_idx; |
unsigned thread_hash; |
unsigned thread_id; |
unsigned val0, val1; |
|
thread_idx = (unsigned)thread_idx_arg; |
printf("trace_loop(%d)\n", thread_idx); |
thread_hash = (unsigned)thread_hash_arg; |
thread_id = next_thread_id++; |
|
printf("trace_loop(%d)\n", thread_id); |
|
while (!abort_trace) { |
|
/* Run thread until an event occurs */ |
rc = debug_go(phoneid, threadid_buf[thread_idx], |
rc = debug_go(phoneid, thread_hash, |
&ev_type, &val0, &val1); |
|
printf("rc = %d, ev_type=%d\n", rc, ev_type); |
if (ev_type == UDEBUG_EVENT_FINISHED) { |
printf("thread %u debugging finished\n", threadid_buf[thread_idx]); |
printf("thread %u debugging finished\n", thread_id); |
break; |
} |
|
189,7 → 199,7 |
if (rc >= 0) { |
switch (ev_type) { |
case UDEBUG_EVENT_SYSCALL: |
event_syscall(thread_idx, val0, (int)val1); |
event_syscall(thread_id, thread_hash, val0, (int)val1); |
break; |
case UDEBUG_EVENT_NEW_THREAD: |
event_new_thread(val0); |
202,16 → 212,25 |
|
} |
|
printf("trace_loop(%d) exiting\n", thread_idx); |
printf("trace_loop(%d) exiting\n", thread_id); |
} |
|
void thread_trace_start(unsigned thread_hash) |
{ |
fid_t fid; |
|
fid = fibril_create(trace_loop, (void *)thread_hash); |
if (fid == 0) { |
printf("Warning: Failed creating fibril\n"); |
} |
fibril_add_ready(fid); |
} |
|
void trace_active_task(void) |
{ |
int taskid; |
int i; |
int rc; |
fid_t fid; |
|
printf("Syscall Tracer\n"); |
printf("Press 'c' to connect\n"); |
236,11 → 255,7 |
abort_trace = 0; |
|
for (i = 0; i < n_threads; i++) { |
fid = fibril_create(trace_loop, (void *)i); |
if (fid == 0) { |
printf("Warning: Failed creating fibril\n"); |
} |
fibril_add_ready(fid); |
thread_trace_start(thread_hash_buf[i]); |
} |
|
getchar(); |
256,6 → 271,8 |
|
int main(void) |
{ |
next_thread_id = 1; |
|
while (1) { |
trace_active_task(); |
} |