This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [rfa:threads] Report when using libthread_db
- From: Andrew Cagney <ac131313 at redhat dot com>
- To: Elena Zannoni <ezannoni at redhat dot com>,gdb-patches at sources dot redhat dot com,Michael Elizabeth Chastain <mec at shout dot net>
- Date: Thu, 07 Aug 2003 15:57:46 -0400
- Subject: Re: [rfa:threads] Report when using libthread_db
- References: <3F3004F7.6090003@redhat.com>
Here's a revised patch. The `Using ...' message now appears after the
copyright.
GNU gdb 2003-08-05-cvs
...
This GDB was configured as "x86_64-unknown-linux-gnu".
(gdb) file
/home/cagney/PENDING/2003-08-05-warn-thread-db/N-x86_64-unknown-linux
-gnu/gdb/testsuite/gdb.threads/pthreads
Reading symbols from
/home/cagney/PENDING/2003-08-05-warn-thread-db/N-x86_64-unk
nown-linux-gnu/gdb/testsuite/gdb.threads/pthreads...done.
Using host libthread_db library "libthread_db.so.1"
(gdb) ...
(gdb) run
Starting program:
/home/cagney/PENDING/2003-08-05-warn-thread-db/N-x86_64-unknow
n-linux-gnu/gdb/testsuite/gdb.threads/pthreads
[Thread debugging using libthread_db enabled]
[New Thread 182894192832 (LWP 28501)]
[Switching to Thread 182894192832 (LWP 28501)]
Thoughts?
Anyone know how to get a version number from libthread_db, or it's
absolute path?
Andrew
2003-08-05 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.
Index: thread-db.c
===================================================================
RCS file: /cvs/src/src/gdb/thread-db.c,v
retrieving revision 1.33
diff -u -r1.33 thread-db.c
--- thread-db.c 5 Jun 2003 18:22:02 -0000 1.33
+++ thread-db.c 7 Aug 2003 18:58:40 -0000
@@ -375,6 +375,15 @@
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 @@
/* 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,21 @@
{
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 probably that libthread_db is loaded too early -
+ should it only be loaded when there is a program to debug? */
+ {
+ static int dejavu;
+ if (!dejavu)
+ {
+ printf_unfiltered ("Using host libthread_db library \"%s\"\n",
+ LIBTHREAD_DB_SO);
+ 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 +648,8 @@
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;