From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24079 invoked by alias); 8 Aug 2003 14:51:30 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 24070 invoked from network); 8 Aug 2003 14:51:28 -0000 Received: from unknown (HELO localhost.redhat.com) (207.219.125.131) by sources.redhat.com with SMTP; 8 Aug 2003 14:51:28 -0000 Received: from redhat.com (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id BEBD62B7F; Fri, 8 Aug 2003 10:51:25 -0400 (EDT) Message-ID: <3F33B8ED.1000908@redhat.com> Date: Fri, 08 Aug 2003 14:51:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.0.2) Gecko/20030223 X-Accept-Language: en-us, en MIME-Version: 1.0 To: cgd@broadcom.com Cc: Elena Zannoni , gdb-patches@sources.redhat.com, Michael Elizabeth Chastain Subject: Re: [rfa:threads] Report when using libthread_db References: <3F3004F7.6090003@redhat.com> <3F32AF3A.1080106@redhat.com> Content-Type: multipart/mixed; boundary="------------090203000902050405000104" X-SW-Source: 2003-08/txt/msg00126.txt.bz2 This is a multi-part message in MIME format. --------------090203000902050405000104 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 697 > At Thu, 7 Aug 2003 19:58:06 +0000 (UTC), "Andrew Cagney" wrote: > >> Anyone know how to get a version number from libthread_db, or it's >> absolute path? > > > looks like there are two ways one can do this: > > dlinfo() on Solaris (and other systems that have it -- but it doesn't > appear common). > > dladdr() on systems that have it and this one is more widespread (incl > solaris, linux at least with -D_GNU_SOURCE, and it looks like NetBSD > has it as well). Works for me! ... Using host libthread_db library "/lib64/tls/libthread_db.so.1". ... now if only there was also some sort of embedded revision/build string :-( Michael, Mark, ok for mainline? Too risky for 6.0? Andrew --------------090203000902050405000104 Content-Type: text/plain; name="diffs" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diffs" Content-length: 4081 2003-08-05 Andrew Cagney * 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: ./gdb/thread-db.c =================================================================== RCS file: /cvs/src/src/gdb/thread-db.c,v retrieving revision 1.33 diff -u -r1.33 thread-db.c --- ./gdb/thread-db.c 5 Jun 2003 18:22:02 -0000 1.33 +++ ./gdb/thread-db.c 8 Aug 2003 14:42:47 -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,30 @@ { 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 @@ 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; --------------090203000902050405000104--