2004-10-19 04:32

by Vasil Kolev

ffserver, et tu mama tambien!

Деня не беше нещо особено, очилата са ми на ремонт, минах през проекта да проверя едно-две неща, след което имахме среща за openfest, и за тест на камерата. За последното се оказа, че нямаме кабел, днес ще търся по магазините.

След това се прибрах, с едно количество лазаня под мишница, хапнах, и седнах да ровя проблем във ffserver-а, даваше segmentation fault от време на време.

Какво ли не пробвах, gdb, valgring, strace, четох source на 0.4.8, 0.4.7, cvs snapshot-а от страницата им и последния cvs… Е стигнах до един извод – НЯКЪДЕ намазва .ffm файла, в който държи текущия поток, при разни мрежови проблеми, и като стигнат дотам клиентите, гърми със sigsegv. Нощта ми мина в гледане на неща от типа:

193.110.159.41 - - [Tue Oct 19 01:10:15 2004] "GET /test2.avi HTTP/1.0" 200 5309590
193.110.159.41 - - [Tue Oct 19 01:12:06 2004] "GET /test1.avi HTTP/1.0" 200 10399138
Segmentation fault (core dumped)
marla:/home/vasil$ gdb --core=core ffmpeg-0.4.8/ffserver
....
#0  0x400c31b7 in memcpy () from /lib/libc.so.6
(gdb) bt
#0  0x400c31b7 in memcpy () from /lib/libc.so.6
#1  0x08062db1 in ffm_read_data (s=0x8288260, buf=0x82cbcc3 "....", size=6421, 
    first=0) at ffm.c:354
#2  0x080632fe in ffm_read_packet (s=0x8288260, pkt=0xbfffbc88) at ffm.c:511
#3  0x0805da4c in av_read_packet (s=0x8288260, pkt=0xbfffbc88) at utils.c:424
#4  0x08054998 in http_prepare_data (c=0x8295270) at ffserver.c:2116
#5  0x0805501a in http_send_data (c=0x8295270) at ffserver.c:2384
#6  0x08051f60 in handle_connection (c=0x8295270) at ffserver.c:879
#7  0x0805191d in http_server () at ffserver.c:625
#8  0x0805b0f2 in main (argc=3, argv=0xbffffd94) at ffserver.c:4654
(gdb) frame 4
#4  0x08054998 in http_prepare_data (c=0x8295270) at ffserver.c:2116
2116        return av_read_packet(s, pkt);
(gdb) print c->state
$1 = HTTPSTATE_SEND_DATA
(gdb) print  c->stream->feed
$2 = (struct FFStream *) 0x827fed0
....
(gdb) print ffm->file_size  
$37 = 117878784
(gdb) print size
$38 = 6421
(gdb) print len 
$39 = -24191
(gdb) print fill_size
$40 = 28273
(gdb) print frame_offset
$41 = -24191
(gdb) q

Особено странни са моментите как от функция, която в общи линии прави прочита 2 байта и прави от тях едно двубайтово число, мога да получа нещо, което е над 65536 – и Valgrind не хвана никакви overflows.

Понеже ми писна, си направих няколко филийки, закусих, и мисля да спя до следобеда.

Leave a Reply