import gdb-1999-11-08 snapshot
[deliverable/binutils-gdb.git] / gdb / linux-thread.c
1 /* Low level interface for debugging GNU/Linux threads for GDB,
2 the GNU debugger.
3 Copyright 1998, 1999 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21 /* This module implements the debugging interface of the linuxthreads package
22 of the glibc. This package implements a simple clone()-based implementation
23 of Posix threads for Linux. To use this module, be sure that you have at
24 least the version of the linuxthreads package that holds the support of
25 GDB (currently 0.8 included in the glibc-2.0.7).
26
27 Right now, the linuxthreads package does not care of priority scheduling,
28 so, neither this module does; In particular, the threads are resumed
29 in any order, which could lead to different scheduling than the one
30 happening when GDB does not control the execution.
31
32 The latest point is that ptrace(PT_ATTACH, ...) is intrusive in Linux:
33 When a process is attached, then the attaching process becomes the current
34 parent of the attached process, and the old parent has lost this child.
35 If the old parent does a wait[...](), then this child is no longer
36 considered by the kernel as a child of the old parent, thus leading to
37 results of the call different when the child is attached and when it's not.
38
39 A fix has been submitted to the Linux community to solve this problem,
40 which consequences are not visible to the application itself, but on the
41 process which may wait() for the completion of the application (mostly,
42 it may consider that the application no longer exists (errno == ECHILD),
43 although it does, and thus being unable to get the exit status and resource
44 usage of the child. If by chance, it is able to wait() for the application
45 after it has died (by receiving first a SIGCHILD, and then doing a wait(),
46 then the exit status and resource usage may be wrong, because the
47 linuxthreads package heavily relies on wait() synchronization to keep
48 them correct. */
49
50 #include <sys/types.h> /* for pid_t */
51 #include <sys/ptrace.h> /* for PT_* flags */
52 #include <sys/wait.h> /* for WUNTRACED and __WCLONE flags */
53 #include <signal.h> /* for struct sigaction and NSIG */
54 #include <sys/utsname.h>
55
56 #include "defs.h"
57 #include "target.h"
58 #include "inferior.h"
59 #include "gdbcore.h"
60 #include "gdbthread.h"
61 #include "wait.h"
62 #include "gdbcmd.h"
63 #include "breakpoint.h"
64
65 #ifndef PT_ATTACH
66 #define PT_ATTACH PTRACE_ATTACH
67 #endif
68 #ifndef PT_KILL
69 #define PT_KILL PTRACE_KILL
70 #endif
71 #ifndef PT_READ_U
72 #define PT_READ_U PTRACE_PEEKUSR
73 #endif
74
75 #ifdef NSIG
76 #define LINUXTHREAD_NSIG NSIG
77 #else
78 #ifdef _NSIG
79 #define LINUXTHREAD_NSIG _NSIG
80 #endif
81 #endif
82
83 extern int child_suppress_run; /* make inftarg.c non-runnable */
84 struct target_ops linuxthreads_ops; /* Forward declaration */
85 extern struct target_ops child_ops; /* target vector for inftarg.c */
86
87 static CORE_ADDR linuxthreads_handles; /* array of linuxthreads handles */
88 static CORE_ADDR linuxthreads_manager; /* pid of linuxthreads manager thread */
89 static CORE_ADDR linuxthreads_initial; /* pid of linuxthreads initial thread */
90 static CORE_ADDR linuxthreads_debug; /* linuxthreads internal debug flag */
91 static CORE_ADDR linuxthreads_num; /* number of valid handle entries */
92
93 static int linuxthreads_max; /* Maximum number of linuxthreads.
94 Zero if this executable doesn't use
95 threads, or wasn't linked with a
96 debugger-friendly version of the
97 linuxthreads library. */
98
99 static int linuxthreads_sizeof_handle; /* size of a linuxthreads handle */
100 static int linuxthreads_offset_descr; /* h_descr offset of the linuxthreads
101 handle */
102 static int linuxthreads_offset_pid; /* p_pid offset of the linuxthreads
103 descr */
104
105 static int linuxthreads_manager_pid; /* manager pid */
106 static int linuxthreads_initial_pid; /* initial pid */
107
108 /* These variables form a bag of threads with interesting status. If
109 wait_thread (PID) finds that PID stopped for some interesting
110 reason (i.e. anything other than stopped with SIGSTOP), then it
111 records its status in this queue. linuxthreads_wait and
112 linuxthreads_find_trap extract processes from here. */
113 static int *linuxthreads_wait_pid; /* wait array of pid */
114 static int *linuxthreads_wait_status; /* wait array of status */
115 static int linuxthreads_wait_last; /* index of last valid elt in
116 linuxthreads_wait_{pid,status} */
117
118 static sigset_t linuxthreads_wait_mask; /* sigset with SIGCHLD */
119
120 static int linuxthreads_step_pid; /* current stepped pid */
121 static int linuxthreads_step_signo; /* current stepped target signal */
122 static int linuxthreads_exit_status; /* exit status of initial thread */
123
124 static int linuxthreads_inferior_pid; /* temporary internal inferior pid */
125 static int linuxthreads_breakpoint_pid; /* last pid that hit a breakpoint */
126 static int linuxthreads_attach_pending; /* attach command without wait */
127
128 static int linuxthreads_breakpoints_inserted; /* any breakpoints inserted */
129
130 /* LinuxThreads uses certain signals for communication between
131 processes; we need to tell GDB to pass them through silently to the
132 inferior. The LinuxThreads library has global variables we can
133 read containing the relevant signal numbers, but since the signal
134 numbers are chosen at run-time, those variables aren't initialized
135 until the shared library's constructors have had a chance to run. */
136
137 struct linuxthreads_signal {
138
139 /* The name of the LinuxThreads library variable that contains
140 the signal number. */
141 char *var;
142
143 /* True if this variable must exist for us to debug properly. */
144 int required;
145
146 /* The variable's address in the inferior, or zero if the
147 LinuxThreads library hasn't been loaded into this inferior yet. */
148 CORE_ADDR addr;
149
150 /* The signal number, or zero if we don't know yet (either because
151 we haven't found the variable, or it hasn't been initialized).
152 This is an actual target signal number that you could pass to
153 `kill', not a GDB signal number. */
154 int signal;
155
156 /* GDB's original settings for `stop' and `print' for this signal.
157 We restore them when the user selects a different executable.
158 Invariant: if sig->signal != 0, then sig->{stop,print} contain
159 the original settings. */
160 int stop, print;
161 };
162
163 struct linuxthreads_signal linuxthreads_sig_restart = {
164 "__pthread_sig_restart", 1, 0, 0, 0, 0
165 };
166 struct linuxthreads_signal linuxthreads_sig_cancel = {
167 "__pthread_sig_cancel", 1, 0, 0, 0, 0
168 };
169 struct linuxthreads_signal linuxthreads_sig_debug = {
170 "__pthread_sig_debug", 0, 0, 0, 0, 0
171 };
172
173 /* A table of breakpoint locations, one per PID. */
174 static struct linuxthreads_breakpoint {
175 CORE_ADDR pc; /* PC of breakpoint */
176 int pid; /* pid of breakpoint */
177 int step; /* whether the pc has been reached after sstep */
178 } *linuxthreads_breakpoint_zombie; /* Zombie breakpoints array */
179 static int linuxthreads_breakpoint_last; /* Last zombie breakpoint */
180
181 /* linuxthreads_{insert,remove}_breakpoint pass the breakpoint address
182 to {insert,remove}_breakpoint via this variable, since
183 iterate_active_threads doesn't provide any way to pass values
184 through to the worker function. */
185 static CORE_ADDR linuxthreads_breakpoint_addr;
186
187 #define REMOVE_BREAKPOINT_ZOMBIE(_i) \
188 { \
189 if ((_i) < linuxthreads_breakpoint_last) \
190 linuxthreads_breakpoint_zombie[(_i)] = \
191 linuxthreads_breakpoint_zombie[linuxthreads_breakpoint_last]; \
192 linuxthreads_breakpoint_last--; \
193 }
194
195
196 \f
197 #ifndef PTRACE_XFER_TYPE
198 #define PTRACE_XFER_TYPE int
199 #endif
200 /* Check to see if the given thread is alive. */
201 static int
202 linuxthreads_thread_alive (pid)
203 int pid;
204 {
205 errno = 0;
206 return ptrace (PT_READ_U, pid, (PTRACE_ARG3_TYPE)0, 0) >= 0 || errno == 0;
207 }
208
209 /* On detach(), find a SIGTRAP status. If stop is non-zero, find a
210 SIGSTOP one, too.
211
212 Make sure PID is ready to run, and free of interference from our
213 efforts to debug it (e.g., pending SIGSTOP or SIGTRAP signals). If
214 STOP is zero, just look for a SIGTRAP. If STOP is non-zero, look
215 for a SIGSTOP, too. Return non-zero if PID is alive and ready to
216 run; return zero if PID is dead.
217
218 PID may or may not be stopped at the moment, and we may or may not
219 have waited for it already. We check the linuxthreads_wait bag in
220 case we've already got a status for it. We may possibly wait for
221 it ourselves.
222
223 PID may have signals waiting to be delivered. If they're caused by
224 our efforts to debug it, accept them with wait, but don't pass them
225 through to PID. Do pass all other signals through. */
226 static int
227 linuxthreads_find_trap (pid, stop)
228 int pid;
229 int stop;
230 {
231 int i;
232 int rpid;
233 int status;
234 int found_stop = 0;
235 int found_trap = 0;
236
237 /* PID may have any number of signals pending. The kernel will
238 report each of them to us via wait, and then it's up to us to
239 pass them along to the process via ptrace, if we so choose.
240
241 We need to paw through the whole set until we've found a SIGTRAP
242 (or a SIGSTOP, if `stop' is set). We don't pass the SIGTRAP (or
243 SIGSTOP) through, but we do re-send all the others, so PID will
244 receive them when we resume it. */
245 int *wstatus = alloca (LINUXTHREAD_NSIG * sizeof (int));
246 int last = 0;
247
248 /* Look at the pending status */
249 for (i = linuxthreads_wait_last; i >= 0; i--)
250 if (linuxthreads_wait_pid[i] == pid)
251 {
252 status = linuxthreads_wait_status[i];
253
254 /* Delete the i'th member of the table. Since the table is
255 unordered, we can do this simply by copying the table's
256 last element to the i'th position, and shrinking the table
257 by one element. */
258 if (i < linuxthreads_wait_last)
259 {
260 linuxthreads_wait_status[i] =
261 linuxthreads_wait_status[linuxthreads_wait_last];
262 linuxthreads_wait_pid[i] =
263 linuxthreads_wait_pid[linuxthreads_wait_last];
264 }
265 linuxthreads_wait_last--;
266
267 if (!WIFSTOPPED(status)) /* Thread has died */
268 return 0;
269
270 if (WSTOPSIG(status) == SIGTRAP)
271 {
272 if (stop)
273 found_trap = 1;
274 else
275 return 1;
276 }
277 else if (WSTOPSIG(status) == SIGSTOP)
278 {
279 if (stop)
280 found_stop = 1;
281 }
282 else
283 {
284 wstatus[0] = status;
285 last = 1;
286 }
287
288 break;
289 }
290
291 if (stop)
292 {
293 /* Make sure that we'll find what we're looking for. */
294 if (!found_trap)
295 kill (pid, SIGTRAP);
296 if (!found_stop)
297 kill (pid, SIGSTOP);
298 }
299
300 /* Catch all status until SIGTRAP and optionally SIGSTOP show up. */
301 for (;;)
302 {
303 child_resume (pid, 1, TARGET_SIGNAL_0);
304
305 for (;;)
306 {
307 rpid = waitpid (pid, &status, __WCLONE);
308 if (rpid > 0)
309 break;
310 if (errno == EINTR)
311 continue;
312
313 /* There are a few reasons the wait call above may have
314 failed. If the thread manager dies, its children get
315 reparented, and this interferes with GDB waiting for
316 them, in some cases. Another possibility is that the
317 initial thread was not cloned, so calling wait with
318 __WCLONE won't find it. I think neither of these should
319 occur in modern Linux kernels --- they don't seem to in
320 2.0.36. */
321 rpid = waitpid (pid, &status, 0);
322 if (rpid > 0)
323 break;
324 if (errno != EINTR)
325 perror_with_name ("waitpid");
326 }
327
328 if (!WIFSTOPPED(status)) /* Thread has died */
329 return 0;
330
331 if (WSTOPSIG(status) == SIGTRAP)
332 if (!stop || found_stop)
333 break;
334 else
335 found_trap = 1;
336 else if (WSTOPSIG(status) != SIGSTOP)
337 wstatus[last++] = status;
338 else if (stop)
339 {
340 if (found_trap)
341 break;
342 else
343 found_stop = 1;
344 }
345 }
346
347 /* Resend any other signals we noticed to the thread, to be received
348 when we continue it. */
349 while (--last >= 0)
350 kill (pid, WSTOPSIG(wstatus[last]));
351
352 return 1;
353 }
354
355 /* Cleanup stub for save_inferior_pid. */
356 static void
357 restore_inferior_pid (arg)
358 void *arg;
359 {
360 int pid = (int) arg;
361 inferior_pid = pid;
362 }
363
364 /* Register a cleanup to restore the value of inferior_pid. */
365 static struct cleanup *
366 save_inferior_pid ()
367 {
368 return make_cleanup (restore_inferior_pid, (void *) inferior_pid);
369 }
370
371 static void
372 sigchld_handler (signo)
373 int signo;
374 {
375 /* This handler is used to get an EINTR while doing waitpid()
376 when an event is received */
377 }
378
379 /* Have we already collected a wait status for PID in the
380 linuxthreads_wait bag? */
381 static int
382 linuxthreads_pending_status (pid)
383 int pid;
384 {
385 int i;
386 for (i = linuxthreads_wait_last; i >= 0; i--)
387 if (linuxthreads_wait_pid[i] == pid)
388 return 1;
389 return 0;
390 }
391
392 \f
393 /* Internal linuxthreads signal management */
394
395 /* Check in OBJFILE for the variable that holds the number for signal SIG.
396 We assume that we've already found other LinuxThreads-ish variables
397 in OBJFILE, so we complain if it's required, but not there.
398 Return true iff things are okay. */
399 static int
400 find_signal_var (sig, objfile)
401 struct linuxthreads_signal *sig;
402 struct objfile *objfile;
403 {
404 struct minimal_symbol *ms = lookup_minimal_symbol (sig->var, NULL, objfile);
405
406 if (! ms)
407 {
408 if (sig->required)
409 {
410 fprintf_unfiltered (gdb_stderr,
411 "Unable to find linuxthreads symbol \"%s\"\n",
412 sig->var);
413 return 0;
414 }
415 else
416 {
417 sig->addr = 0;
418 return 1;
419 }
420 }
421
422 sig->addr = SYMBOL_VALUE_ADDRESS (ms);
423
424 return 1;
425 }
426
427 static int
428 find_all_signal_vars (objfile)
429 struct objfile *objfile;
430 {
431 return ( find_signal_var (&linuxthreads_sig_restart, objfile)
432 && find_signal_var (&linuxthreads_sig_cancel, objfile)
433 && find_signal_var (&linuxthreads_sig_debug, objfile));
434 }
435
436 /* A struct complaint isn't appropriate here. */
437 static int complained_cannot_determine_thread_signal_number = 0;
438
439 /* Check to see if the variable holding the signal number for SIG has
440 been initialized yet. If it has, tell GDB to pass that signal
441 through to the inferior silently. */
442 static void
443 check_signal_number (sig)
444 struct linuxthreads_signal *sig;
445 {
446 int num;
447
448 if (sig->signal)
449 /* We already know this signal number. */
450 return;
451
452 if (! sig->addr)
453 /* We don't know the variable's address yet. */
454 return;
455
456 if (target_read_memory (sig->addr, (char *)&num, sizeof (num))
457 != 0)
458 {
459 /* If this happens once, it'll probably happen for all the
460 signals, so only complain once. */
461 if (! complained_cannot_determine_thread_signal_number)
462 warning ("Cannot determine thread signal number; "
463 "GDB may report spurious signals.");
464 complained_cannot_determine_thread_signal_number = 1;
465 return;
466 }
467
468 if (num == 0)
469 /* It hasn't been initialized yet. */
470 return;
471
472 /* We know sig->signal was zero, and is becoming non-zero, so it's
473 okay to sample GDB's original settings. */
474 sig->signal = num;
475 sig->stop = signal_stop_update (target_signal_from_host (num), 0);
476 sig->print = signal_print_update (target_signal_from_host (num), 0);
477 }
478
479
480 static void
481 check_all_signal_numbers ()
482 {
483 /* If this isn't a LinuxThreads program, quit early. */
484 if (! linuxthreads_max)
485 return;
486
487 check_signal_number (&linuxthreads_sig_restart);
488 check_signal_number (&linuxthreads_sig_cancel);
489 check_signal_number (&linuxthreads_sig_debug);
490
491 /* handle linuxthread exit */
492 if (linuxthreads_sig_debug.signal
493 || linuxthreads_sig_restart.signal)
494 {
495 struct sigaction sact;
496
497 sact.sa_handler = sigchld_handler;
498 sigemptyset(&sact.sa_mask);
499 sact.sa_flags = 0;
500 if (linuxthreads_sig_debug.signal > 0)
501 sigaction(linuxthreads_sig_cancel.signal, &sact, NULL);
502 else
503 sigaction(linuxthreads_sig_restart.signal, &sact, NULL);
504 }
505 }
506
507
508 /* Restore GDB's original settings for SIG.
509 This should only be called when we're no longer sure if we're
510 talking to an executable that uses LinuxThreads, so we clear the
511 signal number and variable address too. */
512 static void
513 restore_signal (sig)
514 struct linuxthreads_signal *sig;
515 {
516 if (! sig->signal)
517 return;
518
519 /* We know sig->signal was non-zero, and is becoming zero, so it's
520 okay to restore GDB's original settings. */
521 signal_stop_update (target_signal_from_host (sig->signal), sig->stop);
522 signal_print_update (target_signal_from_host (sig->signal), sig->print);
523
524 sig->signal = 0;
525 sig->addr = 0;
526 }
527
528
529 /* Restore GDB's original settings for all LinuxThreads signals.
530 This should only be called when we're no longer sure if we're
531 talking to an executable that uses LinuxThreads, so we clear the
532 signal number and variable address too. */
533 static void
534 restore_all_signals ()
535 {
536 restore_signal (&linuxthreads_sig_restart);
537 restore_signal (&linuxthreads_sig_cancel);
538 restore_signal (&linuxthreads_sig_debug);
539
540 /* If it happens again, we should complain again. */
541 complained_cannot_determine_thread_signal_number = 0;
542 }
543
544
545 \f
546
547 /* Apply FUNC to the pid of each active thread. This consults the
548 inferior's handle table to find active threads.
549
550 If ALL is non-zero, process all threads.
551 If ALL is zero, skip threads with pending status. */
552 static void
553 iterate_active_threads (func, all)
554 void (*func)(int);
555 int all;
556 {
557 CORE_ADDR descr;
558 int pid;
559 int i;
560 int num;
561
562 read_memory (linuxthreads_num, (char *)&num, sizeof (int));
563
564 for (i = 0; i < linuxthreads_max && num > 0; i++)
565 {
566 read_memory (linuxthreads_handles +
567 linuxthreads_sizeof_handle * i + linuxthreads_offset_descr,
568 (char *)&descr, sizeof (void *));
569 if (descr)
570 {
571 num--;
572 read_memory (descr + linuxthreads_offset_pid,
573 (char *)&pid, sizeof (pid_t));
574 if (pid > 0 && pid != linuxthreads_manager_pid
575 && (all || (!linuxthreads_pending_status (pid))))
576 (*func)(pid);
577 }
578 }
579
580 }
581
582 /* Insert a thread breakpoint at linuxthreads_breakpoint_addr.
583 This is the worker function for linuxthreads_insert_breakpoint,
584 which passes it to iterate_active_threads. */
585 static void
586 insert_breakpoint (pid)
587 int pid;
588 {
589 int j;
590
591 /* Remove (if any) the positive zombie breakpoint. */
592 for (j = linuxthreads_breakpoint_last; j >= 0; j--)
593 if (linuxthreads_breakpoint_zombie[j].pid == pid)
594 {
595 if ((linuxthreads_breakpoint_zombie[j].pc - DECR_PC_AFTER_BREAK
596 == linuxthreads_breakpoint_addr)
597 && !linuxthreads_breakpoint_zombie[j].step)
598 REMOVE_BREAKPOINT_ZOMBIE(j);
599 break;
600 }
601 }
602
603 /* Note that we're about to remove a thread breakpoint at
604 linuxthreads_breakpoint_addr.
605
606 This is the worker function for linuxthreads_remove_breakpoint,
607 which passes it to iterate_active_threads. The actual work of
608 overwriting the breakpoint instruction is done by
609 child_ops.to_remove_breakpoint; here, we simply create a zombie
610 breakpoint if the thread's PC is pointing at the breakpoint being
611 removed. */
612 static void
613 remove_breakpoint (pid)
614 int pid;
615 {
616 int j;
617
618 /* Insert a positive zombie breakpoint (if needed). */
619 for (j = 0; j <= linuxthreads_breakpoint_last; j++)
620 if (linuxthreads_breakpoint_zombie[j].pid == pid)
621 break;
622
623 if (in_thread_list (pid) && linuxthreads_thread_alive (pid))
624 {
625 CORE_ADDR pc = read_pc_pid (pid);
626 if (linuxthreads_breakpoint_addr == pc - DECR_PC_AFTER_BREAK
627 && j > linuxthreads_breakpoint_last)
628 {
629 linuxthreads_breakpoint_zombie[j].pid = pid;
630 linuxthreads_breakpoint_zombie[j].pc = pc;
631 linuxthreads_breakpoint_zombie[j].step = 0;
632 linuxthreads_breakpoint_last++;
633 }
634 }
635 }
636
637 /* Kill a thread */
638 static void
639 kill_thread (pid)
640 int pid;
641 {
642 if (in_thread_list (pid))
643 ptrace (PT_KILL, pid, (PTRACE_ARG3_TYPE) 0, 0);
644 else
645 kill (pid, SIGKILL);
646 }
647
648 /* Resume a thread */
649 static void
650 resume_thread (pid)
651 int pid;
652 {
653 if (pid != inferior_pid
654 && in_thread_list (pid)
655 && linuxthreads_thread_alive (pid))
656 {
657 if (pid == linuxthreads_step_pid)
658 child_resume (pid, 1, linuxthreads_step_signo);
659 else
660 child_resume (pid, 0, TARGET_SIGNAL_0);
661 }
662 }
663
664 /* Detach a thread */
665 static void
666 detach_thread (pid)
667 int pid;
668 {
669 if (in_thread_list (pid) && linuxthreads_thread_alive (pid))
670 {
671 /* Remove pending SIGTRAP and SIGSTOP */
672 linuxthreads_find_trap (pid, 1);
673
674 inferior_pid = pid;
675 detach (TARGET_SIGNAL_0);
676 inferior_pid = linuxthreads_manager_pid;
677 }
678 }
679
680 /* Stop a thread */
681 static void
682 stop_thread (pid)
683 int pid;
684 {
685 if (pid != inferior_pid)
686 {
687 if (in_thread_list (pid))
688 kill (pid, SIGSTOP);
689 else if (ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0) == 0)
690 {
691 if (!linuxthreads_attach_pending)
692 printf_unfiltered ("[New %s]\n", target_pid_to_str (pid));
693 add_thread (pid);
694 if (linuxthreads_sig_debug.signal)
695 /* After a new thread in glibc 2.1 signals gdb its existence,
696 it suspends itself and wait for linuxthreads_sig_restart,
697 now we can wake up it. */
698 kill (pid, linuxthreads_sig_restart.signal);
699 }
700 else
701 perror_with_name ("ptrace in stop_thread");
702 }
703 }
704
705 /* Wait for a thread */
706 static void
707 wait_thread (pid)
708 int pid;
709 {
710 int status;
711 int rpid;
712
713 if (pid != inferior_pid && in_thread_list (pid))
714 {
715 for (;;)
716 {
717 /* Get first pid status. */
718 rpid = waitpid(pid, &status, __WCLONE);
719 if (rpid > 0)
720 break;
721 if (errno == EINTR)
722 continue;
723
724 /* There are two reasons this might have failed:
725
726 1) PID is the initial thread, which wasn't cloned, so
727 passing the __WCLONE flag to waitpid prevented us from
728 finding it.
729
730 2) The manager thread is the parent of all but the
731 initial thread; if it dies, the children will all be
732 reparented to init, which will wait for them. This means
733 our call to waitpid won't find them.
734
735 Actually, based on a casual look at the 2.0.36 kernel
736 code, I don't think either of these cases happen. But I
737 don't have things set up for remotely debugging the
738 kernel, so I'm not sure. And perhaps older kernels
739 didn't work. */
740 rpid = waitpid(pid, &status, 0);
741 if (rpid > 0)
742 break;
743 if (errno != EINTR && linuxthreads_thread_alive (pid))
744 perror_with_name ("waitpid");
745
746 /* the thread is dead. */
747 return;
748 }
749 if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
750 {
751 linuxthreads_wait_pid[++linuxthreads_wait_last] = pid;
752 linuxthreads_wait_status[linuxthreads_wait_last] = status;
753 }
754 }
755 }
756
757 /* Walk through the linuxthreads handles in order to detect all
758 threads and stop them */
759 static void
760 update_stop_threads (test_pid)
761 int test_pid;
762 {
763 struct cleanup *old_chain = NULL;
764
765 check_all_signal_numbers ();
766
767 if (linuxthreads_manager_pid == 0)
768 {
769 if (linuxthreads_manager)
770 {
771 if (test_pid > 0 && test_pid != inferior_pid)
772 {
773 old_chain = save_inferior_pid ();
774 inferior_pid = test_pid;
775 }
776 read_memory (linuxthreads_manager,
777 (char *)&linuxthreads_manager_pid, sizeof (pid_t));
778 }
779 if (linuxthreads_initial)
780 {
781 if (test_pid > 0 && test_pid != inferior_pid)
782 {
783 old_chain = save_inferior_pid ();
784 inferior_pid = test_pid;
785 }
786 read_memory(linuxthreads_initial,
787 (char *)&linuxthreads_initial_pid, sizeof (pid_t));
788 }
789 }
790
791 if (linuxthreads_manager_pid != 0)
792 {
793 if (old_chain == NULL && test_pid > 0 &&
794 test_pid != inferior_pid && linuxthreads_thread_alive (test_pid))
795 {
796 old_chain = save_inferior_pid ();
797 inferior_pid = test_pid;
798 }
799
800 if (linuxthreads_thread_alive (inferior_pid))
801 {
802 if (test_pid > 0)
803 {
804 if (test_pid != linuxthreads_manager_pid
805 && !linuxthreads_pending_status (linuxthreads_manager_pid))
806 {
807 stop_thread (linuxthreads_manager_pid);
808 wait_thread (linuxthreads_manager_pid);
809 }
810 if (!in_thread_list (test_pid))
811 {
812 if (!linuxthreads_attach_pending)
813 printf_unfiltered ("[New %s]\n",
814 target_pid_to_str (test_pid));
815 add_thread (test_pid);
816 if (linuxthreads_sig_debug.signal
817 && inferior_pid == test_pid)
818 /* After a new thread in glibc 2.1 signals gdb its
819 existence, it suspends itself and wait for
820 linuxthreads_sig_restart, now we can wake up
821 it. */
822 kill (test_pid, linuxthreads_sig_restart.signal);
823 }
824 }
825 iterate_active_threads (stop_thread, 0);
826 iterate_active_threads (wait_thread, 0);
827 }
828 }
829
830 if (old_chain != NULL)
831 do_cleanups (old_chain);
832 }
833
834 /* This routine is called whenever a new symbol table is read in, or
835 when all symbol tables are removed. linux-thread event handling
836 can only be initialized when we find the right variables in
837 libpthread.so. Since it's a shared library, those variables don't
838 show up until the library gets mapped and the symbol table is read
839 in. */
840
841 /* This new_objfile event is now managed by a chained function pointer.
842 * It is the callee's responsability to call the next client on the chain.
843 */
844
845 /* Saved pointer to previous owner of the new_objfile event. */
846 static void (*target_new_objfile_chain) PARAMS ((struct objfile *));
847
848 void
849 linuxthreads_new_objfile (objfile)
850 struct objfile *objfile;
851 {
852 struct minimal_symbol *ms;
853
854 if (!objfile)
855 {
856 /* We're starting an entirely new executable, so we can no
857 longer be sure that it uses LinuxThreads. Restore the signal
858 flags to their original states. */
859 restore_all_signals ();
860
861 /* Indicate that we don't know anything's address any more. */
862 linuxthreads_max = 0;
863
864 goto quit;
865 }
866
867 /* If we've already found our variables in another objfile, don't
868 bother looking for them again. */
869 if (linuxthreads_max)
870 goto quit;
871
872 if (! lookup_minimal_symbol ("__pthread_initial_thread", NULL, objfile))
873 /* This object file isn't the pthreads library. */
874 goto quit;
875
876 if ((ms = lookup_minimal_symbol ("__pthread_threads_debug",
877 NULL, objfile)) == NULL)
878 {
879 /* The debugging-aware libpthreads is not present in this objfile */
880 warning ("\
881 This program seems to use POSIX threads, but the thread library used\n\
882 does not support debugging. This may make using GDB difficult. Don't\n\
883 set breakpoints or single-step through code that might be executed by\n\
884 any thread other than the main thread.");
885 goto quit;
886 }
887 linuxthreads_debug = SYMBOL_VALUE_ADDRESS (ms);
888
889 /* Read internal structures configuration */
890 if ((ms = lookup_minimal_symbol ("__pthread_sizeof_handle",
891 NULL, objfile)) == NULL
892 || target_read_memory (SYMBOL_VALUE_ADDRESS (ms),
893 (char *)&linuxthreads_sizeof_handle,
894 sizeof (linuxthreads_sizeof_handle)) != 0)
895 {
896 fprintf_unfiltered (gdb_stderr,
897 "Unable to find linuxthreads symbol \"%s\"\n",
898 "__pthread_sizeof_handle");
899 goto quit;
900 }
901
902 if ((ms = lookup_minimal_symbol ("__pthread_offsetof_descr",
903 NULL, objfile)) == NULL
904 || target_read_memory (SYMBOL_VALUE_ADDRESS (ms),
905 (char *)&linuxthreads_offset_descr,
906 sizeof (linuxthreads_offset_descr)) != 0)
907 {
908 fprintf_unfiltered (gdb_stderr,
909 "Unable to find linuxthreads symbol \"%s\"\n",
910 "__pthread_offsetof_descr");
911 goto quit;
912 }
913
914 if ((ms = lookup_minimal_symbol ("__pthread_offsetof_pid",
915 NULL, objfile)) == NULL
916 || target_read_memory (SYMBOL_VALUE_ADDRESS (ms),
917 (char *)&linuxthreads_offset_pid,
918 sizeof (linuxthreads_offset_pid)) != 0)
919 {
920 fprintf_unfiltered (gdb_stderr,
921 "Unable to find linuxthreads symbol \"%s\"\n",
922 "__pthread_offsetof_pid");
923 goto quit;
924 }
925
926 if (! find_all_signal_vars (objfile))
927 goto quit;
928
929 /* Read adresses of internal structures to access */
930 if ((ms = lookup_minimal_symbol ("__pthread_handles",
931 NULL, objfile)) == NULL)
932 {
933 fprintf_unfiltered (gdb_stderr,
934 "Unable to find linuxthreads symbol \"%s\"\n",
935 "__pthread_handles");
936 goto quit;
937 }
938 linuxthreads_handles = SYMBOL_VALUE_ADDRESS (ms);
939
940 if ((ms = lookup_minimal_symbol ("__pthread_handles_num",
941 NULL, objfile)) == NULL)
942 {
943 fprintf_unfiltered (gdb_stderr,
944 "Unable to find linuxthreads symbol \"%s\"\n",
945 "__pthread_handles_num");
946 goto quit;
947 }
948 linuxthreads_num = SYMBOL_VALUE_ADDRESS (ms);
949
950 if ((ms = lookup_minimal_symbol ("__pthread_manager_thread",
951 NULL, objfile)) == NULL)
952 {
953 fprintf_unfiltered (gdb_stderr,
954 "Unable to find linuxthreads symbol \"%s\"\n",
955 "__pthread_manager_thread");
956 goto quit;
957 }
958 linuxthreads_manager = SYMBOL_VALUE_ADDRESS (ms) + linuxthreads_offset_pid;
959
960 if ((ms = lookup_minimal_symbol ("__pthread_initial_thread",
961 NULL, objfile)) == NULL)
962 {
963 fprintf_unfiltered (gdb_stderr,
964 "Unable to find linuxthreads symbol \"%s\"\n",
965 "__pthread_initial_thread");
966 goto quit;
967 }
968 linuxthreads_initial = SYMBOL_VALUE_ADDRESS (ms) + linuxthreads_offset_pid;
969
970 /* Search for this last, so it won't be set to a non-zero value unless
971 we successfully found all the symbols above. */
972 if ((ms = lookup_minimal_symbol ("__pthread_threads_max",
973 NULL, objfile)) == NULL
974 || target_read_memory (SYMBOL_VALUE_ADDRESS (ms),
975 (char *)&linuxthreads_max,
976 sizeof (linuxthreads_max)) != 0)
977 {
978 fprintf_unfiltered (gdb_stderr,
979 "Unable to find linuxthreads symbol \"%s\"\n",
980 "__pthread_threads_max");
981 goto quit;
982 }
983
984 /* Allocate gdb internal structures */
985 linuxthreads_wait_pid =
986 (int *) xmalloc (sizeof (int) * (linuxthreads_max + 1));
987 linuxthreads_wait_status =
988 (int *) xmalloc (sizeof (int) * (linuxthreads_max + 1));
989 linuxthreads_breakpoint_zombie = (struct linuxthreads_breakpoint *)
990 xmalloc (sizeof (struct linuxthreads_breakpoint) * (linuxthreads_max + 1));
991
992 if (inferior_pid && !linuxthreads_attach_pending)
993 {
994 int on = 1;
995 target_write_memory (linuxthreads_debug, (char *)&on, sizeof (on));
996 linuxthreads_attach_pending = 1;
997 update_stop_threads (inferior_pid);
998 linuxthreads_attach_pending = 0;
999 }
1000
1001 quit:
1002 /* Call predecessor on chain, if any. */
1003 if (target_new_objfile_chain)
1004 target_new_objfile_chain (objfile);
1005 }
1006
1007 /* If we have switched threads from a one that stopped at breakpoint,
1008 return 1 otherwise 0. */
1009
1010 int
1011 linuxthreads_prepare_to_proceed (step)
1012 int step;
1013 {
1014 if (!linuxthreads_max
1015 || !linuxthreads_manager_pid
1016 || !linuxthreads_breakpoint_pid
1017 || !breakpoint_here_p (read_pc_pid (linuxthreads_breakpoint_pid)))
1018 return 0;
1019
1020 if (step)
1021 {
1022 /* Mark the current inferior as single stepping process. */
1023 linuxthreads_step_pid = inferior_pid;
1024 }
1025
1026 linuxthreads_inferior_pid = linuxthreads_breakpoint_pid;
1027 return linuxthreads_breakpoint_pid;
1028 }
1029
1030 /* Convert a pid to printable form. */
1031
1032 char *
1033 linuxthreads_pid_to_str (pid)
1034 int pid;
1035 {
1036 static char buf[100];
1037
1038 sprintf (buf, "%s %d%s", linuxthreads_max ? "Thread" : "Pid", pid,
1039 (pid == linuxthreads_manager_pid) ? " (manager thread)"
1040 : (pid == linuxthreads_initial_pid) ? " (initial thread)"
1041 : "");
1042
1043 return buf;
1044 }
1045
1046 /* Attach to process PID, then initialize for debugging it
1047 and wait for the trace-trap that results from attaching. */
1048
1049 static void
1050 linuxthreads_attach (args, from_tty)
1051 char *args;
1052 int from_tty;
1053 {
1054 if (!args)
1055 error_no_arg ("process-id to attach");
1056
1057 push_target (&linuxthreads_ops);
1058 linuxthreads_breakpoints_inserted = 1;
1059 linuxthreads_breakpoint_last = -1;
1060 linuxthreads_wait_last = -1;
1061 linuxthreads_exit_status = __W_STOPCODE(0);
1062
1063 child_ops.to_attach (args, from_tty);
1064
1065 if (linuxthreads_max)
1066 linuxthreads_attach_pending = 1;
1067 }
1068
1069 /* Take a program previously attached to and detaches it.
1070 The program resumes execution and will no longer stop
1071 on signals, etc. We'd better not have left any breakpoints
1072 in the program or it'll die when it hits one. For this
1073 to work, it may be necessary for the process to have been
1074 previously attached. It *might* work if the program was
1075 started via the normal ptrace (PTRACE_TRACEME). */
1076
1077 static void
1078 linuxthreads_detach (args, from_tty)
1079 char *args;
1080 int from_tty;
1081 {
1082 if (linuxthreads_max)
1083 {
1084 int i;
1085 int pid;
1086 int off = 0;
1087 target_write_memory (linuxthreads_debug, (char *)&off, sizeof (off));
1088
1089 /* Walk through linuxthreads array in order to detach known threads. */
1090 if (linuxthreads_manager_pid != 0)
1091 {
1092 /* Get rid of all positive zombie breakpoints. */
1093 for (i = 0; i <= linuxthreads_breakpoint_last; i++)
1094 {
1095 if (linuxthreads_breakpoint_zombie[i].step)
1096 continue;
1097
1098 pid = linuxthreads_breakpoint_zombie[i].pid;
1099 if (!linuxthreads_thread_alive (pid))
1100 continue;
1101
1102 if (linuxthreads_breakpoint_zombie[i].pc != read_pc_pid (pid))
1103 continue;
1104
1105 /* Continue in STEP mode until the thread pc has moved or
1106 until SIGTRAP is found on the same PC. */
1107 if (linuxthreads_find_trap (pid, 0)
1108 && linuxthreads_breakpoint_zombie[i].pc == read_pc_pid (pid))
1109 write_pc_pid (linuxthreads_breakpoint_zombie[i].pc
1110 - DECR_PC_AFTER_BREAK, pid);
1111 }
1112
1113 /* Detach thread after thread. */
1114 inferior_pid = linuxthreads_manager_pid;
1115 iterate_active_threads (detach_thread, 1);
1116
1117 /* Remove pending SIGTRAP and SIGSTOP */
1118 linuxthreads_find_trap (inferior_pid, 1);
1119
1120 linuxthreads_wait_last = -1;
1121 linuxthreads_exit_status = __W_STOPCODE(0);
1122 }
1123
1124 linuxthreads_inferior_pid = 0;
1125 linuxthreads_breakpoint_pid = 0;
1126 linuxthreads_step_pid = 0;
1127 linuxthreads_step_signo = TARGET_SIGNAL_0;
1128 linuxthreads_manager_pid = 0;
1129 linuxthreads_initial_pid = 0;
1130 linuxthreads_attach_pending = 0;
1131 init_thread_list (); /* Destroy thread info */
1132 }
1133
1134 child_ops.to_detach (args, from_tty);
1135
1136 unpush_target (&linuxthreads_ops);
1137 }
1138
1139 /* Resume execution of process PID. If STEP is nozero, then
1140 just single step it. If SIGNAL is nonzero, restart it with that
1141 signal activated. */
1142
1143 static void
1144 linuxthreads_resume (pid, step, signo)
1145 int pid;
1146 int step;
1147 enum target_signal signo;
1148 {
1149 if (!linuxthreads_max || stop_soon_quietly || linuxthreads_manager_pid == 0)
1150 child_ops.to_resume (pid, step, signo);
1151 else
1152 {
1153 int rpid;
1154 if (linuxthreads_inferior_pid)
1155 {
1156 /* Prepare resume of the last thread that hit a breakpoint */
1157 linuxthreads_breakpoints_inserted = 0;
1158 rpid = linuxthreads_inferior_pid;
1159 linuxthreads_step_signo = signo;
1160 }
1161 else
1162 {
1163 struct cleanup *old_chain = NULL;
1164 int i;
1165
1166 if (pid < 0)
1167 {
1168 linuxthreads_step_pid = step ? inferior_pid : 0;
1169 linuxthreads_step_signo = signo;
1170 rpid = inferior_pid;
1171 }
1172 else
1173 rpid = pid;
1174
1175 if (pid < 0 || !step)
1176 {
1177 linuxthreads_breakpoints_inserted = 1;
1178
1179 /* Walk through linuxthreads array in order to resume threads */
1180 if (pid >= 0 && inferior_pid != pid)
1181 {
1182 old_chain = save_inferior_pid ();
1183 inferior_pid = pid;
1184 }
1185
1186 iterate_active_threads (resume_thread, 0);
1187 if (linuxthreads_manager_pid != inferior_pid
1188 && !linuxthreads_pending_status (linuxthreads_manager_pid))
1189 resume_thread (linuxthreads_manager_pid);
1190 }
1191 else
1192 linuxthreads_breakpoints_inserted = 0;
1193
1194 /* Deal with zombie breakpoint */
1195 for (i = 0; i <= linuxthreads_breakpoint_last; i++)
1196 if (linuxthreads_breakpoint_zombie[i].pid == rpid)
1197 {
1198 if (linuxthreads_breakpoint_zombie[i].pc != read_pc_pid (rpid))
1199 {
1200 /* The current pc is out of zombie breakpoint. */
1201 REMOVE_BREAKPOINT_ZOMBIE(i);
1202 }
1203 break;
1204 }
1205
1206 if (old_chain != NULL)
1207 do_cleanups (old_chain);
1208 }
1209
1210 /* Resume initial thread. */
1211 if (!linuxthreads_pending_status (rpid))
1212 child_ops.to_resume (rpid, step, signo);
1213 }
1214 }
1215
1216 /* Wait for any threads to stop. We may have to convert PID from a thread id
1217 to a LWP id, and vice versa on the way out. */
1218
1219 static int
1220 linuxthreads_wait (pid, ourstatus)
1221 int pid;
1222 struct target_waitstatus *ourstatus;
1223 {
1224 int status;
1225 int rpid;
1226 int i;
1227 int last;
1228 int *wstatus;
1229
1230 if (linuxthreads_max && !linuxthreads_breakpoints_inserted)
1231 wstatus = alloca (LINUXTHREAD_NSIG * sizeof (int));
1232
1233 /* See if the inferior has chosen values for its signals yet. By
1234 checking for them here, we can be sure we've updated GDB's signal
1235 handling table before the inferior ever gets one of them. (Well,
1236 before we notice, anyway.) */
1237 check_all_signal_numbers ();
1238
1239 for (;;)
1240 {
1241 if (!linuxthreads_max)
1242 rpid = 0;
1243 else if (!linuxthreads_breakpoints_inserted)
1244 {
1245 if (linuxthreads_inferior_pid)
1246 pid = linuxthreads_inferior_pid;
1247 else if (pid < 0)
1248 pid = inferior_pid;
1249 last = rpid = 0;
1250 }
1251 else if (pid < 0 && linuxthreads_wait_last >= 0)
1252 {
1253 status = linuxthreads_wait_status[linuxthreads_wait_last];
1254 rpid = linuxthreads_wait_pid[linuxthreads_wait_last--];
1255 }
1256 else if (pid > 0 && linuxthreads_pending_status (pid))
1257 {
1258 for (i = linuxthreads_wait_last; i >= 0; i--)
1259 if (linuxthreads_wait_pid[i] == pid)
1260 break;
1261 if (i < 0)
1262 rpid = 0;
1263 else
1264 {
1265 status = linuxthreads_wait_status[i];
1266 rpid = pid;
1267 if (i < linuxthreads_wait_last)
1268 {
1269 linuxthreads_wait_status[i] =
1270 linuxthreads_wait_status[linuxthreads_wait_last];
1271 linuxthreads_wait_pid[i] =
1272 linuxthreads_wait_pid[linuxthreads_wait_last];
1273 }
1274 linuxthreads_wait_last--;
1275 }
1276 }
1277 else
1278 rpid = 0;
1279
1280 if (rpid == 0)
1281 {
1282 int save_errno;
1283 sigset_t omask;
1284
1285 set_sigint_trap(); /* Causes SIGINT to be passed on to the
1286 attached process. */
1287 set_sigio_trap ();
1288
1289 sigprocmask(SIG_BLOCK, &linuxthreads_wait_mask, &omask);
1290 for (;;)
1291 {
1292 rpid = waitpid (pid, &status, __WCLONE | WNOHANG);
1293 if (rpid > 0)
1294 break;
1295 if (rpid == 0)
1296 save_errno = 0;
1297 else if (errno != EINTR)
1298 save_errno = errno;
1299 else
1300 continue;
1301
1302 rpid = waitpid (pid, &status, WNOHANG);
1303 if (rpid > 0)
1304 break;
1305 if (rpid < 0)
1306 {
1307 if (errno == EINTR)
1308 continue;
1309 else if (save_errno != 0)
1310 break;
1311 }
1312
1313 sigsuspend(&omask);
1314 }
1315 sigprocmask(SIG_SETMASK, &omask, NULL);
1316
1317 save_errno = errno;
1318 clear_sigio_trap ();
1319
1320 clear_sigint_trap();
1321
1322 if (rpid == -1)
1323 {
1324 if (WIFEXITED(linuxthreads_exit_status))
1325 {
1326 store_waitstatus (ourstatus, linuxthreads_exit_status);
1327 return inferior_pid;
1328 }
1329 else
1330 {
1331 fprintf_unfiltered
1332 (gdb_stderr, "Child process unexpectedly missing: %s.\n",
1333 safe_strerror (save_errno));
1334 /* Claim it exited with unknown signal. */
1335 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
1336 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
1337 return -1;
1338 }
1339 }
1340
1341 /* Signals arrive in any order. So get all signals until SIGTRAP
1342 and resend previous ones to be held after. */
1343 if (linuxthreads_max
1344 && !linuxthreads_breakpoints_inserted
1345 && WIFSTOPPED(status))
1346 if (WSTOPSIG(status) == SIGTRAP)
1347 {
1348 while (--last >= 0)
1349 kill (rpid, WSTOPSIG(wstatus[last]));
1350
1351 /* insert negative zombie breakpoint */
1352 for (i = 0; i <= linuxthreads_breakpoint_last; i++)
1353 if (linuxthreads_breakpoint_zombie[i].pid == rpid)
1354 break;
1355 if (i > linuxthreads_breakpoint_last)
1356 {
1357 linuxthreads_breakpoint_zombie[i].pid = rpid;
1358 linuxthreads_breakpoint_last++;
1359 }
1360 linuxthreads_breakpoint_zombie[i].pc = read_pc_pid (rpid);
1361 linuxthreads_breakpoint_zombie[i].step = 1;
1362 }
1363 else
1364 {
1365 if (WSTOPSIG(status) != SIGSTOP)
1366 {
1367 for (i = 0; i < last; i++)
1368 if (wstatus[i] == status)
1369 break;
1370 if (i >= last)
1371 wstatus[last++] = status;
1372 }
1373 child_resume (rpid, 1, TARGET_SIGNAL_0);
1374 continue;
1375 }
1376 if (linuxthreads_inferior_pid)
1377 linuxthreads_inferior_pid = 0;
1378 }
1379
1380 if (linuxthreads_max && !stop_soon_quietly)
1381 {
1382 if (linuxthreads_max
1383 && WIFSTOPPED(status)
1384 && WSTOPSIG(status) == SIGSTOP)
1385 {
1386 /* Skip SIGSTOP signals. */
1387 if (!linuxthreads_pending_status (rpid))
1388 {
1389 if (linuxthreads_step_pid == rpid)
1390 child_resume (rpid, 1, linuxthreads_step_signo);
1391 else
1392 child_resume (rpid, 0, TARGET_SIGNAL_0);
1393 }
1394 continue;
1395 }
1396
1397 /* Do no report exit status of cloned threads. */
1398 if (WIFEXITED(status))
1399 {
1400 if (rpid == linuxthreads_initial_pid)
1401 linuxthreads_exit_status = status;
1402
1403 /* Remove any zombie breakpoint. */
1404 for (i = 0; i <= linuxthreads_breakpoint_last; i++)
1405 if (linuxthreads_breakpoint_zombie[i].pid == rpid)
1406 {
1407 REMOVE_BREAKPOINT_ZOMBIE(i);
1408 break;
1409 }
1410 if (pid > 0)
1411 pid = -1;
1412 continue;
1413 }
1414
1415 /* Deal with zombie breakpoint */
1416 for (i = 0; i <= linuxthreads_breakpoint_last; i++)
1417 if (linuxthreads_breakpoint_zombie[i].pid == rpid)
1418 break;
1419
1420 if (i <= linuxthreads_breakpoint_last)
1421 {
1422 /* There is a potential zombie breakpoint */
1423 if (WIFEXITED(status)
1424 || linuxthreads_breakpoint_zombie[i].pc != read_pc_pid (rpid))
1425 {
1426 /* The current pc is out of zombie breakpoint. */
1427 REMOVE_BREAKPOINT_ZOMBIE(i);
1428 }
1429 else if (!linuxthreads_breakpoint_zombie[i].step
1430 && WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP)
1431 {
1432 /* This is a real one ==> decrement PC and restart. */
1433 write_pc_pid (linuxthreads_breakpoint_zombie[i].pc
1434 - DECR_PC_AFTER_BREAK, rpid);
1435 if (linuxthreads_step_pid == rpid)
1436 child_resume (rpid, 1, linuxthreads_step_signo);
1437 else
1438 child_resume (rpid, 0, TARGET_SIGNAL_0);
1439 continue;
1440 }
1441 }
1442
1443 /* Walk through linuxthreads array in order to stop them */
1444 if (linuxthreads_breakpoints_inserted)
1445 update_stop_threads (rpid);
1446
1447 }
1448 else if (rpid != inferior_pid)
1449 continue;
1450
1451 store_waitstatus (ourstatus, status);
1452
1453 if (linuxthreads_attach_pending && !stop_soon_quietly)
1454 {
1455 int on = 1;
1456 target_write_memory (linuxthreads_debug, (char *)&on, sizeof (on));
1457 update_stop_threads (rpid);
1458 linuxthreads_attach_pending = 0;
1459 }
1460
1461 if (linuxthreads_breakpoints_inserted
1462 && WIFSTOPPED(status)
1463 && WSTOPSIG(status) == SIGTRAP)
1464 linuxthreads_breakpoint_pid = rpid;
1465 else if (linuxthreads_breakpoint_pid)
1466 linuxthreads_breakpoint_pid = 0;
1467
1468 return rpid;
1469 }
1470 }
1471
1472 /* Fork an inferior process, and start debugging it with ptrace. */
1473
1474 static void
1475 linuxthreads_create_inferior (exec_file, allargs, env)
1476 char *exec_file;
1477 char *allargs;
1478 char **env;
1479 {
1480 if (!exec_file && !exec_bfd)
1481 {
1482 error ("No executable file specified.\n\
1483 Use the \"file\" or \"exec-file\" command.");
1484 return;
1485 }
1486
1487 push_target (&linuxthreads_ops);
1488 linuxthreads_breakpoints_inserted = 1;
1489 linuxthreads_breakpoint_last = -1;
1490 linuxthreads_wait_last = -1;
1491 linuxthreads_exit_status = __W_STOPCODE(0);
1492
1493 if (linuxthreads_max)
1494 linuxthreads_attach_pending = 1;
1495
1496 child_ops.to_create_inferior (exec_file, allargs, env);
1497 }
1498
1499 /* Clean up after the inferior dies. */
1500
1501 static void
1502 linuxthreads_mourn_inferior ()
1503 {
1504 if (linuxthreads_max)
1505 {
1506 int off = 0;
1507 target_write_memory (linuxthreads_debug, (char *)&off, sizeof (off));
1508
1509 linuxthreads_inferior_pid = 0;
1510 linuxthreads_breakpoint_pid = 0;
1511 linuxthreads_step_pid = 0;
1512 linuxthreads_step_signo = TARGET_SIGNAL_0;
1513 linuxthreads_manager_pid = 0;
1514 linuxthreads_initial_pid = 0;
1515 linuxthreads_attach_pending = 0;
1516 init_thread_list(); /* Destroy thread info */
1517 }
1518
1519 child_ops.to_mourn_inferior ();
1520
1521 unpush_target (&linuxthreads_ops);
1522 }
1523
1524 /* Kill the inferior process */
1525
1526 static void
1527 linuxthreads_kill ()
1528 {
1529 int rpid;
1530 int status;
1531
1532 if (inferior_pid == 0)
1533 return;
1534
1535 if (linuxthreads_max && linuxthreads_manager_pid != 0)
1536 {
1537 /* Remove all threads status. */
1538 inferior_pid = linuxthreads_manager_pid;
1539 iterate_active_threads (kill_thread, 1);
1540 }
1541
1542 kill_thread (inferior_pid);
1543
1544 #if 0
1545 /* doing_quit_force solves a real problem, but I think a properly
1546 placed call to catch_errors would do the trick much more cleanly. */
1547 if (doing_quit_force >= 0)
1548 {
1549 if (linuxthreads_max && linuxthreads_manager_pid != 0)
1550 {
1551 /* Wait for thread to complete */
1552 while ((rpid = waitpid (-1, &status, __WCLONE)) > 0)
1553 if (!WIFEXITED(status))
1554 kill_thread (rpid);
1555
1556 while ((rpid = waitpid (-1, &status, 0)) > 0)
1557 if (!WIFEXITED(status))
1558 kill_thread (rpid);
1559 }
1560 else
1561 while ((rpid = waitpid (inferior_pid, &status, 0)) > 0)
1562 if (!WIFEXITED(status))
1563 ptrace (PT_KILL, inferior_pid, (PTRACE_ARG3_TYPE) 0, 0);
1564 }
1565 #endif
1566
1567 /* Wait for all threads. */
1568 do
1569 rpid = waitpid (-1, &status, __WCLONE | WNOHANG);
1570 while (rpid > 0 || errno == EINTR);
1571
1572 do
1573 rpid = waitpid (-1, &status, WNOHANG);
1574 while (rpid > 0 || errno == EINTR);
1575
1576 linuxthreads_mourn_inferior ();
1577 }
1578
1579 /* Insert a breakpoint */
1580
1581 static int
1582 linuxthreads_insert_breakpoint (addr, contents_cache)
1583 CORE_ADDR addr;
1584 char *contents_cache;
1585 {
1586 if (linuxthreads_max && linuxthreads_manager_pid != 0)
1587 {
1588 linuxthreads_breakpoint_addr = addr;
1589 iterate_active_threads (insert_breakpoint, 1);
1590 insert_breakpoint (linuxthreads_manager_pid);
1591 }
1592
1593 return child_ops.to_insert_breakpoint (addr, contents_cache);
1594 }
1595
1596 /* Remove a breakpoint */
1597
1598 static int
1599 linuxthreads_remove_breakpoint (addr, contents_cache)
1600 CORE_ADDR addr;
1601 char *contents_cache;
1602 {
1603 if (linuxthreads_max && linuxthreads_manager_pid != 0)
1604 {
1605 linuxthreads_breakpoint_addr = addr;
1606 iterate_active_threads (remove_breakpoint, 1);
1607 remove_breakpoint (linuxthreads_manager_pid);
1608 }
1609
1610 return child_ops.to_remove_breakpoint (addr, contents_cache);
1611 }
1612
1613 /* Mark our target-struct as eligible for stray "run" and "attach" commands. */
1614
1615 static int
1616 linuxthreads_can_run ()
1617 {
1618 return child_suppress_run;
1619 }
1620 \f
1621 static void
1622 init_linuxthreads_ops ()
1623 {
1624 linuxthreads_ops.to_shortname = "linuxthreads";
1625 linuxthreads_ops.to_longname = "LINUX threads and pthread.";
1626 linuxthreads_ops.to_doc = "LINUX threads and pthread support.";
1627 linuxthreads_ops.to_attach = linuxthreads_attach;
1628 linuxthreads_ops.to_detach = linuxthreads_detach;
1629 linuxthreads_ops.to_resume = linuxthreads_resume;
1630 linuxthreads_ops.to_wait = linuxthreads_wait;
1631 linuxthreads_ops.to_kill = linuxthreads_kill;
1632 linuxthreads_ops.to_can_run = linuxthreads_can_run;
1633 linuxthreads_ops.to_stratum = thread_stratum;
1634 linuxthreads_ops.to_insert_breakpoint = linuxthreads_insert_breakpoint;
1635 linuxthreads_ops.to_remove_breakpoint = linuxthreads_remove_breakpoint;
1636 linuxthreads_ops.to_create_inferior = linuxthreads_create_inferior;
1637 linuxthreads_ops.to_mourn_inferior = linuxthreads_mourn_inferior;
1638 linuxthreads_ops.to_thread_alive = linuxthreads_thread_alive;
1639 linuxthreads_ops.to_magic = OPS_MAGIC;
1640 }
1641
1642 void
1643 _initialize_linuxthreads ()
1644 {
1645 struct sigaction sact;
1646
1647 init_linuxthreads_ops ();
1648 add_target (&linuxthreads_ops);
1649 child_suppress_run = 1;
1650
1651 /* Hook onto the "new_objfile" event.
1652 * If someone else is already hooked onto the event,
1653 * then make sure he will be called after we are.
1654 */
1655 target_new_objfile_chain = target_new_objfile_hook;
1656 target_new_objfile_hook = linuxthreads_new_objfile;
1657
1658 /* Attach SIGCHLD handler */
1659 sact.sa_handler = sigchld_handler;
1660 sigemptyset (&sact.sa_mask);
1661 sact.sa_flags = 0;
1662 sigaction (SIGCHLD, &sact, NULL);
1663
1664 /* initialize SIGCHLD mask */
1665 sigemptyset (&linuxthreads_wait_mask);
1666 sigaddset (&linuxthreads_wait_mask, SIGCHLD);
1667 }
This page took 0.081692 seconds and 4 git commands to generate.