[vlc-devel] [PATCH] libvlc: dump object types abd names when leaking

Steve Lhomme robux4 at ycbcr.xyz
Thu Feb 21 11:44:44 CET 2019


On 21/02/2019 11:37, Rémi Denis-Courmont wrote:
> Hi,
>
> My GDB skills are bad so I just walked the objects tree by printing 
> memory content on the abort. It would be much easier with VLC-specific 
> GDB macros, but the point is that you can debug that assertion just as 
> any.
>
> It also works after the fact for pseudorandom failures, if you enable 
> core dumps. Much better than this patch since you have access to all 
> memory, not just the objects tree.
>
> Adding special snow flake debug code for assertion is a bad idea that 
> sets a very bad precedent - as opposed to improving integration with 
> proper debugging tools.

What's snow flake about adding debug tooling ?

>
> Le 21 février 2019 12:26:47 GMT+02:00, Thomas Guillem <thomas at gllm.fr> 
> a écrit :
>
>
>     On Thu, Feb 21, 2019, at 11:18, Rémi Denis-Courmont wrote:
>>     Hi,
>>
>>     Well I did debug that assertion failure using (ASan +) gdb just
>>     fine last time. The code has not changed. So this kludge is
>>     definitely not necessary for its alleged purpose.
>
>     Even if it works with gdb (please tell us how), evelopers don't
>     always run VLC with gdb. This cause an issue if the leak is not
>     reproducible...
>
>>
>>     Not only that but stderr is not universally the output for debug
>>     nor is it universally where assertion failures are dumped to,
>     So if there is no stderr, you don't see the error. I don't see the
>     problem at all.
>>     so this patch does not even work properly
>     Works on Windows, Android, Linux, macOS when VLC is run via
>     command line. This is the case for most developers usecase.
>
>>
>>     And in most cases you can see the leak by stopping all inputs and
>>     dumping the objects tree before quitting, anyway.
>
>     What about leaks not related to playback ? Interface, service
>     discovery, playlist that are only cleaned when vlc is closed.
>
>>
>>     Le 21 février 2019 11:24:57 GMT+02:00, Thomas Guillem
>>     <thomas at gllm.fr> a écrit :
>>
>>         Comment:
>>         A lot of developers asked me to propose this patch again. It
>>         was previously
>>         refused because developers could use proper debugging tools.
>>         I disagree with
>>         that assumption. Even with Asan, when the leak assert fail,
>>         it will abort()
>>         without prompting any leaks, so you'll have to edit libvlc.c
>>         to remove this
>>         assert. If your leak was not reproducible, you'll lose a
>>         precious information.
>>         And good luck finding the leak with GDB, you really need to
>>         know the internal
>>         of vlc_object_t to iterate through the different list to get
>>         the culprit.
>>         Commit log:
>>         In case of a vlc_object_t leak, and if asserts are enabled,
>>         the error output
>>         will be like the following (when leaking intentionally
>>         decoder_t objects):
>>         === vlc_object LEAKS detected ===
>>         \ playlist
>>         | \ input
>>         | | \ decoder avcodec
>>         | | | decoder faad
>>         | | | decoder stl
>>         ------------------------------------------------------------------------
>>         src/libvlc.c | 30 ++++++++++++++++++++++++++++++
>>         1 file changed, 30 insertions(+)
>>         diff --git a/src/libvlc.c b/src/libvlc.c
>>         index 8e8d2ca8b2..d9ff96de84 100644
>>         --- a/src/libvlc.c
>>         +++ b/src/libvlc.c
>>         @@ -436,6 +436,24 @@ void libvlc_InternalCleanup(
>>         libvlc_int_t *p_libvlc )
>>         #endif
>>         }
>>         +#ifndef NDEBUG
>>         +static void DumpObjectLeaks(vlc_object_internals_t *priv,
>>         unsigned level)
>>         +{
>>         + bool first = true;
>>         + vlc_list_foreach(priv, &priv->children, siblings)
>>         + {
>>         + vlc_object_t *obj = vlc_externals(priv);
>>         + for (unsigned i = 0; i < level; i++)
>>         + fprintf(stderr, " %s ", first && i == level -1 ? "\\" : "|");
>>         + char *name = vlc_object_get_name(obj);
>>         + fprintf(stderr, "%s %s\n", vlc_object_typename(obj), name ?
>>         name : "");
>>         + free(name);
>>         + DumpObjectLeaks(priv, level + 1);
>>         + first = false;
>>         + }
>>         +}
>>         +#endif
>>         +
>>         /**
>>         * Destroy everything.
>>         * This function requests the running threads to finish, waits
>>         for their
>>         @@ -449,6 +467,18 @@ void libvlc_InternalDestroy(
>>         libvlc_int_t *p_libvlc )
>>         vlc_ExitDestroy( &priv->exit );
>>         +#ifndef NDEBUG
>>         + {
>>         + vlc_object_internals_t *internal = vlc_internals(p_libvlc);
>>         + if (atomic_load(&internal->refs) != 1)
>>         + {
>>         + vlc_mutex_lock(&internal->tree_lock);
>>         + fprintf(stderr, "=== vlc_object LEAKS detected ===\n");
>>         + DumpObjectLeaks(internal, 1);
>>         + vlc_mutex_unlock(&internal->tree_lock);
>>         + }
>>         + }
>>         +#endif
>>         assert( atomic_load(&(vlc_internals(p_libvlc)->refs)) == 1 );
>>         vlc_object_release( p_libvlc );
>>         }
>>
>>
>>     -- 
>>     Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez
>>     excuser ma brièveté.
>>     _______________________________________________
>>     vlc-devel mailing list
>>     To unsubscribe or modify your subscription options:
>>     https://mailman.videolan.org/listinfo/vlc-devel
>
>
> -- 
> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez 
> excuser ma brièveté.
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel



More information about the vlc-devel mailing list