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) |