2003-09-04 Andrew Cagney <cagney@redhat.com>

* thread-db.c (verbose_dlsym): New function.
	(thread_db_load): Use verbose_dlsym
	(thread_db_new_objfile): Print that libthread_db was loaded, and
	that thread debugging was enabled.
This commit is contained in:
Andrew Cagney 2003-09-04 21:03:37 +00:00
parent 6e8c2c0627
commit 5220ea4c1e
2 changed files with 53 additions and 11 deletions

View File

@ -1,3 +1,10 @@
2003-09-04 Andrew Cagney <cagney@redhat.com>
* thread-db.c (verbose_dlsym): New function.
(thread_db_load): Use verbose_dlsym
(thread_db_new_objfile): Print that libthread_db was loaded, and
that thread debugging was enabled.
2003-09-04 Andrew Cagney <cagney@redhat.com> 2003-09-04 Andrew Cagney <cagney@redhat.com>
* configure.tgt: Add "mips64*-*-*" target. Delete * configure.tgt: Add "mips64*-*-*" target. Delete

View File

@ -375,6 +375,15 @@ thread_db_init (struct target_ops *target)
target_beneath = target; target_beneath = target;
} }
static void *
verbose_dlsym (void *handle, const char *name)
{
void *sym = dlsym (handle, name);
if (sym == NULL)
warning ("Symbol \"%s\" not found in libthread_db: %s", name, dlerror ());
return sym;
}
static int static int
thread_db_load (void) thread_db_load (void)
{ {
@ -394,47 +403,47 @@ thread_db_load (void)
/* Initialize pointers to the dynamic library functions we will use. /* Initialize pointers to the dynamic library functions we will use.
Essential functions first. */ Essential functions first. */
td_init_p = dlsym (handle, "td_init"); td_init_p = verbose_dlsym (handle, "td_init");
if (td_init_p == NULL) if (td_init_p == NULL)
return 0; return 0;
td_ta_new_p = dlsym (handle, "td_ta_new"); td_ta_new_p = verbose_dlsym (handle, "td_ta_new");
if (td_ta_new_p == NULL) if (td_ta_new_p == NULL)
return 0; return 0;
td_ta_map_id2thr_p = dlsym (handle, "td_ta_map_id2thr"); td_ta_map_id2thr_p = verbose_dlsym (handle, "td_ta_map_id2thr");
if (td_ta_map_id2thr_p == NULL) if (td_ta_map_id2thr_p == NULL)
return 0; return 0;
td_ta_map_lwp2thr_p = dlsym (handle, "td_ta_map_lwp2thr"); td_ta_map_lwp2thr_p = verbose_dlsym (handle, "td_ta_map_lwp2thr");
if (td_ta_map_lwp2thr_p == NULL) if (td_ta_map_lwp2thr_p == NULL)
return 0; return 0;
td_ta_thr_iter_p = dlsym (handle, "td_ta_thr_iter"); td_ta_thr_iter_p = verbose_dlsym (handle, "td_ta_thr_iter");
if (td_ta_thr_iter_p == NULL) if (td_ta_thr_iter_p == NULL)
return 0; return 0;
td_thr_validate_p = dlsym (handle, "td_thr_validate"); td_thr_validate_p = verbose_dlsym (handle, "td_thr_validate");
if (td_thr_validate_p == NULL) if (td_thr_validate_p == NULL)
return 0; return 0;
td_thr_get_info_p = dlsym (handle, "td_thr_get_info"); td_thr_get_info_p = verbose_dlsym (handle, "td_thr_get_info");
if (td_thr_get_info_p == NULL) if (td_thr_get_info_p == NULL)
return 0; return 0;
td_thr_getfpregs_p = dlsym (handle, "td_thr_getfpregs"); td_thr_getfpregs_p = verbose_dlsym (handle, "td_thr_getfpregs");
if (td_thr_getfpregs_p == NULL) if (td_thr_getfpregs_p == NULL)
return 0; return 0;
td_thr_getgregs_p = dlsym (handle, "td_thr_getgregs"); td_thr_getgregs_p = verbose_dlsym (handle, "td_thr_getgregs");
if (td_thr_getgregs_p == NULL) if (td_thr_getgregs_p == NULL)
return 0; return 0;
td_thr_setfpregs_p = dlsym (handle, "td_thr_setfpregs"); td_thr_setfpregs_p = verbose_dlsym (handle, "td_thr_setfpregs");
if (td_thr_setfpregs_p == NULL) if (td_thr_setfpregs_p == NULL)
return 0; return 0;
td_thr_setgregs_p = dlsym (handle, "td_thr_setgregs"); td_thr_setgregs_p = verbose_dlsym (handle, "td_thr_setgregs");
if (td_thr_setgregs_p == NULL) if (td_thr_setgregs_p == NULL)
return 0; return 0;
@ -587,6 +596,30 @@ thread_db_new_objfile (struct objfile *objfile)
{ {
td_err_e err; td_err_e err;
/* First time through, report that libthread_db was successfuly
loaded. Can't print this in in thread_db_load as, at that stage,
the interpreter and it's console haven't started. The real
problem here is that libthread_db is loaded too early - it should
only be loaded when there is a program to debug. */
{
static int dejavu;
if (!dejavu)
{
Dl_info info;
const char *library = NULL;
/* Try dladdr. */
if (dladdr ((*td_ta_new_p), &info) != 0)
library = info.dli_fname;
/* Try dlinfo? */
if (library == NULL)
/* Paranoid - don't let a NULL path slip through. */
library = LIBTHREAD_DB_SO;
printf_unfiltered ("Using host libthread_db library \"%s\".\n",
library);
dejavu = 1;
}
}
/* Don't attempt to use thread_db on targets which can not run /* Don't attempt to use thread_db on targets which can not run
(core files). */ (core files). */
if (objfile == NULL || !target_has_execution) if (objfile == NULL || !target_has_execution)
@ -624,6 +657,8 @@ thread_db_new_objfile (struct objfile *objfile)
break; break;
case TD_OK: case TD_OK:
printf_unfiltered ("[Thread debugging using libthread_db enabled]\n");
/* The thread library was detected. Activate the thread_db target. */ /* The thread library was detected. Activate the thread_db target. */
push_target (&thread_db_ops); push_target (&thread_db_ops);
using_thread_db = 1; using_thread_db = 1;