x11 - XIO:由32位libxcb导致的致命IO错误11

标签 x11 core

是的,之前曾有人问过这个问题,但是阅读答案并没有给我很大的启发。

我写了一个C程序,使用几天后便崩溃了。重要的一点是,即使设置了所有内容,它也不会生成核心文件(core_pattern,ulimit -c unlimited等。我可以使用kill -SIGQUIT触发核心转储)。

该程序会广泛记录其操作,但是在日志中没有崩溃提示。
在崩溃(或之前?)上显示的唯一消息是:

XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
  after 2322 requests (2322 known processed) with 0 events remaining.


有两个问题:
-没有核心转储的程序如何崩溃(返回$?= 1)。
-此错误消息是关于什么的,我该怎么办?

系统是RedHat Enterprise 6.4

编辑:
我设法通过从atexit()回调内部调用abort()来强制进行核心转储:

(gdb) bt
#0  0x00bc8424 in __kernel_vsyscall ()
#1  0x0085a861 in raise () from /lib/libc.so.6
#2  0x0085c13a in abort () from /lib/libc.so.6
#3  0x0808f5cf in Unexpected () at MyCode.c:1378
#4  0x0085de9f in exit () from /lib/libc.so.6
#5  0x00c85701 in _XDefaultIOError () from /usr/lib/libX11.so.6
#6  0x00c85797 in _XIOError () from /usr/lib/libX11.so.6
#7  0x00c84055 in _XReply () from /usr/lib/libX11.so.6
#8  0x00c68b8f in XGetImage () from /usr/lib/libX11.so.6
#9  0x004fd6a7 in ?? () from /usr/local/lib/libcvi.so
#10 0x00478ad5 in ?? () from /usr/local/lib/libcvi.so
...
#29 0x001eed9d in ?? () from /usr/local/lib/libcvi.so
#30 0x001eee41 in RunUserInterface () from /usr/local/lib/libcvi.so
#31 0x0808fab4 in main (argc=2, argv=0xbfbdc984) at MyCode.c:1540


关于这个X11问题,​​有人可以启发我吗? libcvi.so不是我的,只有MyCode.c(LabWindows / CVI)。

编辑2014-12-05:
这是更精确的回溯。事情肯定在X11中发生,但是我不是X11程序员,所以从提供的行中查看X的源代码只会告诉我X服务器(?)暂时不可用。如果只是暂时的,有什么方法可以简单地告诉它忽略此错误?

#4  0x00965eaf in __run_exit_handlers (status=1) at exit.c:78
#5  exit (status=1) at exit.c:100
#6  0x00c356b1 in _XDefaultIOError (dpy=0x88aeb80) at XlibInt.c:1292
#7  0x00c35747 in _XIOError (dpy=0x88aeb80) at XlibInt.c:1498
#8  0x00c340a6 in _XReply (dpy=0x88aeb80, rep=0xbf82fa90, extra=0, discard=0) at xcb_io.c:708
#9  0x00c18c0f in XGetImage (dpy=0x88aeb80, d=27263845, x=0, y=0, width=60, height=20, plane_mask=4294967295, format=2) at GetImage.c:75
#10 0x005f46a7 in ?? () from /usr/local/lib/libcvi.so


对应行:

XlibInt.c: _XDefaultIOError()
1292:   exit(1);

XlibInt.c: _XIOError
1498:   _XDefaultIOError(dpy);

xcb_io.c: _XReply()
708:    if(!reply) _XIOError(dpy);

GetImage.c: XGetImage()
74: if (_XReply (dpy, (xReply *) &rep, 0, xFalse) == 0 || ...

最佳答案

好的,我终于找到了原因(感谢National Instruments的某人),更好的诊断和解决方法。

该错误存在于libxcb的许多版本中,并且是已经知道了几年的32位计数器翻转问题:https://bugs.freedesktop.org/show_bug.cgi?id=71338

并非所有版本的libxcb都受到影响,libxcb-1.9-5拥有它,而libxcb-1.5-1没有。从错误列表中,不应该影响64位操作系统,但是我设法在至少一个版本上触发了它。

这给我带来了更好的诊断。以下程序将在不到15分钟的时间内在受影响的库上崩溃(比以前花费了整整一周的时间):

// Compile with: gcc test.c -lX11 && time ./a.out
#include <X11/Xlib.h>
void main(void) {
    Display *d = XOpenDisplay(NULL);
    if (d)
     for(;;)
        XNoOp(d);
}


最后一点,上面的编在64位系统上编译和运行正常,在旧的32位系统上编译并运行也正常,但是如果我将32位版本转移到64位系统,几分钟后崩溃。

关于x11 - XIO:由32位libxcb导致的致命IO错误11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25790890/

相关文章:

ubuntu - 无法安装 nvidia 驱动程序,在函数 'block_cpu_fault_locked' : error implicit declaration of function 'task_stack_page

linux - 如何使用 Xlib 恢复窗口?

core - Identityserver4 - 在 IIS 中托管

c - X 窗口 id 0 是什么意思 - 未创建窗口?

docker - 如何在 OSX 上的 docker-machine 中显示来自 docker 容器的 gui View ?

linux - BadAlloc 并在 wxWidgets 程序中崩溃。如何找到错误?

c++ - (C++) 将指向动态分配数组的指针传递给函数

java - 根据输入参数获取Java列表

c++ - 为什么taskset对fedora没有影响?

我可以通过线程进入应用程序来测量 Linux 中的 CPU 使用率吗