遭遇ATI显卡无法使用Xv的问题

机器:P D 3.2的cpu OS:Ubuntu dapper 6.06 2.6.15-26,i686内核 显卡:ati X600 256M显存,双头 软件环境:totem-xine, mplayer, w32codecs都安装了

问题:能够正常进入X,能够玩opengl游戏,但是一播放电影就不行了,X崩溃重启,回到图形登录页面。glxinfo和fglrxinfo(注意fps有一个突变,不知为何):

glxinfo 16914 frames in 5.0 seconds = 3382.795 FPS 16917 frames in 5.0 seconds = 3383.297 FPS 16774 frames in 5.0 seconds = 3354.716 FPS 48706 frames in 5.0 seconds = 9741.081 FPS 52345 frames in 5.0 seconds = 10466.271 FPS 51773 frames in 5.0 seconds = 10350.462 FPS 52214 frames in 5.0 seconds = 10442.764 FPS fglrxinfo display: :0.0 screen: 0 OpenGL vendor string: ATI Technologies Inc. OpenGL renderer string: RADEON X600 Generic OpenGL version string: 2.0.5814 (8.25.18)

崩溃后的信息为:

Fata Server Error Caught Signal 11, Server aborting

查询网络后,有两个解决方法,都要手动修改xorg.conf,第一种是禁用extmod,第二种是禁用Xv,改用opengl。

禁用extmod则注释掉Load “extmod”这一句就可以了。 禁用Xv需要把Xv设为off,opengl设为on,修改Section “Device”:

Option “VideoOverlay” “off” Option “OpenGLOverlay” “on”

个人觉得第二种方法稍微好一些,不过也是戳子里面拔将军,沒有解决实际问题,并且用mplayer播放电影的时候,启动和结束程序还会黑一下屏。

使用opengl以后fps从12000降到了8000多,所以Xv还是要更快一些的,不过我也不怎么玩游戏,无所谓了,没准等以后fglrx驱动或者xorg升级了就能解决这个问题。

不要被.Net的假提交蒙骗了

目标

过程比较曲折,还是从头说起吧,事情的起因是这样的:现在不是主要在Ubuntu下工作么,但是单位的办公系统却只能使用ie,原因是因为要使用一个activex控件来读取一个加密锁,然后才能利用加密锁内的数据登录进入系统。而在测试系统中,我可以使用用户名+密码的方式进入系统,之后基本上所有的页面在firefox下操作也都正常。综上所述,只要能够跳过“登录”这一关,我就不用再启动笨重的vmware去运行ie使用这套办公软件了,直接利用firefox就可以了。ok,现在我的目标已经确定,下面是主要的解决思路。

解决思路

在firefox下使用过del.icio.us、furl等服务的应该都知道,他们都可以在firefox的书签工具栏上生成一个按钮,而只要点击这个按钮,就可以把当前页面存入美味书签或者记入furl收藏,甚至可以读取到当前页面上的部分内容。其实,这些书签工具栏上的按钮和普通的书签没有本质区别,只是别人以http://开头,他们以javascript:开头罢了。看看这个小例子:拖动下面这个链接到书签工具栏,然后点击执行一下,看看会发生什么?其实把网址直接拖动到书签工具栏或者Bookmarks菜单下也是一样能够保存的,因为他们本来就是一类东西。

拖动我到书签工具栏,然后点击执行一下,看看会发生什么?

(在书签工具栏的按钮上面点击鼠标右键,然后选“Delete”就可以删除了。)

同理,activex只是读取加密锁的工具,最终还是要把读出的数据通过表单post到服务器上进行验证,所以,只要我们能够“跳过”activex读取这一步,直接把加密锁中的数据post到服务器上,就能够形成一样的效果。

获得加密锁数据

很简单,问开发人员要就是了,还有一种做法就是仔细研究客户端的脚本然后改写为本地模式然后自己读,当然对于有些带有加密性质的activex控件是无效的。幸好开发人员很乐意提供我加密锁的数据,因为除了锁上的显式数据以外,另外还有一个校验码,同时存放在加密锁和服务器上,就像“虎符”一样,碰对了才有效,所以在小范围内实施我这种行为基本上不会带来什么安全问题。

“伪”读取并提交数据

也不复杂,前提是观众要对上面那个书签工具栏上的按钮的例子有比较清楚的理解,这里我就直接贴代码好了:

javascript:(function(){document.Form1.username=’coolboy’; document.Form1.password=’ooxx’; document.Form1.submit();})();

我当然不会贴出真实的数据啦,上面的例子就是模仿一个登录表单,通过js向表单中写入数据,最后直接调用表单的submit方法。由于是这些内容是要填在书签的“地址”一栏中的,所以是一长行的形式。

实战!

像上面那个例子一样,在js中对表单对象赋值,然后调用表单的submit方法,然后运行。。。。咦?怎么没有效果?页面好像只是刷新了一下,然后就没有变化了,既不是已经成功登录的样子,也不是登录数据错误的样子,好像、好像就仅仅是刷新了一下!

费劲周折,终于了解到了真实原因,原来是被.net的小把戏给耍了:

.net为开发人员提供了很多方便的工具,其中包括在“服务端”运行的web form控件,在开发的时候他们和普通的html控件没有大的区别,但是却能够很方便的让开发人员对其属性和方法进行设定。然后在实际运行生成html页面的时候,.net引擎会将他们转化为标准的html表单代码,并且利用__VIEWSTATE保存状态数据。

而我们刚刚看到的“刷新”是什么呢?原来是这样:首先我们通过js进行赋值的操作是没有问题的,值被正确设定,然后调用表单的submit方法也没有错,数据也正确的提交到服务端了,但是,当服务器端接受到post的数据之后,并没有按照正常的post方法来进行处理,而是另外一套方法。为什么会这样呢?因为我们在客户端收到的html代码中看到的form,input等控件,都是带有runat=”server”属性的,也就是设定了要在服务器端执行。我们当然看不到实际的runat=”server”,因为在生成页面时就已经转换成了标准的html代码。而当服务器端接受到有关runat=”server”控件的操作的时候,却不会按照正常的get、post来操作,而是使用在服务器端代码中设定好了的方法来执行操作。本例中,由于使用js手工提交的数据并没有和服务器端设定的方法“吻合”在一起,导致服务器端没有进行任何操作,又原原本本的把页面送了回来,所以,我们看到页面“刷新”了一下。我们以为表单被提交了,就会被服务端正常的处理,却没有想到.net引擎偷懒什么也没干,蒙蔽了我们的双眼。

现在,我终于明白,为什么在有些.net开发的应用中,输入完数据直接敲回车是不会提交的,必须用鼠标点击“提交”按钮才行,看来.net的威力在不成熟的开发者手工也不过如此。

关于上述的.net实现机制,可以参考: asp.net用户控件中的Button,在直接回车的时候不提交表单,如何办? 关于前台调用后台事件__doPostBack函数 (论坛答疑点滴)__doPostBack()无效?

排除问题,胜利!

虽然道理是绕了一个圈子,但是解决方法却是无比的简单:

javascript:(function(){document.Form1.username=’coolboy’; document.Form1.password=’ooxx’; document.Form1.Button_Submit.click();})();

没错,就是由原来的调用表单的submit方法(以前常用),变成了直接调用submit按钮的click方法,问题顺利解决!但是究其深层次的道理,还是要看看上面几篇参考中关于doPostBack函数的解释,应该能够明白一些。

废话

我们这些喜欢使用linux系统的人,在广大使用windows系统的同志们心中,总是那么的“特别”,其实他们不知道,在很多技术细节上,真正“特别”的却多是windows产品。比尔大叔的风格,就是把原本就有标准解决方法的东西,增加一些华丽的“方便”功能,然后用只有微软才能够解释清楚的方式,包装成为“方便”开发人员的“工具”,在赚进大把的钞票的同时,还让广大开发人员对微软产品产生了无比的依赖性。我想这也许是微软始终无法真正创造底层技术标准的原因吧。就像黑客帝国一样,只要你身在matrix当中,不管你作什么,都只是matrix的一个“子程序”,只有跳出矩阵,才能看清楚这个世界。

重装系统与重装服务

近日一台用于测试的服务器坏了,上面有apache、iis、tomcat、sybase等服务,损坏原因是system和system.alt两个文件全部损坏,而我又没有什么救援盘拯救盘之类的,无奈只能将winnt\repair下面的system文件覆盖了过来,这个文件是windows2000刚刚安装完毕的时候建立的,所以很多安装的软件、服务就没有了,需要重新安装。

apache服务的安装:apache.exe -k install iis基本上自带的,想不装都不行,并且以前安装过的.net framework也能够继续使用 tomcat有一个service.bat文件用来创建服务

最麻烦的就是sybase了,sybase的菜单还在,使用“配置服务器”也能看到服务器名,但是系统的服务列表中却没有这一项,好在sybase的大部分所需文件还是都在sybase目录之下,所以你有两种方法可选:一种是从别的机器上把sybase服务的注册表项导出来,手工修改后导入,反正文件都还在,不会影响使用的;另一种是备份master和sysproc的两个设备文件,然后删除服务器、再新建服务器,最后把master和sysproc设备文件再覆盖回去,应该也是可以的。

引申联想一下,这些伟大的软件给我们提供了多么方便的方式啊,相当于是在系统重新安装之后,只需要操作几个命令就可以装上服务,以前的配置文件、数据文件照常使用。其中表现较差的就是sybase了,没有方便的服务管理工具,我想,对系统的依赖性应该也纳入软件评测的标准,我们需要“绿色”的服务器软件。

当然,我们最希望的是服务器不出问题,硬盘的问题可以用raid来解决,硬件的问题可以更换,所以,最可怕的就是系统由于软件的原因无法引导、甚至数据损坏。在这方面,linux和windows面临着同样的敌人,但不知道nix系列的松散配置文件方式是否更加健壮一些。至少对于windows,在系统正常运行的时候,记得用“开始—程序—附件—系统工具—备份”创建一张紧急恢复磁盘,哪怕不实际的写入软件,把重要文件备份到winnt\repair\RegBack下来一份也是好的,毕竟windows对这些配置文件的依赖性太强了。

一个离奇的php header函数问题的解决

Ubuntu上的apache、php5、mysql5都已经安装完毕了,phpMyAdmin也能够管理数据库了,接下来就是把以前apache上的程序再运行起来了。第一个Brim很顺利,除了和win下一样会有notice错误报告;第二个是mantis,一个bug跟踪系统,在这里就遇到了问题。

mantis的数据库配置正常,apache的虚拟目录配置也正常,访问/mantis时却是个空白页,php的error_reporting设置的是E_ALL,error_log和display_log都打开着呢,怎么会不显示内容呢。故意加了个语法错误在index.php中,发现浏览时会提示语法错误,errorlog中也有相应的内容。但就是正常访问的时候既不显示内容,也不提示错误,errorlog中也是没有变化。

于是开始跟踪代码,mantis 0.19.2,虽然include比较多,但是很容易就判断出:我的机器上尚存有保留的登录记录,因此index.php判断出登录状态之后就会把页面跳转到main_page.php,而问题极有可能就是出现在这个跳转上:

print_header_redirect( ‘main_page.php’ );

跟进函数print_header_redirect,在core/print_api.php中:

function print_header_redirect( $p_url, $p_die = true ) { … header( “Location: $p_url” );

就是一个简单的header函数,怎么会不干活呢?于是在header函数前面加上die(‘test’);,刷新页面显示test,又改为在header函数后面加上die(‘test’);,再刷新页面还是只显示test,header都是不工作。按理说我这两种操作方式,哪怕不起作用,总也会有个错误提示吧,但是再次查看errorlog文件,依然空手而归。

一个下午就在反复的检查设置、测试、跟踪代码、查找问题中过去了,还好没有放弃,最终把问题集中到了错误报告上面。我的php环境中错误的显示、保存都已经设置好了,但是无论怎么在这个程序里面添加错误的代码,就是不显示和保存错误(这里的保存指错误信息被存到errorlog文件中)。但是另外建了一个简单的测试文件,错误也能显示和保存,header还能够正常的工作。这不是出鬼了么,同样的apache,不同的虚拟目录,就能够有这么大的差别?

继续查找。。。直到吃过晚饭之后,终于发现,在core/error_api.php中,有一句:

set_error_handler( ‘error_handler’ );

后面还有function error_handler,并且这个文件是一大堆被包含文件之一。原来,mantis使用error_handler函数接管了php的错误处理,怪不得什么错误信息都不显示呢。现在,注释掉这一句,错误信息就能够显示了,并且header也能够正常工作了。但是把注释去掉,就又不行了,没办法,就先暂时用系统自带的错误处理功能吧,现在用的mantis 0.19.2版本是老了些,需要升级了,等升级完应该就没事了。

总结:在调试php程序的时候,错误报告对我们是十分有用的,但是在程序明显出错而又看不见错误的时候,别忘了有可能是程序使用set_error_handler函数接管了错误的处理,错误就不会显示和写入errorlog文件了。同样还有set_output_handler接管输出(输出过滤)等类似函数。

msvcrt.dll无法删除一例

一台windows2000服务器,安装了sqlserver2000,本来没事,但由于工作需要,要安装sybase 12的client,sybase 12的client是java式的安装,不仅只能在本地驱动器上执行(网络驱动器上不行),安装文件的路径中还不能包含中文,甚是麻烦。

安装的过程中提示覆盖msvcrt.dll文件,没仔细看,就给覆盖了,然后在重启的时候就发现sqlserver无法启动了,提示找不到入口。。。msvcrt.dll文件什么的,才想起来覆盖给搞坏了。

从别的地方找了一个正确的msvcrt.dll文件,想拷贝回去吧,却提示文件正在使用中,原来windows中几乎每个程序都用到了这个文件,当然无法直接覆盖了,试过了unlocker也不行,无奈,在c盘根目录新建了一个批处理文件a.bat,内容如下:

copy c:\msvcrt.dll c:\winnt\system32 /Y @rem 建一个目录,就当是成功标记了 mkdir c:\copy_ok

然后在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce 和 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx 两个位置下新建一个字符串类型的键,内容为“c:\a.bat”,重启系统。。。。

系统重启完毕,一看copy_ok目录也建好了,但文件依然未被覆盖,再使用另外一种方式:

cd c:\winnt\system32 ren msvcrt.dll msvcrt.dll.old copy c:\msvcrt.dll .

没想到居然成功的将文件覆盖了,再次重启系统,问题解决。

不知道设置批处理那一步对后来改名的操作是否有影响,反正搞定了,收工。

Update @ 2007-04-22

今天忽然想到一个会产生这种结果的原因,那就是windows会追踪文件的更名,换一种方式解释,如果你有一个程序持续的写入一个文件,比如apache对access.log的写入,如果你在这个程序仍然运行的情况下,对文件进行更名操作,那么这个程序不会把内容写入新的文件,而是继续写入更名后的文件。所以,对msvcrt.dl进行更名并不影响它的使用,并且是系统允许的操作,而系统重启之后,一切重新开始,新文件就上岗了。

似乎Ubuntu在某些情况下也会这样,以前遇到过,程序正往一个log文件里面写东西呢,把log文件删除,期待程序生成新的log文件,而这怎么也不发生。

用unlocker删除顽固的文件

前两天从某个网站下载一个什么东西来着,结果下了一点就不动了,在ff中取消之后,却在硬盘中留下了一个名叫“20050325mareido_trial.exe”的文件,死活删不掉了。

E:\temp>del 20050325mareido_trial.exe E:\temp\20050325mareido_trial.exe 进程无法访问文件,因为另一个程序正在使用此文件。

但是这个文件却可以用文字编辑软件编辑并保存,也可以用copy con写入内容:

这个删不掉的文件却可以用文字编辑器编辑

重新启动机器也无效,检查磁盘也没有发现错误,由此判断系统并没有真正“使用了”这个文件,而是由于其他的原因不让删除。于是,找到了unlocker,试试效果。下载、安装,软件不大,安装也很方便,还是多语言版的。不过安装完以后是没有主执行文件的快捷方式的,而是通过在文件上点右键,出现右键菜单上的菜单项调用的。

unlocker是通过右键菜单调出的

现在看到,这个文件被好几个explorer进程使用者呢,选择左下角的“删除”,然后点右下方的“全部解锁”,看能否解决。不过不知道这windows抱着这个只有一些字母的“exe”文件锁定着作什么呢?

终于把那个可恶的文件删除掉了

然后——大功告成~文件被移动到了回收站,unlocker出色得完成了任务。

终于把那个可恶的文件删除掉了

如果你也有什么文件删不掉,不妨一试。 参见:西行资讯-文件删除利器:Unlocker v1.7.9

后记:文件是删除掉了,不过按照它的提示,我在回收站里找了半天也没有找到这个文件。