Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2867 → Rev 2868

/branches/tracing/uspace/app/sctrace/sctrace.c
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();
}