PC+linux桌面环境下,占用率最高的播放器非VLC莫属了。
VLC是开源播放器,它的解码大部分依赖ffmpeg开源库,在PC+linux下主要有三种渲染方式:x11(X server原生支持的), Glx(使用opengl加速), xvideo(Nvida加速)。
因为VLC依赖第三方库,很多时候,第三方库的错误也被算在VLC头上。
最近经常遇到的VLC的崩溃现象,我使用的是vlc-1.0.1版本,rhel5.5环境下。
日志如下:
打开coredump,ulimit -c unlimited,重现错误。
使用命令查看堆栈,如下
gdb ./vlc ./core.123456
bt
可以发现,错误是,Xsync()引起的。
照例,先看看新的vlc版本有没有解决。
看了一下vlc-2.0.1,新版本引入了xcb,xcb使用下面的函数,
xcb_generic_error_t *e = xcb_request_check (sys->conn, ck);
检查显示成功与否,不成功,释放掉 pic{picture_Release (pic);},然后显示下一帧图片。
我的rhel5.5太旧了,尝试安装xcb开发环境还需要更新XFree86(X server的实现版本)。不想折腾。
再回头看看堆栈,#19是一个vlc注册进去的错误处理函数。
这个函数中,vlc调用XGetErrorText,得到详细错误信息,并打印出来了。
然后,“XSetErrorHandler(NULL);”调用了默认错误处理函数XDefaultError(),它调用了exit(),进程退出。
好了,我的想法是:
打印详细错误信息,
参考vlc-2.0.1,不调用默认错误处理函数,而是直接返回(return 0;)。
不知道这样能不能达到目的?
明天再试。
土鳖抗铁牛