是的,之前已经问过这个问题,但是阅读答案并没有给我带来太多启发。
我写了一个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 || ...
答案 0 :(得分:6)
好的,我终于找到了原因(感谢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-位系统,几分钟后崩溃。
答案 1 :(得分:1)
我刚刚有一个程序就像这样,完全相同的错误信息。我希望计数器错误在崩溃之前处理2 ^ 32个事件。
该程序的结构使得一个工作线程与X线程有一个单独的X连接,这样它就可以向X线程发送消息来更新窗口。
最后,我将问题追溯到一个地方,在这个地方,将事件发送到窗口以重绘它的函数由多个线程调用,没有互斥体,并且因为X到同一个X连接不是参赛者,遇到这个确切的错误。在函数上加入一个互斥量,没有问题。