2014-09-11 15 views
6

Sì, questa domanda è stata posta prima, ma la lettura delle risposte non mi ha illuminato molto.XIO: errore IO irreversibile 11

Ho scritto un programma C che si interrompe dopo alcuni giorni di utilizzo. Un punto importante è che NON genera un file core, anche se tutto è impostato in modo tale che dovrebbe (core_pattern, ulimit -c unlimited, ecc. Posso attivare un core dump fine con kill -SIGQUIT).

I programmi registrano estesamente quello che fa, ma non c'è alcun accenno al crash nel registro. L'unico messaggio visualizzato presso l'incidente (? O prima) è:

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

Quindi due domande: - come è possibile che un crash del programma (ritorno $ = 1?), Senza core dump. - che cos'è questo messaggio di errore e cosa posso fare?

System è RedHat Enterprise 6.4

Edit: sono riuscito a forzare un core dump chiamando abort() dall'interno di un atexit() callback:

(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 

Qualcuno mi può illuminare da questo Problema X11? libcvi.so non è mio, solo MyCode.c (LabWindows/CVI).

Modifica 2014-12-05: Ecco un backtrace ancora più preciso. Le cose accadono sicuramente in X11, ma io non sono un programmatore X11, quindi guardando il codice sorgente di X dal linestell fornito solo che il server X (?) È temporaneamente non disponibile. C'è un modo per dirlo semplicemente di ignorare questo errore se è solo temporaneo?

#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 

linee corrispondenti:

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

Il programma potrebbe perdere descrittori. Guarda nella sua directory '/ proc//fd' dopo che è stata eseguita da un po 'di tempo; vedi un numero maggiore di link in là? –

+0

Di solito ci vogliono diversi giorni prima che si blocca, ma controllerò la situazione. Alcuni googling mi portano a credere che si tratti di un problema multi-monitor Xinerama/NVidia non correlato alla mia app. – dargaud

+0

Rimuovere Xinerama non è stato d'aiuto. Ottengo ancora quegli arresti senza core dump. Qualche strumento che posso usare per rintracciarlo? – dargaud

risposta

5

OK, ho finalmente trovato la causa (grazie a qualcuno al National Instruments), una migliore diagnosi e una soluzione.

il bug è in molte versioni del libxcb ed è un problema contatore rollover a 32 bit che è stato conosciuto per alcuni anni: https://bugs.freedesktop.org/show_bug.cgi?id=71338

Non tutte le versioni di libxcb sono colpiti libxcb-1,9-5 ha, libxcb-1.5-1 no. Dall'elenco dei bug, il sistema operativo a 64 bit non dovrebbe essere interessato, ma sono riuscito a attivarlo su almeno una versione.

Che mi porta a una diagnosi migliore. Il seguente programma andrà in crash in meno di 15 minuti sulle librerie interessate (meglio di tutta la settimana in precedenza preso):

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

E un'ultima cosa, quanto sopra prog compilato e corse su un sistema a 64 bit funziona bene , compilato e eseguito su un vecchio sistema a 32 bit funziona anche bene, ma se trasferisco la versione a 32 bit al sistema a 64 bit, si blocca dopo pochi minuti.

0

Ho appena avuto un programma che ha funzionato esattamente così, con esattamente lo stesso messaggio di errore. Mi aspetterei che il contro errore elabori 2^32 eventi prima di bloccarsi.

Il programma è stato strutturato in modo che un thread di lavoro abbia una connessione X separata al thread X in modo che possa inviare messaggi al thread X per aggiornare la finestra.

Alla fine ho tracciato il problema in un punto in cui la funzione che inviava gli eventi alla finestra per ridisegnarla era chiamata da più thread, senza un mutex, e poiché X alla stessa connessione X non è ri -entrante, si è schiantato con questo errore esatto. Inserisci un mutex sulla funzione e nessun problema da allora.