[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