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

Reply via email to