Odpluskwianie

Valid XHTML 1.0 Transitional

Spis treści:

Część Pierwsza:

(Mateusz Wykurz)

  1. Generalnie o błędach, ich źródłach i sposobach radzenia sobie z nimi.
  2. Co to jest i do czego służy debuger?
  3. Jak używać odpluskwiacza?
  4. Spojrzenie od strony technicznej

Część druga:

(Robert Źrałek)

  1. Wirtualne komputery
  2. Odpluskwianie Windows
  3. Odpluskwianie jądra Linuxa

Część trzecia:

(Michał Przybyłek)

  1. Inny Świat
    1. Czynniki determinują?ce niezawodność aplikacji
    2. Genera i Common Lisp
    3. Degres technologiczny lat '80 - od Lispu do Uniksa i C (Speedability beats Reliability)
    4. Powrót do idei z czasów Lispu (Reliability beats Speedability)
  2. Wycieki zasobów, profilery i debuggowanie w wysokopoziomowych środowiskach programistycznych
    1. Wycieki zasobów
    2. Profilery
    3. Profilery w Eclipse i NetBeans
    4. Profiler Valgrind
    5. Odpluskwiacze Eclipse i NetBeans


Generalnie o błędach, ich źródłach i sposobach radzenia sobie z nimi.

Bug

  1. Bug to w żargonie programistycznym określenie na warunek, który uważasz za prawdziwy, a jest on w rzeczywistości fałszywy, tj. nie jest spełniony np.:
  2. Najpopularniejsze źródła błędów programistycznych to:

Literatura:
Jon Bentley "Perełki Oprogramowania", WNT 2001

Spis treści

Strategie usuwania błędów:

Strategie usuwania błędów:

Czyli ogólne metody odpluskwiania (lokalizowania błędu):

  1. Myślenie nad kodem i wykonywanie go na papierze
  2. Wypisywanie komunikatów na konsolę
  3. Asercje
  4. Testowanie

Kiedy używać debugera?

Kiedy zlokalizowanie błędu innymi metodami jest wystarczająco trudne, np.:

Kiedy NIE używać debugera:

Literatura:
Jon Bentley "Perełki Oprogramowania", WNT 2001
Ian Sommerville "Inżynieria Oprogramowania", WNT 2003

Spis treści

Co to jest i do czego służy debuger?

Jakie narzędzia mamy do dyspozycji (pod linuxem)?

  1. Darmowe
  2. Komercyjne:

Spis treści

Jak używać odpluskwiacza?

Gdb w akcji:

Do czego służy debuger:

Za pomocą debugera zwykle możemy:

  1. Prześledzić wykonanie programu
  2. Monitorować
  3. Dodatkowo niektóre narzędzia pozwalają:

Jak taki debuger wygląda?

  1. Debuger zintegrowany z większym narzędziem, tj. Borland C++ Builder
  2. Debuger jako osobny, pojedynczy program
  3. Debuger jako grupa programów (połączona być może wspólnym interfejsem). Składowe takiego kombajnu to zwykle:

Insight w akcji:

Przykład użycia odpluskwiacza (GDB)

  1. Kompilujemy program z użyciem odpowiednich komend
  2. Linkujemy
  3. Uruchamiamy sesję (gdb <nazwa_programu>)
    1. Ustawiamy breakpointy:
      • break <nazwa_funkcji>
    2. Przesuwamy się po kodzie:
      • n(ext), s(tep)
    3. Oglądamy stos wywołań dla funkcji:
      • bt (backtrace)
    4. Sprawdzamy wartości zmiennych:
      • p(rint) <zmienna>
    5. Ustawiamy wartości zmiennych
      • p(rint) <zmienna>=<wartość> (wartość - może zawierać wywołania funkcji i przpisania)
    6. Oglądamy kod z miejsca w którym jesteśmy
      • l(ist)

Jak jeszcze można korzystać z GDB?

  1. DDD - Data Display Debugger, front-end dla debuger-ów takich jak GDB, DBX, WDB, Ladebug, JDB, XDB? Znany ze względu na możliwość wyświetlania struktur danych w postaci grafów
  2. Insight - wersja GDB z GUI (nie front-end). Projekt jest wspierany przez Red Hat.
  3. ElectricFence - pozwala zatrzymać program na instrukcji, która wyszła poza zaalokowaną (za pomocą malloc-a) pamięć
  4. Uruchamianie GDB z podaniem pliku core (gdb pokaże, która linia kodu wywołała błąd)

Linki

DDD w akcji:

Spis treści

Spojrzenie od strony technicznej

  1. Opcje odpluskwiania w GCC
  2. Formaty plików obiektowych i przygotowanych do odpluskwiania.

Spis treści

Opcje odpluskwiania w GCC

  1. "-g"
  2. "-g-O"
  3. "-g3"

Dlaczego warto ich używać?

  1. Po co kusić los?
  2. Wiele kompilatorów zezwala na jednoczesną optymalizacje, czyli kompilację z opcją "-g -O"

Dlaczego możemy nie chcieć ich używać?

  1. Zwiększają rozmiar pliku wynikowego

Linki

Spis treści

Formaty plików obiektowych i przygotowanych do odpluskwiania.

Pliki obiektowe:

  1. Pliki obiektowe są tworzone przez kompilator i na ogół zawierają:
  2. Program wykonywalny powstaje poprzez połączenie przez linker plików obiektowych.

Formaty "debug info" dla plików pod Unix-em

  1. Stab (Symbol TABle): a.out, COFF, (non System V) ELF
  2. DWARF: (System V) ELF

Spis treści


Wirtualne komputery

Spis treści

1. VMware

VMware Workstation (obecnie w wersji 5.5) jest aplikacją komercyjną, dostępną dla systemów Windows NT/2000/2003 Server/XP oraz Linux. Wirtualna maszyna VMware jest potężnym narzędziem do wizualizacji środowiska i aplikacji, które można uruchamiać pod wieloma systemami operacyjnymi. Dzięki VMware możemy pod kontrolą Windows używać aplikacji Linuksa i odwrotnie. VMware "udaje" cały komputer - od BIOSu, systemu operacyjnego, aż po urządzenia wejścia/wyjścia. VMware jest produktem dla osób, które pracując na stacjach roboczych pod kontrolą jednego systemu, nie chcą się pozbawiać możliwości korzystania z aplikacji innego systemu.

Użytkownik może uruchomić niemal dowolny system operacyjny jako przenośną wirtualną maszynę z pełną obsługą sieci bez konieczności rebootowania komputera i  bez konieczności partycjonowania dysku. VMware służy raczej do uruchamiania pełnych systemów, wraz z dźwiękiem, grafiką, animacją i skomplikowanymi aplikacjami.

Każda wirtualna maszyna dostarcza platformy, w której każdy nowy system operacyjny jest w stanie widzieć następujące urządzenia.

  • Processor
  • Chip Set
  • BIOS
  • Memory
  • Graphics
  • IDE Drives
  • SCSI Devices
  • Floppy Drives
  • Serial (COM) Ports
  • Parallel (LPT) Ports
  • USB ports
  • Keyboard
  • Mouse and Drawing Tablets
  • Ethernet Card
  • Sound
  • Virtual Networking

Nie oznacza to jednak, że sprzęt, który fizycznie mamy zainstalowany w komputerze będzie tak samo widziany przez system operacyjny. Istnieje możliwość udawania kilku procesorów na maszynie jednoprocesorowej z hyperthreading lub dual-core. Istnieje również udawanie jednego procesora na maszynie wieloprocesorowej.
Obecnie BIOS-em jaki jest udostępniony wraz w VMware jest PhoenixBIOS™ 4.0 Release 6 with VESA BIOS.
Program udostępnia także dostęp do bardziej "realnych" urządzeń, takich jak USB.



Systemy operacyjne jaki można uruchomić jako gość na wirtualnej maszynie VMware Workstation:




Dla kogo VMware:


 
Zalety:


Wady:


2. UML (User Mode Linux)

User mode linux pozwala na odpalenie jądra linuxa pod uruchomionym jądrem w przestrzeni użytkownika (dlatego user mode). UML jest prostym i bezpiecznym sposobem na uruchomienie innych wersji linuxa i procesów linuxa pod istniejącym systemem bez ryzykowania uszkodzenia głównej konfiguracji sysemu.

W praktyce oznacza to ze tworzymy zupełnie wirtualna maszynę z możliwością posiadania większej ilości wirtualnego sprzętu i oprogramowania niż fizycznie znajduje się w komputerze. Wirtualnej maszynie można również udostępnić lub zabronić dostępu do dowolnego zasobu sprzętowego. Co teoretycznie zmniejsza zagrożenia uszkodzenia prawdziwego komputera.
UML nie emuluje całego komputera, działa za to jako kolejny proces użytkownika, co oczywiście wystarcza do zainstalowania dowolnego Linuksa. Jego podstawowe zastosowanie to możliwość stworzenia wirtualnej sieci, choć może także służyć jako system pomiarowy przepustowości sieci (potrafi obsługiwać wiele urządzeń sieciowych zainstalowanych na pojedynczym komputerze). Za pomocą UML można nawet stworzyć udostępniane wzajemnie przez wirtualne systemy udziały dyskowe.

Każda wirtualna maszyna dostarcza platformy, w której każdy nowy system operacyjny jest w stanie widzieć następujące urządzenia:


  • Block devices
  • IDE Drives (physical disks and partitions)
  • Floppy Drives
  • CD-ROM
  • Memory devices (such as /dev/mem)
  • SCSI Devices


  • Consoles and Serial lines
  • Network devices
  • USB devices
  • Sound
  • PCI hardware

Jak to działa:

UML uruchamia swój scheduler niezależnie od scheduler-a głównego linuxa.

Scheduler głównego linuxa łatwo uzupełnia swoje struktury danych po wykonaniu jakichś czynności przez scheduler UML-a. W podobny sposób UML uruchamia swój własny wirtualny system. Alokuje niezbędną pamięć spośród istniejącej fizycznej przestrzeni adresowej głównego linuxa. Następnie mapuje przydzieloną pamięć na swoją wirtualną pamięć i określa tam swoją wirtualną przestrzeń adresową. Jeśli będzie istniała potrzeba konfiguracji pliku wymiany (swap) to zostanie podłączony plik wymiany.

Zasadniczo wszystko co w linuksie nie jest sprzętem lub nie odwołuje się do sprzętu w UML-u po prostu działa.

Normalnie jądro Linuxa odwołuje się bezpośrednio do sprzętu i każdy proces działający proces prosi jądro o odwołanie się do sprzętu.

+-----------+-----------+----+
| Process 1 | Process 2 | ...|
+-----------+-----------+----+
|       Linux Kernel         |
+----------------------------+
|         Hardware           |
+----------------------------+

Jądro UML pod tym względem różni się od zwykłego jądra. Jądro UML zamiast komunikować się z sprzętem komunikuje się z prawdziwym jądrem w celu komunikacji ze sprzętem tak jak zwykły program. Programy działające pod UML mogą normalnie uruchamiać tak jakby pracowały pod normalnym jądrem.

            +----------------+
            | Process 2 | ...|
+-----------+----------------+
| Process 1 | User-Mode Linux|
+----------------------------+
|       Linux Kernel         |
+----------------------------+
|         Hardware           |
+----------------------------+

 

Ładowanie jądra UML

Wirtualne konsole

UML ułatwia też pracę programistom, którzy mogą przetestować swoje dzieło w wielu środowiskach linuksowych. Kolejne zastosowanie wiąże się z wymogami bezpieczeństwa. Jeśli nie zależy nam na wydajności serwera lub dysponujemy wydajną sprzętowo maszyną, możemy pokusić się o instalację serwera WWW lub pocztowego pod kontrolą UML. Przy takiej konfiguracji włamanie się z zewnątrz będzie miało wpływ tylko na system pracujący pod kontrolą UML. Bezpieczeństwo całej sieci czy farmy serwerów pozostanie zaś nienaruszone.

Do pracy UML wymaga w zasadzie dowolnej dystrybucji Linuksa, jednak instalacja programu, w przeciwieństwie do VMware, jest dość skomplikowana.

Do pracy UML potrzebuje:


Kompilacja UML przypomina pod każdym względem kompilację zwykłego jądra linuksowego.

Konfigurację jądra, przed kompilację przeprowadzamy tak samo jak dla zwykłego jądra, specyfikując jawnie architekturę jako um (domyślną architekturą będzie i386, dla maszyn PC).

make ARCH=um menuconfig


Zalety:

Wady:


3. Xen


Xen to wydajny monitor maszyn wirtualnych na licencji open source, opracowany na Uniwersytecie w Cambridge i rozwijany przez firmę XenSource.

Xen jest w swojej zasadzie podobny do VMWare. Niemniej wymaga pewnych niewielkich zmian w kodzie systemu operacyjnego, nie emuluje pełnego sprzętu.
Jego zadaniem jest obserwowanie maszyn wirtualnych uruchomionych w jego środowisku i dbanie o to, aby nie zakłócały one wzajemnie swojej pracy i aby ich równoczesne działanie nie obniżało w znaczący sposób wydajności. Atutem i przyczyną popularności Xen jest to, że on sam do swojej pracy zużywa stosunkowo niewiele zasobów systemowych.


W tej chwili dla XEN-a są dostępne następujące systemy:


O ile UML był programem, uruchamianym ze zwykłego Linuxa, o tyle XEN jest samodzielnym quasi-systemem. Wymaga samodzielnego bootowania. W nagrodę dostajemy bardzo wydajny system, o prędkości niemal nie ustępującej pracy systemu natywnego na prawdziwym sprzęcie.

Kompilacja jądra linuksowego na platformę XEN, przebiega podobnie jak ta na platform_ UML.

make ARCH=xeno menuconfig

make ARCH=xeno bzImage

Niemniej, samo jądro tutaj nie wystarczy. Potrzebna jest instalacja samego

XEN-a. W przypadku loadera GRUB, który jest standardowy w większości

dystrybucji linuksowych, wystarczy stworzyć następujący wpis

title Xen / XenoLinux 2.4.22

kernel /boot/xen.gz dom0_mem=131072 ser_baud=115200 noht

module /boot/xenolinux.gz root=/dev/hda2 ro console=tty0

gdzie xen.gz jest samym XEN-em, a xenolinux, jądrem Linuxa, skompilowanym dla XEN-a. Pierwszy Linux pracuje w domenie-0, i jest  przywilejowany. Tylko jeden Linux może pracować w tej domenie. Kolejne  mogą być uruchamiane odpowiednimi narzędziami.


Zalety:

Wady

Porównanie:

Testy:


Native Linux (L)
Xen/Linux (X)
VMware Workstation 3.2 (V)
User Mode Linux (U)


Cecha

VMware

UML

XEN

Instalacja wymaga modyfikacja
jądra


NIE

TAK

TAK

Instalacja wymaga modyfikacji partycji

NIE

NIE

Wymaga modyfikacji wpisów w bootloaderze

Wymaga dostosowania systemu do współpracy

NIE

TAK

TAK

Możliwość łańcuszków systemów

Dowolny system w dowolnym

Możliwość uruchamiania nowego UMLa w już uruchomionym

Raczej nie

Szybkość działania

Średnia

Duża

Bardzo dużą

Odpłatność

Rozwiązanie komercyjne

Darmowe
Licencja GNU

Darmowe
Licencja GNU

Spis treści

Odpluskwianie Windows

Zestaw narzędzi do debuggowania pod Windows (Debugging Tools):


Zestaw narzędzi Debugging Tools jest oferowany dla następujących systemów operacyjnych:


Odpluskwianie z użyciem WinDbg

WinDbd używa do debuggowania zestawu symboli w formacie używanym przez Microsoft Visual Studio. Może uzyskać dostęp do dowolnej funkcji i zmiennej wyeksportowanej przez kompilator przy kompilowaniu modułów. Eksportowane zmienne zazwyczaj umieszczane są w plikach (.pdb)

Przykład z pliku .pdb (pliki .pdb są plikami binarnymi):

RobRenderMany_3ds@MyLoader@vector@RenderInfo@$allocator@RenderInfo

WinDbg potrafi wyświetlać kod źródłowy aplikacji. Potrafi ustawiać breakpoints, wyświetlać zmienne, obiekty C++ oraz struktury. Istnieje możliwość śledzenia stosu, pamięci i kodu (również po assemblerowego) podczas debuggowania. Zawiera również linie komend w celu wywołania komend, których wywołanie za pomocą graficznego interfacu jest niemożliwe.

WinDbg zazwyczaj wymaga dwóch komputerów (maszyny hosta i maszyny docelowej) w celu debuggowania w trybie jądra. Umożliwia również zdalne odpluskwianie kodu w trybie użytkownika.



Porównanie narzędzi do obpluskwiania pod Windows:

Cecha

KD

NTSD

WinDbg

Visual Studio .NET

Kernel-mode debugging

Y

N

Y

N

User-mode debugging  


Y

Y

Y

Unmanaged debugging

Y

Y

Y

Y

Managed debugging


Y

Y

Y

Remote debugging

Y

Y

Y

Y

Attach to process

Y

Y

Y

Y

Detach from process in Win2K and XP

Y

Y

Y

Y

SQL debugging

N

N

N

Y


Zrzut z działania kd:
kd> lmv mntos*
start    end        module name
00400000 00618080   ntoskrnl     (private pdb symbols)  c:\localsym\ntoskrnl.pdb\DD3B00F5D69B4D1D8DADA85166188F862\ntoskrnl.pdb
    Loaded symbol image file: ntoskrnl.exe
    Mapped memory image file: c:\localsym\ntoskrnl.exe\404D5566218080\ntoskrnl.exe
    Image path: \\winbuilds\release\XPSP2\2094\usa\x86fre\bin\ntoskrnl.exe
    Timestamp:        Mon Mar 08 21:25:58 2004 (404D5566)
    Checksum:         0021AF90
    ImageSize:        00218080
    File version:     5.1.2600.2094
    Product version:  5.1.2600.2094
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        1.0 App
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft« Windows« Operating System
    InternalName:     ntoskrnl.exe
    OriginalFilename: ntoskrnl.exe
    ProductVersion:   5.1.2600.2094
    FileVersion:      5.1.2600.2094 (xpsp_sp2_rc1.040308-1920)
    FileDescription:  NT Kernel & System
    LegalCopyright:   Microsoft Corporation. All rights reserved.

Spis treści

Odpluskwianie Jądra Linuksa

oops i Ksymoops

Czym jest „oops”?

Kiedy jądro Linuksa wykryje zaistnienie niebezpiecznej i anormalnej sytuacji, „oops” jest wyzwalane.
Oops posiada dwie zasadnicze funkcje:
Oops wydaje się być totalnie niezrozumiały. Plik binarny, miejscami szyfrowany.

Oops może zawierać następujące informacje:


Przykład:

CPU:    0
EIP:    0010:<c011933c>    Tainted: P
Using defaults from ksymoops -t elf32-i386 -a i386
EFLAGS: 00010002
eax: 00000ce0   ebx: 00001000   ecx: c778a510   edx: 00000610
esi: 00000002   edi: 00000000   ebp: c02165c0   esp: c6663f58
ds: 0018   es: 0018   ss: 0018
Process pcmcia (pid: 1003, stackpage=c6663000)
Stack: 00000000 c02165a0 00000000 c02165c0 c6663fc4 c01193cf c010ac96 c0116406
       c0116340 00000000 00000001 c02165c0 fffffffe c011616a c02165c0 00000000
       c0214900 00000000 c6663fbc 00000046 c010817d 00000000 080caa18 00000000
Call Trace: <c01193cf><c010ac96><c0116406><c0116340><c011616a><c010817d><c0109f48>
Code: 89 42 04 89 10 c7 41 04 00 00 00 00 c7 01 00 00 00 00 fb 53


Ksymoops jest narzędziem służącym do dekodowania oops zrzutów jądra oraz wiadomości o błędach.
Ksymoops czyta raporty o błędach z plików Oops.file i używa zmiennych ze źródeł w celu zamiany zmiennych z raportu na zrozumiały tekst.

Przykład z działanie ksymoops:
EIP; c0113f8c <sys_init_module+49c/4d0>
  Trace; c011d3f5 <sys_mremap+295/370>
  Trace; c011af5f <do_generic_file_read+5bf/5f0>
  Trace; c011afe9 <file_read_actor+59/60>
  Trace; c011d2bc <sys_mremap+15c/370>
  Trace; c010e80f <do_sigaltstack+ff/1a0>
  Trace; c0107c39 <overflow+9/c>
  Trace; c0107b30 <tracesys+1c/23>


KGBD jest odpluskwiaczem na poziomie źródeł jądra linuxa. KGDB wraz z gdb służy do odpluskwiania jądra.
Odpluskwianie jądra z użyciem KGDB niczym nie różni się od odpluskwiania zwykłej aplikacji. Możliwe jest stosowanie place breakpointów w źródłach jądra. Dowolne chodzenie po kodzie i obserwowanie zmiennych.

Do działania KGDB potrzebuje dwóch komputerów. Maszyna testowana z maszyną testującą jest połączona kablem szeregowym. Na maszynie testowej jest uruchomiony KGDB a na maszynie testującej GDB. Połączenie szeregowe jest wykorzystywane do prze gdb do komunikacji z testowanym jądrem.

Spis treści


I. Inny świat


"Way back in the good old days -
when men were men,
women were women,
and hackers were indeterminate -
if you were doing AI, you were doing LISP…"

- Chris Welty


1. Czynniki determinujące niezawodność aplikacji

  1. Sprzęt Wsparcie w architekturze sprzętowej dla języków programowania:
  2. System operacyjny
    1. Systemy operacyjne budowane w językach danej architektury:
      • Unix i C
      • Genera i Common Lisp
    2. Systemowy język programowania:
      • Unix i C,
      • Inferno i Limbo,
      • Oberon i Oberon,
      • Genera i Common Lisp
  3. Błędy programistyczne, debuggowanie i języki niskiego poziomu a języki wysokiego poziomu:

2. Genera i Common Lisp


Jak zwiększyć niezawodność aplikacji ? - używać bezpiecznych systemów operacyjnych, bezpiecznych języków i odpowiednich narzędzi programistycznych


3. Degres technologiczny lat '80 - od Lispu do Uniksa i C (Speedability beats Reliability)

Richard Gabriel 1989 (za profesorem Edgarem Dijkstrą)


4. Powrót do idei z czasów Lispu (Reliability beats Speedability)

Microsoft i Singularity - jak by wyglądał system stworzony całkowicie od nowa z myślą o niezawodności ?




Sun i JX - model bazujący na "dziedzinach" i "portalach"




II.
Wycieki zasobów, profilery i debuggowanie w wysokopoziomowych środowiskach programistycznych

1.
Wycieki zasobów
  1. Czas życia obiektu a czas istnienia w pamięci
  2. Systemy z ręczną gospodarką pamięci
  3. Systemy z GC - dlaczego mamy wycieki pamięci w systemach z GC ?
    • odcinanie referencji, słabe referencje
    • zwalnianie pamięci
  4. zwalnianie zasobów
    • RAII w systemach z GC
    • RAII w C++

2.
Profilery
  1. Profiler - narzędzie, które pomaga opisać przebieg programu, w szczególności znaleźć fragmenty krytyczne pod względem wydajnościowym
  2. Donald Knuth
    • Premature optimization is the root of all evil (or at least most of it) in programming
  3. Zasada Pareta
    • Poniżej 20% punktów jest witalnych
    • Powyżej 80% punktów jest trywialnych
  4. Working Set

3. Profilery w Eclipse i NetBeans

  1. Możliwości
    • Określanie zużycia procesora/pamięci
      • przez zadana grupę wątków
      • na wykonaniu określonych fragmentów kodu
    • Generacja statystyk odnośnie wielkości stosów
    • Generacja statystyk odnośnie lokatora
    • Generacja statystyk odnośnie przepływów
    • Monitorowanie wycieków zasobów
    • Robienie zrzutów pamięci z czasów wykonania aplikacji
  2. Zużycie procesora - NetBeans



  3. Ogólne statystyki - NetBeans



  4. Grafy przepływów - Eclipse







4. Profiler Valgrind
  1. Memcheck, Addrcheck - sprawdzanie poprawnosci dostępu do pamięci
    1. Odwołania do niezainicjalizowanej pamięci (Addrcheck tego nie sprawdza)
    2. Pisanie lub czytanie z pamięci, po jej zwolnieniu
    3. Przekraczanie zakresów w tablicach (i ogólnie pisanie poza końcem przydzielonej pamięci)
    4. Pisanie lub czytanie niedozwolonych adresów ze stosu
    5. Niezwolnione fragmenty pamięci
    6. Alokacja poprzez new/new[] a dealokacja przez delete[]/delete odpowiednio
    7. Zamiana kolejności argumentów przy niektórych standardowych funkcjach operujących na pamięci
  2. Missif - monitorowanie rozmiarów przydzielanej pamięci
  3. Cachegrind - monitorowanie cache procesora
  4. Helgrind - raport o fragmentach pamięci współdzielonych przez wątki, o których nie ma gwarancji, że są używane w sposób spójny


5. Odpluskwiacze Eclipse i NetBeans
  1. Remote debugging - łączenie się z działającą aplikacją i naprawianie jej "w locie" - mechanizm fix and continua
  2. Breakpoints - punkty przerywania obliczeń
    • line brakpoint - przerwanie dojściem do linii, jeżeli dodatkowo spełniony jest określony warunek
    • method breakpoint - przerwanie przy wołaniu danej metody
    • class breakpoint - przerwanie przy ładowaniu (odładowywaniu) danej klasy do (z) maszyny wirtualnej
    • thread breakpoint - przerwanie przy wznawianiu, bądź zatrzymaniu wątku
    • exception breakpoint - przerwanie przy rzuceniu, złapaniu, bądź nie złapaniu wyjątku
    • variable breakpoint - przerwanie przy odczycie, lub modyfikacji zmiennej klasowej
  3. Expression evaluation - obliczenie wyrażenia podanego podczas dojścia do danego punku przebiegu programu