【发布时间】:2014-08-06 16:47:20
【问题描述】:
我的应用程序在调用 libX11 函数时随机挂起。例如:调用XGetClassHint、XGetWindowProperty或XListInputDevices有时不返回。
例如,这里是调用XGetClassHint时的回溯
#0 0xb70a762c in poll () from /lib/libc.so.6
#1 0xb6f980f0 in _xcb_conn_wait (c=0x9d66a20, cond=0xbf98c600, vector=0x0, count=0x0) at ../../src/xcb_conn.c:316
#2 0xb6f9a7e1 in xcb_wait_for_reply (c=0x9d66a20, request=178, e=0xbf98c68c) at ../../src/xcb_in.c:395
#3 0xb7597746 in _XReply (dpy=0x9d660d8, rep=0xbf98c6f0, extra=0, discard=0) at ../../src/xcb_io.c:462
#4 0xb75750a0 in XGetWindowProperty (dpy=0x9d660d8, w=31457802, property=67, offset=0, length=8192, delete=0, req_type=31, actual_type=0xbf98c78c, actual_format=0xbf98c788, nitems=0xbf98c784, bytesafter=0xbf98c780, prop=0xbf98c77c) at ../../src/GetProp.c:70
#5 0xb7573f51 in XGetClassHint (dpy=0x9d660d8, w=31457802, classhint=0xbf98c83c) at ../../src/GetHints.c:312
#6 0x080ccfac in WindowManager::get_class (this=0x8144460, window=@0xbf98c814, clase=0xbf98c83c) at src/WindowManager.cpp:1334
我已经跟踪了我的应用程序和服务器之间的 X11 消息,并且我收到了对请求 WM_CLASS 的 GetProperty 的回复:
001:<:00b2: 24: Request(20): GetProperty delete=false(0x00) window=0x01e0020a property=0x43("WM_CLASS") type=0x1f("STRING") long-offset=0x00000000 long-length=0x00002000
001:>:00b2:52: Reply to GetProperty: type=0x1f("STRING") bytes-after=0x00000000 data='Navigator\000Iceweasel\000'
我的应用程序是单线程的,我可以看到仍在接收和处理来自服务器的 X11 消息,但它看起来永远不会从 XGetClassHint 返回,因为由于某种原因没有处理 GetProperty 回复。
我使用的操作系统是标准的debian squeeze,相关的包有:
ii libx11-6 2:1.3.3-4+squeeze1 X11 client-side library
ii libx11-6-dbg 2:1.3.3-4+squeeze1 X11 client-side library (debug package)
ii libx11-data 2:1.3.3-4+squeeze1 X11 client-side library
ii libx11-dev 2:1.3.3-4+squeeze1 X11 client-side library (development headers)
ii libx11-xcb1 2:1.3.3-4+squeeze1 Xlib/XCB interface library
ii libx11-xcb1-dbg 2:1.3.3-4+squeeze1 Xlib/XCB interface library (debug package)
ii libxcb1 1.6-1+squeeze1 X C Binding
ii libxcb1-dbg 1.6-1+squeeze1 X C Binding, debugging symbols
ii libxcb1-dev 1.6-1+squeeze1 X C Binding, development files
知道是什么原因造成的吗?
谢谢!
更新
经过更多调试后,该问题似乎是在程序处理 SIGCHLD 时发生的。在信号处理程序中,我只是写入管道以通知主线程,但没有对 libX11 进行任何操作。但最终删除信号处理程序使问题消失了。是否有意义?或者我可以期待这个问题在未来再次出现吗?
再次感谢
【问题讨论】:
-
你能针对原生 Xlib 而不是 XlibXcb 构建吗?
-
@n.m.我不确定如何使用 debian 软件包来做到这一点。卸载 libx11-xcb 可能会起作用,但我需要对我正在使用的其他东西的依赖
-
我对 XlibXcb 不够熟悉,但我很确定你不需要卸载任何东西。您只需将您的应用程序与
-lX11链接,而不是-lx11-xcb1或其他任何东西。这不一定有效。好吧,我几乎可以肯定它不会起作用,但它只是可能起作用,这就是我问的原因。