当 DISPLAY=:0 但不是 DISPLAY=hnam.local:0 甚至 DISPLAY=unix:0 时,某些 GTk3 应用程序会因 BadAccess 中止

当 DISPLAY=:0 但不是 DISPLAY=hnam.local:0 甚至 DISPLAY=unix:0 时,某些 GTk3 应用程序会因 BadAccess 中止

我的 XQuartz 环境遇到了一些问题,由于一些难以弄清楚的怪异原因而无法启动。它(大部分)再次工作,但在我的各种故障排除尝试中,我一定造成了另一次回归。

像 Epiphany、gtk3-demo-application 这样的应用程序甚至zenity --calendar可以按照您的预期启动。现在,他们由于显然是通过XCreatePixmap下的调用发生的 BadAccess 而中止gdk_x11_window_set_icon_list。奇怪,因为我不认为这是 XCreatePixmap 的可能错误。

更奇怪的是:确实如此不是DISPLAY=hnam.local:0如果我使用(甚至unix:0!)而不只是启动这些应用程序,就会发生这种情况DISPLAY=:0。据我所知,这使得连接通过 TCP/IP 堆栈。作为一种解决方法是可以接受的,因为性能/功能损失在 XQuartz 下可能没有实际意义,但我仍然想了解这里的情况。

我怀疑这与我确实使用了privileged_startx通常为 XQuartz 用户启用并负责在 /tmp 下设置目录的包装器有关。几年前,由于我不记得的原因,我禁用了该功能,但在故障排除期间重新启用了该功能。它又被禁用了,自从我这样做之后,又出现了另一个奇怪的现象。在启动 X11 环境后,我可以像以前一样启动有问题的应用程序。几分钟后,他们将再次在启动时抛出 BadAccess。或者也许我可以只启动它们一次,这将触发后续启动时导致 BadAccess 的任何原因。编辑:但见下文*)

我配置了 X11(希望再次配置了)以允许来自 LAN 中的远程服务器的连接。我也总是这样做,xhost +x因为没有理由进行任何更严格形式的连接控制。

在我的故障排除过程中,我的 .Xauthority 文件(由 root 拥有)也引起了一个简短的问题,我通过重新拥有它并运行 .Xauthority 文件来修复该问题xauth -b

上述症状是否引起警觉?它们是否与 /tmp 下的那些目录中的内容有关,或者与我的 .Xauthority 文件中的可疑内容有关?当从最本地的连接而不是从远程连接执行操作时,操作会违反规则,这似乎很奇怪,不是吗?

谢谢!

编辑:我有一种直接原因的预感,但仍然没有解释为什么会发生这种情况。

我的 X11 会话由 xfce4 面板“锚定”。看起来有问题的 XCreatePixmap 调用可能针对该面板进程拥有的可绘制对象,例如在面板的“窗口按钮”中安装应用程序图标。仅当 2 个 XDisplay 字符串相同时才有意义。这可以解释为什么我也可以避免 DISPLAY=unix:0 的错误(据我所知,这相当于 DISPLAY=:0)。

正如我所说,我仍然无法理解为什么它以前有效,更不明白为什么它现在在有限的时间内有效。编辑:我似乎也误解了 xwininfo 向我展示的内容。

我拼凑了一个XIOErrorExitHandler检查环境的程序。变量知道它应该尝试继续。这似乎有效。

编辑:运行egsudo zenity --calendar也不会抛出BadAccess,它再次指向不再具有正确权限的文件的方向。

*)编辑:以及最奇怪的观察:实际上没有实际的延迟;时间方面是由我推迟了我的常规操作之一而引入的:将初始终端窗口移动到所需的屏幕(如果已连接)并通过 WM (xfwm4) 最大化它们的高度。更改这 2 个窗口中的 1 个窗口(属于单独的 Konsole5 实例)的高度会触发该问题如果我恢复该窗口的初始高度,它就会消失。如果我关闭窗口,触发操作将移动到另一个窗口。

令人烦恼的是,我找不到任何request_code 133代表什么的指示。

答案1

这并不是一个明确的答案,但它必须是答案的开始:

我查看了 Qt 的 XCB 插件(v 5.9.8)中到底发生了什么。正如我所想,如果无法获得共享内存,它会回退到使用常规内存作为窗口后备存储,但在这种情况下它仍然尝试获取 MIT-SHM 扩展。我对代码进行了一些调整,因此甚至没有进行尝试,但这显然没有任何效果。

我也终于反应过来看看是否可以增加共享内存限制。你瞧,增加shmseg(从 8 到 16,并且shmall)使得 shm 分配起作用。 “主动追溯”已经运行的应用程序(显然)......并且即使“有问题的”窗口高度最大化,BadAccess 错误也会消失。

我不明白shmget另一个应用程序中的故障如何会导致完全不相关的应用程序中出现 X11 错误。但 X11 服务器可能也会调用shmget或等效函数,并且这些调用可能会因与我的 Qt 应用程序中失败的原因相同而失败。有点奇怪的是,这些会被报告为 BadAccess,但谁知道呢,也许分配失败的下游代码会报告接收到空指针。

相关内容