2014-09-11 14 views
6

Ja, diese Frage wurde schon einmal gestellt, aber das Lesen der Antworten hat mich nicht sehr aufgeklärt.XIO: fataler IO-Fehler 11

Ich schrieb ein C-Programm, das nach ein paar Tagen der Verwendung abstürzt. Ein wichtiger Punkt ist, dass es keine Core-Datei generiert, obwohl alles so eingerichtet ist, dass es sollte (core_pattern, ulimit -c unlimited, etc. Ich kann eine Kern-Dump-Strafe mit kill -SIGQUIT auslösen).

Die Programme protokollieren ausführlich, was es tut, aber es gibt keinen Hinweis auf den Absturz im Protokoll. Die einzige Nachricht an dem Absturz angezeigt (? Oder vor) ist:

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

So zwei Fragen: - wie es für ein Programm möglich ist, zum Absturz zu bringen (return $ = 1?) Ohne Core Dump. - Worum geht es bei dieser Fehlermeldung und was kann ich tun?

-System ist RedHat Enterprise 6.4

Edit: schaffte ich es von einem Core-Dump zu erzwingen Abbruch durch den Aufruf() innerhalb eines atexit() Rückruf:

(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 

Jeder kann mich aufzuklären, diese X11 Problem? libcvi.so gehört mir nicht, nur MyCode.c (LabWindows/CVI).

Bearbeiten 2014-12-05: Hier ist eine noch genauere Rückverfolgung. Dinge passieren definitiv in X11, aber ich bin kein X11-Programmierer, also schaue ich mir den Quellcode für X von der mitgelieferten Zeile nur an, dass der X-Server (?) Vorübergehend nicht verfügbar ist. Gibt es eine Möglichkeit, es einfach zu sagen, diesen Fehler zu ignorieren, wenn es nur vorübergehend ist?

#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 

Entsprechende Linien:

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

Ihr Programm kann Deskriptoren löschen. Suchen Sie in seinem '/ proc//fd' -Verzeichnis, nachdem es einige Zeit ausgeführt wurde; Siehst du dort eine erhöhte Anzahl von Links? –

+0

Es dauert normalerweise einige Tage, bis es abstürzt, aber ich werde die Situation überwachen. Ein paar Google-Tests führen mich zu der Annahme, dass es sich um ein Xinerama/NVidia-Multi-Monitor-Problem handelt, das nichts mit meiner App zu tun hat. – dargaud

+0

Das Entfernen von Xinerama hat nicht geholfen. Ich bekomme diese Abstürze immer noch ohne Core Dump. Irgendein Werkzeug, das ich benutzen kann, um es aufzuspüren? – dargaud

Antwort

5

OK, fand ich endlich die Ursache (dank jemand bei National Instruments), eine bessere Diagnose und eine Abhilfe.

Der Fehler in vielen Versionen von libxcb ist und ist ein 32-Bit-Zähler Roll Problem, das seit einigen Jahren bekannt ist: https://bugs.freedesktop.org/show_bug.cgi?id=71338

Nicht alle Versionen von libxcb sind betroffen libxcb-1,9-5 hat, libxcb-1.5-1 nicht. Von der Fehlerliste sollte das 64-Bit-Betriebssystem nicht betroffen sein, aber ich habe es bei mindestens einer Version ausgelöst.

Was bringt mich zu einer besseren Diagnose. Das folgende Programm in weniger als 15 Minuten auf die betroffenen Bibliotheken (besser als die ganze Woche dauerte es vorher) abstürzen:

// 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); 
} 

Und eine letzte Sache, die oben prog kompiliert und lief auf einem 64-Bit-System funktioniert gut , Kompiliert und lief auf einem alten 32-Bit-System funktioniert auch gut, aber wenn ich die 32-Bit-Version auf das 64-Bit-System übertrage, stürzt es nach ein paar Minuten ab.

0

Ich hatte gerade ein Programm, das genau so mit genau der gleichen Fehlermeldung handelte. Ich würde erwarten, dass der Counter-Fehler 2^32 Ereignisse vor dem Absturz verarbeitet.

Das Programm wurde so strukturiert, dass ein Worker-Thread eine separate X-Verbindung zum X-Thread hat, sodass er Nachrichten an den X-Thread senden kann, um das Fenster zu aktualisieren.

Am Ende verfolgte ich das Problem bis zu einem Ort, an dem die Funktion das Senden der Ereignisse an das Fenster, um es neu zu zeichnen von mehreren Threads ohne Mutex darauf aufgerufen wurde, und da X zu der gleichen X-Verbindung nicht re ist , mit diesem genauen Fehler abgestürzt. Setzen Sie einen Mutex auf die Funktion und keine Probleme seit.