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>
* configure.tgt: Add "mips64*-*-*" target. Delete

View File

@ -375,6 +375,15 @@ thread_db_init (struct target_ops *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
thread_db_load (void)
{
@ -394,47 +403,47 @@ thread_db_load (void)
/* Initialize pointers to the dynamic library functions we will use.
Essential functions first. */
td_init_p = dlsym (handle, "td_init");
td_init_p = verbose_dlsym (handle, "td_init");
if (td_init_p == NULL)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
return 0;
@ -587,6 +596,30 @@ thread_db_new_objfile (struct objfile *objfile)
{
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
(core files). */
if (objfile == NULL || !target_has_execution)
@ -624,6 +657,8 @@ thread_db_new_objfile (struct objfile *objfile)
break;
case TD_OK:
printf_unfiltered ("[Thread debugging using libthread_db enabled]\n");
/* The thread library was detected. Activate the thread_db target. */
push_target (&thread_db_ops);
using_thread_db = 1;