2014-09-11 15 views
6

Tak, to pytanie zostało zadane wcześniej, ale przeczytanie odpowiedzi nie oświeciło mnie zbyt wiele.XIO: fatalny błąd IO 11

Napisałem program w języku C, który zawiesza się po kilku dniach używania. Ważnym punktem jest to, że NIE generuje pliku core, mimo że wszystko jest ustawione tak, że powinno (core_pattern, ulimit -c unlimited, itd. Mogę wyzwolić core dump fine z kill -SIGQUIT).

Programy szeroko rejestrują, co robi, ale w dzienniku nie ma żadnej wskazówki na temat awarii. Jedyny komunikat wyświetlany w katastrofie (? Lub wcześniej) jest:

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

Więc dwa pytania: - Jak to możliwe, aby program mógł upaść (powrót $ = 1?) Bez zrzutu pamięci. - o czym jest ten komunikat o błędzie i co mogę zrobić?

System to RedHat Enterprise 6.4

Edit: udało mi się wymusić zrzutu poprzez wywołanie abort() od wewnątrz 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 

Każdy może mnie oświecić jak to Problem X11? libcvi.so nie jest mój, tylko MyCode.c (LabWindows/CVI).

Edycja 2014-12-05: Oto jeszcze dokładniejszy ślad wstecz. Rzeczy zdecydowanie zdarzają się w X11, ale nie jestem programistą X11, więc patrząc na kod źródłowy X z podanego linestell mnie tylko, że serwer X (?) Jest chwilowo niedostępny. Czy istnieje sposób, aby po prostu powiedzieć, aby zignorować ten błąd, jeśli jest to tylko tymczasowe?

#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 

Odpowiednie linie:

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

Twój program może wyciekać z deskryptorów. Po jego uruchomieniu zajrzyj do katalogu '/ proc//fd'; widzisz tam zwiększoną liczbę linków? –

+0

Zwykle trwa kilka dni zanim się zawiesi, ale będę monitorował sytuację. Niektóre badania goszczące prowadzą mnie do przekonania, że ​​jest to problem z wieloma monitorami Xinerama/NVidia, niezwiązany z moją aplikacją. – dargaud

+0

Usunięcie Xineramy nie pomogło. Nadal dostaję te wypadki bez zrzutu pamięci. Jakieś narzędzie, za pomocą którego mogę je wyśledzić? – dargaud

Odpowiedz

5

OK, w końcu znalazłem przyczynę (dzięki kogoś w National Instruments), lepiej diagnostycznych i obejście.

Błąd jest w wielu wersjach libxcb i jest 32-bitowy licznik rollover problemem, który został znany od kilku lat: https://bugs.freedesktop.org/show_bug.cgi?id=71338

nie dotyczy wszystkich wersji libxcb libxcb-1.9-5 ma, libxcb-1.5-1 nie ma. Z listy błędów nie powinno to wpłynąć na 64-bitowy system operacyjny, ale udało mi się go uruchomić w co najmniej jednej wersji.

Co prowadzi mnie do lepszej diagnostyki. Poniższy program padnie w mniej niż 15 minut na dotkniętych bibliotek (lepsze niż cały tydzień że uprzednio odbył):

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

i jeden końcowy rzeczy, powyższe prog skompilowany i pobiegł na systemie 64-bitowym działa poprawnie skompilowany i uruchomiony na starym 32-bitowym systemie działa również dobrze, ale jeśli przeniesię 32-bitową wersję do 64-bitowego systemu, to zawiesza się po kilku minutach.

0

Po prostu miałem program, który działał dokładnie tak, z dokładnie tym samym komunikatem o błędzie. Oczekuję, że błąd licznika przetworzy zdarzenia 2^32 przed awarią.

Program został skonstruowany w taki sposób, że wątek roboczy ma oddzielne połączenie X z wątkiem X, dzięki czemu może wysyłać wiadomości do wątku X, aby zaktualizować okno.

W końcu śledziłem problem do miejsca, w którym funkcja wysyłająca zdarzenia do okna, aby ją przerysować, została wywołana przez wiele wątków, bez muteksu, a ponieważ X do tego samego połączenia X nie jest ponownie -entrant, rozbił się z tym dokładnie błędem. Wstaw mutex funkcji i nie ma problemów, ponieważ.

Powiązane problemy