我有一个 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/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee