aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrakuco <rakuco@FreeBSD.org>2012-10-29 05:50:34 +0800
committerrakuco <rakuco@FreeBSD.org>2012-10-29 05:50:34 +0800
commitb53b814a5f6900339c3670f884c66b5cd3e2473a (patch)
tree8c9b24b1260dc461acf4593a64f4e5fb158bd105
parent0638d56e7f34f7dd0fe7c56dd15b06afa44f4ab5 (diff)
downloadfreebsd-ports-gnome-b53b814a5f6900339c3670f884c66b5cd3e2473a.tar.gz
freebsd-ports-gnome-b53b814a5f6900339c3670f884c66b5cd3e2473a.tar.zst
freebsd-ports-gnome-b53b814a5f6900339c3670f884c66b5cd3e2473a.zip
- 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@gmail.com> (maintainer) Feature safe: yes
-rw-r--r--devel/gdb/Makefile37
-rw-r--r--devel/gdb/files/fbsd-threads.c152
-rw-r--r--devel/gdb/files/patch-gdb-amd64fbsd-nat.c17
-rw-r--r--devel/gdb/files/patch-gdb-i386fbsd-nat.c17
4 files changed, 185 insertions, 38 deletions
diff --git a/devel/gdb/Makefile b/devel/gdb/Makefile
index c2f6398104ef..4842717d5c05 100644
--- a/devel/gdb/Makefile
+++ b/devel/gdb/Makefile
@@ -24,13 +24,12 @@ CONFIGURE_ENV= CONFIGURED_M4=m4 CONFIGURED_BISON=byacc
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>
diff --git a/devel/gdb/files/fbsd-threads.c b/devel/gdb/files/fbsd-threads.c
index 21ebcb92fbe4..ec884dae9623 100644
--- a/devel/gdb/files/fbsd-threads.c
+++ b/devel/gdb/files/fbsd-threads.c
@@ -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, const td_thrhandle_t *th_p,
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 target_ops *ops, char *args,
#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_thrhandle_t *th, td_thrinfo_t *ti)
}
}
- /* 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_ops *ops,
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 target_ops *ops,
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 *ops, ptid_t ptid)
{
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 target_ops *ops)
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_ops *ops, ptid_t ptid)
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_t 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, lwpid_t lwpid)
{
if (ptrace (PT_RESUME, lwpid, 0, 0) == -1)
return PS_ERR;
- return PS_OK;
+ return PS_OK;
}
ps_err_e
diff --git a/devel/gdb/files/patch-gdb-amd64fbsd-nat.c b/devel/gdb/files/patch-gdb-amd64fbsd-nat.c
index 42e1ccfdc9fd..5cd5015a89ba 100644
--- a/devel/gdb/files/patch-gdb-amd64fbsd-nat.c
+++ b/devel/gdb/files/patch-gdb-amd64fbsd-nat.c
@@ -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>
diff --git a/devel/gdb/files/patch-gdb-i386fbsd-nat.c b/devel/gdb/files/patch-gdb-i386fbsd-nat.c
index f77a87532ba3..6642c554a0ad 100644
--- a/devel/gdb/files/patch-gdb-i386fbsd-nat.c
+++ b/devel/gdb/files/patch-gdb-i386fbsd-nat.c
@@ -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 */