Pisanie kodu nieodzownie jest powiązane z błędami – czy to syntaktycznymi, czy też, nieco trudniejszymi do wykrycia, błędami logicznymi. O ile ten pierwszy przypadek jest dość łatwy do znalezienia i naprawy, ponieważ pomaga nam w tym kompilator, tak już ten drugi może przyprawić o ból głowy. By nam nieco tego bólu oszczędzić, powstało wiele narzędzi oraz metodyk odpluskwiania kodu. Czy jednak kiedykolwiek zastanawialiśmy się, co tak naprawdę kryje się pod maską debuggera? Czemu on w ogóle działa – i jak działa – oraz co zrobić, gdy pracujemy w bardziej wymagających środowiskach i nie mamy dostępu do całego zaplecza narzędzi debugujących? W poniższym artykule postaram się rzucić nieco światła na powyższe zagadnienia, zaczynając od sprzętu, przechodząc przez kernel, a na przestrzeni użytkownika kończąc.
W artykule skupimy się wokół systemów operacyjnych Linux i FreeBSD i spojrzymy na debugger z ich perspektywy. Ponadto sporo czasu poświęcimy na przyjrzenie się sprzętowi. W końcu wsparcie od sprzętu wydaje się niezbędne do debugowania bardziej zawiłych problemów. Sprawdzimy zatem, co producenci architektur takich jak arm64 czy też amd64 dostarczają twórcom systemów operacyjnych oraz programów wbudowanych do ułatwienia debugowania.
Zagadnienia poruszane w tym artykule:
Artykuł pochodzi magazynu Programista nr 82 (3/2019). Jest to wydanie z czerwca 2019 r. Szczegółowy spis treści: https://programistamag.pl/programista-3-2019-82/
Autorem artykuły jest Michał Krawczyk. Programista systemów wbudowanych w krakowskiej firmie Semihalf. Zajmuje się pisaniem sterowników sieciowych w kernelu FreeBSD oraz DPDK. Prywatnie fan gier komputerowych i planszowych, a także entuzjasta niskopoziomowego rozmawiania ze sprzętem oraz grafiki komputerowej.