Autor Wątek: "Maximum number of clients reached"  (Przeczytany 6532 razy)

Offline nargatte

  • Użytkownik

# Sierpień 14, 2013, 16:29:30
Podczas pisania gry zdarza się, że trzeba ją uruchomić kilka razy, a nawet kilka tysięcy razy w celach debugowania. Programuje na Ubuntu 13.04 i za którymś uruchomieniem dostaję taki oto komunikat:
Maximum number of clients reachedMaximum number of clients reachedMaximum number of clients reachedNaruszenie ochrony pamięci (core dumped)Program się oczywiście od razu wyłącza(jeśli w ogóle się włączył). Problem rozwiązuje tylko uruchomienie ponowne komputera. Jakby ktoś pytał to kontekst tworze za pomocą SDL a program piszę w OpenGL. 

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline programistagd

  • Użytkownik
    • WeHaveIdea

# Sierpień 14, 2013, 17:03:33
Co do debugowania, keidy uruchamiasz grę, masz podpięty debugger? (np. gdb)
Bo wtedy teoretycznie powinien ci pokazać miejsce, które powoduje segfaulta i call stack(które funkcje były po kolei wywoływane), więc możesz namierzyć problem.


Chyba, że twój problem polega na tym, że komputer się zawiesza i nie możesz przeglądnąć debuggera. Też mi się to zdarzało, gdy debugowałem grę na OGRE. Niestety nie potrafiłem tego naprawić, ale jeśli chcesz spróbować to może kompilujesz pod Debug, ale bibliotekę masz skompilowaną pod Release (nie jestem pewien czy to powoduje błąd, pewnie nie, ale jedyne co mi przychodzi do głowy).

Offline Xender

  • Użytkownik

# Sierpień 14, 2013, 17:50:46
Czy inne programy korzystające z OpenGL wtedy działają (glxgears)? Inne programy tworzące kontekst OpenGL przez SDL? Może to sprawa sterowników grafiki - jaką masz kartę i drivery (oficjalne czy nie)?

PS. nie zalegają Ci procesy z poprzednich uruchomień (komenda pgrep nazwa_programu)?

Offline nargatte

  • Użytkownik

# Sierpień 14, 2013, 20:44:18
Jeśli chodzi o debugera to przyznam się szczerze, że nie używam. W poprzednim komentarzu użyłem tego słowa jako testowe uruchamianie programów, bez użycia jakichś zewnętrznych programów. Być może utrudniam sobie życie ale jak trzeba sprawdzić nazwę zmiennej to po prostu cout-uje ją sobie. W ustawieniach projektu wyłączyłem opcje debugowania i używam tylko release.

Problem jest o tyle trudny, że pojawia się jak chce. O ile w kodzie jak jest błąd to nie działa program, jak niema to działa, to tu problem pojawi się kiedy chce. Dlatego trudno mi jest sprawdzić czy inne programy działają wtedy czy nie ale w najbliższej okazji sprawdzę. Sterowniki oficjalne, najnowsza wersja opengl i mesy, karta to AMD Radeon HD 6570.

Offline Xender

  • Użytkownik

  • +2
# Sierpień 14, 2013, 22:20:50
@up - Polecam się nauczyć używać debuggera, to nie trudne. ;)

Wypisywanie wartości zmiennych bywa przydatne, ale żadna metoda debugowania nie rozwiąże wszystkich problemów, warto wiedzieć, kiedy czego użyć.

Polecam Gynvaela - https://www.youtube.com/playlist?list=PL5D59D2682ED5B2EA.

Offline nargatte

  • Użytkownik

# Sierpień 15, 2013, 13:21:40
dzięki bardzo za fajne pomoce naukowe

Offline aphity

  • Użytkownik

# Sierpień 15, 2013, 15:32:37
Jeżeli nie masz sensownego punktu zaczepienia, spróbuj metody z zakomentowywaniem kodu (w materiałach Gynvaela gdzieś chyba o tym jest). W Twoim przypadku dodatkową przeszkodą jest to, że do wykrycia błędu trzeba uruchomić program wielokrotnie, co oczywiście warto zautomatyzować. Jak?

Na początek zrób żeby po włączeniu sam się szybko wyłączał, a potem odpal go w bashowej pętli:

Kod: (bash) [Zaznacz]
for((i=1;;++i)); do
    echo "Running #$i..."
    ./program
done

Dzięki temu skrypt sam odpali program po kolei wiele razy. Będziesz mógł sprawdzić po mniej więcej ilu uruchomieniach wyskakuje tamten błąd.

Gdy już będziesz to wiedział, zakomentuj część kodu, przekompiluj program i odpal skrypt ponownie. Jeśli znów się "zepsuje", zakomentuj więcej i uruchom skrypt raz jeszcze. Postępuj tak do momentu gdy zauważysz że problem przestał się pojawiać (tzn. minęło więcej uruchomień niż przedtem, a appka nadal się uruchamia). To oznacza, że odpowiedzialny był ostatnio zakomentowany fragment.

Offline Xender

  • Użytkownik

# Sierpień 15, 2013, 15:55:51
@up - Fajnie, ale to jednak mi wygląda na błąd systemowy. Nawet jest coś o tym na necie.

Offline nargatte

  • Użytkownik

# Sierpień 15, 2013, 16:17:18
Załączyłem ten skrypt i zaczęły się dziać niezłe jaja. Pierwsze uruchomienie działa cały czas tylko wywalała masę błędów że nie znajdywało plików z których korzystam, skopiowałem więc je i pościłem znowu, działało też cały czas tylko nie zrobiłem tak żeby się program od razu wyłączał i klikałem esc cały czas. Uruchomiłem więc środowisko, poprawiłem kod i kiedy włączyłem program z poziomu środowiska pojawiła się ten błąd. Kolejne wywołanie programu ze skryptu dawał ten sam wynik błędu. Zresetowałem komputer. Puściłem odnowa skrypt i działał bez przerwy, nie udało uruchomić się mu tylko w 70 wywołaniu bo GLEW się nie zainicjował, ale 71, 72 i tak dalej uruchamiały się normalnie, wyłączyłem skrypt kiedy doszło do 200. Znów zacząłem wywoływać program z poziomu środowiska, ale tym razem błędu nie było, nic nie było, nie inicjowało okna, nic nie pisało w konsoli, bawiłem się w kodzie chwile ale nic nie poprawiło sytuacji. Tylko reset komputera.   

Offline Xender

  • Użytkownik

# Sierpień 15, 2013, 16:26:26
@up - Czy zrestartowanie X11 pomaga? (pozamykać programy (niezapisane dane itp.), `sudo pkill X`, system powinien podnieść znowu - jak nie podniesie, to zalogować się na TTY (ctrl-alt-[F1 do F6]) i odpalić ręcznie `startx`).

Offline nargatte

  • Użytkownik

# Sierpień 15, 2013, 16:35:33
Najlepszym rozwiązaniem chyba będzie uruchamiać program z poziomu terminala a nie środowiska.

Offline aphity

  • Użytkownik

# Sierpień 15, 2013, 16:59:02
środowisko - masz na myśli IDE? Jeśli tak, to jakiego używasz?

Offline nargatte

  • Użytkownik

# Sierpień 15, 2013, 17:06:22
Code::Blocks IDE

Offline aphity

  • Użytkownik

# Sierpień 15, 2013, 17:09:24
Najlepszym rozwiązaniem chyba będzie uruchamiać program z poziomu terminala a nie środowiska.
Czy dobrze rozumiem, że błąd pojawia się tylko przy odpalaniu z C::B ?

Offline nargatte

  • Użytkownik

# Sierpień 15, 2013, 17:17:55
Sądząc po wynikach zebranych po testowaniu za pomocą tego skryptu to tak. Może problem tkwi w programie UXTerm, to właśnie za pomocą niego C::B uruchamia program.