On Tue, Feb 24, 2015 at 6:21 PM, wm4 <[email protected]> wrote: > On Tue, 24 Feb 2015 15:33:53 +0000 > Vittorio Giovara <[email protected]> wrote: > >> Enabled only in debug mode and only when run under Valgrind. >> >> Signed-off-by: Vittorio Giovara <[email protected]> >> --- >> This is a neat trick I found reading >> https://blog.mozilla.org/nnethercote/2011/01/11/using-valgrind-to-get-stack-traces/ >> >> It should help in identifying where an error occurred if it is logged. >> >> I was looking for such a thing for some time, and other solutions like >> debugbreak https://github.com/scottt/debugbreak are simply too fragile. >> >> The function is a static import so there are no additional libraries or >> dependencies. Additionally it only appears on valgrind runs so it doesn't >> pollute normal log and it is possible to turn it off if desired. >> >> I am not sure if I should keep everything under a single CONFIG_ or if it's >> better to have the header check serpatedly (like in the proposed patch). >> >> Vittorio >> >> configure | 10 ++++++++++ >> libavutil/log.c | 7 +++++++ >> 2 files changed, 17 insertions(+) >> >> diff --git a/configure b/configure >> index c1d673c..4e8fd6e 100755 >> --- a/configure >> +++ b/configure >> @@ -315,6 +315,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-backtrace-printf when debug is enabled, do not print a backtrace >> + under Valgrind when an error is logged >> >> NOTE: Object files are built at the place where configure is launched. >> EOF >> @@ -1242,6 +1244,7 @@ SUBSYSTEM_LIST=" >> " >> >> CONFIG_LIST=" >> + backtrace_printf >> $COMPONENT_LIST >> $EXAMPLE_LIST >> $EXTERNAL_LIBRARY_LIST >> @@ -1408,6 +1411,7 @@ HEADERS_LIST=" >> sys_un_h >> sys_videoio_h >> unistd_h >> + valgrind_valgrind_h >> windows_h >> winsock2_h >> " >> @@ -3771,6 +3775,9 @@ enabled version3 && { enabled gpl && enable gplv3 || >> enable lgplv3; } >> >> disabled optimizations || check_cflags -fomit-frame-pointer >> >> +enabled debug && { disabled backtrace_printf || >> + { check_header valgrind/valgrind.h && enable backtrace_printf; } } >> + >> enable_weak_pic() { >> disabled pic && return >> enable pic >> @@ -4629,6 +4636,9 @@ if enabled ppc; then >> echo "dcbzl available ${dcbzl-no}" >> fi >> echo "debug symbols ${debug-no}" >> +if enabled debug; then >> + echo "Valgrind backtrace ${backtrace_printf-no}" >> +fi >> echo "optimize for size ${small-no}" >> echo "optimizations ${optimizations-no}" >> echo "static ${static-no}" >> diff --git a/libavutil/log.c b/libavutil/log.c >> index d38e40b..3d1d1ef 100644 >> --- a/libavutil/log.c >> +++ b/libavutil/log.c >> @@ -40,6 +40,10 @@ >> #include "internal.h" >> #include "log.h" >> >> +#if HAVE_VALGRIND_VALGRIND_H >> +#include <valgrind/valgrind.h> >> +#endif >> + >> static int av_log_level = AV_LOG_INFO; >> static int flags; >> >> @@ -161,6 +165,9 @@ void av_log_default_callback(void *avcl, int level, >> const char *fmt, va_list vl) >> } >> colored_fputs(av_clip(level >> 3, 0, 6), tint >> 8, line); >> av_strlcpy(prev, line, sizeof line); >> + >> + if (CONFIG_BACKTRACE_PRINTF && level <= AV_LOG_ERROR) >> + VALGRIND_PRINTF_BACKTRACE(""); > > This does not work. How is VALGRIND_PRINTF_BACKTRACE supposed to exist > if valgrind.h is not included?
Hmm, I should probably simplify and use a single #if, resending shortly. -- Vittorio _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
