UOS+KIRIN截屏出错研究

Posted 柳鲲鹏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UOS+KIRIN截屏出错研究相关的知识,希望对你有一定的参考价值。

  泰OFFICE有个BUG,说在UOS+KIRIN系统上,截屏卡死。在KYLIN和其他UOS上,则正常。这么怪异的问题,当然很难解决。只能由吾出场,从JDK角度来看看。

  使用的是Robot进行屏幕。于是吾进行跟踪,出错顺序依次是:

  • Robot.createScreenCapture()
  • XRobotPeer.getRGBPixels
  • XRobotPeer.getRGBPixelsImpl()
  • awt_Robot.c:getRGBPixelsImpl

  这里已经是C了。在这里进行跟踪,发现是compositeGetOverlayWindow导致的。吾仔细想了半天,莫非是窗口产生了没有释放?那找找有没有对应的释放函数。别说,还真找到了一个释放函数:XCompositeGetOverlayWindow。加上之后,果然不死了。

https://www.linuxhowtos.org/manpages/3/XCompositeGetOverlayWindow.htm

  不死的问题解决了,拿到的是黑屏,也就是没有得到数据。于是又进行了跟踪。

  • awt_Robot.c:getWindowImage
  • multiVis.c:ReadAreaToImage

通过对比正确顺序,发现:正确的时候XGetImage()返回结果,错误的时候为NULL。

于是进行了修改:如果有数据设置一个标志;返回时根据标志来决定返回对象还是NULL。

为什么没有数据呢?这个没有进一步分析。

  实际上这个系统也能截屏。不知道是系统版本问题(比如UI不一样)?还是显卡适配问题?

以上是关于UOS+KIRIN截屏出错研究的主要内容,如果未能解决你的问题,请参考以下文章

J3D在UOS+KIRIN崩溃2:深层原因分析

J3D在UOS+KIRIN崩溃3:GLProfile正确初始化及解决办法

全网首发:解决uos上sqlite-jdbc访问/tmp目录出错提示的问题

UOS设置屏幕缩放后的配置文件研究

.each() 行为怪异

UOS就是深度系统换壳?官方做出回应