- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 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/
我正在尝试设置我的 git 配置,以便我可以使用工作环境和个人环境。 这是我的 ~.gitconfig 文件的内容(碰巧 work 和 private 在 github 上): [url "git@
我有以下情况。我在 Sheet1 上有一个项目列表,我想将项目复制到 Sheet2 并排除特定项目。 假设我在 Sheet1 上有以下项目列表: 我想将“梨”单元格留在 Sheet2 上。 它应该完全
我试图让 gcc 以不同的语言提供错误消息。但它仍然给我英文的错误信息。 我的语言环境输出 varun@varun-desktop:$ 语言环境 LANG=en_IN LC_CTYPE="es_EC.
我在 Linux x86 上使用 gcc。 我的程序将指向 C 函数的指针导出到 LLVM JIT 函数。调用约定是 cdecl。它在 Windows 上的 MingW 上运行良好。但是奇怪的事情发生
windows 上 php 的奇怪问题...我的应用程序加载了一个“核心”文件,该文件加载了一个设置文件、注册自动加载、进行初始化等。在核心文件的顶部我有 include_once("config.p
在工具|选项|调试器选项 |语言异常可以忽略特定的异常类型。是否可以为每个项目定义这个?例如在调试构建配置中(Delphi 2009 和/或 2010)? /编辑:Reported in QC 最佳答
我在一个文本框旁边有 2 个按钮,在这 2 个按钮后面还有另一个文本框。第一个文本框的 tabindex 为 1000,第一个按钮为 1001,第二个按钮为 1002。第二个文本框的 tabindex
我是 python 新手,正在尝试类型提示,但它们似乎只在某些情况下起作用。它们似乎在属性返回类型上按预期工作,但是当我尝试将整数分配给字符串值(即 self._my_string = 4)时,我没有
问题陈述 我有一些国家和这些国家的州的依赖组合框。我使用 VBA 在第一个组合框中填充唯一值,然后在第二个组合框中动态填充唯一值。该代码似乎忽略了初始传递中的条件。 例如,该代码适用于第一个国家/地区
我对 Javascript 有点陌生。我试图做到这一点,以便单击一个页面上的图像会将您带到一个新页面,并在该新页面上显示特定的 div,因此我使用 sessionStorage 来记住并使用 bool
我不确定我是否正确地处理了这个问题。 我有一个 ASP.NET MVC Web 应用程序。有 4 个主要“页面”通过单击菜单选项,可以选择一个页面,并将该页面选项存储在本地存储中。 现在,如果我刷新页
我的页面工作正常,并按预期显示日期和时间,直到我不得不添加 new Date() 以避免 momentjs deprecation warning 。现在我的约会比应有的时间晚了 5 个小时。 我该如
我需要合并一个 fork 项目。不幸的是,CVS $Id 行不同,因此我尝试的合并工具报告所有文件都不同(其中 95% 只有这一行不同) 是否有一个合并工具可以配置为忽略基于模式的行比较结果? [编辑
我是 python 新手,正在尝试类型提示,但它们似乎只在某些情况下起作用。它们似乎在属性返回类型上按预期工作,但是当我尝试将整数分配给字符串值(即 self._my_string = 4)时,我没有
我正在尝试根据 How do a send an HTTPS request through a proxy in Java? 使用代理访问 https 网页 但是我遇到了一个奇怪的问题:HttpsU
我有一个简单的 CMakeLists.txt 文件: cmake_minimum_required(VERSION 2.8.9) project (sample) add_library(Shared
这个问题在这里已经有了答案: typedef pointer const weirdness (6 个答案) 关闭 8 年前。 我有一个结构体 type_s。然后我将指向 struct type_s
我正在尝试制作一个使用 AES 256 加密的应用程序。不幸的是我无法让它工作。也许我没有完全理解密码逻辑。 所以它正在工作,但据我了解,哈希包含密码。但如果我更改密码,输出是相同的。因此,Crypt
我的文件包含一些行,例如 "This is a string." = "This is a string's content." " Another \" example \"" = " New ex
我尝试使用此查询来获取所选健身房的所有用户。 我的问题是查询忽略了这部分:ual.user_id = weekUsers.user_id 查询似乎获取了与我选择的日期匹配的所有用户 ID,而不检查该用
我是一名优秀的程序员,十分优秀!