2004-10-19 04:32
by Vasil Kolevffserver, 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.
Понеже ми писна, си направих няколко филийки, закусих, и мисля да спя до следобеда.