[RFC] print stack trace after each syscall
Luca Clementi
luca.clementi at gmail.com
Mon Jul 8 01:43:49 UTC 2013
On Wed, Jul 3, 2013 at 9:58 AM, Mike Frysinger <vapier at gentoo.org> wrote:
> On Tuesday 02 July 2013 21:54:17 Luca Clementi wrote:
>> Regarding PKG_CHECKS_MODULE I am not too convinced (although I must
>> say that I am not an expert of autoconf).
>> For example Ubuntu 12.04 the system libunwind7 and libunwind7-dev do
>> not include the .pc files needed by PKG_CHECKS_MODULE.
>
> looks like they're new to the 1.1 release. you should still default to
> checking the .pc files. just add fallback logic to support older versions.
>
> something like this untested snippet:
> PKG_CHECK_MODULES([LIBUNWIND], [libunwind-generic],
> [CFLAGS="$CFLAGS $LIBUNWIND_CFLAGS" LIBS="$LIBS $LIBUNWIND_LIBS"],
> [... AC_CHECK_LIB fallback logic ...])
Hey Mike,
I did some tests on this, and they are not just new to 1.1 but they
are also missing the: Cflags section.
So I can't get the include path from them anyway.
So far I have a solution with ac_check_lib that works with both
distribution installation and local installation and uses the
--with-libunwind=/path/to/unwind flag.
Provided the .pc file were not missing the Cflags what would be the
advantage of having 10 extra line to manage the checks with
pkg_check_modules?
Luca
diff --git a/Makefile.am b/Makefile.am
index 9d611f3..c8ad026 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -12,7 +12,7 @@ ARCH = @arch@
ACLOCAL_AMFLAGS = -I m4
AM_CFLAGS = $(WARN_CFLAGS)
-AM_CPPFLAGS = -I$(srcdir)/$(OS)/$(ARCH) -I$(srcdir)/$(OS) -I$(builddir)/$(OS)
+AM_CPPFLAGS = -I$(srcdir)/$(OS)/$(ARCH) -I$(srcdir)/$(OS)
-I$(builddir)/$(OS) $(libunwind_CPPFLAGS)
strace_SOURCES = \
bjm.c \
@@ -43,6 +43,14 @@ strace_SOURCES = \
util.c \
vsprintf.c
+
+if LIB_UNWIND
+strace_SOURCES += unwind.c
+strace_LDADD = $(libunwind_LIBS)
+AM_LDFLAGS = $(libunwind_LDFLAGS)
+endif
+
+
noinst_HEADERS = defs.h
# Enable this to get link map generated
#strace_CFLAGS = $(AM_CFLAGS) -Wl,-Map=strace.mapfile
diff --git a/configure.ac b/configure.ac
index 03e49fe..526fbda 100644
--- a/configure.ac
+++ b/configure.ac
@@ -261,6 +261,63 @@ AC_CHECK_MEMBERS([struct sigcontext.sc_hi2],,,
[#include <signal.h>
# include <asm/sigcontext.h>
#endif])
+
+dnl stack trace with libunwind
+AC_ARG_WITH([libunwind],
+ [AS_HELP_STRING([--with-libunwind],
+ [libunwind is used to display system call
stacktrace])],
+ [case "${withval}" in
+ (yes|no) enable_libunwind=$withval;;
+ (*) enable_libunwind=yes
+ libunwind_CPPFLAGS="${AM_CPPFLAGS} -I${withval}/include"
+ libunwind_LDFLAGS="-L${withval}/lib" ;;
+ esac],
+ [enable_libunwind=maybe])
+
+AS_IF([test "x$enable_libunwind" != xno],
+ [saved_CPPFLAGS="${CPPFLAGS}"
+ CPPFLAGS="${CPPFLAGS} ${libunwind_CPPFLAGS}"
+ AC_CHECK_HEADERS([libunwind-ptrace.h libunwind.h])
+ CPPFLAGS="${saved_CPPFLAGS}" ])
+
+if test "x$ac_cv_header_libunwind_ptrace_h" = "xyes" &&
+ test "x$ac_cv_header_libunwind_h" = "xyes"; then
+
+ dnl code is taken from ltrace
+ case "${host_cpu}" in
+ arm*|sa110) UNWIND_ARCH="arm" ;;
+ i?86) UNWIND_ARCH="x86" ;;
+ powerpc) UNWIND_ARCH="ppc32" ;;
+ powerpc64) UNWIND_ARCH="ppc64" ;;
+ mips*) UNWIND_ARCH="mips" ;;
+ *) UNWIND_ARCH="${host_cpu}" ;;
+ esac
+
+ saved_LDFLAGS="${LDFLAGS}"
+ LDFLAGS="${LDFLAGS} ${libunwind_LDFLAGS}"
+ AC_CHECK_LIB([unwind], [backtrace],
+ [libunwind_LIBS="-lunwind"],
+ [AC_MSG_FAILURE([Unable to find libunwind])])
+ AC_CHECK_LIB([unwind-generic], [_U${UNWIND_ARCH}_create_addr_space],
+ [libunwind_LIBS="-lunwind-generic $libunwind_LIBS"],
+ [AC_MSG_FAILURE([Unable to find libunwind-generic])],
+ [$libunwind_LIBS])
+ AC_CHECK_LIB([unwind-ptrace], [_UPT_create],
+ [libunwind_LIBS="-lunwind-ptrace $libunwind_LIBS"],
+ [AC_MSG_FAILURE([Unable to find libunwind-ptrace])],
+ [$libunwind_LIBS])
+ LDFLAGS="${saved_LDFLAGS}"
+
+ dnl we have all the dependencies we need we can activate stack tracing
+ AC_SUBST(libunwind_LIBS)
+ AC_SUBST(libunwind_LDFLAGS)
+ AC_SUBST(libunwind_CPPFLAGS)
+ AC_DEFINE([LIB_UNWIND], 1, [Compile stack tracing functionality])
+ AC_MSG_NOTICE([Enabled stack tracing])
+fi
+AM_CONDITIONAL([LIB_UNWIND], [test
"x$ac_cv_lib_unwind_ptrace__UPT_create" == "xyes"])
+
+
AC_CHECK_MEMBERS([struct utsname.domainname],,, [#include <sys/utsname.h>])
AC_CHECK_DECLS([sys_errlist])
More information about the Strace-devel
mailing list