On 05/04/2024 23:08, Ilya Maximets wrote:
> Currently, calls like ovs_assert() just print out a condition that
> caused assertion to fail.  But it may be not enough to understand what
> exactly has happened, especially if assertion failed in some generic
> function like dp_packet_resize() or similar.
> 
> Print the stack trace along with the abort message to give more context
> for the later debugging.
> 
> This should be especially useful in case the issue happens in an
> environment with core dumps disabled.
> 
> Adding the log to vlog_abort() to cover a little more cases where
> VLOG_ABORT is called and not only assertion failures.
> 
> It would be nice to also have stack traces in case of reaching the
> OVS_NOT_REACHED().  But this macro is used in some places as a last
> resort and should not actually do more than just stopping the process
> immediately.  And it also can be used in contexts without logging
> initialized.  Such a change will need to be done more carefully.
> Better solution might be to use VLOG_ABORT() where appropriate instead.
> 
Thanks Ilya. Tried it and it's working. One comment below.

> Signed-off-by: Ilya Maximets <i.maxim...@ovn.org>
> ---
>  lib/vlog.c       | 10 ++++++++--
>  tests/library.at |  4 +++-
>  2 files changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/vlog.c b/lib/vlog.c
> index b2653142f..e78c785f7 100644
> --- a/lib/vlog.c
> +++ b/lib/vlog.c
> @@ -29,6 +29,7 @@
>  #include <time.h>
>  #include <unistd.h>
>  #include "async-append.h"
> +#include "backtrace.h"
>  #include "coverage.h"
>  #include "dirs.h"
>  #include "openvswitch/dynamic-string.h"
> @@ -1274,8 +1275,9 @@ vlog_fatal(const struct vlog_module *module, const char 
> *message, ...)
>      va_end(args);
>  }
>  
> -/* Logs 'message' to 'module' at maximum verbosity, then calls abort().  
> Always
> - * writes the message to stderr, even if the console destination is disabled.
> +/* Attempts to log a stack trace, logs 'message' to 'module' at maximum
> + * verbosity, then calls abort().  Always writes the message to stderr, even
> + * if the console destination is disabled.
>   *
>   * Choose this function instead of vlog_fatal_valist() if the daemon 
> monitoring
>   * facility should automatically restart the current daemon.  */
> @@ -1289,6 +1291,10 @@ vlog_abort_valist(const struct vlog_module *module_,
>       * message written by the later ovs_abort_valist(). */
>      module->levels[VLF_CONSOLE] = VLL_OFF;
>  
> +    /* Printing the stack trace before the 'message', because the 'message'
> +     * will flush the async log queue (VLL_EMER).  With a different order we
> +     * would need to flush the queue manually again. */
> +    log_backtrace();
>      vlog_valist(module, VLL_EMER, message, args);
>      ovs_abort_valist(0, message, args);
>  }

Is it worth adding to vlog_fatal_valist() as well for VLOG_FATAL()?

If there's some reason not to, then LGTM as is.

Acked-by: Kevin Traynor <ktray...@redhat.com>

> diff --git a/tests/library.at b/tests/library.at
> index 7b4acebb8..d962e1b3f 100644
> --- a/tests/library.at
> +++ b/tests/library.at
> @@ -230,7 +230,9 @@ AT_CHECK([ovstest test-util -voff -vfile:info 
> '-vPATTERN:file:%c|%p|%m' --log-fi
>    [$exit_status], [], [stderr])
>  
>  AT_CHECK([sed 's/\(opened log file\) .*/\1/
> -s/|[[^|]]*: /|/' test-util.log], [0], [dnl
> +s/|[[^|]]*: /|/
> +/backtrace/d
> +/|.*|/!d' test-util.log], [0], [dnl
>  vlog|INFO|opened log file
>  util|EMER|assertion false failed in test_assert()
>  ])

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to