Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Feb 2015 03:18:30 +0000 (UTC)
From:      Rui Paulo <rpaulo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r278658 - head/lib/libproc
Message-ID:  <201502130318.t1D3IUDc083842@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rpaulo
Date: Fri Feb 13 03:18:29 2015
New Revision: 278658
URL: https://svnweb.freebsd.org/changeset/base/278658

Log:
  Teach libproc how to find debugging symbols in /usr/lib/debug.
  
  MFC after:	1 week

Modified:
  head/lib/libproc/proc_sym.c

Modified: head/lib/libproc/proc_sym.c
==============================================================================
--- head/lib/libproc/proc_sym.c	Fri Feb 13 02:10:09 2015	(r278657)
+++ head/lib/libproc/proc_sym.c	Fri Feb 13 03:18:29 2015	(r278658)
@@ -82,6 +82,21 @@ fail:
 	strlcpy(buf, symbol, len);
 }
 
+static int
+find_dbg_obj(const char *path)
+{
+	int fd;
+	char dbg_path[PATH_MAX];
+
+	snprintf(dbg_path, sizeof(dbg_path),
+	    "/usr/lib/debug/%s.debug", path);
+	fd = open(dbg_path, O_RDONLY);
+	if (fd > 0)
+		return (fd);
+	else
+		return (open(path, O_RDONLY));
+}
+
 static void
 proc_rdl2prmap(rd_loadobj_t *rdl, prmap_t *map)
 {
@@ -295,7 +310,7 @@ proc_addr2sym(struct proc_handle *p, uin
 
 	if ((map = proc_addr2map(p, addr)) == NULL)
 		return (-1);
-	if ((fd = open(map->pr_mapname, O_RDONLY, 0)) < 0) {
+	if ((fd = find_dbg_obj(map->pr_mapname)) < 0) {
 		DPRINTF("ERROR: open %s failed", map->pr_mapname);
 		goto err0;
 	}
@@ -443,7 +458,7 @@ proc_name2sym(struct proc_handle *p, con
 		DPRINTFX("ERROR: couldn't find object %s", object);
 		goto err0;
 	}
-	if ((fd = open(map->pr_mapname, O_RDONLY, 0)) < 0) {
+	if ((fd = find_dbg_obj(map->pr_mapname)) < 0) {
 		DPRINTF("ERROR: open %s failed", map->pr_mapname);
 		goto err0;
 	}
@@ -539,7 +554,7 @@ proc_iter_symbyaddr(struct proc_handle *
 
 	if ((map = proc_name2map(p, object)) == NULL)
 		return (-1);
-	if ((fd = open(map->pr_mapname, O_RDONLY)) < 0) {
+	if ((fd = find_dbg_obj(map->pr_mapname)) < 0) {
 		DPRINTF("ERROR: open %s failed", map->pr_mapname);
 		goto err0;
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201502130318.t1D3IUDc083842>