OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [gdb/] [linux-thread-db.c] - Blame information for rev 851

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
/* libthread_db assisted debugging support, generic parts.
2
 
3
   Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
4
   2010 Free Software Foundation, Inc.
5
 
6
   This file is part of GDB.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
 
21
#include "defs.h"
22
 
23
#include "gdb_assert.h"
24
#include <dlfcn.h>
25
#include "gdb_proc_service.h"
26
#include "gdb_thread_db.h"
27
 
28
#include "bfd.h"
29
#include "command.h"
30
#include "exceptions.h"
31
#include "gdbcmd.h"
32
#include "gdbthread.h"
33
#include "inferior.h"
34
#include "symfile.h"
35
#include "objfiles.h"
36
#include "target.h"
37
#include "regcache.h"
38
#include "solib.h"
39
#include "solib-svr4.h"
40
#include "gdbcore.h"
41
#include "observer.h"
42
#include "linux-nat.h"
43
 
44
#include <signal.h>
45
 
46
#ifdef HAVE_GNU_LIBC_VERSION_H
47
#include <gnu/libc-version.h>
48
#endif
49
 
50
/* GNU/Linux libthread_db support.
51
 
52
   libthread_db is a library, provided along with libpthread.so, which
53
   exposes the internals of the thread library to a debugger.  It
54
   allows GDB to find existing threads, new threads as they are
55
   created, thread IDs (usually, the result of pthread_self), and
56
   thread-local variables.
57
 
58
   The libthread_db interface originates on Solaris, where it is
59
   both more powerful and more complicated.  This implementation
60
   only works for LinuxThreads and NPTL, the two glibc threading
61
   libraries.  It assumes that each thread is permanently assigned
62
   to a single light-weight process (LWP).
63
 
64
   libthread_db-specific information is stored in the "private" field
65
   of struct thread_info.  When the field is NULL we do not yet have
66
   information about the new thread; this could be temporary (created,
67
   but the thread library's data structures do not reflect it yet)
68
   or permanent (created using clone instead of pthread_create).
69
 
70
   Process IDs managed by linux-thread-db.c match those used by
71
   linux-nat.c: a common PID for all processes, an LWP ID for each
72
   thread, and no TID.  We save the TID in private.  Keeping it out
73
   of the ptid_t prevents thread IDs changing when libpthread is
74
   loaded or unloaded.  */
75
 
76
static char *libthread_db_search_path;
77
 
78
/* If we're running on GNU/Linux, we must explicitly attach to any new
79
   threads.  */
80
 
81
/* This module's target vector.  */
82
static struct target_ops thread_db_ops;
83
 
84
/* Non-zero if we have determined the signals used by the threads
85
   library.  */
86
static int thread_signals;
87
static sigset_t thread_stop_set;
88
static sigset_t thread_print_set;
89
 
90
struct thread_db_info
91
{
92
  struct thread_db_info *next;
93
 
94
  /* Process id this object refers to.  */
95
  int pid;
96
 
97
  /* Handle from dlopen for libthread_db.so.  */
98
  void *handle;
99
 
100
  /* Structure that identifies the child process for the
101
     <proc_service.h> interface.  */
102
  struct ps_prochandle proc_handle;
103
 
104
  /* Connection to the libthread_db library.  */
105
  td_thragent_t *thread_agent;
106
 
107
  /* True if we need to apply the workaround for glibc/BZ5983.  When
108
     we catch a PTRACE_O_TRACEFORK, and go query the child's thread
109
     list, nptl_db returns the parent's threads in addition to the new
110
     (single) child thread.  If this flag is set, we do extra work to
111
     be able to ignore such stale entries.  */
112
  int need_stale_parent_threads_check;
113
 
114
  /* Location of the thread creation event breakpoint.  The code at
115
     this location in the child process will be called by the pthread
116
     library whenever a new thread is created.  By setting a special
117
     breakpoint at this location, GDB can detect when a new thread is
118
     created.  We obtain this location via the td_ta_event_addr
119
     call.  */
120
  CORE_ADDR td_create_bp_addr;
121
 
122
  /* Location of the thread death event breakpoint.  */
123
  CORE_ADDR td_death_bp_addr;
124
 
125
  /* Pointers to the libthread_db functions.  */
126
 
127
  td_err_e (*td_init_p) (void);
128
 
129
  td_err_e (*td_ta_new_p) (struct ps_prochandle * ps,
130
                                td_thragent_t **ta);
131
  td_err_e (*td_ta_map_id2thr_p) (const td_thragent_t *ta, thread_t pt,
132
                                  td_thrhandle_t *__th);
133
  td_err_e (*td_ta_map_lwp2thr_p) (const td_thragent_t *ta,
134
                                   lwpid_t lwpid, td_thrhandle_t *th);
135
  td_err_e (*td_ta_thr_iter_p) (const td_thragent_t *ta,
136
                                td_thr_iter_f *callback, void *cbdata_p,
137
                                td_thr_state_e state, int ti_pri,
138
                                sigset_t *ti_sigmask_p,
139
                                unsigned int ti_user_flags);
140
  td_err_e (*td_ta_event_addr_p) (const td_thragent_t *ta,
141
                                  td_event_e event, td_notify_t *ptr);
142
  td_err_e (*td_ta_set_event_p) (const td_thragent_t *ta,
143
                                 td_thr_events_t *event);
144
  td_err_e (*td_ta_clear_event_p) (const td_thragent_t *ta,
145
                                   td_thr_events_t *event);
146
  td_err_e (*td_ta_event_getmsg_p) (const td_thragent_t *ta,
147
                                    td_event_msg_t *msg);
148
 
149
  td_err_e (*td_thr_validate_p) (const td_thrhandle_t *th);
150
  td_err_e (*td_thr_get_info_p) (const td_thrhandle_t *th,
151
                                 td_thrinfo_t *infop);
152
  td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th,
153
                                     int event);
154
 
155
  td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
156
                                     psaddr_t map_address,
157
                                     size_t offset, psaddr_t *address);
158
};
159
 
160
/* List of known processes using thread_db, and the required
161
   bookkeeping.  */
162
struct thread_db_info *thread_db_list;
163
 
164
static void thread_db_find_new_threads_1 (ptid_t ptid);
165
static void thread_db_find_new_threads_2 (ptid_t ptid, int until_no_new);
166
 
167
/* Add the current inferior to the list of processes using libpthread.
168
   Return a pointer to the newly allocated object that was added to
169
   THREAD_DB_LIST.  HANDLE is the handle returned by dlopen'ing
170
   LIBTHREAD_DB_SO.  */
171
 
172
static struct thread_db_info *
173
add_thread_db_info (void *handle)
174
{
175
  struct thread_db_info *info;
176
 
177
  info = xcalloc (1, sizeof (*info));
178
  info->pid = ptid_get_pid (inferior_ptid);
179
  info->handle = handle;
180
  info->need_stale_parent_threads_check = 1;
181
 
182
  info->next = thread_db_list;
183
  thread_db_list = info;
184
 
185
  return info;
186
}
187
 
188
/* Return the thread_db_info object representing the bookkeeping
189
   related to process PID, if any; NULL otherwise.  */
190
 
191
static struct thread_db_info *
192
get_thread_db_info (int pid)
193
{
194
  struct thread_db_info *info;
195
 
196
  for (info = thread_db_list; info; info = info->next)
197
    if (pid == info->pid)
198
      return info;
199
 
200
  return NULL;
201
}
202
 
203
/* When PID has exited or has been detached, we no longer want to keep
204
   track of it as using libpthread.  Call this function to discard
205
   thread_db related info related to PID.  Note that this closes
206
   LIBTHREAD_DB_SO's dlopen'ed handle.  */
207
 
208
static void
209
delete_thread_db_info (int pid)
210
{
211
  struct thread_db_info *info, *info_prev;
212
 
213
  info_prev = NULL;
214
 
215
  for (info = thread_db_list; info; info_prev = info, info = info->next)
216
    if (pid == info->pid)
217
      break;
218
 
219
  if (info == NULL)
220
    return;
221
 
222
  if (info->handle != NULL)
223
    dlclose (info->handle);
224
 
225
  if (info_prev)
226
    info_prev->next = info->next;
227
  else
228
    thread_db_list = info->next;
229
 
230
  xfree (info);
231
}
232
 
233
/* Prototypes for local functions.  */
234
static int attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
235
                          const td_thrinfo_t *ti_p);
236
static void detach_thread (ptid_t ptid);
237
 
238
 
239
/* Use "struct private_thread_info" to cache thread state.  This is
240
   a substantial optimization.  */
241
 
242
struct private_thread_info
243
{
244
  /* Flag set when we see a TD_DEATH event for this thread.  */
245
  unsigned int dying:1;
246
 
247
  /* Cached thread state.  */
248
  td_thrhandle_t th;
249
  thread_t tid;
250
};
251
 
252
 
253
static char *
254
thread_db_err_str (td_err_e err)
255
{
256
  static char buf[64];
257
 
258
  switch (err)
259
    {
260
    case TD_OK:
261
      return "generic 'call succeeded'";
262
    case TD_ERR:
263
      return "generic error";
264
    case TD_NOTHR:
265
      return "no thread to satisfy query";
266
    case TD_NOSV:
267
      return "no sync handle to satisfy query";
268
    case TD_NOLWP:
269
      return "no LWP to satisfy query";
270
    case TD_BADPH:
271
      return "invalid process handle";
272
    case TD_BADTH:
273
      return "invalid thread handle";
274
    case TD_BADSH:
275
      return "invalid synchronization handle";
276
    case TD_BADTA:
277
      return "invalid thread agent";
278
    case TD_BADKEY:
279
      return "invalid key";
280
    case TD_NOMSG:
281
      return "no event message for getmsg";
282
    case TD_NOFPREGS:
283
      return "FPU register set not available";
284
    case TD_NOLIBTHREAD:
285
      return "application not linked with libthread";
286
    case TD_NOEVENT:
287
      return "requested event is not supported";
288
    case TD_NOCAPAB:
289
      return "capability not available";
290
    case TD_DBERR:
291
      return "debugger service failed";
292
    case TD_NOAPLIC:
293
      return "operation not applicable to";
294
    case TD_NOTSD:
295
      return "no thread-specific data for this thread";
296
    case TD_MALLOC:
297
      return "malloc failed";
298
    case TD_PARTIALREG:
299
      return "only part of register set was written/read";
300
    case TD_NOXREGS:
301
      return "X register set not available for this thread";
302
#ifdef THREAD_DB_HAS_TD_NOTALLOC
303
    case TD_NOTALLOC:
304
      return "thread has not yet allocated TLS for given module";
305
#endif
306
#ifdef THREAD_DB_HAS_TD_VERSION
307
    case TD_VERSION:
308
      return "versions of libpthread and libthread_db do not match";
309
#endif
310
#ifdef THREAD_DB_HAS_TD_NOTLS
311
    case TD_NOTLS:
312
      return "there is no TLS segment in the given module";
313
#endif
314
    default:
315
      snprintf (buf, sizeof (buf), "unknown thread_db error '%d'", err);
316
      return buf;
317
    }
318
}
319
 
320
/* Return 1 if any threads have been registered.  There may be none if
321
   the threading library is not fully initialized yet.  */
322
 
323
static int
324
have_threads_callback (struct thread_info *thread, void *args)
325
{
326
  int pid = * (int *) args;
327
 
328
  if (ptid_get_pid (thread->ptid) != pid)
329
    return 0;
330
 
331
  return thread->private != NULL;
332
}
333
 
334
static int
335
have_threads (ptid_t ptid)
336
{
337
  int pid = ptid_get_pid (ptid);
338
 
339
  return iterate_over_threads (have_threads_callback, &pid) != NULL;
340
}
341
 
342
struct thread_get_info_inout
343
{
344
  struct thread_info *thread_info;
345
  struct thread_db_info *thread_db_info;
346
};
347
 
348
/* A callback function for td_ta_thr_iter, which we use to map all
349
   threads to LWPs.
350
 
351
   THP is a handle to the current thread; if INFOP is not NULL, the
352
   struct thread_info associated with this thread is returned in
353
   *INFOP.
354
 
355
   If the thread is a zombie, TD_THR_ZOMBIE is returned.  Otherwise,
356
   zero is returned to indicate success.  */
357
 
358
static int
359
thread_get_info_callback (const td_thrhandle_t *thp, void *argp)
360
{
361
  td_thrinfo_t ti;
362
  td_err_e err;
363
  ptid_t thread_ptid;
364
  struct thread_get_info_inout *inout;
365
  struct thread_db_info *info;
366
 
367
  inout = argp;
368
  info = inout->thread_db_info;
369
 
370
  err = info->td_thr_get_info_p (thp, &ti);
371
  if (err != TD_OK)
372
    error (_("thread_get_info_callback: cannot get thread info: %s"),
373
           thread_db_err_str (err));
374
 
375
  /* Fill the cache.  */
376
  thread_ptid = ptid_build (info->pid, ti.ti_lid, 0);
377
  inout->thread_info = find_thread_ptid (thread_ptid);
378
 
379
  /* In the case of a zombie thread, don't continue.  We don't want to
380
     attach to it thinking it is a new thread.  */
381
  if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
382
    return TD_THR_ZOMBIE;
383
 
384
  if (inout->thread_info == NULL)
385
    {
386
      /* New thread.  Attach to it now (why wait?).  */
387
      if (!have_threads (thread_ptid))
388
        thread_db_find_new_threads_1 (thread_ptid);
389
      else
390
        attach_thread (thread_ptid, thp, &ti);
391
      inout->thread_info = find_thread_ptid (thread_ptid);
392
      gdb_assert (inout->thread_info != NULL);
393
    }
394
 
395
  return 0;
396
}
397
 
398
/* Convert between user-level thread ids and LWP ids.  */
399
 
400
static ptid_t
401
thread_from_lwp (ptid_t ptid)
402
{
403
  td_thrhandle_t th;
404
  td_err_e err;
405
  struct thread_db_info *info;
406
  struct thread_get_info_inout io = {0};
407
 
408
  /* This ptid comes from linux-nat.c, which should always fill in the
409
     LWP.  */
410
  gdb_assert (GET_LWP (ptid) != 0);
411
 
412
  info = get_thread_db_info (GET_PID (ptid));
413
 
414
  /* Access an lwp we know is stopped.  */
415
  info->proc_handle.ptid = ptid;
416
  err = info->td_ta_map_lwp2thr_p (info->thread_agent, GET_LWP (ptid), &th);
417
  if (err != TD_OK)
418
    error (_("Cannot find user-level thread for LWP %ld: %s"),
419
           GET_LWP (ptid), thread_db_err_str (err));
420
 
421
  /* Fetch the thread info.  If we get back TD_THR_ZOMBIE, then the
422
     event thread has already died.  If another gdb interface has called
423
     thread_alive() previously, the thread won't be found on the thread list
424
     anymore.  In that case, we don't want to process this ptid anymore
425
     to avoid the possibility of later treating it as a newly
426
     discovered thread id that we should add to the list.  Thus,
427
     we return a -1 ptid which is also how the thread list marks a
428
     dead thread.  */
429
  io.thread_db_info = info;
430
  io.thread_info = NULL;
431
  if (thread_get_info_callback (&th, &io) == TD_THR_ZOMBIE
432
      && io.thread_info == NULL)
433
    return minus_one_ptid;
434
 
435
  gdb_assert (ptid_get_tid (ptid) == 0);
436
  return ptid;
437
}
438
 
439
 
440
/* Attach to lwp PTID, doing whatever else is required to have this
441
   LWP under the debugger's control --- e.g., enabling event
442
   reporting.  Returns true on success.  */
443
int
444
thread_db_attach_lwp (ptid_t ptid)
445
{
446
  td_thrhandle_t th;
447
  td_thrinfo_t ti;
448
  td_err_e err;
449
  struct thread_db_info *info;
450
 
451
  info = get_thread_db_info (GET_PID (ptid));
452
 
453
  if (info == NULL)
454
    return 0;
455
 
456
  /* This ptid comes from linux-nat.c, which should always fill in the
457
     LWP.  */
458
  gdb_assert (GET_LWP (ptid) != 0);
459
 
460
  /* Access an lwp we know is stopped.  */
461
  info->proc_handle.ptid = ptid;
462
 
463
  /* If we have only looked at the first thread before libpthread was
464
     initialized, we may not know its thread ID yet.  Make sure we do
465
     before we add another thread to the list.  */
466
  if (!have_threads (ptid))
467
    thread_db_find_new_threads_1 (ptid);
468
 
469
  err = info->td_ta_map_lwp2thr_p (info->thread_agent, GET_LWP (ptid), &th);
470
  if (err != TD_OK)
471
    /* Cannot find user-level thread.  */
472
    return 0;
473
 
474
  err = info->td_thr_get_info_p (&th, &ti);
475
  if (err != TD_OK)
476
    {
477
      warning (_("Cannot get thread info: %s"), thread_db_err_str (err));
478
      return 0;
479
    }
480
 
481
  attach_thread (ptid, &th, &ti);
482
  return 1;
483
}
484
 
485
static void *
486
verbose_dlsym (void *handle, const char *name)
487
{
488
  void *sym = dlsym (handle, name);
489
  if (sym == NULL)
490
    warning (_("Symbol \"%s\" not found in libthread_db: %s"), name, dlerror ());
491
  return sym;
492
}
493
 
494
static td_err_e
495
enable_thread_event (int event, CORE_ADDR *bp)
496
{
497
  td_notify_t notify;
498
  td_err_e err;
499
  struct thread_db_info *info;
500
 
501
  info = get_thread_db_info (GET_PID (inferior_ptid));
502
 
503
  /* Access an lwp we know is stopped.  */
504
  info->proc_handle.ptid = inferior_ptid;
505
 
506
  /* Get the breakpoint address for thread EVENT.  */
507
  err = info->td_ta_event_addr_p (info->thread_agent, event, &notify);
508
  if (err != TD_OK)
509
    return err;
510
 
511
  /* Set up the breakpoint.  */
512
  gdb_assert (exec_bfd);
513
  (*bp) = (gdbarch_convert_from_func_ptr_addr
514
           (target_gdbarch,
515
            /* Do proper sign extension for the target.  */
516
            (bfd_get_sign_extend_vma (exec_bfd) > 0
517
             ? (CORE_ADDR) (intptr_t) notify.u.bptaddr
518
             : (CORE_ADDR) (uintptr_t) notify.u.bptaddr),
519
            &current_target));
520
  create_thread_event_breakpoint (target_gdbarch, *bp);
521
 
522
  return TD_OK;
523
}
524
 
525
static void
526
enable_thread_event_reporting (void)
527
{
528
  td_thr_events_t events;
529
  td_err_e err;
530
#ifdef HAVE_GNU_LIBC_VERSION_H
531
  const char *libc_version;
532
  int libc_major, libc_minor;
533
#endif
534
  struct thread_db_info *info;
535
 
536
  info = get_thread_db_info (GET_PID (inferior_ptid));
537
 
538
  /* We cannot use the thread event reporting facility if these
539
     functions aren't available.  */
540
  if (info->td_ta_event_addr_p == NULL
541
      || info->td_ta_set_event_p == NULL
542
      || info->td_ta_event_getmsg_p == NULL
543
      || info->td_thr_event_enable_p == NULL)
544
    return;
545
 
546
  /* Set the process wide mask saying which events we're interested in.  */
547
  td_event_emptyset (&events);
548
  td_event_addset (&events, TD_CREATE);
549
 
550
#ifdef HAVE_GNU_LIBC_VERSION_H
551
  /* The event reporting facility is broken for TD_DEATH events in
552
     glibc 2.1.3, so don't enable it if we have glibc but a lower
553
     version.  */
554
  libc_version = gnu_get_libc_version ();
555
  if (sscanf (libc_version, "%d.%d", &libc_major, &libc_minor) == 2
556
      && (libc_major > 2 || (libc_major == 2 && libc_minor > 1)))
557
#endif
558
    td_event_addset (&events, TD_DEATH);
559
 
560
  err = info->td_ta_set_event_p (info->thread_agent, &events);
561
  if (err != TD_OK)
562
    {
563
      warning (_("Unable to set global thread event mask: %s"),
564
               thread_db_err_str (err));
565
      return;
566
    }
567
 
568
  /* Delete previous thread event breakpoints, if any.  */
569
  remove_thread_event_breakpoints ();
570
  info->td_create_bp_addr = 0;
571
  info->td_death_bp_addr = 0;
572
 
573
  /* Set up the thread creation event.  */
574
  err = enable_thread_event (TD_CREATE, &info->td_create_bp_addr);
575
  if (err != TD_OK)
576
    {
577
      warning (_("Unable to get location for thread creation breakpoint: %s"),
578
               thread_db_err_str (err));
579
      return;
580
    }
581
 
582
  /* Set up the thread death event.  */
583
  err = enable_thread_event (TD_DEATH, &info->td_death_bp_addr);
584
  if (err != TD_OK)
585
    {
586
      warning (_("Unable to get location for thread death breakpoint: %s"),
587
               thread_db_err_str (err));
588
      return;
589
    }
590
}
591
 
592
/* Same as thread_db_find_new_threads_1, but silently ignore errors.  */
593
 
594
static void
595
thread_db_find_new_threads_silently (ptid_t ptid)
596
{
597
  volatile struct gdb_exception except;
598
 
599
  TRY_CATCH (except, RETURN_MASK_ERROR)
600
    {
601
      thread_db_find_new_threads_2 (ptid, 1);
602
    }
603
 
604
  if (except.reason < 0 && info_verbose)
605
    {
606
      exception_fprintf (gdb_stderr, except,
607
                         "Warning: thread_db_find_new_threads_silently: ");
608
    }
609
}
610
 
611
/* Lookup a library in which given symbol resides.
612
   Note: this is looking in GDB process, not in the inferior.
613
   Returns library name, or NULL.  */
614
 
615
static const char *
616
dladdr_to_soname (const void *addr)
617
{
618
  Dl_info info;
619
 
620
  if (dladdr (addr, &info) != 0)
621
    return info.dli_fname;
622
  return NULL;
623
}
624
 
625
/* Attempt to initialize dlopen()ed libthread_db, described by HANDLE.
626
   Return 1 on success.
627
   Failure could happen if libthread_db does not have symbols we expect,
628
   or when it refuses to work with the current inferior (e.g. due to
629
   version mismatch between libthread_db and libpthread).  */
630
 
631
static int
632
try_thread_db_load_1 (struct thread_db_info *info)
633
{
634
  td_err_e err;
635
 
636
  /* Initialize pointers to the dynamic library functions we will use.
637
     Essential functions first.  */
638
 
639
  info->td_init_p = verbose_dlsym (info->handle, "td_init");
640
  if (info->td_init_p == NULL)
641
    return 0;
642
 
643
  err = info->td_init_p ();
644
  if (err != TD_OK)
645
    {
646
      warning (_("Cannot initialize libthread_db: %s"), thread_db_err_str (err));
647
      return 0;
648
    }
649
 
650
  info->td_ta_new_p = verbose_dlsym (info->handle, "td_ta_new");
651
  if (info->td_ta_new_p == NULL)
652
    return 0;
653
 
654
  /* Initialize the structure that identifies the child process.  */
655
  info->proc_handle.ptid = inferior_ptid;
656
 
657
  /* Now attempt to open a connection to the thread library.  */
658
  err = info->td_ta_new_p (&info->proc_handle, &info->thread_agent);
659
  if (err != TD_OK)
660
    {
661
      if (info_verbose)
662
        printf_unfiltered (_("td_ta_new failed: %s\n"),
663
                           thread_db_err_str (err));
664
      else
665
        switch (err)
666
          {
667
            case TD_NOLIBTHREAD:
668
#ifdef THREAD_DB_HAS_TD_VERSION
669
            case TD_VERSION:
670
#endif
671
              /* The errors above are not unexpected and silently ignored:
672
                 they just mean we haven't found correct version of
673
                 libthread_db yet.  */
674
              break;
675
            default:
676
              warning (_("td_ta_new failed: %s"), thread_db_err_str (err));
677
          }
678
      return 0;
679
    }
680
 
681
  info->td_ta_map_id2thr_p = verbose_dlsym (info->handle, "td_ta_map_id2thr");
682
  if (info->td_ta_map_id2thr_p == NULL)
683
    return 0;
684
 
685
  info->td_ta_map_lwp2thr_p = verbose_dlsym (info->handle, "td_ta_map_lwp2thr");
686
  if (info->td_ta_map_lwp2thr_p == NULL)
687
    return 0;
688
 
689
  info->td_ta_thr_iter_p = verbose_dlsym (info->handle, "td_ta_thr_iter");
690
  if (info->td_ta_thr_iter_p == NULL)
691
    return 0;
692
 
693
  info->td_thr_validate_p = verbose_dlsym (info->handle, "td_thr_validate");
694
  if (info->td_thr_validate_p == NULL)
695
    return 0;
696
 
697
  info->td_thr_get_info_p = verbose_dlsym (info->handle, "td_thr_get_info");
698
  if (info->td_thr_get_info_p == NULL)
699
    return 0;
700
 
701
  /* These are not essential.  */
702
  info->td_ta_event_addr_p = dlsym (info->handle, "td_ta_event_addr");
703
  info->td_ta_set_event_p = dlsym (info->handle, "td_ta_set_event");
704
  info->td_ta_clear_event_p = dlsym (info->handle, "td_ta_clear_event");
705
  info->td_ta_event_getmsg_p = dlsym (info->handle, "td_ta_event_getmsg");
706
  info->td_thr_event_enable_p = dlsym (info->handle, "td_thr_event_enable");
707
  info->td_thr_tls_get_addr_p = dlsym (info->handle, "td_thr_tls_get_addr");
708
 
709
  printf_unfiltered (_("[Thread debugging using libthread_db enabled]\n"));
710
 
711
  if (info_verbose || *libthread_db_search_path)
712
    {
713
      const char *library;
714
 
715
      library = dladdr_to_soname (*info->td_ta_new_p);
716
      if (library == NULL)
717
        library = LIBTHREAD_DB_SO;
718
 
719
      printf_unfiltered (_("Using host libthread_db library \"%s\".\n"),
720
                         library);
721
    }
722
 
723
  /* The thread library was detected.  Activate the thread_db target
724
     if this is the first process using it.  */
725
  if (thread_db_list->next == NULL)
726
    push_target (&thread_db_ops);
727
 
728
  enable_thread_event_reporting ();
729
 
730
  /* There appears to be a bug in glibc-2.3.6: calls to td_thr_get_info fail
731
     with TD_ERR for statically linked executables if td_thr_get_info is
732
     called before glibc has initialized itself.  Silently ignore such
733
     errors, and let gdb enumerate threads again later.  */
734
  thread_db_find_new_threads_silently (inferior_ptid);
735
 
736
  return 1;
737
}
738
 
739
/* Attempt to use LIBRARY as libthread_db.  LIBRARY could be absolute,
740
   relative, or just LIBTHREAD_DB.  */
741
 
742
static int
743
try_thread_db_load (const char *library)
744
{
745
  void *handle;
746
  struct thread_db_info *info;
747
 
748
  if (info_verbose)
749
    printf_unfiltered (_("Trying host libthread_db library: %s.\n"),
750
                       library);
751
  handle = dlopen (library, RTLD_NOW);
752
  if (handle == NULL)
753
    {
754
      if (info_verbose)
755
        printf_unfiltered (_("dlopen failed: %s.\n"), dlerror ());
756
      return 0;
757
    }
758
 
759
  if (info_verbose && strchr (library, '/') == NULL)
760
    {
761
      void *td_init;
762
 
763
      td_init = dlsym (handle, "td_init");
764
      if (td_init != NULL)
765
        {
766
          const char *const libpath = dladdr_to_soname (td_init);
767
 
768
          if (libpath != NULL)
769
            printf_unfiltered (_("Host %s resolved to: %s.\n"),
770
                               library, libpath);
771
        }
772
    }
773
 
774
  info = add_thread_db_info (handle);
775
 
776
  if (try_thread_db_load_1 (info))
777
    return 1;
778
 
779
  /* This library "refused" to work on current inferior.  */
780
  delete_thread_db_info (GET_PID (inferior_ptid));
781
  return 0;
782
}
783
 
784
 
785
/* Search libthread_db_search_path for libthread_db which "agrees"
786
   to work on current inferior.  */
787
 
788
static int
789
thread_db_load_search (void)
790
{
791
  char path[PATH_MAX];
792
  const char *search_path = libthread_db_search_path;
793
  int rc = 0;
794
 
795
  while (*search_path)
796
    {
797
      const char *end = strchr (search_path, ':');
798
 
799
      if (end)
800
        {
801
          size_t len = end - search_path;
802
 
803
          if (len + 1 + strlen (LIBTHREAD_DB_SO) + 1 > sizeof (path))
804
            {
805
              char *cp = xmalloc (len + 1);
806
 
807
              memcpy (cp, search_path, len);
808
              cp[len] = '\0';
809
              warning (_("libthread_db_search_path component too long,"
810
                         " ignored: %s."), cp);
811
              xfree (cp);
812
              search_path += len + 1;
813
              continue;
814
            }
815
          memcpy (path, search_path, len);
816
          path[len] = '\0';
817
          search_path += len + 1;
818
        }
819
      else
820
        {
821
          size_t len = strlen (search_path);
822
 
823
          if (len + 1 + strlen (LIBTHREAD_DB_SO) + 1 > sizeof (path))
824
            {
825
              warning (_("libthread_db_search_path component too long,"
826
                         " ignored: %s."), search_path);
827
              break;
828
            }
829
          memcpy (path, search_path, len + 1);
830
          search_path += len;
831
        }
832
      strcat (path, "/");
833
      strcat (path, LIBTHREAD_DB_SO);
834
      if (try_thread_db_load (path))
835
        {
836
          rc = 1;
837
          break;
838
        }
839
    }
840
  if (rc == 0)
841
    rc = try_thread_db_load (LIBTHREAD_DB_SO);
842
  return rc;
843
}
844
 
845
/* Attempt to load and initialize libthread_db.
846
   Return 1 on success.
847
 */
848
 
849
static int
850
thread_db_load (void)
851
{
852
  struct objfile *obj;
853
  struct thread_db_info *info;
854
 
855
  info = get_thread_db_info (GET_PID (inferior_ptid));
856
 
857
  if (info != NULL)
858
    return 1;
859
 
860
  /* Don't attempt to use thread_db on targets which can not run
861
     (executables not running yet, core files) for now.  */
862
  if (!target_has_execution)
863
    return 0;
864
 
865
  /* Don't attempt to use thread_db for remote targets.  */
866
  if (!target_can_run (&current_target))
867
    return 0;
868
 
869
  if (thread_db_load_search ())
870
    return 1;
871
 
872
  /* None of the libthread_db's on our search path, not the system default
873
     ones worked.  If the executable is dynamically linked against
874
     libpthread, try loading libthread_db from the same directory.  */
875
 
876
  ALL_OBJFILES (obj)
877
    if (libpthread_name_p (obj->name))
878
      {
879
        char path[PATH_MAX], *cp;
880
 
881
        gdb_assert (strlen (obj->name) < sizeof (path));
882
        strcpy (path, obj->name);
883
        cp = strrchr (path, '/');
884
 
885
        if (cp == NULL)
886
          {
887
            warning (_("Expected absolute pathname for libpthread in the"
888
                       " inferior, but got %s."), path);
889
          }
890
        else if (cp + 1 + strlen (LIBTHREAD_DB_SO) + 1 > path + sizeof (path))
891
          {
892
            warning (_("Unexpected: path to libpthread in the inferior is"
893
                       " too long: %s"), path);
894
          }
895
        else
896
          {
897
            strcpy (cp + 1, LIBTHREAD_DB_SO);
898
            if (try_thread_db_load (path))
899
              return 1;
900
          }
901
        warning (_("Unable to find libthread_db matching inferior's thread"
902
                   " library, thread debugging will not be available."));
903
        return 0;
904
    }
905
  /* Either this executable isn't using libpthread at all, or it is
906
     statically linked.  Since we can't easily distinguish these two cases,
907
     no warning is issued.  */
908
  return 0;
909
}
910
 
911
static void
912
disable_thread_event_reporting (struct thread_db_info *info)
913
{
914
  if (info->td_ta_clear_event_p != NULL)
915
    {
916
      td_thr_events_t events;
917
 
918
      /* Set the process wide mask saying we aren't interested in any
919
         events anymore.  */
920
      td_event_fillset (&events);
921
      info->td_ta_clear_event_p (info->thread_agent, &events);
922
    }
923
 
924
  info->td_create_bp_addr = 0;
925
  info->td_death_bp_addr = 0;
926
}
927
 
928
static void
929
check_thread_signals (void)
930
{
931
  if (!thread_signals)
932
    {
933
      sigset_t mask;
934
      int i;
935
 
936
      lin_thread_get_thread_signals (&mask);
937
      sigemptyset (&thread_stop_set);
938
      sigemptyset (&thread_print_set);
939
 
940
      for (i = 1; i < NSIG; i++)
941
        {
942
          if (sigismember (&mask, i))
943
            {
944
              if (signal_stop_update (target_signal_from_host (i), 0))
945
                sigaddset (&thread_stop_set, i);
946
              if (signal_print_update (target_signal_from_host (i), 0))
947
                sigaddset (&thread_print_set, i);
948
              thread_signals = 1;
949
            }
950
        }
951
    }
952
}
953
 
954
/* Check whether thread_db is usable.  This function is called when
955
   an inferior is created (or otherwise acquired, e.g. attached to)
956
   and when new shared libraries are loaded into a running process.  */
957
 
958
void
959
check_for_thread_db (void)
960
{
961
  /* Do nothing if we couldn't load libthread_db.so.1.  */
962
  if (!thread_db_load ())
963
    return;
964
}
965
 
966
static void
967
thread_db_new_objfile (struct objfile *objfile)
968
{
969
  /* This observer must always be called with inferior_ptid set
970
     correctly.  */
971
 
972
  if (objfile != NULL)
973
    check_for_thread_db ();
974
}
975
 
976
/* Attach to a new thread.  This function is called when we receive a
977
   TD_CREATE event or when we iterate over all threads and find one
978
   that wasn't already in our list.  Returns true on success.  */
979
 
980
static int
981
attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
982
               const td_thrinfo_t *ti_p)
983
{
984
  struct private_thread_info *private;
985
  struct thread_info *tp = NULL;
986
  td_err_e err;
987
  struct thread_db_info *info;
988
 
989
  /* If we're being called after a TD_CREATE event, we may already
990
     know about this thread.  There are two ways this can happen.  We
991
     may have iterated over all threads between the thread creation
992
     and the TD_CREATE event, for instance when the user has issued
993
     the `info threads' command before the SIGTRAP for hitting the
994
     thread creation breakpoint was reported.  Alternatively, the
995
     thread may have exited and a new one been created with the same
996
     thread ID.  In the first case we don't need to do anything; in
997
     the second case we should discard information about the dead
998
     thread and attach to the new one.  */
999
  if (in_thread_list (ptid))
1000
    {
1001
      tp = find_thread_ptid (ptid);
1002
      gdb_assert (tp != NULL);
1003
 
1004
      /* If tp->private is NULL, then GDB is already attached to this
1005
         thread, but we do not know anything about it.  We can learn
1006
         about it here.  This can only happen if we have some other
1007
         way besides libthread_db to notice new threads (i.e.
1008
         PTRACE_EVENT_CLONE); assume the same mechanism notices thread
1009
         exit, so this can not be a stale thread recreated with the
1010
         same ID.  */
1011
      if (tp->private != NULL)
1012
        {
1013
          if (!tp->private->dying)
1014
            return 0;
1015
 
1016
          delete_thread (ptid);
1017
          tp = NULL;
1018
        }
1019
    }
1020
 
1021
  check_thread_signals ();
1022
 
1023
  if (ti_p->ti_state == TD_THR_UNKNOWN || ti_p->ti_state == TD_THR_ZOMBIE)
1024
    return 0;                    /* A zombie thread -- do not attach.  */
1025
 
1026
  /* Under GNU/Linux, we have to attach to each and every thread.  */
1027
  if (tp == NULL
1028
      && lin_lwp_attach_lwp (BUILD_LWP (ti_p->ti_lid, GET_PID (ptid))) < 0)
1029
    return 0;
1030
 
1031
  /* Construct the thread's private data.  */
1032
  private = xmalloc (sizeof (struct private_thread_info));
1033
  memset (private, 0, sizeof (struct private_thread_info));
1034
 
1035
  /* A thread ID of zero may mean the thread library has not initialized
1036
     yet.  But we shouldn't even get here if that's the case.  FIXME:
1037
     if we change GDB to always have at least one thread in the thread
1038
     list this will have to go somewhere else; maybe private == NULL
1039
     until the thread_db target claims it.  */
1040
  gdb_assert (ti_p->ti_tid != 0);
1041
  private->th = *th_p;
1042
  private->tid = ti_p->ti_tid;
1043
 
1044
  /* Add the thread to GDB's thread list.  */
1045
  if (tp == NULL)
1046
    tp = add_thread_with_info (ptid, private);
1047
  else
1048
    tp->private = private;
1049
 
1050
  info = get_thread_db_info (GET_PID (ptid));
1051
 
1052
  /* Enable thread event reporting for this thread.  */
1053
  err = info->td_thr_event_enable_p (th_p, 1);
1054
  if (err != TD_OK)
1055
    error (_("Cannot enable thread event reporting for %s: %s"),
1056
           target_pid_to_str (ptid), thread_db_err_str (err));
1057
  return 1;
1058
}
1059
 
1060
static void
1061
detach_thread (ptid_t ptid)
1062
{
1063
  struct thread_info *thread_info;
1064
 
1065
  /* Don't delete the thread now, because it still reports as active
1066
     until it has executed a few instructions after the event
1067
     breakpoint - if we deleted it now, "info threads" would cause us
1068
     to re-attach to it.  Just mark it as having had a TD_DEATH
1069
     event.  This means that we won't delete it from our thread list
1070
     until we notice that it's dead (via prune_threads), or until
1071
     something re-uses its thread ID.  We'll report the thread exit
1072
     when the underlying LWP dies.  */
1073
  thread_info = find_thread_ptid (ptid);
1074
  gdb_assert (thread_info != NULL && thread_info->private != NULL);
1075
  thread_info->private->dying = 1;
1076
}
1077
 
1078
static void
1079
thread_db_detach (struct target_ops *ops, char *args, int from_tty)
1080
{
1081
  struct target_ops *target_beneath = find_target_beneath (ops);
1082
  struct thread_db_info *info;
1083
 
1084
  info = get_thread_db_info (GET_PID (inferior_ptid));
1085
 
1086
  if (info)
1087
    {
1088
      disable_thread_event_reporting (info);
1089
 
1090
      /* Delete the old thread event breakpoints.  Note that unlike
1091
         when mourning, we can remove them here because there's still
1092
         a live inferior to poke at.  In any case, GDB will not try to
1093
         insert anything in the inferior when removing a
1094
         breakpoint.  */
1095
      remove_thread_event_breakpoints ();
1096
 
1097
      delete_thread_db_info (GET_PID (inferior_ptid));
1098
    }
1099
 
1100
  target_beneath->to_detach (target_beneath, args, from_tty);
1101
 
1102
  /* NOTE: From this point on, inferior_ptid is null_ptid.  */
1103
 
1104
  /* If there are no more processes using libpthread, detach the
1105
     thread_db target ops.  */
1106
  if (!thread_db_list)
1107
    unpush_target (&thread_db_ops);
1108
}
1109
 
1110
/* Check if PID is currently stopped at the location of a thread event
1111
   breakpoint location.  If it is, read the event message and act upon
1112
   the event.  */
1113
 
1114
static void
1115
check_event (ptid_t ptid)
1116
{
1117
  struct regcache *regcache = get_thread_regcache (ptid);
1118
  struct gdbarch *gdbarch = get_regcache_arch (regcache);
1119
  td_event_msg_t msg;
1120
  td_thrinfo_t ti;
1121
  td_err_e err;
1122
  CORE_ADDR stop_pc;
1123
  int loop = 0;
1124
  struct thread_db_info *info;
1125
 
1126
  info = get_thread_db_info (GET_PID (ptid));
1127
 
1128
  /* Bail out early if we're not at a thread event breakpoint.  */
1129
  stop_pc = regcache_read_pc (regcache)
1130
            - gdbarch_decr_pc_after_break (gdbarch);
1131
  if (stop_pc != info->td_create_bp_addr
1132
      && stop_pc != info->td_death_bp_addr)
1133
    return;
1134
 
1135
  /* Access an lwp we know is stopped.  */
1136
  info->proc_handle.ptid = ptid;
1137
 
1138
  /* If we have only looked at the first thread before libpthread was
1139
     initialized, we may not know its thread ID yet.  Make sure we do
1140
     before we add another thread to the list.  */
1141
  if (!have_threads (ptid))
1142
    thread_db_find_new_threads_1 (ptid);
1143
 
1144
  /* If we are at a create breakpoint, we do not know what new lwp
1145
     was created and cannot specifically locate the event message for it.
1146
     We have to call td_ta_event_getmsg() to get
1147
     the latest message.  Since we have no way of correlating whether
1148
     the event message we get back corresponds to our breakpoint, we must
1149
     loop and read all event messages, processing them appropriately.
1150
     This guarantees we will process the correct message before continuing
1151
     from the breakpoint.
1152
 
1153
     Currently, death events are not enabled.  If they are enabled,
1154
     the death event can use the td_thr_event_getmsg() interface to
1155
     get the message specifically for that lwp and avoid looping
1156
     below.  */
1157
 
1158
  loop = 1;
1159
 
1160
  do
1161
    {
1162
      err = info->td_ta_event_getmsg_p (info->thread_agent, &msg);
1163
      if (err != TD_OK)
1164
        {
1165
          if (err == TD_NOMSG)
1166
            return;
1167
 
1168
          error (_("Cannot get thread event message: %s"),
1169
                 thread_db_err_str (err));
1170
        }
1171
 
1172
      err = info->td_thr_get_info_p (msg.th_p, &ti);
1173
      if (err != TD_OK)
1174
        error (_("Cannot get thread info: %s"), thread_db_err_str (err));
1175
 
1176
      ptid = ptid_build (GET_PID (ptid), ti.ti_lid, 0);
1177
 
1178
      switch (msg.event)
1179
        {
1180
        case TD_CREATE:
1181
          /* Call attach_thread whether or not we already know about a
1182
             thread with this thread ID.  */
1183
          attach_thread (ptid, msg.th_p, &ti);
1184
 
1185
          break;
1186
 
1187
        case TD_DEATH:
1188
 
1189
          if (!in_thread_list (ptid))
1190
            error (_("Spurious thread death event."));
1191
 
1192
          detach_thread (ptid);
1193
 
1194
          break;
1195
 
1196
        default:
1197
          error (_("Spurious thread event."));
1198
        }
1199
    }
1200
  while (loop);
1201
}
1202
 
1203
static ptid_t
1204
thread_db_wait (struct target_ops *ops,
1205
                ptid_t ptid, struct target_waitstatus *ourstatus,
1206
                int options)
1207
{
1208
  struct thread_db_info *info;
1209
  struct target_ops *beneath = find_target_beneath (ops);
1210
 
1211
  ptid = beneath->to_wait (beneath, ptid, ourstatus, options);
1212
 
1213
  if (ourstatus->kind == TARGET_WAITKIND_IGNORE)
1214
    return ptid;
1215
 
1216
  if (ourstatus->kind == TARGET_WAITKIND_EXITED
1217
      || ourstatus->kind == TARGET_WAITKIND_SIGNALLED)
1218
    return ptid;
1219
 
1220
  info = get_thread_db_info (GET_PID (ptid));
1221
 
1222
  /* If this process isn't using thread_db, we're done.  */
1223
  if (info == NULL)
1224
    return ptid;
1225
 
1226
  if (ourstatus->kind == TARGET_WAITKIND_EXECD)
1227
    {
1228
      /* New image, it may or may not end up using thread_db.  Assume
1229
         not unless we find otherwise.  */
1230
      delete_thread_db_info (GET_PID (ptid));
1231
      if (!thread_db_list)
1232
        unpush_target (&thread_db_ops);
1233
 
1234
      /* Thread event breakpoints are deleted by
1235
         update_breakpoints_after_exec.  */
1236
 
1237
      return ptid;
1238
    }
1239
 
1240
  /* If we do not know about the main thread yet, this would be a good time to
1241
     find it.  */
1242
  if (ourstatus->kind == TARGET_WAITKIND_STOPPED && !have_threads (ptid))
1243
    thread_db_find_new_threads_1 (ptid);
1244
 
1245
  if (ourstatus->kind == TARGET_WAITKIND_STOPPED
1246
      && ourstatus->value.sig == TARGET_SIGNAL_TRAP)
1247
    /* Check for a thread event.  */
1248
    check_event (ptid);
1249
 
1250
  if (have_threads (ptid))
1251
    {
1252
      /* Change ptids back into the higher level PID + TID format.  If
1253
         the thread is dead and no longer on the thread list, we will
1254
         get back a dead ptid.  This can occur if the thread death
1255
         event gets postponed by other simultaneous events.  In such a
1256
         case, we want to just ignore the event and continue on.  */
1257
 
1258
      ptid = thread_from_lwp (ptid);
1259
      if (GET_PID (ptid) == -1)
1260
        ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
1261
    }
1262
 
1263
  return ptid;
1264
}
1265
 
1266
static void
1267
thread_db_mourn_inferior (struct target_ops *ops)
1268
{
1269
  struct target_ops *target_beneath = find_target_beneath (ops);
1270
 
1271
  delete_thread_db_info (GET_PID (inferior_ptid));
1272
 
1273
  target_beneath->to_mourn_inferior (target_beneath);
1274
 
1275
  /* Delete the old thread event breakpoints.  Do this after mourning
1276
     the inferior, so that we don't try to uninsert them.  */
1277
  remove_thread_event_breakpoints ();
1278
 
1279
  /* Detach thread_db target ops.  */
1280
  if (!thread_db_list)
1281
    unpush_target (ops);
1282
}
1283
 
1284
struct callback_data
1285
{
1286
  struct thread_db_info *info;
1287
  int new_threads;
1288
};
1289
 
1290
static int
1291
find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
1292
{
1293
  td_thrinfo_t ti;
1294
  td_err_e err;
1295
  ptid_t ptid;
1296
  struct thread_info *tp;
1297
  struct callback_data *cb_data = data;
1298
  struct thread_db_info *info = cb_data->info;
1299
 
1300
  err = info->td_thr_get_info_p (th_p, &ti);
1301
  if (err != TD_OK)
1302
    error (_("find_new_threads_callback: cannot get thread info: %s"),
1303
           thread_db_err_str (err));
1304
 
1305
  if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
1306
    return 0;                    /* A zombie -- ignore.  */
1307
 
1308
  if (ti.ti_tid == 0)
1309
    {
1310
      /* A thread ID of zero means that this is the main thread, but
1311
         glibc has not yet initialized thread-local storage and the
1312
         pthread library.  We do not know what the thread's TID will
1313
         be yet.  Just enable event reporting and otherwise ignore
1314
         it.  */
1315
 
1316
      /* In that case, we're not stopped in a fork syscall and don't
1317
         need this glibc bug workaround.  */
1318
      info->need_stale_parent_threads_check = 0;
1319
 
1320
      err = info->td_thr_event_enable_p (th_p, 1);
1321
      if (err != TD_OK)
1322
        error (_("Cannot enable thread event reporting for LWP %d: %s"),
1323
               (int) ti.ti_lid, thread_db_err_str (err));
1324
 
1325
      return 0;
1326
    }
1327
 
1328
  /* Ignore stale parent threads, caused by glibc/BZ5983.  This is a
1329
     bit expensive, as it needs to open /proc/pid/status, so try to
1330
     avoid doing the work if we know we don't have to.  */
1331
  if (info->need_stale_parent_threads_check)
1332
    {
1333
      int tgid = linux_proc_get_tgid (ti.ti_lid);
1334
 
1335
      if (tgid != -1 && tgid != info->pid)
1336
        return 0;
1337
    }
1338
 
1339
  ptid = ptid_build (info->pid, ti.ti_lid, 0);
1340
  tp = find_thread_ptid (ptid);
1341
  if (tp == NULL || tp->private == NULL)
1342
    {
1343
      if (attach_thread (ptid, th_p, &ti))
1344
        cb_data->new_threads += 1;
1345
      else
1346
        /* Problem attaching this thread; perhaps it exited before we
1347
           could attach it?
1348
           This could mean that the thread list inside glibc itself is in
1349
           inconsistent state, and libthread_db could go on looping forever
1350
           (observed with glibc-2.3.6).  To prevent that, terminate
1351
           iteration: thread_db_find_new_threads_2 will retry.  */
1352
        return 1;
1353
    }
1354
 
1355
  return 0;
1356
}
1357
 
1358
/* Helper for thread_db_find_new_threads_2.
1359
   Returns number of new threads found.  */
1360
 
1361
static int
1362
find_new_threads_once (struct thread_db_info *info, int iteration,
1363
                       td_err_e *errp)
1364
{
1365
  volatile struct gdb_exception except;
1366
  struct callback_data data;
1367
  td_err_e err = TD_ERR;
1368
 
1369
  data.info = info;
1370
  data.new_threads = 0;
1371
 
1372
  TRY_CATCH (except, RETURN_MASK_ERROR)
1373
    {
1374
      /* Iterate over all user-space threads to discover new threads.  */
1375
      err = info->td_ta_thr_iter_p (info->thread_agent,
1376
                                    find_new_threads_callback,
1377
                                    &data,
1378
                                    TD_THR_ANY_STATE,
1379
                                    TD_THR_LOWEST_PRIORITY,
1380
                                    TD_SIGNO_MASK,
1381
                                    TD_THR_ANY_USER_FLAGS);
1382
    }
1383
 
1384
  if (info_verbose)
1385
    {
1386
      if (except.reason < 0)
1387
        exception_fprintf (gdb_stderr, except,
1388
                           "Warning: find_new_threads_once: ");
1389
 
1390
      printf_filtered (_("Found %d new threads in iteration %d.\n"),
1391
                       data.new_threads, iteration);
1392
    }
1393
 
1394
  if (errp != NULL)
1395
    *errp = err;
1396
 
1397
  return data.new_threads;
1398
}
1399
 
1400
/* Search for new threads, accessing memory through stopped thread
1401
   PTID.  If UNTIL_NO_NEW is true, repeat searching until several
1402
   searches in a row do not discover any new threads.  */
1403
 
1404
static void
1405
thread_db_find_new_threads_2 (ptid_t ptid, int until_no_new)
1406
{
1407
  td_err_e err;
1408
  struct lwp_info *lp;
1409
  struct thread_db_info *info;
1410
  int pid = ptid_get_pid (ptid);
1411
  int i, loop;
1412
 
1413
  /* In linux, we can only read memory through a stopped lwp.  */
1414
  ALL_LWPS (lp, ptid)
1415
    if (lp->stopped && ptid_get_pid (lp->ptid) == pid)
1416
      break;
1417
 
1418
  if (!lp)
1419
    /* There is no stopped thread.  Bail out.  */
1420
    return;
1421
 
1422
  info = get_thread_db_info (GET_PID (ptid));
1423
 
1424
  /* Access an lwp we know is stopped.  */
1425
  info->proc_handle.ptid = ptid;
1426
 
1427
  if (until_no_new)
1428
    {
1429
      /* Require 4 successive iterations which do not find any new threads.
1430
         The 4 is a heuristic: there is an inherent race here, and I have
1431
         seen that 2 iterations in a row are not always sufficient to
1432
         "capture" all threads.  */
1433
      for (i = 0, loop = 0; loop < 4; ++i, ++loop)
1434
        if (find_new_threads_once (info, i, NULL) != 0)
1435
          /* Found some new threads.  Restart the loop from beginning.  */
1436
          loop = -1;
1437
    }
1438
  else
1439
    {
1440
      find_new_threads_once (info, 0, &err);
1441
      if (err != TD_OK)
1442
        error (_("Cannot find new threads: %s"), thread_db_err_str (err));
1443
    }
1444
}
1445
 
1446
static void
1447
thread_db_find_new_threads_1 (ptid_t ptid)
1448
{
1449
  thread_db_find_new_threads_2 (ptid, 0);
1450
}
1451
 
1452
static int
1453
update_thread_core (struct lwp_info *info, void *closure)
1454
{
1455
  info->core = linux_nat_core_of_thread_1 (info->ptid);
1456
  return 0;
1457
}
1458
 
1459
static void
1460
thread_db_find_new_threads (struct target_ops *ops)
1461
{
1462
  struct thread_db_info *info;
1463
 
1464
  info = get_thread_db_info (GET_PID (inferior_ptid));
1465
 
1466
  if (info == NULL)
1467
    return;
1468
 
1469
  thread_db_find_new_threads_1 (inferior_ptid);
1470
 
1471
  iterate_over_lwps (minus_one_ptid /* iterate over all */,
1472
                     update_thread_core, NULL);
1473
}
1474
 
1475
static char *
1476
thread_db_pid_to_str (struct target_ops *ops, ptid_t ptid)
1477
{
1478
  struct thread_info *thread_info = find_thread_ptid (ptid);
1479
  struct target_ops *beneath;
1480
 
1481
  if (thread_info != NULL && thread_info->private != NULL)
1482
    {
1483
      static char buf[64];
1484
      thread_t tid;
1485
 
1486
      tid = thread_info->private->tid;
1487
      snprintf (buf, sizeof (buf), "Thread 0x%lx (LWP %ld)",
1488
                tid, GET_LWP (ptid));
1489
 
1490
      return buf;
1491
    }
1492
 
1493
  beneath = find_target_beneath (ops);
1494
  if (beneath->to_pid_to_str (beneath, ptid))
1495
    return beneath->to_pid_to_str (beneath, ptid);
1496
 
1497
  return normal_pid_to_str (ptid);
1498
}
1499
 
1500
/* Return a string describing the state of the thread specified by
1501
   INFO.  */
1502
 
1503
static char *
1504
thread_db_extra_thread_info (struct thread_info *info)
1505
{
1506
  if (info->private == NULL)
1507
    return NULL;
1508
 
1509
  if (info->private->dying)
1510
    return "Exiting";
1511
 
1512
  return NULL;
1513
}
1514
 
1515
/* Get the address of the thread local variable in load module LM which
1516
   is stored at OFFSET within the thread local storage for thread PTID.  */
1517
 
1518
static CORE_ADDR
1519
thread_db_get_thread_local_address (struct target_ops *ops,
1520
                                    ptid_t ptid,
1521
                                    CORE_ADDR lm,
1522
                                    CORE_ADDR offset)
1523
{
1524
  struct thread_info *thread_info;
1525
  struct target_ops *beneath;
1526
 
1527
  /* If we have not discovered any threads yet, check now.  */
1528
  if (!have_threads (ptid))
1529
    thread_db_find_new_threads_1 (ptid);
1530
 
1531
  /* Find the matching thread.  */
1532
  thread_info = find_thread_ptid (ptid);
1533
 
1534
  if (thread_info != NULL && thread_info->private != NULL)
1535
    {
1536
      td_err_e err;
1537
      psaddr_t address;
1538
      struct thread_db_info *info;
1539
 
1540
      info = get_thread_db_info (GET_PID (ptid));
1541
 
1542
      /* glibc doesn't provide the needed interface.  */
1543
      if (!info->td_thr_tls_get_addr_p)
1544
        throw_error (TLS_NO_LIBRARY_SUPPORT_ERROR,
1545
                     _("No TLS library support"));
1546
 
1547
      /* Caller should have verified that lm != 0.  */
1548
      gdb_assert (lm != 0);
1549
 
1550
      /* Finally, get the address of the variable.  */
1551
      /* Note the cast through uintptr_t: this interface only works if
1552
         a target address fits in a psaddr_t, which is a host pointer.
1553
         So a 32-bit debugger can not access 64-bit TLS through this.  */
1554
      err = info->td_thr_tls_get_addr_p (&thread_info->private->th,
1555
                                         (psaddr_t)(uintptr_t) lm,
1556
                                         offset, &address);
1557
 
1558
#ifdef THREAD_DB_HAS_TD_NOTALLOC
1559
      /* The memory hasn't been allocated, yet.  */
1560
      if (err == TD_NOTALLOC)
1561
          /* Now, if libthread_db provided the initialization image's
1562
             address, we *could* try to build a non-lvalue value from
1563
             the initialization image.  */
1564
        throw_error (TLS_NOT_ALLOCATED_YET_ERROR,
1565
                     _("TLS not allocated yet"));
1566
#endif
1567
 
1568
      /* Something else went wrong.  */
1569
      if (err != TD_OK)
1570
        throw_error (TLS_GENERIC_ERROR,
1571
                     (("%s")), thread_db_err_str (err));
1572
 
1573
      /* Cast assuming host == target.  Joy.  */
1574
      /* Do proper sign extension for the target.  */
1575
      gdb_assert (exec_bfd);
1576
      return (bfd_get_sign_extend_vma (exec_bfd) > 0
1577
              ? (CORE_ADDR) (intptr_t) address
1578
              : (CORE_ADDR) (uintptr_t) address);
1579
    }
1580
 
1581
  beneath = find_target_beneath (ops);
1582
  if (beneath->to_get_thread_local_address)
1583
    return beneath->to_get_thread_local_address (beneath, ptid, lm, offset);
1584
  else
1585
    throw_error (TLS_GENERIC_ERROR,
1586
                 _("TLS not supported on this target"));
1587
}
1588
 
1589
/* Callback routine used to find a thread based on the TID part of
1590
   its PTID.  */
1591
 
1592
static int
1593
thread_db_find_thread_from_tid (struct thread_info *thread, void *data)
1594
{
1595
  long *tid = (long *) data;
1596
 
1597
  if (thread->private->tid == *tid)
1598
    return 1;
1599
 
1600
  return 0;
1601
}
1602
 
1603
/* Implement the to_get_ada_task_ptid target method for this target.  */
1604
 
1605
static ptid_t
1606
thread_db_get_ada_task_ptid (long lwp, long thread)
1607
{
1608
  struct thread_info *thread_info;
1609
 
1610
  thread_db_find_new_threads_1 (inferior_ptid);
1611
  thread_info = iterate_over_threads (thread_db_find_thread_from_tid, &thread);
1612
 
1613
  gdb_assert (thread_info != NULL);
1614
 
1615
  return (thread_info->ptid);
1616
}
1617
 
1618
static void
1619
thread_db_resume (struct target_ops *ops,
1620
                  ptid_t ptid, int step, enum target_signal signo)
1621
{
1622
  struct target_ops *beneath = find_target_beneath (ops);
1623
  struct thread_db_info *info;
1624
 
1625
  if (ptid_equal (ptid, minus_one_ptid))
1626
    info = get_thread_db_info (GET_PID (inferior_ptid));
1627
  else
1628
    info = get_thread_db_info (GET_PID (ptid));
1629
 
1630
  /* This workaround is only needed for child fork lwps stopped in a
1631
     PTRACE_O_TRACEFORK event.  When the inferior is resumed, the
1632
     workaround can be disabled.  */
1633
  if (info)
1634
    info->need_stale_parent_threads_check = 0;
1635
 
1636
  beneath->to_resume (beneath, ptid, step, signo);
1637
}
1638
 
1639
static void
1640
init_thread_db_ops (void)
1641
{
1642
  thread_db_ops.to_shortname = "multi-thread";
1643
  thread_db_ops.to_longname = "multi-threaded child process.";
1644
  thread_db_ops.to_doc = "Threads and pthreads support.";
1645
  thread_db_ops.to_detach = thread_db_detach;
1646
  thread_db_ops.to_wait = thread_db_wait;
1647
  thread_db_ops.to_resume = thread_db_resume;
1648
  thread_db_ops.to_mourn_inferior = thread_db_mourn_inferior;
1649
  thread_db_ops.to_find_new_threads = thread_db_find_new_threads;
1650
  thread_db_ops.to_pid_to_str = thread_db_pid_to_str;
1651
  thread_db_ops.to_stratum = thread_stratum;
1652
  thread_db_ops.to_has_thread_control = tc_schedlock;
1653
  thread_db_ops.to_get_thread_local_address
1654
    = thread_db_get_thread_local_address;
1655
  thread_db_ops.to_extra_thread_info = thread_db_extra_thread_info;
1656
  thread_db_ops.to_get_ada_task_ptid = thread_db_get_ada_task_ptid;
1657
  thread_db_ops.to_magic = OPS_MAGIC;
1658
}
1659
 
1660
/* Provide a prototype to silence -Wmissing-prototypes.  */
1661
extern initialize_file_ftype _initialize_thread_db;
1662
 
1663
void
1664
_initialize_thread_db (void)
1665
{
1666
  init_thread_db_ops ();
1667
  add_target (&thread_db_ops);
1668
 
1669
  /* Defer loading of libthread_db.so until inferior is running.
1670
     This allows gdb to load correct libthread_db for a given
1671
     executable -- there could be mutiple versions of glibc,
1672
     compiled with LinuxThreads or NPTL, and until there is
1673
     a running inferior, we can't tell which libthread_db is
1674
     the correct one to load. */
1675
 
1676
  libthread_db_search_path = xstrdup (LIBTHREAD_DB_SEARCH_PATH);
1677
 
1678
  add_setshow_optional_filename_cmd ("libthread-db-search-path",
1679
                                     class_support,
1680
                                     &libthread_db_search_path, _("\
1681
Set search path for libthread_db."), _("\
1682
Show the current search path or libthread_db."), _("\
1683
This path is used to search for libthread_db to be loaded into \
1684
gdb itself."),
1685
                            NULL,
1686
                            NULL,
1687
                            &setlist, &showlist);
1688
  /* Add ourselves to objfile event chain.  */
1689
  observer_attach_new_objfile (thread_db_new_objfile);
1690
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.