[svn-commits] tilghman: branch tilghman/better_backtrace_1.4 r297953 - in /team/tilghman/be...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Dec 9 14:53:28 CST 2010


Author: tilghman
Date: Thu Dec  9 14:53:26 2010
New Revision: 297953

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=297953
Log:
Yay, everything works...

Modified:
    team/tilghman/better_backtrace_1.4/include/asterisk/utils.h
    team/tilghman/better_backtrace_1.4/main/logger.c
    team/tilghman/better_backtrace_1.4/main/utils.c

Modified: team/tilghman/better_backtrace_1.4/include/asterisk/utils.h
URL: http://svnview.digium.com/svn/asterisk/team/tilghman/better_backtrace_1.4/include/asterisk/utils.h?view=diff&rev=297953&r1=297952&r2=297953
==============================================================================
--- team/tilghman/better_backtrace_1.4/include/asterisk/utils.h (original)
+++ team/tilghman/better_backtrace_1.4/include/asterisk/utils.h Thu Dec  9 14:53:26 2010
@@ -563,4 +563,13 @@
 #define ast_assert(a)
 #endif
 
+/*!\brief Resolve a binary to a full pathname
+ * \param binary Name of the executable to resolve
+ * \param fullpath Buffer to hold the complete pathname
+ * \param fullpath_size Size of \a fullpath
+ * \retval NULL \a binary was not found or the environment variable PATH is not set
+ * \return \a fullpath
+ */
+char *ast_utils_which(const char *binary, char *fullpath, size_t fullpath_size);
+
 #endif /* _ASTERISK_UTILS_H */

Modified: team/tilghman/better_backtrace_1.4/main/logger.c
URL: http://svnview.digium.com/svn/asterisk/team/tilghman/better_backtrace_1.4/main/logger.c?view=diff&rev=297953&r1=297952&r2=297953
==============================================================================
--- team/tilghman/better_backtrace_1.4/main/logger.c (original)
+++ team/tilghman/better_backtrace_1.4/main/logger.c Thu Dec  9 14:53:26 2010
@@ -833,48 +833,57 @@
 void ast_backtrace(void)
 {
 #ifdef linux
-#ifdef AST_DEVMODE
-	int count=0, i=0;
+#  ifdef AST_DEVMODE
+	int stackcount = 0, stackfr;
 	void **addresses;
-#if defined(HAVE_DLADDR) && defined(HAVE_BFD)
-	bfd *bfdobj;
-	Dl_info dli;
+#    if defined(HAVE_DLADDR) && defined(HAVE_BFD)
+	bfd *bfdobj;           /* bfd.h */
+	Dl_info dli;           /* dlfcn.h */
 	long allocsize;
-	asymbol **syms = NULL;
-	bfd_vma offset;
-	const char *last_slash;
-#if 0
+	asymbol **syms = NULL; /* bfd.h */
+	bfd_vma offset;        /* bfd.h */
+	const char *lastslash;
 	asection *section;
 	const char *file, *func;
 	unsigned int line;
-#endif
-	int j;
-#else
+	char address_str[128];
+#    else
 	char **strings;
-#endif
+#    endif
 
 	if ((addresses = ast_calloc(MAX_BACKTRACE_FRAMES, sizeof(*addresses)))) {
-		count = backtrace(addresses, MAX_BACKTRACE_FRAMES);
-#if defined(HAVE_DLADDR) && defined(HAVE_BFD)
-		ast_log(LOG_DEBUG, "Got %d backtrace record%c\n", count, count != 1 ? 's' : ' ');
-		for (i = 0; i < count; i++) {
+		stackcount = backtrace(addresses, MAX_BACKTRACE_FRAMES);
+#    if defined(HAVE_DLADDR) && defined(HAVE_BFD)
+		ast_log(LOG_DEBUG, "Got %d backtrace record%c\n", stackcount, stackcount != 1 ? 's' : ' ');
+		for (stackfr = 0; stackfr < stackcount; stackfr++) {
 			int found = 0, symbolcount;
-			int bestmatch = -1;
-			long bestdiff = LONG_MAX;
-
-			if (!dladdr(addresses[i], &dli)) {
+
+			if (!dladdr(addresses[stackfr], &dli)) {
 				continue;
 			}
-			last_slash = strrchr(dli.dli_fname, '/');
+
+			if (strcmp(dli.dli_fname, "asterisk") == 0) {
+				char asteriskpath[256];
+				if (!(dli.dli_fname = ast_utils_which("asterisk", asteriskpath, sizeof(asteriskpath)))) {
+					/* This will fail to find symbols */
+					ast_log(LOG_DEBUG, "Failed to find asterisk binary for debug symbols.\n");
+					dli.dli_fname = "asterisk";
+				}
+			}
+
+			lastslash = strrchr(dli.dli_fname, '/');
 			if (	(bfdobj = bfd_openr(dli.dli_fname, NULL)) &&
 					bfd_check_format(bfdobj, bfd_object) &&
 					(allocsize = bfd_get_symtab_upper_bound(bfdobj)) > 0 &&
 					(syms = ast_malloc(allocsize)) &&
 					(symbolcount = bfd_canonicalize_symtab(bfdobj, syms))) {
 
-				offset = addresses[i] - dli.dli_fbase;
-
-#if 0
+				if (bfdobj->flags & DYNAMIC) {
+					offset = addresses[stackfr] - dli.dli_fbase;
+				} else {
+					offset = addresses[stackfr] - (void *) 0;
+				}
+
 				for (section = bfdobj->sections; section; section = section->next) {
 					if (	!bfd_get_section_flags(bfdobj, section) & SEC_ALLOC ||
 							section->vma > offset ||
@@ -883,48 +892,42 @@
 					}
 
 					if (!bfd_find_nearest_line(bfdobj, section, syms, offset - section->vma, &file, &func, &line)) {
-						break;
+						continue;
 					}
 
-					/* TODO Stack trace output */
+					/* Stack trace output */
 					found++;
-#if __WORDSIZE == 32
-					ast_log(LOG_DEBUG, "#%d: [%08lX] %s:%u %s (%08lX+%lX)\n", i,
-						(unsigned long) addresses[i],
-						file, line,
+					lastslash = strrchr(file, '/');
+#      if __WORDSIZE == 32
+					if (dli.dli_saddr == NULL) {
+						address_str[0] = '\0';
+					} else {
+						snprintf(address_str, sizeof(address_str), " (%08lX+%lX)",
+							(unsigned long) dli.dli_saddr,
+							(unsigned long) (addresses[stackfr] - dli.dli_saddr));
+					}
+					ast_log(LOG_DEBUG, "#%d: [%08lX] %s:%u %s()%s\n", stackfr,
+						(unsigned long) addresses[stackfr],
+						lastslash ? lastslash + 1 : file, line,
 						S_OR(func, "???"),
-						(unsigned long) dli.dli_saddr,
-						(unsigned long) (addresses[i] - dli.dli_saddr));
-#elif __WORDSIZE == 64
-					ast_log(LOG_DEBUG, "#%d: [%016lX] %s:%u %s (%16lX+%lX)\n", i,
-						(unsigned long) addresses[i],
-						file, line,
+						address_str);
+#      elif __WORDSIZE == 64
+					if (dli.dli_saddr == NULL) {
+						address_str[0] = '\0';
+					} else {
+						snprintf(address_str, sizeof(address_str), " (%016lX+%lX)",
+							(unsigned long) dli.dli_saddr,
+							(unsigned long) (addresses[stackfr] - dli.dli_saddr));
+					}
+					ast_log(LOG_DEBUG, "#%d: [%016lX] %s:%u %s()%s\n", stackfr,
+						(unsigned long) addresses[stackfr],
+						lastslash ? lastslash + 1 : file, line,
 						S_OR(func, "???"),
-						(unsigned long) dli.dli_saddr,
-						(unsigned long) (addresses[i] - dli.dli_saddr));
-#endif
+						address_str);
+#      endif
 
 					break;
 				}
-#else
-				for (j = 0; j < symbolcount; j++) {
-					asymbol *s = syms[j];
-					if (s->value + s->section->vma > offset) {
-						/* Past the symbol we want */
-						continue;
-					}
-					if (offset - (s->value + s->section->vma) < bestdiff) {
-						bestmatch = j;
-						bestdiff = offset - (s->value + s->section->vma);
-					}
-				}
-				found++;
-				ast_log(LOG_DEBUG, "#%d: [%08lX] %s %s (%08lX+%lX) %d\n", i,
-					(unsigned long) addresses[i],
-					last_slash ? last_slash + 1 : dli.dli_fname, syms[bestmatch]->name,
-					(unsigned long) dli.dli_saddr,
-					(unsigned long) (addresses[i] - dli.dli_saddr), j);
-#endif
 			}
 			if (bfdobj) {
 				bfd_close(bfdobj);
@@ -935,43 +938,55 @@
 
 			/* Default output, if we cannot find the information within BFD */
 			if (!found) {
-#if __WORDSIZE == 32
-				ast_log(LOG_DEBUG, "#%d: [%08lX] %s %s (%08lX+%lX)\n", i,
-					(unsigned long) addresses[i],
-					last_slash ? last_slash + 1 : dli.dli_fname,
+#      if __WORDSIZE == 32
+				if (dli.dli_saddr == NULL) {
+					address_str[0] = '\0';
+				} else {
+					snprintf(address_str, sizeof(address_str), " (%08lX+%lX)",
+						(unsigned long) dli.dli_saddr,
+						(unsigned long) (addresses[stackfr] - dli.dli_saddr));
+				}
+				ast_log(LOG_DEBUG, "#%d: [%08lX] %s %s()%s\n", stackfr,
+					(unsigned long) addresses[stackfr],
+					lastslash ? lastslash + 1 : dli.dli_fname,
 					S_OR(dli.dli_sname, "<unknown>"),
-					(unsigned long) dli.dli_saddr,
-					(unsigned long) (addresses[i] - dli.dli_saddr));
-#elif __WORDSIZE == 64
-				ast_log(LOG_DEBUG, "#%d: [%016lX] %s %s (%08lX+%lX)\n", i,
-					(unsigned long) addresses[i],
-					last_slash ? last_slash + 1 : dli.dli_fname,
+					address_str);
+#      elif __WORDSIZE == 64
+				if (dli.dli_saddr == NULL) {
+					address_str[0] = '\0';
+				} else {
+					snprintf(address_str, sizeof(address_str), " (%016lX+%lX)",
+						(unsigned long) dli.dli_saddr,
+						(unsigned long) (addresses[stackfr] - dli.dli_saddr));
+				}
+				ast_log(LOG_DEBUG, "#%d: [%016lX] %s %s()%s\n", stackfr,
+					(unsigned long) addresses[stackfr],
+					lastslash ? lastslash + 1 : dli.dli_fname,
 					S_OR(dli.dli_sname, "<unknown>"),
-					(unsigned long) dli.dli_saddr,
-					(unsigned long) (addresses[i] - dli.dli_saddr));
-#endif
-			}
-		}
-#else
-		if ((strings = backtrace_symbols(addresses, count))) {
-			ast_log(LOG_DEBUG, "Got %d backtrace record%c\n", count, count != 1 ? 's' : ' ');
-			for (i=0; i < count ; i++) {
-#if __WORDSIZE == 32
-				ast_log(LOG_DEBUG, "#%d: [%08X] %s\n", i, (unsigned int)addresses[i], strings[i]);
-#elif __WORDSIZE == 64
-				ast_log(LOG_DEBUG, "#%d: [%016lX] %s\n", i, (unsigned long)addresses[i], strings[i]);
-#endif
+					address_str);
+#      endif
+			}
+		}
+#    else /* !defined(HAVE_DLADDR) || !defined(HAVE_BFD) */
+		if ((strings = backtrace_symbols(addresses, stackcount))) {
+			ast_log(LOG_DEBUG, "Got %d backtrace record%c\n", stackcount, stackcount != 1 ? 's' : ' ');
+			for (stackfr = 0; stackfr < stackcount ; stackfr++) {
+#      if __WORDSIZE == 32
+				ast_log(LOG_DEBUG, "#%d: [%08X] %s\n", i, (unsigned int)addresses[stackfr], strings[stackfr]);
+#      elif __WORDSIZE == 64
+				ast_log(LOG_DEBUG, "#%d: [%016lX] %s\n", i, (unsigned long)addresses[stackfr], strings[stackfr]);
+#      endif
 			}
 			free(strings);
 		} else {
 			ast_log(LOG_DEBUG, "Could not allocate memory for backtrace\n");
 		}
-#endif
+#    endif /* defined(HAVE_DLADDR) && defined(HAVE_BFD) */
 		free(addresses);
 	}
-#else
+#  else /* !defined(AST_DEVMODE) */
 	ast_log(LOG_WARNING, "Must run configure with '--enable-dev-mode' for stack backtraces.\n");
-#endif
+#  endif /* defined(AST_DEVMODE) */
 #else /* ndef linux */
 	ast_log(LOG_WARNING, "Inline stack backtraces are only available on the Linux platform.\n");
 #endif

Modified: team/tilghman/better_backtrace_1.4/main/utils.c
URL: http://svnview.digium.com/svn/asterisk/team/tilghman/better_backtrace_1.4/main/utils.c?view=diff&rev=297953&r1=297952&r2=297953
==============================================================================
--- team/tilghman/better_backtrace_1.4/main/utils.c (original)
+++ team/tilghman/better_backtrace_1.4/main/utils.c Thu Dec  9 14:53:26 2010
@@ -38,6 +38,7 @@
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#include <sys/stat.h>
 
 #define AST_API_MODULE		/* ensure that inlinable API functions will be built in lock.h if required */
 #include "asterisk/lock.h"
@@ -1441,3 +1442,22 @@
 	return res;
 }
 #endif
+
+char *ast_utils_which(const char *binary, char *fullpath, size_t fullpath_size)
+{
+	const char *envPATH = getenv("PATH");
+	char *tpath, *path;
+	struct stat unused;
+	if (!envPATH) {
+		return NULL;
+	}
+	tpath = ast_strdupa(envPATH);
+	while ((path = strsep(&tpath, ":"))) {
+		snprintf(fullpath, fullpath_size, "%s/%s", path, binary);
+		if (!stat(fullpath, &unused)) {
+			return fullpath;
+		}
+	}
+	return NULL;
+}
+




More information about the svn-commits mailing list