gstreamer and valgrind

Krzysztof Borowczyk k.borowczyk at samsung.com
Wed Aug 20 08:06:22 PDT 2014


Hello,

I've composed a sample GStreamer pipeline that leaks, although it doesn't leak as much as in original problem, also it stops leaking before running out of memory.

The command is:

gst-launch-1.0 udpsrc uri="my_ip:5555" ! queue ! decodebin ! videoconvert ! avenc_flv ! flvmux streamable=true ! rtmpsink location="rtmp://rtmp_server:8080/oflaDemo/streamName live=1"

The memory as shown by htop (VIRT/RES/SHR):
1. "No signal" banner: 515M/25212/6308
2. Signal turned on:   517M/26532/6312
3. "No signal" again:  719M/228M/6356
4. Signal turned on:   720M/230M/6356
5. "No signal" again:  913M/424M/6456


On one run I got SIGSEGV on step 3. The backtrace was:
(gdb) back
#0  0x00007f8c248ee03d in poll () at ../sysdeps/unix/syscall-template.S:81
#1  0x00007f8c24e2cfe4 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#2  0x00007f8c24e2d30a in g_main_loop_run ()
   from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#3  0x00007f8c25378a94 in gst_bus_poll (bus=bus at entry=0x2534b70,
    events=events at entry=GST_MESSAGE_ANY, timeout=<optimized out>)
    at gstbus.c:1082
#4  0x00000000004045a8 in event_loop (pipeline=0x2722040,
    blocking=blocking at entry=1, do_progress=do_progress at entry=0,
    target_state=target_state at entry=GST_STATE_PLAYING) at gst-launch.c:509
#5  0x0000000000403767 in main (argc=17, argv=0x7fff093ce3c8)
    at gst-launch.c:1085


I saved the core in case some other details would be helpful (it's 185M).

When run in Valgrind this pipe grows even without switching the signal. I waited until it got to about 1500M(RES), then did the signal switching. This is what Valgrind says:

==14224== 265,263,534 (63,240 direct, 265,200,294 indirect) bytes in 465 blocks are definitely lost in loss record 3,880 of 3,882
==14224==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14224==    by 0x53DA610: g_malloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==14224==    by 0x53F022D: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==14224==    by 0x4E6E36A: gst_buffer_add_meta (gstbuffer.c:1915)
==14224==    by 0x9121760: gst_buffer_add_video_meta_full (gstvideometa.c:231)
==14224==    by 0x91227A8: video_buffer_pool_alloc (gstvideopool.c:202)
==14224==    by 0x4E6F353: do_alloc_buffer.constprop.2 (gstbufferpool.c:272)
==14224==    by 0x4E6F6F5: default_acquire_buffer (gstbufferpool.c:995)
==14224==    by 0x4E70A01: gst_buffer_pool_acquire_buffer (gstbufferpool.c:1099)
==14224==    by 0x7A0D63A: default_prepare_output_buffer (gstbasetransform.c:1577)
==14224==    by 0x7A0F3BA: gst_base_transform_handle_buffer (gstbasetransform.c:2065)
==14224==    by 0x7A0FD00: gst_base_transform_chain (gstbasetransform.c:2201)
==14224==
==14224== 1,392,821,707 (546,744 direct, 1,392,274,963 indirect) bytes in 2,071 blocks are definitely lost in loss record 3,881 of 3,882
==14224==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14224==    by 0x53DA610: g_malloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==14224==    by 0x53F022D: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==14224==    by 0x53F076D: g_slice_alloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==14224==    by 0x912E699: gst_video_encoder_chain (gstvideoencoder.c:1212)
==14224==    by 0x4E97F07: gst_pad_push_data (gstpad.c:3760)
==14224==    by 0x7A0FF08: gst_base_transform_chain (gstbasetransform.c:2237)
==14224==    by 0x4E97F07: gst_pad_push_data (gstpad.c:3760)
==14224==    by 0x4E89F0A: gst_proxy_pad_chain_default (gstghostpad.c:128)
==14224==    by 0x4E97F07: gst_pad_push_data (gstpad.c:3760)
==14224==    by 0x91252BE: gst_video_decoder_clip_and_push_buf (gstvideodecoder.c:2657)
==14224==    by 0x912A447: gst_video_decoder_finish_frame (gstvideodecoder.c:2572)
==14224==
==14224== 1,653,911,262 bytes in 2,658 blocks are indirectly lost in loss record 3,882 of 3,882
==14224==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14224==    by 0x53DA610: g_malloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==14224==    by 0x53F022D: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4000.0)
==14224==    by 0x4E627CC: _sysmem_new_block (gstallocator.c:415)
==14224==    by 0x4E6C471: gst_buffer_new_allocate (gstbuffer.c:668)
==14224==    by 0x912275C: video_buffer_pool_alloc (gstvideopool.c:195)
==14224==    by 0x4E6F353: do_alloc_buffer.constprop.2 (gstbufferpool.c:272)
==14224==    by 0x4E6F6F5: default_acquire_buffer (gstbufferpool.c:995)
==14224==    by 0x4E70A01: gst_buffer_pool_acquire_buffer (gstbufferpool.c:1099)
==14224==    by 0x7A0D63A: default_prepare_output_buffer (gstbasetransform.c:1577)
==14224==    by 0x7A0F3BA: gst_base_transform_handle_buffer (gstbasetransform.c:2065)
==14224==    by 0x7A0FD00: gst_base_transform_chain (gstbasetransform.c:2201)
==14224==
==14224== LEAK SUMMARY:
==14224==    definitely lost: 626,733 bytes in 2,548 blocks
==14224==    indirectly lost: 1,657,475,257 bytes in 9,597 blocks
==14224==      possibly lost: 136,289,663 bytes in 600 blocks
==14224==    still reachable: 995,020 bytes in 7,242 blocks
==14224==         suppressed: 0 bytes in 0 blocks
==14224==
==14224== For counts of detected and suppressed errors, rerun with: -v
==14224== Use --track-origins=yes to see where uninitialised values come from
==14224== ERROR SUMMARY: 314 errors from 270 contexts (suppressed: 0 from 0)

-- 
Best regards,
Krzysztof Borowczyk
	
> -----Original Message-----
> From: gstreamer-devel [mailto:gstreamer-devel-
> bounces at lists.freedesktop.org] On Behalf Of Krzysztof Borowczyk
> Sent: Wednesday, August 20, 2014 3:52 PM
> To: 'Discussion of the development of and with GStreamer'
> Subject: RE: gstreamer and valgrind
> 
> [...]
> 
> > >
> > > GStreamer now works differently
> >
> > Note that the message says that it *might* now take different code
> > paths
> > to ease debugging. As far as I know, it doesn't actually do that in
> > practice, besides printing that info text.
> >
> > >  and I get leaks quite rarely.
> >
> > Are you sure about that? Perhaps it just leaks slower because it runs
> > slower?
> 
> Yes it runs and leaks much slower, but it has been a bit more difficult
> to trigger the leak. The way to trigger it is quite strange (explained
> below).
> 
> The setup is:
> 
> 1. First computer: ffmpeg streaming mpegts to udp://secondComputer:5555
> - ffmpeg grabs input of avermedia grabbing card.
> 2. On the second one the (simplified) pipeline is:
> udpsrc -> queue -> decodebin -> [...] -> avenc_flv -> flvmux ->
> rtmpsink
> 
> I've run similar pipelines with different sources (left of [...])
> without noticing any serious leakage. (shmsink, decklinksrc, filesrc).
> 
> To trigger the leak:
> 1. Start the pipeline with the stream content being video of static
> image (No signal panel from avermedia card on the other computer)
> 2. Start video input on the avermedia, so it's no longer static image.
> 3. After some time turn off the signal, video goes back to static
> image.
> 4. Huge leaking starts now.
> 
> It's a way that triggers the leak 100% of the time. If I stop at point
> 1 or 2 there seems to be no significant leak during 10min test period -
> leaking starts immediately after switching the signal off.
> 
> I suppose this switching of signal on the first computer should have no
> influence on GStreamer, ffmpeg is streaming all the time, just
> different content - do you have any idea why this might happen? I'm
> using GStreamer 1.2.4, were there any significant leak fixes in the
> meantime?
> 
> I will try to prepare a test case with clean GStreamer, without our
> application. In the meantime this is the bottom of Valgrind log without
> G_SLICE=always-malloc, below that one is another one, with G_SLICE set.
> Application was stopped with ctrl-c, unfortunately there is no easy way
> to terminate it normally.
> 
> ==8282== 174,974,310 bytes in 90 blocks are possibly lost in loss
> record 9,438 of 9,440
> ==8282==    at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==8282==    by 0x4E85610: g_malloc (in /lib/x86_64-linux-gnu/libglib-
> 2.0.so.0.4000.0)
> ==8282==    by 0x4E9B22D: g_slice_alloc (in /lib/x86_64-linux-
> gnu/libglib-2.0.so.0.4000.0)
> ==8282==    by 0x63B87CC: _sysmem_new_block (gstallocator.c:415)
> ==8282==    by 0x63C2471: gst_buffer_new_allocate (gstbuffer.c:668)
> ==8282==    by 0x289F275C: video_buffer_pool_alloc (gstvideopool.c:195)
> ==8282==    by 0x63C5353: do_alloc_buffer.constprop.2
> (gstbufferpool.c:272)
> ==8282==    by 0x63C56F5: default_acquire_buffer (gstbufferpool.c:995)
> ==8282==    by 0x63C6A01: gst_buffer_pool_acquire_buffer
> (gstbufferpool.c:1099)
> ==8282==    by 0xB8C663A: default_prepare_output_buffer
> (gstbasetransform.c:1577)
> ==8282==    by 0xB8C83BA: gst_base_transform_handle_buffer
> (gstbasetransform.c:2065)
> ==8282==    by 0xB8C8D00: gst_base_transform_chain
> (gstbasetransform.c:2201)
> ==8282==
> ==8282== 221,634,126 bytes in 114 blocks are indirectly lost in loss
> record 9,439 of 9,440
> ==8282==    at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==8282==    by 0x4E85610: g_malloc (in /lib/x86_64-linux-gnu/libglib-
> 2.0.so.0.4000.0)
> ==8282==    by 0x4E9B22D: g_slice_alloc (in /lib/x86_64-linux-
> gnu/libglib-2.0.so.0.4000.0)
> ==8282==    by 0x63B87CC: _sysmem_new_block (gstallocator.c:415)
> ==8282==    by 0x63C2471: gst_buffer_new_allocate (gstbuffer.c:668)
> ==8282==    by 0x289F275C: video_buffer_pool_alloc (gstvideopool.c:195)
> ==8282==    by 0x63C5353: do_alloc_buffer.constprop.2
> (gstbufferpool.c:272)
> ==8282==    by 0x63C56F5: default_acquire_buffer (gstbufferpool.c:995)
> ==8282==    by 0x63C6A01: gst_buffer_pool_acquire_buffer
> (gstbufferpool.c:1099)
> ==8282==    by 0xB8C663A: default_prepare_output_buffer
> (gstbasetransform.c:1577)
> ==8282==    by 0xB8C83BA: gst_base_transform_handle_buffer
> (gstbasetransform.c:2065)
> ==8282==    by 0xB8C8D00: gst_base_transform_chain
> (gstbasetransform.c:2201)
> ==8282==
> ==8282== 743,315,903 bytes in 377 blocks are still reachable in loss
> record 9,440 of 9,440
> ==8282==    at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==8282==    by 0x4E85610: g_malloc (in /lib/x86_64-linux-gnu/libglib-
> 2.0.so.0.4000.0)
> ==8282==    by 0x4E9B22D: g_slice_alloc (in /lib/x86_64-linux-
> gnu/libglib-2.0.so.0.4000.0)
> ==8282==    by 0x63B87CC: _sysmem_new_block (gstallocator.c:415)
> ==8282==    by 0x63C2471: gst_buffer_new_allocate (gstbuffer.c:668)
> ==8282==    by 0x289F275C: video_buffer_pool_alloc (gstvideopool.c:195)
> ==8282==    by 0x63C5353: do_alloc_buffer.constprop.2
> (gstbufferpool.c:272)
> ==8282==    by 0x63C56F5: default_acquire_buffer (gstbufferpool.c:995)
> ==8282==    by 0x63C6A01: gst_buffer_pool_acquire_buffer
> (gstbufferpool.c:1099)
> ==8282==    by 0xB8C663A: default_prepare_output_buffer
> (gstbasetransform.c:1577)
> ==8282==    by 0xB8C83BA: gst_base_transform_handle_buffer
> (gstbasetransform.c:2065)
> ==8282==    by 0xB8C8D00: gst_base_transform_chain
> (gstbasetransform.c:2201)
> ==8282==
> ==8282== LEAK SUMMARY:
> ==8282==    definitely lost: 77,952 bytes in 274 blocks
> ==8282==    indirectly lost: 223,170,538 bytes in 879 blocks
> ==8282==      possibly lost: 175,129,187 bytes in 2,281 blocks
> ==8282==    still reachable: 772,523,997 bytes in 102,118 blocks
> ==8282==         suppressed: 0 bytes in 0 blocks
> ==8282==
> ==8282== For counts of detected and suppressed errors, rerun with: -v
> ==8282== Use --track-origins=yes to see where uninitialised values come
> from
> ==8282== ERROR SUMMARY: 915 errors from 871 contexts (suppressed: 0
> from 0)
> (END)
> 
> 
> Here a different run with G_SLICE:
> ==13331== 190,527,582 bytes in 98 blocks are possibly lost in loss
> record 9,466 of 9,468
> ==13331==    at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==13331==    by 0x4E85610: g_malloc (in /lib/x86_64-linux-gnu/libglib-
> 2.0.so.0.4000.0)
> ==13331==    by 0x4E9B22D: g_slice_alloc (in /lib/x86_64-linux-
> gnu/libglib-2.0.so.0.4000.0)
> ==13331==    by 0x63B87CC: _sysmem_new_block (gstallocator.c:415)
> ==13331==    by 0x63C2471: gst_buffer_new_allocate (gstbuffer.c:668)
> ==13331==    by 0x287DD75C: video_buffer_pool_alloc
> (gstvideopool.c:195)
> ==13331==    by 0x63C5353: do_alloc_buffer.constprop.2
> (gstbufferpool.c:272)
> ==13331==    by 0x63C56F5: default_acquire_buffer (gstbufferpool.c:995)
> ==13331==    by 0x63C6A01: gst_buffer_pool_acquire_buffer
> (gstbufferpool.c:1099)
> ==13331==    by 0xB8C663A: default_prepare_output_buffer
> (gstbasetransform.c:1577)
> ==13331==    by 0xB8C83BA: gst_base_transform_handle_buffer
> (gstbasetransform.c:2065)
> ==13331==    by 0xB8C8D00: gst_base_transform_chain
> (gstbasetransform.c:2201)
> ==13331==
> ==13331== 217,745,808 bytes in 112 blocks are indirectly lost in loss
> record 9,467 of 9,468
> ==13331==    at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==13331==    by 0x4E85610: g_malloc (in /lib/x86_64-linux-gnu/libglib-
> 2.0.so.0.4000.0)
> ==13331==    by 0x4E9B22D: g_slice_alloc (in /lib/x86_64-linux-
> gnu/libglib-2.0.so.0.4000.0)
> ==13331==    by 0x63B87CC: _sysmem_new_block (gstallocator.c:415)
> ==13331==    by 0x63C2471: gst_buffer_new_allocate (gstbuffer.c:668)
> ==13331==    by 0x287DD75C: video_buffer_pool_alloc
> (gstvideopool.c:195)
> ==13331==    by 0x63C5353: do_alloc_buffer.constprop.2
> (gstbufferpool.c:272)
> ==13331==    by 0x63C56F5: default_acquire_buffer (gstbufferpool.c:995)
> ==13331==    by 0x63C6A01: gst_buffer_pool_acquire_buffer
> (gstbufferpool.c:1099)
> ==13331==    by 0xB8C663A: default_prepare_output_buffer
> (gstbasetransform.c:1577)
> ==13331==    by 0xB8C83BA: gst_base_transform_handle_buffer
> (gstbasetransform.c:2065)
> ==13331==    by 0xB8C8D00: gst_base_transform_chain
> (gstbasetransform.c:2201)
> ==13331==
> ==13331== 799,696,514 bytes in 406 blocks are still reachable in loss
> record 9,468 of 9,468
> ==13331==    at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==13331==    by 0x4E85610: g_malloc (in /lib/x86_64-linux-gnu/libglib-
> 2.0.so.0.4000.0)
> ==13331==    by 0x4E9B22D: g_slice_alloc (in /lib/x86_64-linux-
> gnu/libglib-2.0.so.0.4000.0)
> ==13331==    by 0x63B87CC: _sysmem_new_block (gstallocator.c:415)
> ==13331==    by 0x63C2471: gst_buffer_new_allocate (gstbuffer.c:668)
> ==13331==    by 0x287DD75C: video_buffer_pool_alloc
> (gstvideopool.c:195)
> ==13331==    by 0x63C5353: do_alloc_buffer.constprop.2
> (gstbufferpool.c:272)
> ==13331==    by 0x63C56F5: default_acquire_buffer (gstbufferpool.c:995)
> ==13331==    by 0x63C6A01: gst_buffer_pool_acquire_buffer
> (gstbufferpool.c:1099)
> ==13331==    by 0xB8C663A: default_prepare_output_buffer
> (gstbasetransform.c:1577)
> ==13331==    by 0xB8C83BA: gst_base_transform_handle_buffer
> (gstbasetransform.c:2065)
> ==13331==    by 0xB8C8D00: gst_base_transform_chain
> (gstbasetransform.c:2201)
> ==13331==
> ==13331== LEAK SUMMARY:
> ==13331==    definitely lost: 78,872 bytes in 277 blocks
> ==13331==    indirectly lost: 221,424,134 bytes in 906 blocks
> ==13331==      possibly lost: 190,732,025 bytes in 2,769 blocks
> ==13331==    still reachable: 841,250,822 bytes in 102,333 blocks
> ==13331==         suppressed: 0 bytes in 0 blocks
> ==13331==
> ==13331== For counts of detected and suppressed errors, rerun with: -v
> ==13331== Use --track-origins=yes to see where uninitialised values
> come from
> ==13331== ERROR SUMMARY: 1098 errors from 874 contexts (suppressed: 0
> from 0)
> 
> 
> --
> Best regards,
> Krzysztof Borowczyk
> 
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



More information about the gstreamer-devel mailing list