Subversion Repositories HelenOS

Rev

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

Rev 2939 Rev 2940
Line 57... Line 57...
57
 
57
 
58
#define MAX_ARGC 10
58
#define MAX_ARGC 10
59
int cmd_argc;
59
int cmd_argc;
60
char *cmd_argv[MAX_ARGC + 1];   /* need one spare field for cmd_split() */
60
char *cmd_argv[MAX_ARGC + 1];   /* need one spare field for cmd_split() */
61
 
61
 
62
#define THBUF_SIZE 64
-
 
63
thash_t thread_hash_buf[THBUF_SIZE];
-
 
64
 
62
 
65
int next_thread_id;
63
int next_thread_id;
66
 
64
 
67
int app_phone;
65
int app_phone;
68
volatile bool abort_debug;
66
volatile bool abort_debug;
Line 140... Line 138...
140
}
138
}
141
 
139
 
142
static void thread_stop(void)
140
static void thread_stop(void)
143
{
141
{
144
    dthread_t *dt;
142
    dthread_t *dt;
-
 
143
    uintptr_t pc;
145
 
144
 
146
    dt = dthread_get();
145
    dt = dthread_get();
-
 
146
    pc = dthread_get_pc(dt);
147
    cons_printf("[thread %d] stopped\n", dt->id);
147
    cons_printf("[thread %d] stopped at 0x%lx\n", dt->id, pc);
148
    dthread_stop_me();
148
    dthread_stop_me();
149
    cons_printf("[thread %d] go\n", dt->id);
149
    cons_printf("[thread %d] go\n", dt->id);
150
}
150
}
151
 
151
 
152
/*
152
/*
Line 181... Line 181...
181
    if (rc < 0) return rc;
181
    if (rc < 0) return rc;
182
 
182
 
183
    return 0;
183
    return 0;
184
}
184
}
185
 
185
 
-
 
186
#define THASH_BUF_INIT_LENGTH 32
-
 
187
 
186
static int get_thread_list(void)
188
static int get_thread_list(thash_t **thash_buf_ptr, int *n)
187
{
189
{
188
    int rc;
190
    int rc;
189
    int tb_copied;
191
    int tb_copied;
190
    int tb_needed;
192
    int tb_needed;
191
    int i;
193
    int i;
192
    int n;
194
    size_t tb_size;
-
 
195
    thash_t *thash_buf;
193
 
196
 
194
    cons_printf("send IPC_M_DEBUG_THREAD_READ message\n");
197
    tb_size = THASH_BUF_INIT_LENGTH * sizeof(thash_t);
-
 
198
    thash_buf = malloc(tb_size);
-
 
199
 
195
    rc = udebug_thread_read(app_phone, (unsigned)thread_hash_buf,
200
    rc = udebug_thread_read(app_phone, (sysarg_t)thash_buf,
196
        THBUF_SIZE*sizeof(unsigned), &tb_copied, &tb_needed);
201
        tb_size, &tb_copied, &tb_needed);
197
    cons_printf("-> %d\n", rc);
-
 
198
    if (rc < 0) return rc;
202
    if (rc < 0) return rc;
199
 
203
 
-
 
204
    if (tb_needed > tb_size) {
-
 
205
        /* Larger buffer needed  */
-
 
206
 
-
 
207
        free(thash_buf);
-
 
208
 
-
 
209
        tb_size = tb_needed;
-
 
210
        thash_buf = malloc(tb_size);
-
 
211
 
-
 
212
        if (!thash_buf) {
-
 
213
            printf("malloc failed\n");
-
 
214
            exit(1);
-
 
215
        }
-
 
216
 
-
 
217
        /* Try again */
-
 
218
       
-
 
219
        rc = udebug_thread_read(app_phone, (sysarg_t)thash_buf,
200
    n = tb_copied / sizeof(unsigned);
220
            tb_size, &tb_copied, &tb_needed);
201
 
221
 
202
    cons_printf("thread IDs:");
-
 
203
    for (i=0; i<n; i++) {
222
        if (rc < 0) return rc;
204
        cons_printf(" %u", thread_hash_buf[i]);
-
 
205
    }
223
    }
206
    cons_printf("\ntotal of %u threads\n", tb_needed/sizeof(unsigned));
-
 
207
 
224
 
-
 
225
    *n = tb_copied / sizeof(thash_t);
-
 
226
 
-
 
227
    cons_printf("thread hashes:");
-
 
228
 
-
 
229
    for (i = 0; i < *n; ++i) {
-
 
230
        cons_printf("0x%x\n", thash_buf[i]);
-
 
231
    }
-
 
232
 
-
 
233
    cons_printf("Total of %u threads\n", *n);
-
 
234
 
-
 
235
    *thash_buf_ptr = thash_buf;
-
 
236
 
208
    return n;
237
    return 0;
209
}
238
}
210
 
239
 
211
void event_thread_b(unsigned hash)
240
void event_thread_b(unsigned hash)
212
{
241
{
213
    async_serialize_start();
242
    async_serialize_start();
Line 293... Line 322...
293
    int taskid;
322
    int taskid;
294
    int i;
323
    int i;
295
    int rc;
324
    int rc;
296
    int c;
325
    int c;
297
 
326
 
-
 
327
    thash_t *thash_buffer;
-
 
328
    int n_threads;
-
 
329
 
298
    cons_printf("Breakpoint Debugger\n");
330
    cons_printf("Breakpoint Debugger\n");
299
    cons_printf("Press 'c' to connect\n");
331
    cons_printf("Press 'c' to connect\n");
300
    while ((i = getchar()) != 'c')
332
    while ((i = getchar()) != 'c')
301
        putchar(i);
333
        putchar(i);
302
 
334
 
Line 307... Line 339...
307
        return;
339
        return;
308
    }
340
    }
309
 
341
 
310
    cons_printf("Connected to task %d\n", taskid);
342
    cons_printf("Connected to task %d\n", taskid);
311
 
343
 
312
    rc = get_thread_list();
344
    rc = get_thread_list(&thash_buffer, &n_threads);
313
    if (rc < 0) {
345
    if (rc < 0) {
314
        cons_printf("Failed to get thread list (error %d)\n", rc);
346
        cons_printf("Failed to get thread list\n", rc);
315
        return;
347
        return;
316
    }
348
    }
317
 
349
 
318
    abort_debug = false;
350
    abort_debug = false;
319
 
351
 
320
    for (i = 0; i < rc; i++) {
352
    for (i = 0; i < n_threads; i++) {
321
        thread_debug_start(thread_hash_buf[i]);
353
        thread_debug_start(thash_buffer[i]);
322
    }
354
    }
323
 
355
 
324
    while (!quit) {
356
    while (!quit) {
325
        cons_read_line(in_buf, IN_BUF_SIZE);
357
        cons_read_line(in_buf, IN_BUF_SIZE);
326
        command_split(in_buf);
358
        command_split(in_buf);