gpt4 book ai didi

linux - 如果忽略 X11 BadWindow 错误会怎样?

转载 作者:IT王子 更新时间:2023-10-29 01:19:18 25 4
gpt4 key购买 nike

我有一个 1990 年代早期编写的遗留 Motif 应用程序(我无法在 QT 中重写 UI,甚至无法在不经过耗时的安全评估的情况下对应用程序进行大量修改)。这个应用程序曾经在 AIX 上运行,在密集使用的情况下连续运行数周并且非常稳定。我们现在已经将它移植到 Linux。在长时间的持续 Beta 测试期间,该应用大约每周崩溃一次,并显示以下消息。

Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 4 (X_DestroyWindow)

从那以后,我了解到可以使用自定义 X11 错误处理程序(默认的 X11 错误处理程序只打印错误消息并退出)来忽略这些错误,如下所述:

http://motifdeveloper.com/tips/tip29.html

我已经实现了一个自定义的 X11 错误处理程序,它忽略了那篇文章中描述的 BadWindow 错误。所以我的问题是:比我更了解 X11 开发和 X 服务器内部工作的人可以启发我是否真的可以像这样忽略 BadWindow 错误吗?

附言我将尝试通过在同步模式下运行我们的应用程序来进一步调试它,但速度很慢,因为我无法按需重现此错误。任何有关调试 BadWindow 错误的提示也将不胜感激。

最佳答案

如果您的程序由单个进程组成(与 X 显示器的单个连接),那么此错误几乎总是反射(reflect)程序中的错误。

要知道的 secret 是如何调试它。因为 Xlib 是异步的,所以 XDestroyWindow() 会即发即弃,窗口上的一些销毁后操作也可能即发即弃,并且您会在以后的某个时间(在一些其他不相关的 X 调用)。这意味着来自 X 错误的堆栈跟踪毫无意义,而且很难调试。

要解决此问题,请调用 XSynchronize(dpy, True) 以强制所有调用同步。这会使应用程序变慢,所以不要在生产中让它保持打开状态。 http://www.x.org/releases/X11R7.6/doc/man/man3/XSynchronize.3.xhtml

但是在同步模式下,如果 Xlib 调用使用了错误的窗口,它将立即失败。因此,您可以设置一个调试断点,例如在您的错误处理程序函数上,并获得有意义的回溯。这应该会告诉您哪个 Xlib 调用导致了问题 - 希望它会清楚它是一个小部件的双重删除,使用一个被破坏的小部件,还是什么。

如果您的应用程序确实有多个进程或多个显示连接,例如在窗口管理器中,那么 BadWindow 可能是不可避免的(如果您试图弄乱另一个应用程序的窗口,那么有一场不可避免的比赛,其他应用程序的窗口可能会被破坏)。在这种情况下,忽略 BadWindow 是正确的解决方案,但最佳做法是仅在已知会触发它的那些调用期间忽略它,因此您仍然会遇到可能是错误的错误。一个常见的习惯用法是实现一个 error_trap_push()/error_trap_pop(),它只是安装和卸载忽略错误的错误处理程序。当您触摸可能会在您无法控制的情况下删除的外部窗口时,推送错误陷阱。

关于linux - 如果忽略 X11 BadWindow 错误会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20871304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com