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.