log: Print a full backtrace along with error messages under Valgrind
authorVittorio Giovara <vittorio.giovara@gmail.com>
Mon, 20 Apr 2015 13:44:32 +0000 (14:44 +0100)
committerVittorio Giovara <vittorio.giovara@gmail.com>
Mon, 20 Apr 2015 18:20:57 +0000 (19:20 +0100)
Useful to understand where and in what execution state a certain message
is generated. It is enabled only when optimizations are disabled, since
function names are not printed otherwise.

Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
configure
libavutil/log.c
libavutil/version.h

index 3493ea8..e2d9642 100755 (executable)
--- a/configure
+++ b/configure
@@ -317,6 +317,8 @@ Developer options (useful when working on Libav itself):
                            (group) and PROB the probability associated with
                            NAME (default 0.5).
   --random-seed=VALUE      seed value for --enable/disable-random
+  --disable-valgrind-backtrace do not print a backtrace under Valgrind
+                           (only applies to --disable-optimizations builds)
 
 NOTE: Object files are built at the place where configure is launched.
 EOF
@@ -1261,6 +1263,7 @@ CONFIG_LIST="
     pod2man
     texi2html
     thumb
+    valgrind_backtrace
     xmm_clobber_test
 "
 
@@ -1412,6 +1415,7 @@ HEADERS_LIST="
     sys_un_h
     sys_videoio_h
     unistd_h
+    valgrind_valgrind_h
     windows_h
     winsock2_h
 "
@@ -1743,6 +1747,7 @@ simd_align_16_if_any="altivec neon sse"
 log2_deps="!libc_msvcrt"
 
 symver_if_any="symver_asm_label symver_gnu_asm"
+valgrind_backtrace_deps="!optimizations valgrind_valgrind_h"
 
 # threading support
 atomics_gcc_if="sync_val_compare_and_swap"
@@ -2282,6 +2287,7 @@ enable optimizations
 enable safe_bitstream_reader
 enable static
 enable swscale_alpha
+enable valgrind_backtrace
 
 # By default, enable only those hwaccels that have no external dependencies.
 enable dxva2 vda vdpau
@@ -4164,6 +4170,7 @@ check_header sys/select.h
 check_header sys/time.h
 check_header sys/un.h
 check_header unistd.h
+check_header valgrind/valgrind.h
 check_header vdpau/vdpau.h
 check_header vdpau/vdpau_x11.h
 check_header VideoDecodeAcceleration/VDADecoder.h
index 7f2cb08..37427ef 100644 (file)
 #include "internal.h"
 #include "log.h"
 
+#if HAVE_VALGRIND_VALGRIND_H
+#include <valgrind/valgrind.h>
+/* this is the log level at which valgrind will output a full backtrace */
+#define BACKTRACE_LOGLEVEL AV_LOG_ERROR
+#endif
+
 static int av_log_level = AV_LOG_INFO;
 static int flags;
 
@@ -164,6 +170,11 @@ void av_log_default_callback(void *avcl, int level, const char *fmt, va_list vl)
     }
     colored_fputs(av_clip(level >> 3, 0, NB_LEVELS - 1), tint >> 8, line);
     av_strlcpy(prev, line, sizeof line);
+
+#if CONFIG_VALGRIND_BACKTRACE
+    if (level <= BACKTRACE_LOGLEVEL)
+        VALGRIND_PRINTF_BACKTRACE("");
+#endif
 }
 
 static void (*av_log_callback)(void*, int, const char*, va_list) =
index eb2574a..9c45e0e 100644 (file)
@@ -55,7 +55,7 @@
 
 #define LIBAVUTIL_VERSION_MAJOR 54
 #define LIBAVUTIL_VERSION_MINOR 12
-#define LIBAVUTIL_VERSION_MICRO  0
+#define LIBAVUTIL_VERSION_MICRO  1
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
                                                LIBAVUTIL_VERSION_MINOR, \