歡迎您光臨本站 註冊首頁

用gdb調試崩潰了的mplayer

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  

筆者酷愛在Debian5.02下用mplayer看電影,平時都好好的,突然有一天,命令行下出現如下提示:

MPlayer interrupted by signal 11 in module: filter_video
- MPlayer crashed by bad usage of CPU/FPU/RAM.
  Recompile MPlayer with --enable-debug and make a 'gdb' backtrace and
  disassembly. Details in DOCS/HTML/en/bugreports_what.html#bugreports_crash.
- MPlayer crashed. This shouldn't happen.
  It can be a bug in the MPlayer code _or_ in your drivers _or_ in your
  gcc version. If you think it's MPlayer's fault, please read
  DOCS/HTML/en/bugreports.html and follow the instructions there. We can't and
  won't help unless you provide this information when reporting a possible bug.
 [ This binary of MPlayer in Debian is currently compiled with
   '--enable-debug'; the debugging symbols are in the package
   'mplayer-dbg'.]

Oh My God!(當時是說粗口,這裡用這句代替一下,畢竟要和諧)

0) 第一階段探索,使用Debian提供的二進位包機制


$ sudo apt-get install mplayer-dbg
$ pwd
/home/c-aries/source/debian
$ apt-get source mplayer
$ cd mplayer-1.0~rc2/
$ gdb mplayer

... #使用gdb調試

(gdb) run -vo fbdev ~/video/擁抱春天.flv

... #因為我沒開X,所以調試是在終端下的jfbterm工作,視頻必需顯示在framebuffer上,所以為 -vo fbdev

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb5c136d0 (LWP 18529)]
read_font_desc_ft (fname=0x8ae0800 "/usr/share/fonts/truetype/unifont/unifont.ttf", movie_width=320, movie_height=33124) at font_load_ft.c:797
797    font_load_ft.c: No such file or directory.
    in font_load_ft.c
(gdb) list
792    in font_load_ft.c
(gdb)

此時提示在read_font_desc_ft()里出現Segmentation fault
說明mplayer出錯和font(字體)有關

1) 第二階段探索,使用Debian提供的源碼包機制

$ sudo apt-get remove mplayer
$ pwd
/home/c-aries/source/debian/mplayer-1.0~rc2
$ sudo apt-get build-dep mplayer
$ ./configure --prefix=/usr --enable-debug --codecsdir=/usr/lib/codecs/ --enable-fbdev --disable-dvdnav --disable-dvdread --disable-dvdread-internal --enable-mencoder && make
... #我的GNU小本沒有光碟機,所以--disable-dvd*,其間報錯,mencoder無法正常生成
$ gdb ./mplayer
... #學 0) 中的調試方法,發現視頻可正常播放,我還想用gdb調試一下mplayer看哪裡出錯了啊 : (

2) 第三階段探索,使用自己下載的包

由於 1) 中的mencoder編譯失敗,不爽,所以親手下載官網的包,重新編譯

$ pwd
/home/c-aries/source/mplayer
$ cat url
http://www.mplayerhq.hu/MPlayer/releases/MPlayer-1.0rc1.tar.bz2
http://www.mplayerhq.hu/MPlayer/releases/MPlayer-1.0rc2.tar.bz2
http://www.mplayerhq.hu/MPlayer/releases/codecs/essential-20071007.tar.bz2
http://www.mplayerhq.hu/MPlayer/releases/codecs/all-20071007.tar.bz2
http://www.mplayerhq.hu/MPlayer/releases/fonts/font-arial-iso-8859-7.tar.bz2
http://www.mplayerhq.hu/MPlayer/skins/Blue-1.7.tar.bz2
http://www.mplayerhq.hu/MPlayer/patches/asmrules_fix_20061231.diff
http://www.mplayerhq.hu/MPlayer/patches/cddb_fix_20070605.diff
http://www.linuxfromscratch.org/patches/blfs/6.3/MPlayer-1.0rc1-ext_ffmpeg-1.patch
$ wget -c -i url
... #根據url中的文件列表下載文件,省略
$ pwd
/home/c-aries/source/mplayer/MPlayer-1.0rc2
$ ./configure --prefix=/usr --enable-debug --codecsdir=/usr/lib/codecs/ --enable-fbdev --disable-dvdnav --disable-dvdread --disable-dvdread-internal --enable-mencoder && make

結果mplayer和mencoder編譯成功,視頻播放正常

3) 第四階段探索,為什麼Debian官方包的mplayer不能正常使用?

無意中發現自己以前的筆記中,configure配置時有個 --confdir 參數

$ pwd
/home/c-aries/source/mplayer/MPlayer-1.0rc2
$ ./configure --prefix=/usr --enable-debug --codecsdir=/usr/lib/codecs/ --enable-fbdev --disable-dvdnav --disable-dvdread --disable-dvdread-internal --enable-mencoder --confdir=/etc/mplayer && make
$ gdb ./mplayer
(gdb) run -vo fbdev ~/video/擁抱春天.flv
... #省略
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb6a808f0 (LWP 31599)]
read_font_desc_ft (
    fname=0xa454100 "/usr/share/fonts/truetype/unifont/unifont.ttf",
    movie_width=320, movie_height=33124) at font_load_ft.c:797
797            charset[i] = charcode;
(gdb) list
792    #ifdef HAVE_FREETYPE21
793        i = 0;
794        charcode = FT_Get_First_Char( face, &gindex );
795        while (gindex != 0) {
796        if (charcode < 65536 && charcode >= 33) { // sanity check
797            charset[i] = charcode;
798            charcodes[i] = 0;
799            i++;
800        }
801        charcode = FT_Get_Next_Char( face, charcode, &gindex );
(gdb) backtrace
#0  read_font_desc_ft (
    fname=0xa454100 "/usr/share/fonts/truetype/unifont/unifont.ttf",
    movie_width=320, movie_height=33124) at font_load_ft.c:797
#1  0x082361a7 in load_font_ft (width=320, height=182, fontp=0x87f7380,
    font_name=0xa2fe680 "Sans") at font_load_ft.c:1164
#2  0x082326db in vo_update_osd (dxs=320, dys=182) at sub.c:1093
#3  0x08232c83 in vo_draw_text (dxs=320, dys=182,
    draw_alpha=0x80ed570 <draw_alpha>) at sub.c:1228
#4  0x080edc84 in draw_osd () at vo_fbdev.c:1093
#5  0x0814a492 in control (vf=0xa409ed0, request=7, data=0x0) at vf_vo.c:94
#6  0x08142e54 in control (vf=0xa3ec538, request=7, data=0x0)
    at vf_scale.c:449
#7  0x0811f685 in filter_video (sh_video=0xa3b0280, frame=0xa3ee710, pts=0)
    at dec_video.c:415
#8  0x080a3460 in main (argc=4, argv=0xbfbf95c4) at mplayer.c:2046
(gdb)


發現視頻不能正常播放,gdb定位到出現問題的代碼 : )
試著和 0) 比較,list可以列出代碼

好玩,用gdb在mplayer的代碼中遊走,list一下,break一下,print一下探尋問題的癥結

原來關鍵在於 /etc/mplayer/mplayer.conf 文件,Debian官方編譯mpalyer時應該使用了 --confdir=/etc/mplayer 配置選項

3) 結論

將 /etc/mplayer/mplayer.conf 中的 'fontconfig=1' 註釋掉,改成 '#fontconfig=1' 即可

這是個表面原因,臨時的解決方法,不過修改完,Debian官方的mplayer就能正常工作了

以下是我的配置
$ cat /etc/mplayer/mplayer.conf
### mplayer DEBCONF AREA. DO NOT EDIT THIS AREA OR INSERT TEXT BEFORE IT.
#video output driver
#vo=xv,x11
#c-aries: 添加fbdev支持
vo=fbdev,xv,x11
#device for dvd
#dvd-device=/dev/cdrom
#truetype font, using fontconfig
#fontconfig=1
#c-aries: fontconfig=1是mplayer產生bug的原因
font='Sans'
#if you do not like this default, override it by adding
#  a ao= line below this debconf area
#ao=alsa,oss
#c-aries: 默認為alsa,oss我不熟悉,沒配置
ao=alsa
### END OF DEBCONF AREA.  PLACE YOUR EDITS BELOW; THEY WILL BE PRESERVED.

Debian mplayer官方包真正不能運行的原因,就留給大家學習gdb,一起找出真正的原因吧
有點得過且過,不過話說回來也要循序漸進

調試到現在,不管是用Debian官方包還是自己編譯的包,我系統上的mplayer又可以用來看電影 : )

gdb mplayer bug


[火星人 ] 用gdb調試崩潰了的mplayer已經有680次圍觀

http://coctec.com/docs/program/show-post-71597.html