[Numbat] Połączenia

Tomasz Mrugalski thomson at klub.com.pl
Wed Feb 28 00:49:01 CET 2007


On Tue, 27 Feb 2007 somebody known as Maciej Jureko wrote:

> Zakładałem, że dla każdego połączenia będzie oddzielna kolejka, więc do
> WMaxConn dodałem obiekt cQueue. Dopiero wczoraj się zorientowałem, że
> powoduje to powstanie błędu "Segmentation fault" (np. na zakończenie
> symulacji lub gdy się kliknie w moduł WMaxMacSS). Myślę co z tym dalej
> zrobić.
Mniam. Lubie takie rebusy. Jest fura możliwości zdebugowania, co tam 
dokładnie nie leży. Można zrobić to wiele sposobów. Oto 3 z nich:

=
1. Skompiluj kod.
2. Uruchom debugger gdb.
3. W gdb załaduj kod: file wimax
4. Uruchom kod: run
5. Doprowadź do wywału.
6. gdb zatrzyma sie w miejscu, gdzie sie rozwaliło.

Możesz teraz obejrzeć, co jest nie tak. Przydatne polecenia:
bt - backtrace, czyli oglądanie, w którym miejscu konrektnie umarł kod i 
jaka seria wywołań do tego doprowadziła.
up - skocz funkcje wyżej
down - skocz funkcje niżej

Całość bedzie obsługiwała się dużo lepiej z emacsa (automatycznie będzie 
wyświetlany kod błędu). Uruchomienie gdb z emacs: esc-x gdb

Wyjasnienie/ostrzeżenie: może być tak, że rozwalasz sobie pamięć, np. 
zwalniając dwukrotnie ten sam objekt albo zapisując do pamięci, które nie 
zaalokowałeś (albo np. alokując 100 bajtów, a zapisując 101). Takie 
niepoprawne akcje niekoeniecznie od razu powodują segfault. One mogą tylko 
zniszczyć system zarządzania pamięcią. Potem kod może wybuchnąć w dowolnym 
momencie związanym z operacjami na pamięci. Warto o tym pamiętać.

=Valgrind to mocarny program pilnujący operacji na pamięci. Sprawdza, czy 
nie robisz jakichś głupot w stylu używania pamięci, której nie 
zaalokowałeś, dwukrotnego zwalniania tej samej pamięci itd. Uruchomienie:

valgrind --tool=memcheck --show-reachable=yes --leak-check=full ./wimax

Uwaga: warto poczytać o opcjach. Trochę ciężkawa lektura za pierwszym 
razem, ale bardzo pouczająca.

=Jeżeli natrafisz na problem, o którym ostrzegałem w podejściu 1, nie 
rozpaczaj. Ja np. prawie biegałem po ścianach, bo zajechałem pamięć, a 
potem kod wybuchał mi na prymitywnym fopen(). Aby tego uniknąć można 
zlinkować kod z biblioteką electric fence, która sprawi, że segfault 
pojawi się dokładnie w miejscu niedozwolonej operacji na pamięci, a nie 
1000 linii później. Aby z niego skorzystać, należy dodać w Makefile'u do 
flag używanyach do linkowania coś takiego: -lefence
Oczywiście należy mieć w systemie zainstalowany electric fence.

> W czwartek/piątek będę trochę bardziej zajęty. Może spotkamy się na
> początku przyszłego tygodnia (poniedziałek, wtorek) - przez weekend
> będzie można jeszcze spokojnie spojrzeć w kod :).
Ok, zatem proponuje poniedziałek. Albo może w sobote sie spotkamy? Co Wy 
na to? Jak Maciek nie poradzi sobie z segfaultem, to możemy nad kodem 
siąść razem i namierzyć, co tam nie działa.

Pzdr,

-- 
Tomasz Mrugalski,              | "We all know Linux is great...it does    |
thomson(at)klub(dot)com(dot)pl |  infinite loops in 5 seconds."           |
                                |                           Linus Torvalds |


More information about the Numbat mailing list