Subversion Repositories HelenOS

Rev

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

Rev 2838 Rev 2850
Line 16... Line 16...
16
#include "errors.h"
16
#include "errors.h"
17
#include "debug_api.h"
17
#include "debug_api.h"
18
 
18
 
19
#define TIDBUF_SIZE 64
19
#define TIDBUF_SIZE 64
20
unsigned threadid_buf[TIDBUF_SIZE];
20
unsigned threadid_buf[TIDBUF_SIZE];
-
 
21
unsigned n_threads;
21
 
22
 
22
int phoneid;
23
int phoneid;
23
int abort_trace;
24
int abort_trace;
24
 
25
 
25
int task_connect(int taskid)
26
int task_connect(int taskid)
Line 52... Line 53...
52
    rc = debug_thread_read(phoneid, (unsigned)threadid_buf,
53
    rc = debug_thread_read(phoneid, (unsigned)threadid_buf,
53
        TIDBUF_SIZE*sizeof(unsigned), &tb_copied, &tb_needed);
54
        TIDBUF_SIZE*sizeof(unsigned), &tb_copied, &tb_needed);
54
    printf("-> %d\n", rc);
55
    printf("-> %d\n", rc);
55
    if (rc < 0) return rc;
56
    if (rc < 0) return rc;
56
 
57
 
-
 
58
    n_threads = tb_copied / sizeof(unsigned);
-
 
59
 
57
    printf("thread IDs:");
60
    printf("thread IDs:");
58
    for (i=0; i<tb_copied / sizeof(unsigned); i++) {
61
    for (i=0; i<n_threads; i++) {
59
        printf(" %u", threadid_buf[i]);
62
        printf(" %u", threadid_buf[i]);
60
    }
63
    }
61
    printf("\ntotal of %u threads\n", tb_needed/sizeof(unsigned));
64
    printf("\ntotal of %u threads\n", tb_needed/sizeof(unsigned));
62
 
65
 
63
    return 0;
66
    return 0;
Line 115... Line 118...
115
            ipc_args[0], ipc_args[1], ipc_args[2],
118
            ipc_args[0], ipc_args[1], ipc_args[2],
116
            ipc_args[3], ipc_args[4], ipc_args[5]);
119
            ipc_args[3], ipc_args[4], ipc_args[5]);
117
    }
120
    }
118
}
121
}
119
 
122
 
120
int keyboard_fibril(void *arg)
-
 
121
{
-
 
122
    (void)arg;
-
 
123
 
-
 
124
    printf("keyboard fibril started\n");
-
 
125
 
-
 
126
    getchar();
-
 
127
    printf("keyboard fibril setting abort_trace\n");
-
 
128
    abort_trace = 1;
-
 
129
    printf("keyboard fibril sending debug_end()\n");
-
 
130
    debug_end(phoneid);
-
 
131
    printf("keyboard fibril hanging up phone\n");
-
 
132
    ipc_hangup(phoneid);
-
 
133
    printf("keyboard fibril exitting\n");
-
 
134
 
-
 
135
    return EOK;
-
 
136
}
-
 
137
 
-
 
138
void trace_loop(void)
123
void trace_loop(void *thread_idx_arg)
139
{
124
{
140
    int rc;
125
    int rc;
141
    unsigned sc_args[6];
126
    unsigned sc_args[6];
142
    unsigned copied;
127
    unsigned copied;
143
    unsigned ev_type;
128
    unsigned ev_type;
144
    unsigned sc_id;
129
    unsigned sc_id;
145
    int sc_rc;
130
    int sc_rc;
146
    int rv_type;
131
    int rv_type;
147
    fid_t kb_fid;
132
    unsigned thread_idx;
148
 
133
 
149
    abort_trace = 0;
-
 
150
    kb_fid = fibril_create(keyboard_fibril, NULL);
134
    thread_idx = (unsigned)thread_idx_arg;
151
    if (kb_fid == 0) {
-
 
152
        printf("Failed creating keyboard fibril\n");
135
    printf("trace_loop(%d)\n", thread_idx);
153
        return;
-
 
154
    }
-
 
155
    fibril_add_ready(kb_fid);
-
 
156
 
136
 
157
    while (!abort_trace) {
137
    while (!abort_trace) {
158
 
138
 
159
        /* Run thread until a syscall is executed */
139
        /* Run thread until a syscall is executed */
160
        rc = debug_go(phoneid, threadid_buf[0],
140
        rc = debug_go(phoneid, threadid_buf[thread_idx],
161
            &ev_type, &sc_id, &sc_rc);
141
            &ev_type, &sc_id, &sc_rc);
162
 
142
 
163
        printf("rc = %d, ev_type=%d\n", rc, ev_type);
143
        printf("rc = %d, ev_type=%d\n", rc, ev_type);
164
        if (ev_type == UDEBUG_EVENT_FINISHED) {
144
        if (ev_type == UDEBUG_EVENT_FINISHED) {
165
            printf("thread %u debugging finished\n", threadid_buf[0]);
145
            printf("thread %u debugging finished\n", threadid_buf[thread_idx]);
166
            break;
146
            break;
167
        }
147
        }
168
 
148
 
169
        /* Read syscall arguments */
149
        /* Read syscall arguments */
170
        if (rc >= 0) {
150
        if (rc >= 0) {
171
            rc = debug_args_read(phoneid, threadid_buf[0],
151
            rc = debug_args_read(phoneid, threadid_buf[thread_idx],
172
                sc_args);
152
                sc_args);
173
        }
153
        }
174
 
154
 
-
 
155
        printf("[%d] ", thread_idx);
-
 
156
 
175
        /* Print syscall name, id and arguments */
157
        /* Print syscall name, id and arguments */
176
        if (rc >= 0) {
158
        if (rc >= 0) {
177
            printf("%s", syscall_desc[sc_id].name);
159
            printf("%s", syscall_desc[sc_id].name);
178
            print_sc_args(sc_args, syscall_desc[sc_id].n_args);
160
            print_sc_args(sc_args, syscall_desc[sc_id].n_args);
179
            rv_type = syscall_desc[sc_id].rv_type;
161
            rv_type = syscall_desc[sc_id].rv_type;
Line 187... Line 169...
187
        default:
169
        default:
188
            break;
170
            break;
189
        }
171
        }
190
    }
172
    }
191
 
173
 
192
    printf("trace_loop() exiting\n");
174
    printf("trace_loop(%d) exiting\n", thread_idx);
193
}
175
}
194
 
176
 
195
 
177
 
196
void trace_active_task(void)
178
void trace_active_task(void)
197
{
179
{
198
    int taskid;
180
    int taskid;
199
    int i;
181
    int i;
200
    int rc;
182
    int rc;
-
 
183
    fid_t fid;
201
 
184
 
202
    printf("Syscall Tracer\n");
185
    printf("Syscall Tracer\n");
203
    printf("Press 'c' to connect\n");
186
    printf("Press 'c' to connect\n");
204
    while ((i = getchar()) != 'c')
187
    while ((i = getchar()) != 'c')
205
        putchar(i);
188
        putchar(i);
206
 
189
 
207
    taskid = 13;
190
    taskid = 14;
208
    rc = task_connect(taskid);
191
    rc = task_connect(taskid);
209
    if (rc < 0) {
192
    if (rc < 0) {
210
        printf("Failed to connect to task %d\n", taskid);
193
        printf("Failed to connect to task %d\n", taskid);
211
        return;
194
        return;
212
    }
195
    }
Line 217... Line 200...
217
    if (rc < 0) {
200
    if (rc < 0) {
218
        printf("Failed to get thread list (error %d)\n", rc);
201
        printf("Failed to get thread list (error %d)\n", rc);
219
        return;
202
        return;
220
    }
203
    }
221
 
204
 
222
    trace_loop();
205
    abort_trace = 0;
223
/*
206
 
-
 
207
    for (i = 0; i < n_threads; i++) {
-
 
208
        fid = fibril_create(trace_loop, (void *)0);
-
 
209
        if (fid == 0) {
224
    printf("press 'd' to disconnect\n");
210
            printf("Warning: Failed creating fibril\n");
-
 
211
        }
225
    while ((i = getchar()) != 'd')
212
        fibril_add_ready(fid);
-
 
213
    }
-
 
214
 
226
        putchar(i);
215
    getchar();
227
 
216
 
228
    printf("call debug_end()\n");
217
    printf("terminate debugging session...\n");
-
 
218
    abort_trace = 1;
229
    debug_end(phoneid);
219
    debug_end(phoneid);
-
 
220
    ipc_hangup(phoneid);
230
*/
221
 
231
    printf("done\n");
222
    printf("done\n");
232
    return;
223
    return;
233
}
224
}
234
 
225
 
235
int main(void)
226
int main(void)