泰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不一样)?还是显卡适配问题?