O debugowaniu słów kilka

Od wczoraj jestem szczęśliwym posiadaczem Nokii N900. Wszystko zaczęło się od niusów o nowym modelu N9. Możliwości jakie ma ten telefon są niesamowite, MeeGo to po prostu Linux przystosowany do działania na komórce (inaczej niż Android albo Bada). Cena jaką sobie jednak życzą sobie za to cudo jest jednakza dużo (ok. 2500 zł średnio). Po wybadaniu tematu dowiedziałem się, że niecałe dwa lata temu wyszła N900, która ma trochę starszy system, Maemo. W każdym razie to dalej zwykły Linux, a komórka sporo tańsza. Ja swoją mam od 6 lat, więc to był dobry moment, żeby zmienić.

Pierwszy cel jaki wyznaczyłem temu urządzeniu to odpalenie swojej starej gry, Oki. Powinno pójść gładko, w końcu kompilator jest ten sam, SDL pod Maemo śmiga ładnie. Oczywiście jak to w życiu tak łatwo nie było. Kompilatory miały drobne różnice. Jaki jest zakres chara w C? Myślałem, że -128 do 127, ale okazało się, że dopuszczalne jest też 0..255. A teraz przejdźmy do głównego tematu posta, czyli jak do tego doszedłem używając debugowania.

Oczywiście użyłem gdb. Na początek trzeba było wpierw przystosować binarkę. Dodałem w opcjach kompilacji parametr -g, który umieści odpowiednie dane w wynikowym pliku, i pozbyłem się optymalizacji (-O2), bo niektóre informacje potem były przez to niewidoczne. Program w trybie debugowania odpala się poleceniem:

gdb ./nazwa_pliku

Po uruchomieniu możemy wstukiwać polecenia do debuggera. Podstawowe to run, continue i quit. Pierwszy uruchamia program, kolejnym możemy kontynuować wykonywanie, kiedy debugger go zastopuje, a ostatnie to oczywiście wyjście z gdb. Działają też pierwsze litery (czyli r, c i q).

Gdy program się wykonuje i nadejdzie upragniony błąd, gdb go stopuje i mamy czas, żeby zbadać dokładnie sytuację. Żeby zobaczyć stos wywoływań wstukujemy backtrace (bt).

(gdb) bt
#0 0x0804a621 in center_text (text=0x8054158 "szatkus 2006", y=50) at font.c:46
#1 0x0804f40f in show_menu () at menu.c:41
#2 0x0804f6a9 in start_menu () at menu.c:87
#3 0x0804b30a in main (args=0x1, argc=0xbffff3c4) at main.c:82

Żeby sprawdzić jaką wartość ma zmienna w tym momencie wywołujemy: print jakaś_zmienna Z tym, że to zachowuje się sprytniej niż printf w C, samo wykrywa typ i wyświetla w miarę szczegółowo. Structy też ogarnia.

Jeśli chcemy postawić swojego breakpointa to używamy:

break nazwa_pliku.c:numer_linii

To co tu przedstawiłem to tylko część możliwości gdb. Taka dobra podstawa, żeby skutecznie debugować swoje programy. Gdybym wiedział o takich narzędziach w liceum, gdy pisałem Okiego moje życie byłoby dużo łatwiejsze :>