Linux. Niezbędnik programisty - Helion
Tytuł oryginału: The Linux Programmer's Toolbox
Tłumaczenie: Mikołaj Szczepaniak
ISBN: 978-83-246-1485-1
stron: 736, Format: 200x230, okładka: miękka
Data wydania: 2009-03-06
Księgarnia: Helion
Cena książki: 149,00 zł
Wszystko, czego potrzebujesz,
aby tworzyć wydajny, elastyczny i bezbłędny kod!
- Jaki edytor wybrać?
- Jak działają systemy kontroli wersji?
- Jak zapewnić wysoką wydajność oraz bezbłędne działanie tworzonych rozwiązań?
Programista, jak każdy fachowiec, posiada perfekcyjnie dobrany zestaw narzędzi, pozwalający mu na szybkie, wygodne, elastyczne i - co najważniejsze - optymalne rozwiązywanie postawionych problemów. Wybranie odpowiednich narzędzi i skomponowanie ich zbioru zabiera często wiele dni, miesięcy, a nawet i lat. A przecież my, programiści, nie mamy aż tyle czasu! Koniecznie trzeba znaleźć jakiś szybszy sposób!
Najlepszą odpowiedzią na ten problem jest właśnie niniejsza książka. Dzięki niej opanujesz sposoby pobierania i instalacji różnych narzędzi, a nowo nabyta wiedza na temat sposobów zarządzania pakietami w różnych dystrybucjach na pewno nie pójdzie na marne. W kolejnych rozdziałach poznasz przebieg procesu kompilacji oraz dowiesz się, jak interpretować poszczególne błędy i ostrzeżenia. John Fusco omawia tu także edytory Vim oraz Emacs - ale nie wskazuje, który z nich jest lepszy! Dzięki książce "Linux. Niezbędnik projektanta" wykorzystanie systemów kontroli wersji nie będzie stanowiło dla Ciebie najmniejszego problemu. Na kolejnych stronach szczegółowo omawiane są zasady funkcjonowania jądra systemu oraz sposób działania procesów i komunikacji między nimi. Lektura kolejnych rozdziałów dostarczy Ci niezbędnych informacji na temat zapewniania wysokiej wydajności tworzonych rozwiązań oraz metod diagnozowania problemów z oprogramowaniem.
- Zdobywanie i instalacja oprogramowania open source
- Proces kompilacji kodu źródłowego
- Zarządzanie pakietami w różnych dystrybucjach
- Interpretacja komunikatów o błędach i ostrzeżeń
- Edytory plików tekstowych
- Wykorzystanie systemów kontroli wersji
- Funkcjonowanie jÄ…dra systemu operacyjnego Linux
- Wykorzystanie procesów
- Komunikacja między procesami
- Diagnozowanie problemów z komunikacją pomiędzy procesami
- Zwiększanie wydajności tworzonych rozwiązań
- Wykrywanie problemów w napisanym oprogramowaniu
Osoby które kupowały "Linux. Niezbędnik programisty", wybierały także:
- Bash. Techniki zaawansowane. Kurs video. Zostań administratorem systemów IT 169,00 zł, (50,70 zł -70%)
- Administracja systemem Linux. Kurs video. Przewodnik dla początkujących 59,00 zł, (17,70 zł -70%)
- Gray Hat C#. Język C# w kontroli i łamaniu zabezpieczeń 57,74 zł, (17,90 zł -69%)
- Python dla administrator 178,97 zł, (62,64 zł -65%)
- Cybersecurity dla ka 144,86 zł, (52,15 zł -64%)
Spis treści
Linux. Niezbędnik programisty -- spis treści
Słowo wstępne (17)
Przedmowa (19)
Podziękowania (25)
O autorze (27)
Rozdział 1. Pobieranie i instalacja narzędzi oferowanych w trybie open source (29)
- 1.1. Wprowadzenie (29)
- 1.2. Czym jest tryb open source? (30)
- 1.3. Co idea otwartego dostÄ™pu do kodu źródÅ‚owego oznacza dla nas? (30)
- 1.3.1. Odnajdywanie właściwych narzędzi (31)
- 1.3.2. Formaty dystrybucji oprogramowania (32)
- 1.4. Wprowadzenie do tematyki plików archiwalnych (33)
- 1.4.1. Identyfikacja plików archiwalnych (35)
- 1.4.2. PrzeglÄ…danie zawartoÅ›ci plików archiwalnych (36)
- 1.4.3. Rozpakowywanie plików z pliku archiwalnego (40)
- 1.5. Poznajmy wykorzystywany menedżer pakietów (42)
- 1.5.1. Wybór pomiÄ™dzy kodem źródÅ‚owym a wersjÄ… binarnÄ… (43)
- 1.5.2. Praca z pakietami (46)
- 1.6. Kilka sÅ‚ów o bezpieczeÅ„stwie w kontekÅ›cie pakietów (46)
- 1.6.1. Potrzeba uwierzytelniania (48)
- 1.6.2. Podstawowe uwierzytelnianie pakietów (49)
- 1.6.3. Uwierzytelnianie pakietów z podpisami cyfrowymi (51)
- 1.6.4. Podpisy narzÄ™dzia GPG, stosowane dla pakietów RPM (52)
- 1.6.5. Kiedy uwierzytelnienie pakietu jest niemożliwe (56)
- 1.7. Analiza zawartości pakietu (57)
- 1.7.1. Jak analizować pobrane pakiety (59)
- 1.7.2. SzczegóÅ‚owa analiza pakietów RPM (61)
- 1.7.3. SzczegóÅ‚owa analiza pakietów Debiana (62)
- 1.8. Aktualizowanie pakietów (64)
- 1.8.1. APT 3 Advanced Package Tool (66)
- 1.8.2. YUM 3 Yellowdog Updater Modified (67)
- 1.8.3. Synaptic 3 nakładka narzędzia APT z graficznym interfejsem użytkownika (67)
- 1.8.4. up2date 3 narzędzie aktualizujące pakiety dystrybucji Red Hat (69)
- 1.9. Podsumowanie (71)
- 1.9.1. Narzędzia użyte w tym rozdziale (71)
- 1.9.2. Materiały dostępne w internecie (72)
RozdziaÅ‚ 2. Kompilacja kodu źródÅ‚owego (73)
- 2.1. Wprowadzenie (73)
- 2.2. Narzędzia kompilujące (74)
- 2.2.1. Rys historyczny (74)
- 2.2.2. Zrozumieć program make (77)
- 2.2.3. Jak przebiega proces Å‚Ä…czenia programów (103)
- 2.2.4. Zrozumieć biblioteki (104)
- 2.3. Proces kompilacji (109)
- 2.3.1. Narzędzia kompilacji GNU (110)
- 2.3.2. Etap konfiguracji (skrypt configure) (111)
- 2.3.3. Etap kompilacji 3 narzędzie make (113)
- 2.3.4. Etap instalacji 3 polecenie make install (114)
- 2.4. Zrozumieć błędy i ostrzeżenia (115)
- 2.4.1. Typowe błędy w plikach Makefile (115)
- 2.4.2. Błędy na etapie konfiguracji (119)
- 2.4.3. Błędy na etapie kompilacji (120)
- 2.4.4. Zrozumieć błędy kompilatora (124)
- 2.4.5. Zrozumieć ostrzeżenia kompilatora (126)
- 2.4.6. Zrozumieć błędy programu łączącego (138)
- 2.5. Podsumowanie (140)
- 2.5.1. Narzędzia użyte w tym rozdziale (140)
- 2.5.2. Materiały dostępne w internecie (141)
Rozdział 3. Szukanie pomocy (143)
- 3.1. Wprowadzenie (143)
- 3.2. Narzędzia pomocy elektronicznej (144)
- 3.2.1. Strona man (144)
- 3.2.2. Organizacja stron man (145)
- 3.2.3. Przeszukiwanie stron man - narzędzie apropos (149)
- 3.2.4. Poszukiwanie właściwych stron man - polecenie whatis (151)
- 3.2.5. Czego należy szukać na stronach man (152)
- 3.2.6. Kilka szczególnie przydatnych stron man (153)
- 3.2.7. Narzędzie info projektu GNU (155)
- 3.2.8. PrzeglÄ…danie stron info (156)
- 3.2.9. Przeszukiwanie stron info (159)
- 3.2.10. Zalecane strony info (160)
- 3.2.11. Narzędzia pomocy uruchamiane na pulpicie (160)
- 3.3. PozostaÅ‚e źródÅ‚a pomocy (162)
- 3.3.1. Katalog /usr/share/doc (162)
- 3.3.2. Odwołania do innych stron oraz mechanizmy indeksowania (163)
- 3.3.3. Zapytania kierowane do pakietów (164)
- 3.4. Formaty dokumentacji (166)
- 3.4.1. Formaty TeX, LaTeX i DVI (166)
- 3.4.2. Format Texinfo (167)
- 3.4.3. Format DocBook (168)
- 3.4.4. Język HTML (169)
- 3.4.5. Język PostScript (171)
- 3.4.6. Format PDF (173)
- 3.4.7. Język troff (174)
- 3.5. ŹródÅ‚a informacji w internecie (174)
- 3.5.1. Witryna http://www.gnu.org/ (175)
- 3.5.2. Witryna http://SourceForge.net/ (175)
- 3.5.3. Witryna projektu The Linux Documentation Project (176)
- 3.5.4. Grupy dyskusyjne Usenet (177)
- 3.5.5. Listy dyskusyjne (177)
- 3.5.6. Pozostałe fora (178)
- 3.6. Odnajdywanie informacji o jÄ…drze systemu Linux (178)
- 3.6.1. Kompilacja jÄ…dra (178)
- 3.6.2. Moduły jądra (180)
- 3.6.3. PozostaÅ‚e źródÅ‚a dokumentacji (182)
- 3.7. Podsumowanie (182)
- 3.7.1. Narzędzia użyte w tym rozdziale (182)
- 3.7.2. Materiały dostępne w internecie (183)
RozdziaÅ‚ 4. Edycja i konserwacja plików źródÅ‚owych (185)
- 4.1. Wprowadzenie (185)
- 4.2. Edytor tekstu (186)
- 4.2.1. Edytor domyślny (188)
- 4.2.2. Jakich funkcji należy szukać w edytorze tekstu (188)
- 4.2.3. Wielka dwójka - vi oraz Emacs (190)
- 4.2.4. Vim - udoskonalony edytor vi (191)
- 4.2.5. Edytor Emacs (215)
- 4.2.6. Atak klonów (227)
- 4.2.7. Podstawowe informacje o kilku edytorach tekstu z graficznym interfejsem użytkownika (230)
- 4.2.8. Wymagania pamięciowe (235)
- 4.2.9. Podsumowanie wiadomości o edytorach (237)
- 4.3. Kontrola wersji (238)
- 4.3.1. Podstawy kontroli wersji (238)
- 4.3.2. Terminologia obowiązująca w świecie kontroli wersji (240)
- 4.3.3. Narzędzia pomocnicze (243)
- 4.3.4. Podstawy poleceń diff i patch (243)
- 4.3.5. PrzeglÄ…danie i scalanie zmian (247)
- 4.4. UpiÄ™kszacze i przeglÄ…darki kodu źródÅ‚owego (254)
- 4.4.1. UpiÄ™kszacze wcięć w kodzie źródÅ‚owym (255)
- 4.4.2. Artystyczny styl narzędzia astyle (258)
- 4.4.3. Analiza kodu za pomocą narzędzia cflow (259)
- 4.4.4. Analiza kodu za pomocą narzędzia ctags (262)
- 4.4.5. Przeglądanie kodu za pomocą narzędzia cscope (262)
- 4.4.6. Przeglądanie i dokumentowanie kodu za pomocą narzędzia Doxygen (264)
- 4.4.7. Analiza kodu źródÅ‚owego z wykorzystaniem kompilatora (266)
- 4.5. Podsumowanie (268)
- 4.5.1. Narzędzia użyte w tym rozdziale (269)
- 4.5.2. Bibliografia (270)
- 4.5.3. Materiały dostępne w internecie (270)
Rozdział 5. Co każdy programista powinien wiedzieć o jądrze systemu (273)
- 5.1. Wprowadzenie (273)
- 5.2. Tryb użytkownika a tryb jądra (274)
- 5.2.1. Wywołania systemowe (276)
- 5.2.2. Przenoszenie danych pomiędzy przestrzenią użytkownika a przestrzenią jądra (278)
- 5.3. Mechanizm szeregowania procesów (279)
- 5.3.1. ReguÅ‚y szeregowania procesów (279)
- 5.3.2. Blokowanie, wywłaszczanie i rezygnacje (282)
- 5.3.3. Priorytety szeregowania i kwestia sprawiedliwości (283)
- 5.3.4. Priorytety i wartość nice (287)
- 5.3.5. Priorytety czasu rzeczywistego (289)
- 5.3.6. Tworzenie procesów czasu rzeczywistego (292)
- 5.3.7. Stany procesów (294)
- 5.3.8. Jak jest mierzony czas pracy procesów (301)
- 5.4. Zrozumieć urządzenia i sterowniki urządzeń (313)
- 5.4.1. Rodzaje sterowników urzÄ…dzeÅ„ (314)
- 5.4.2. Słowo o modułach jądra (316)
- 5.4.3. Węzły urządzeń (317)
- 5.4.4. Urządzenia i operacje wejścia-wyjścia (330)
- 5.5. Mechanizm szeregowania operacji wejścia-wyjścia (340)
- 5.5.1. Winda Linusa (znana też jako noop) (342)
- 5.5.2. Mechanizm szeregowania operacji wejścia-wyjścia z terminem granicznym (343)
- 5.5.3. Przewidujący mechanizm szeregowania operacji wejścia-wyjścia (344)
- 5.5.4. Mechanizm szeregowania operacji wejścia-wyjścia z pełnym kolejkowaniem (344)
- 5.5.5. Wybór mechanizmu szeregowania operacji wejÅ›cia-wyjÅ›cia (344)
- 5.6. Zarządzanie pamięcią w przestrzeni użytkownika (345)
- 5.6.1. Omówienie pamiÄ™ci wirtualnej (346)
- 5.6.2. Wyczerpanie dostępnej pamięci (363)
- 5.7. Podsumowanie (378)
- 5.7.1. Narzędzia użyte w tym rozdziale (378)
- 5.7.2. Interfejsy API omówione w tym rozdziale (379)
- 5.7.3. Materiały dostępne w internecie (379)
- 5.7.4. Bibliografia (379)
Rozdział 6. Zrozumieć procesy (381)
- 6.1. Wprowadzenie (381)
- 6.2. SkÄ…d siÄ™ biorÄ… procesy (381)
- 6.2.1. Wywołania systemowe fork i vfork (382)
- 6.2.2. Kopiowanie przy zapisie (383)
- 6.2.3. Wywołanie systemowe clone (384)
- 6.3. Funkcje z rodziny exec (384)
- 6.3.1. Skrypty wykonywalne (385)
- 6.3.2. Wykonywalne pliki obiektów (387)
- 6.3.3. Rozmaite binaria (389)
- 6.4. Synchronizacja procesów za pomocÄ… funkcji wait (392)
- 6.5. Wymagania pamięciowe procesu (394)
- 6.5.1. Deskryptory plików (397)
- 6.5.2. Stos (404)
- 6.5.3. Pamięć rezydentna i pamięć zablokowana (405)
- 6.6. Ustawianie ograniczeÅ„ dla procesów (406)
- 6.7. Procesy i system plików procfs (410)
- 6.8. Narzędzia do zarządzania procesami (413)
- 6.8.1. Wyświetlanie informacji o procesach za pomocą polecenia ps (413)
- 6.8.2. Zaawansowane informacje o procesach, uzyskiwane z wykorzystaniem formatów (416)
- 6.8.3. Odnajdywanie procesów wedÅ‚ug nazw za pomocÄ… poleceÅ„ ps i pgrep (419)
- 6.8.4. Śledzenie wymagań pamięciowych procesu za pomocą polecenia pmap (420)
- 6.8.5. WysyÅ‚anie sygnaÅ‚ów do procesów identyfikowanych przez nazwy (422)
- 6.9. Podsumowanie (423)
- 6.9.1. Wywołania systemowe i interfejsy API użyte w tym rozdziale (423)
- 6.9.2. Narzędzia użyte w tym rozdziale (424)
- 6.9.3. Materiały dostępne w internecie (424)
Rozdział 7. Komunikacja pomiędzy procesami (425)
- 7.1. Wprowadzenie (425)
- 7.2. Technika IPC z wykorzystaniem zwykÅ‚ych plików (426)
- 7.2.1. Blokowanie plików (431)
- 7.2.2. Wady implementacji techniki IPC z wykorzystaniem plików (432)
- 7.3. Pamięć wspóÅ‚dzielona (432)
- 7.3.1. ZarzÄ…dzanie pamiÄ™ciÄ… wspóÅ‚dzielonÄ… za poÅ›rednictwem interfejsu POSIX API (433)
- 7.3.2. ZarzÄ…dzanie pamiÄ™ciÄ… wspóÅ‚dzielonÄ… za poÅ›rednictwem interfejsu System V API (437)
- 7.4. Sygnały (440)
- 7.4.1. WysyÅ‚anie sygnaÅ‚ów do procesu (441)
- 7.4.2. ObsÅ‚uga sygnaÅ‚ów (442)
- 7.4.3. Maska sygnaÅ‚ów i obsÅ‚uga sygnaÅ‚ów (444)
- 7.4.4. Sygnały czasu rzeczywistego (447)
- 7.4.5. Zaawansowane operacje na sygnałach z wykorzystaniem funkcji sigqueue i sigaction (450)
- 7.5. Potoki (453)
- 7.6. Gniazda (454)
- 7.6.1. Tworzenie gniazd (455)
- 7.6.2. Przykład gniazda lokalnego, utworzonego za pomocą funkcji socketpair (458)
- 7.6.3. Przykład aplikacji klient-serwer, zbudowanej z wykorzystaniem gniazd lokalnych (459)
- 7.6.4. Przykład aplikacji klient-serwer, zbudowanej z wykorzystaniem gniazd sieciowych (465)
- 7.7. Kolejki komunikatów (466)
- 7.7.1. Kolejka komunikatów standardu System V (467)
- 7.7.2. Kolejka komunikatów standardu POSIX (471)
- 7.7.3. Różnice dzielÄ…ce kolejki komunikatów standardów POSIX i System V (476)
- 7.8. Semafory (477)
- 7.8.1. Interfejs API semaforów standardu POSIX (483)
- 7.8.2. Interfejs API semaforów standardu System V (486)
- 7.9. Podsumowanie (488)
- 7.9.1. Wywołania systemowe i interfejsy API użyte w tym rozdziale (489)
- 7.9.2. Bibliografia (490)
- 7.9.3. Materiały dostępne w internecie (490)
RozdziaÅ‚ 8. Diagnozowanie mechanizmów komunikacji miÄ™dzyprocesowej za pomocÄ… poleceÅ„ powÅ‚oki (491)
- 8.1. Wprowadzenie (491)
- 8.2. Narzędzia operujące na otwartych plikach (491)
- 8.2.1. Polecenie lsof (492)
- 8.2.2. Polecenie fuser (493)
- 8.2.3. Polecenie ls (494)
- 8.2.4. Polecenie file (495)
- 8.2.5. Polecenie stat (495)
- 8.3. Zrzucanie danych z pliku (496)
- 8.3.1. Polecenie strings (499)
- 8.3.2. Polecenie xxd (500)
- 8.3.3. Polecenie hexdump (501)
- 8.3.4. Polecenie od (502)
- 8.4. Narzędzia powłoki do obsługi komunikacji międzyprocesowej standardu System V (504)
- 8.4.1. Pamięć wspóÅ‚dzielona standardu System V (504)
- 8.4.2. Kolejki komunikatów standardu System V (507)
- 8.4.3. Semafory standardu System V (509)
- 8.5. Narzędzia powłoki do obsługi komunikacji międzyprocesowej standardu POSIX (510)
- 8.5.1. Pamięć wspóÅ‚dzielona standardu POSIX (510)
- 8.5.2. Kolejki komunikatów standardu POSIX (511)
- 8.5.3. Semafory standardu POSIX (512)
- 8.6. Narzędzia pomocne w pracy z sygnałami (514)
- 8.7. Narzędzia pomocne w pracy z potokami i gniazdami (516)
- 8.7.1. Potoki i struktury FIFO (517)
- 8.7.2. Gniazda (518)
- 8.8. Identyfikacja plików i obiektów IPC na podstawie i-wÄ™zÅ‚ów (521)
- 8.9. Podsumowanie (523)
- 8.9.1. Narzędzia wykorzystane w tym rozdziale (523)
- 8.9.2. Materiały dostępne w internecie (523)
Rozdział 9. Doskonalenie wydajności (525)
- 9.1. Wprowadzenie (525)
- 9.2. Wydajność systemu (525)
- 9.2.1. Problemy związane z pamięcią (526)
- 9.2.2. Wykorzystanie procesora i rywalizacja o dostęp do magistrali (537)
- 9.2.3. UrzÄ…dzenia i przerwania (541)
- 9.2.4. NarzÄ™dzia umożliwiajÄ…ce identyfikacjÄ™ problemów w zakresie wydajnoÅ›ci systemu (550)
- 9.3. Wydajność aplikacji (560)
- 9.3.1. Pierwsze kroki - polecenie time (560)
- 9.3.2. Zrozumieć architekturę procesora z wykorzystaniem narzędzia x86info (561)
- 9.3.3. Stosowanie pakietu Valgrind do analizy efektywnoÅ›ci rozkazów (565)
- 9.3.4. Wprowadzenie do narzędzia ltrace (570)
- 9.3.5. Stosowanie narzędzia strace do monitorowania wydajności programu (572)
- 9.3.6. Tradycyjne programy do optymalizacji oprogramowania - gcov oraz gprof (574)
- 9.3.7. Podstawowe informacje o narzędziu OProfile (583)
- 9.4. Wydajność w środowisku wieloprocesorowym (590)
- 9.4.1. Rodzaje systemów SMP (591)
- 9.4.2. Programowanie dla komputerów SMP (596)
- 9.5. Podsumowanie (600)
- 9.5.1. Omówione w tym rozdziale problemy zwiÄ…zane z wydajnoÅ›ciÄ… (601)
- 9.5.2. Terminy wprowadzone w tym rozdziale (601)
- 9.5.3. Narzędzia wykorzystane w tym rozdziale (601)
- 9.5.4. Materiały dostępne w internecie (602)
- 9.5.5. Bibliografia (602)
Rozdział 10. Diagnozowanie oprogramowania (603)
- 10.1. Wprowadzenie (603)
- 10.2. Najprostsze narzędzie diagnostyczne - funkcja printf (604)
- 10.2.1. Problemy związane ze stosowaniem funkcji printf w roli narzędzia diagnostycznego (604)
- 10.2.2. Efektywne korzystanie z funkcji printf (610)
- 10.2.3. Kilka sÅ‚ów podsumowania metod diagnozowania oprogramowania z wykorzystaniem funkcji printf (620)
- 10.3. Jak opanować podstawy debugera GNU - gdb (622)
- 10.3.1. Wykonywanie kodu pod kontrolÄ… debugera gdb (623)
- 10.3.2. Zatrzymywanie i wznawianie wykonywania kodu (624)
- 10.3.3. Analiza i modyfikowanie danych (636)
- 10.3.4. Dołączanie debugera gdb do pracującego procesu (649)
- 10.3.5. Diagnozowanie plików rdzenia (649)
- 10.3.6. Diagnozowanie programów wielowÄ…tkowych za pomocÄ… debugera gdb (653)
- 10.3.7. Diagnozowanie zoptymalizowanego kodu (655)
- 10.4. Diagnozowanie obiektów dzielonych (659)
- 10.4.1. Kiedy i dlaczego stosujemy obiekty dzielone (659)
- 10.4.2. Tworzenie obiektów dzielonych (660)
- 10.4.3. Lokalizowanie obiektów dzielonych (661)
- 10.4.4. Nadpisywanie domyÅ›lnych lokalizacji obiektów dzielonych (662)
- 10.4.5. Problemy zwiÄ…zane z bezpieczeÅ„stwem obiektów dzielonych (663)
- 10.4.6. Narzędzia wykorzystywane w pracy z obiektami dzielonymi (663)
- 10.5. Poszukiwanie problemów zwiÄ…zanych z pamiÄ™ciÄ… (667)
- 10.5.1. Podwójne zwalnianie pamiÄ™ci (668)
- 10.5.2. Wycieki pamięci (668)
- 10.5.3. PrzepeÅ‚nienia buforów (669)
- 10.5.4. Narzędzia biblioteki standardowej glibc (671)
- 10.5.5. Diagnozowanie problemów zwiÄ…zanych z pamiÄ™ciÄ… za pomocÄ… pakietu Valgrind (675)
- 10.5.6. Identyfikacja przepełnień za pomocą debugera Electric Fence (682)
- 10.6. Techniki niekonwencjonalne (685)
- 10.6.1. Tworzenie własnych czarnych skrzynek (685)
- 10.6.2. Åšledzenie wsteczne w czasie wykonywania (688)
- 10.6.3. Wymuszanie zrzutów rdzenia (691)
- 10.6.4. Stosowanie sygnaÅ‚ów (692)
- 10.6.5. Diagnozowanie oprogramowania z wykorzystaniem systemu pakietu procfs (693)
- 10.7. Podsumowanie (696)
- 10.7.1. Narzędzia wykorzystane w tym rozdziale (697)
- 10.7.2. Materiały dostępne w internecie (697)
- 10.7.3. Bibliografia (697)
Skorowidz (699)