svn commit: r306581 - in head/devel/gdb: . files
Bryan Drewery
bdrewery at freebsd.org
Fri Nov 9 14:36:24 UTC 2012
On 10/28/2012 4:50 PM, Raphael Kubo da Costa wrote:
> Author: rakuco
> Date: Sun Oct 28 21:50:34 2012
> New Revision: 306581
> URL: http://svn.freebsd.org/changeset/ports/306581
>
> Log:
> - Show thread names, closing ports/172572. Thanks to Mark Lokowich.
> - It is now possible to choose which readline version to use, closing
> ports/172077. Thanks to Jan Beich.
> - Fix patches to remove compilation warnings.
> - Clean configure arguments to remove a compilation warning.
> - Fix file permissions when the PYTHON option is enabled.
> - Trim Makefile header.
>
> PR: ports/172828
> Submitted by: Luca Pizzammiglio <luca.pizzamiglio at gmail.com> (maintainer)
> Feature safe: yes
>
For some reason this is now failing on amd64:
http://pointyhat.freebsd.org/errorlogs/amd64-errorlogs/e.9.20121104103132/gdb-7.5_1.log
Snippet:
> checking for C compiler default output file name...
> configure: error: in `/wrkdirs/usr/ports/devel/gdb/work/gdb-7.5':
> configure: error: C compiler cannot create executables
> See `config.log' for more details.
> ===> Script "configure" failed unexpectedly.
> Please report the problem to luca.pizzamiglio at gmail.com [maintainer] and
> attach the "/wrkdirs/usr/ports/devel/gdb/work/gdb-7.5/config.log" including
> the output of the failure of your make command. Also, it might be a good idea
> to provide an overview of all packages installed on your system (e.g. a
> /usr/local/sbin/pkg info -g -Ea).
> *** Error code 1
Bryan
> Modified:
> head/devel/gdb/Makefile
> head/devel/gdb/files/fbsd-threads.c
> head/devel/gdb/files/patch-gdb-amd64fbsd-nat.c
> head/devel/gdb/files/patch-gdb-i386fbsd-nat.c
>
> Modified: head/devel/gdb/Makefile
> ==============================================================================
> --- head/devel/gdb/Makefile Sun Oct 28 21:44:23 2012 (r306580)
> +++ head/devel/gdb/Makefile Sun Oct 28 21:50:34 2012 (r306581)
> @@ -24,13 +24,12 @@ CONFIGURE_ENV= CONFIGURED_M4=m4 CONFIGUR
> CONFIGURE_ARGS= --program-suffix=${PORTVERSION:S/.//g} \
> --with-gdb-datadir=${PREFIX}/share/gdb${PORTVERSION:S/.//g} \
> --with-libiconv-prefix=${LOCALBASE} \
> - --with-system-readline \
> - --without-libunwind \
> + --without-libunwind-ia64 \
> --enable-target=all \
> --enable-tui
> CFLAGS:= ${CFLAGS:C/ +$//} # blanks at EOL creep in sometimes
> CFLAGS+= -DRL_NO_COMPAT
> -EXCLUDE= dejagnu expect readline sim texinfo intl
> +EXCLUDE= dejagnu expect sim texinfo intl
> EXTRACT_AFTER_ARGS= | ${TAR} -xf - ${EXCLUDE:S/^/--exclude /} \
> --no-same-owner --no-same-permissions
> VER= ${PORTVERSION:S/.//g}
> @@ -39,13 +38,14 @@ MAN1= gdb${VER}.1
>
> ONLY_FOR_ARCHS= i386 amd64 # untested elsewhere, might work
>
> -# Forcing to use readline.6 from ports (newer readline in FreeBSD world is not
> -# compatible anymore).
> -USE_READLINE= port
> -
> OPTIONS_DEFINE= DEBUG EXPAT PYTHON THREADS GDB_LINK
> +OPTIONS_SINGLE_READLINE= BASE_READLINE BUNDLED_READLINE PORT_READLINE
> +OPTIONS_SINGLE= READLINE
> +BASE_READLINE_DESC= from base system (EXPERIMENTAL)
> +BUNDLED_READLINE_DESC= from gdb distfile
> +PORT_READLINE_DESC= from devel/readline port
> GDB_LINK_DESC= Create the gdb link
> -OPTIONS_DEFAULT= THREADS GDB_LINK
> +OPTIONS_DEFAULT= THREADS GDB_LINK PORT_READLINE
>
> .include <bsd.port.options.mk>
>
> @@ -59,6 +59,19 @@ PLIST_SUB+= GDB_LINK="@comment "
> USE_PYTHON= 2.5-2.7
> .endif
>
> +.if empty(PORT_OPTIONS:MBUNDLED_READLINE)
> +EXCLUDE+= readline
> +CONFIGURE_ARGS+= --with-system-readline
> +.endif
> +
> +.if ${PORT_OPTIONS:MBASE_READLINE}
> +CFLAGS+= -D_rl_echoing_p=readline_echoing_p
> +USE_READLINE= base
> +.endif
> +
> +.if ${PORT_OPTIONS:MPORT_READLINE}
> +USE_READLINE= port
> +.endif
> .include <bsd.port.pre.mk>
>
> .if ${PORT_OPTIONS:MTHREADS}
> @@ -97,7 +110,7 @@ post-patch:
>
> do-install:
> ${INSTALL_PROGRAM} ${WRKSRC}/gdb/gdb ${PREFIX}/bin/gdb${VER}
> - ${LN} ${PREFIX}/bin/gdb${VER} ${PREFIX}/bin/gdbtui${VER}
> + ${LN} -sf ${PREFIX}/bin/gdb${VER} ${PREFIX}/bin/gdbtui${VER}
> ${INSTALL_MAN} ${WRKSRC}/gdb/gdb.1 ${MAN1PREFIX}/man/man1/gdb${VER}.1
> .if ${PORT_OPTIONS:MGDB_LINK}
> ${LN} -sf gdb${VER} ${PREFIX}/bin/gdb
> @@ -107,4 +120,10 @@ do-install:
> (cd ${WRKSRC}/gdb/data-directory; ${GMAKE} install-python )
> .endif
>
> +post-install:
> +.if ${PORT_OPTIONS:MPYTHON}
> + ${CHMOD} u+w ${PREFIX}/share/gdb${VER}/python/gdb/*.py*
> + ${CHMOD} u+w ${PREFIX}/share/gdb${VER}/python/gdb/command/*.py*
> +.endif
> +
> .include <bsd.port.post.mk>
>
> Modified: head/devel/gdb/files/fbsd-threads.c
> ==============================================================================
> --- head/devel/gdb/files/fbsd-threads.c Sun Oct 28 21:44:23 2012 (r306580)
> +++ head/devel/gdb/files/fbsd-threads.c Sun Oct 28 21:50:34 2012 (r306581)
> @@ -18,6 +18,15 @@
> along with this program; if not, write to the Free Software
> Foundation, Inc., 59 Temple Place - Suite 330,
> Boston, MA 02111-1307, USA. */
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <err.h>
> +
> +#include <sys/param.h>
> +#include <sys/sysctl.h>
> +#include <sys/user.h>
> +#include <libutil.h>
>
> #include <dlfcn.h>
> #include <sys/types.h>
> @@ -48,11 +57,19 @@
>
> #define LIBTHREAD_DB_SO "libthread_db.so"
>
> +struct private_thread_info
> +{
> + char *lwp_name;
> +};
> +
> struct ps_prochandle
> {
> pid_t pid;
> };
>
> +/* Defining the prototype of _initialize_thread_db to remove warning */
> +extern initialize_file_ftype _initialize_thread_db;
> +
> /* This module's target vectors. */
> static struct target_ops fbsd_thread_ops;
>
> @@ -76,8 +93,8 @@ static td_thragent_t *thread_agent;
> /* The last thread we are single stepping */
> static ptid_t last_single_step_thread;
>
> -/* Pointers to the libthread_db functions. */
>
> +/* Pointers to the libthread_db functions. */
> static td_err_e (*td_init_p) (void);
>
> static td_err_e (*td_ta_new_p) (struct ps_prochandle *ps, td_thragent_t **ta);
> @@ -133,6 +150,7 @@ static CORE_ADDR td_create_bp_addr;
> static CORE_ADDR td_death_bp_addr;
>
> /* Prototypes for local functions. */
> +static void fbsd_find_lwp_name(long lwpid, struct private_thread_info *info);
> static void fbsd_thread_find_new_threads (struct target_ops *ops);
> static int fbsd_thread_alive (struct target_ops *ops, ptid_t ptid);
> static void attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
> @@ -140,6 +158,9 @@ static void attach_thread (ptid_t ptid,
> static void fbsd_thread_detach (struct target_ops *ops, char *args,
> int from_tty);
>
> +CORE_ADDR fbsd_thread_get_local_address(struct target_ops *ops,
> + ptid_t ptid, CORE_ADDR lm, CORE_ADDR offset);
> +
> /* Building process ids. */
>
> #define GET_PID(ptid) ptid_get_pid (ptid)
> @@ -152,6 +173,13 @@ static void fbsd_thread_detach (struct t
> #define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
> #define BUILD_THREAD(tid, pid) ptid_build (pid, 0, tid)
>
> +static void
> +free_private_thread_info(struct private_thread_info *info)
> +{
> + xfree(info->lwp_name);
> + xfree(info);
> +}
> +
> static char *
> thread_db_err_str (td_err_e err)
> {
> @@ -237,7 +265,7 @@ static ptid_t
> thread_from_lwp (ptid_t ptid, td_thrhandle_t *th, td_thrinfo_t *ti)
> {
> td_err_e err;
> -
> +
> gdb_assert (IS_LWP (ptid));
>
> if (fbsd_thread_active)
> @@ -252,7 +280,7 @@ thread_from_lwp (ptid_t ptid, td_thrhand
> }
> }
>
> - /* the LWP is not mapped to user thread */
> + /* the LWP is not mapped to user thread */
> return BUILD_LWP (GET_LWP (ptid), GET_PID (ptid));
> }
>
> @@ -463,7 +491,7 @@ check_for_thread_db (void)
> that at this point there is no guarantee that we actually have a
> child process. */
> proc_handle.pid = GET_PID (inferior_ptid);
> -
> +
> /* Now attempt to open a connection to the thread library. */
> err = td_ta_new_p (&proc_handle, &thread_agent);
> switch (err)
> @@ -477,7 +505,7 @@ check_for_thread_db (void)
> push_target(&fbsd_thread_ops);
> fbsd_thread_present = 1;
> fbsd_thread_activate();
> -
> +
> break;
>
> default:
> @@ -631,11 +659,24 @@ static void
> attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
> const td_thrinfo_t *ti_p, int verbose)
> {
> + struct private_thread_info *private;
> + struct thread_info *tp = NULL;
> + char *lwpstr = NULL;
> td_err_e err;
>
> /* Add the thread to GDB's thread list. */
> if (!in_thread_list (ptid))
> - add_thread (ptid);
> + {
> + /* Add thread with info */
> + private = xmalloc(sizeof(struct private_thread_info));
> + gdb_assert(private != NULL);
> + // Thread name is assigned when printed
> + memset(private, 0, sizeof(struct private_thread_info));
> +
> + tp = add_thread_with_info(ptid, private);
> + tp->private = private;
> + tp->private_dtor = free_private_thread_info;
> + }
>
> if (ti_p->ti_state == TD_THR_UNKNOWN || ti_p->ti_state == TD_THR_ZOMBIE)
> return; /* A zombie thread -- do not attach. */
> @@ -743,7 +784,7 @@ fbsd_thread_wait (struct target_ops *ops
> a non-existing thread to fbsd_thread_resume causes error. However,
> if the exiting thread is the currently selected thread,
> then that is handled later in handle_inferior_event(), and we must
> - not delete the currently selected thread.
> + not delete the currently selected thread.
> */
> if (!fbsd_thread_alive (ops, inferior_ptid) && !ptid_equal(inferior_ptid, ret))
> {
> @@ -781,7 +822,7 @@ fbsd_lwp_fetch_registers (struct target_
> if (ptrace (PT_GETREGS, lwp, (caddr_t) &gregs, 0) == -1)
> error ("Cannot get lwp %d registers: %s\n", lwp, safe_strerror (errno));
> supply_gregset (regcache, &gregs);
> -
> +
> #ifdef PT_GETXMMREGS
> if (ptrace (PT_GETXMMREGS, lwp, xmmregs, 0) == 0)
> {
> @@ -819,7 +860,7 @@ fbsd_thread_fetch_registers (struct targ
> err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (inferior_ptid), &th);
> if (err != TD_OK)
> error ("Cannot find thread %d: Thread ID=%ld, %s",
> - pid_to_thread_id (inferior_ptid),
> + pid_to_thread_id (inferior_ptid),
> GET_THREAD (inferior_ptid), thread_db_err_str (err));
>
> err = td_thr_getgregs_p (&th, gregset);
> @@ -1051,7 +1092,7 @@ fbsd_thread_alive (struct target_ops *op
> {
> lwp = GET_LWP (ptid);
> bfd_map_over_sections (core_bfd, fbsd_core_check_lwp, &lwp);
> - return (lwp == 0);
> + return (lwp == 0);
> }
>
> /* check lwp in kernel */
> @@ -1091,10 +1132,74 @@ fbsd_thread_find_new_threads (struct tar
> error ("Cannot find new threads: %s", thread_db_err_str (err));
> }
>
> +static void
> +fbsd_find_lwp_name(long lwpid, struct private_thread_info *info)
> +{
> + int error, name[4];
> + unsigned int i;
> + struct kinfo_proc *kipp, *kip;
> + char *lwpstr = info->lwp_name;
> + int pid = inferior_ptid.pid;
> + size_t len = 0;
> +
> + name[0] = CTL_KERN;
> + name[1] = KERN_PROC;
> + name[2] = KERN_PROC_PID | KERN_PROC_INC_THREAD;
> + name[3] = pid;
> +
> + error = sysctl(name, 4, NULL, &len, NULL, 0);
> + if (error < 0 && errno != ESRCH) {
> + warn("sysctl: kern.proc.pid: %d", pid);
> + return;
> + }
> + if (error < 0)
> + return;
> +
> + kip = malloc(len);
> + if (kip == NULL)
> + err(-1, "malloc");
> +
> + if (sysctl(name, 4, kip, &len, NULL, 0) < 0) {
> + warn("sysctl: kern.proc.pid: %d", pid);
> + free(kip);
> + return;
> + }
> +
> + for (i = 0; i < len / sizeof(*kipp); i++) {
> + kipp = &kip[i];
> + if ((kipp->ki_tid == lwpid) && strlen(kipp->ki_ocomm) &&
> + (strcmp(kipp->ki_comm, kipp->ki_ocomm) != 0))
> + {
> + // Found the LWP, update the name field
> + if (lwpstr != NULL)
> + {
> + if (strcmp(lwpstr, kipp->ki_ocomm) != 0)
> + {
> + xfree(lwpstr);
> + }
> + else
> + {
> + // Name hasn't changed, just return
> + break;
> + }
> + }
> +
> + len = strlen(kipp->ki_ocomm);
> + lwpstr = xmalloc(len);
> + strcpy(lwpstr, kipp->ki_ocomm);
> + info->lwp_name = lwpstr;
> + break;
> + }
> + }
> +
> + free(kip);
> +}
> +
> static char *
> fbsd_thread_pid_to_str (struct target_ops *ops, ptid_t ptid)
> {
> static char buf[64];
> + struct thread_info *tinfo = NULL;
>
> if (IS_THREAD (ptid))
> {
> @@ -1112,10 +1217,25 @@ fbsd_thread_pid_to_str (struct target_op
> error ("Cannot get thread info, Thread ID=%ld, %s",
> GET_THREAD (ptid), thread_db_err_str (err));
>
> + tinfo = find_thread_ptid(ptid);
> + gdb_assert(tinfo != NULL);
> +
> if (ti.ti_lid != 0)
> {
> - snprintf (buf, sizeof (buf), "Thread %llx (LWP %d)",
> - (unsigned long long)th.th_thread, ti.ti_lid);
> + // Need to find the name of this LWP, even though it shouldn't change
> + fbsd_find_lwp_name(ti.ti_lid, tinfo->private);
> +
> + if (tinfo->private->lwp_name == NULL)
> + {
> + snprintf(buf, sizeof (buf), "Thread %llx (LWP %d)",
> + (unsigned long long)th.th_thread, ti.ti_lid);
> + }
> + else
> + {
> + snprintf(buf, sizeof (buf), "Thread %llx (LWP %d %s)",
> + (unsigned long long)th.th_thread, ti.ti_lid,
> + tinfo->private->lwp_name);
> + }
> }
> else
> {
> @@ -1170,7 +1290,7 @@ static int
> tsd_cb (thread_key_t key, void (*destructor)(void *), void *ignore)
> {
> struct minimal_symbol *ms;
> - char *name;
> + const char *name;
>
> ms = lookup_minimal_symbol_by_pc (extract_func_ptr (&destructor));
> if (!ms)
> @@ -1333,7 +1453,7 @@ thread_db_load (void)
> td_ta_event_getmsg_p = dlsym (handle, "td_ta_event_getmsg");
> td_thr_event_enable_p = dlsym (handle, "td_thr_event_enable");
> td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr");
> -
> +
> return 1;
> }
>
> @@ -1514,7 +1634,7 @@ ps_lstop(struct ps_prochandle *ph, lwpid
> {
> if (ptrace (PT_SUSPEND, lwpid, 0, 0) == -1)
> return PS_ERR;
> - return PS_OK;
> + return PS_OK;
> }
>
> ps_err_e
> @@ -1522,7 +1642,7 @@ ps_lcontinue(struct ps_prochandle *ph, l
> {
> if (ptrace (PT_RESUME, lwpid, 0, 0) == -1)
> return PS_ERR;
> - return PS_OK;
> + return PS_OK;
> }
>
> ps_err_e
>
> Modified: head/devel/gdb/files/patch-gdb-amd64fbsd-nat.c
> ==============================================================================
> --- head/devel/gdb/files/patch-gdb-amd64fbsd-nat.c Sun Oct 28 21:44:23 2012 (r306580)
> +++ head/devel/gdb/files/patch-gdb-amd64fbsd-nat.c Sun Oct 28 21:50:34 2012 (r306581)
> @@ -1,6 +1,12 @@
> --- gdb/amd64fbsd-nat.c.orig 2012-02-09 17:06:44.000000000 +0100
> -+++ gdb/amd64fbsd-nat.c 2012-08-22 23:51:38.000000000 +0200
> -@@ -26,6 +26,7 @@
> ++++ gdb/amd64fbsd-nat.c 2012-08-30 10:58:55.000000000 +0200
> +@@ -21,11 +21,13 @@
> + #include "inferior.h"
> + #include "regcache.h"
> + #include "target.h"
> ++#include "gregset.h"
> +
> + #include "gdb_assert.h"
> #include <signal.h>
> #include <stddef.h>
> #include <sys/types.h>
> @@ -8,7 +14,7 @@
> #include <sys/ptrace.h>
> #include <sys/sysctl.h>
> #include <machine/reg.h>
> -@@ -93,6 +94,47 @@
> +@@ -93,6 +95,46 @@
> };
>
>
> @@ -28,7 +34,7 @@
> + do this for all registers. */
> +
> +void
> -+fill_gregset (struct regcache *regcache, gregset_t *gregsetp, int regnum)
> ++fill_gregset (const struct regcache *regcache, gdb_gregset_t *gregsetp, int regnum)
> +{
> + amd64_collect_native_gregset (regcache, gregsetp, regnum);
> +}
> @@ -47,12 +53,11 @@
> + do this for all registers. */
> +
> +void
> -+fill_fpregset (struct regcache *regcache, fpregset_t *fpregsetp, int regnum)
> ++fill_fpregset (const struct regcache *regcache, gdb_fpregset_t *fpregsetp, int regnum)
> +{
> + amd64_collect_fxsave (regcache, regnum, fpregsetp);
> +}
> +
> -+
> /* Support for debugging kernel virtual memory images. */
>
> #include <sys/types.h>
>
> Modified: head/devel/gdb/files/patch-gdb-i386fbsd-nat.c
> ==============================================================================
> --- head/devel/gdb/files/patch-gdb-i386fbsd-nat.c Sun Oct 28 21:44:23 2012 (r306580)
> +++ head/devel/gdb/files/patch-gdb-i386fbsd-nat.c Sun Oct 28 21:50:34 2012 (r306581)
> @@ -1,14 +1,17 @@
> ---- gdb/i386fbsd-nat.c.orig 2010-01-01 02:31:36.000000000 -0500
> -+++ gdb/i386fbsd-nat.c 2010-10-22 13:57:48.705926000 -0400
> -@@ -24,6 +24,7 @@
> +--- gdb/i386fbsd-nat.c.orig 2012-05-24 18:39:09.000000000 +0200
> ++++ gdb/i386fbsd-nat.c 2012-08-29 17:19:57.000000000 +0200
> +@@ -21,8 +21,10 @@
> + #include "inferior.h"
> + #include "regcache.h"
> #include "target.h"
> ++#include "gregset.h"
>
> #include <sys/types.h>
> +#include <sys/procfs.h>
> #include <sys/ptrace.h>
> #include <sys/sysctl.h>
>
> -@@ -81,6 +82,49 @@
> +@@ -80,6 +82,49 @@
> }
>
>
> @@ -28,7 +31,7 @@
> + do this for all registers. */
> +
> +void
> -+fill_gregset (struct regcache *regcache, gregset_t *gregsetp, int regnum)
> ++fill_gregset (const struct regcache *regcache, gdb_gregset_t *gregsetp, int regnum)
> +{
> + i386bsd_collect_gregset (regcache, gregsetp, regnum);
> +}
> @@ -49,7 +52,7 @@
> + do this for all registers. */
> +
> +void
> -+fill_fpregset (struct regcache *regcache, fpregset_t *fpregsetp, int regnum)
> ++fill_fpregset (const struct regcache *regcache, gdb_fpregset_t *fpregsetp, int regnum)
> +{
> + i387_collect_fsave (regcache, regnum, fpregsetp);
> +}
> @@ -58,7 +61,7 @@
> /* Support for debugging kernel virtual memory images. */
>
> #include <sys/types.h>
> -@@ -141,7 +185,6 @@
> +@@ -141,7 +186,6 @@
> #endif /* HAVE_PT_GETDBREGS */
>
>
>
--
Regards,
Bryan Drewery
bdrewery at freenode/EFNet
More information about the svn-ports-all
mailing list