0Pricing
C Academy · Lekcja

Odczytywanie raportów

Interpretowanie danych wyjściowych

Odczytywanie raportów to bezpłatna lekcja C Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C Academy zawiera 4 lekcji w sumie.

Budowa raportu

Raport Valgrind składa się z trzech części:

  • Prefiks identyfikatora procesu w każdym wierszu
  • Jeden lub więcej bloków błędów pojawiających się w trakcie działania
  • Końcowe podsumowanie HEAP and LEAK SUMMARY przy zakończeniu programu

Umiejętność odczytywania każdej z tych części zamienia ścianę tekstu w precyzyjną listę zadań.

Prefiks PID

Każdy wiersz Valgrind rozpoczyna się od ==PID==, na przykład ==12345==.

Jest to identyfikator procesu, a nie część danych wyjściowych programu. Pozwala oddzielić komunikaty Valgrind od wywołań printf programu, gdy oba strumienie korzystają z tego samego terminala.

==12345== Memcheck, a memory error detector
==12345== Command: ./prog
==12345==

Przykładowy blok błędu

Oto rzeczywisty blok dotyczący nieprawidłowego zapisu:

==12345== Invalid write of size 4
==12345== at 0x4005A1: main (prog.c:6)
==12345== Address 0x520304c is 0 bytes after a block of size 20 alloc'd
==12345== at 0x4838B40: malloc
==12345== by 0x40058E: main (prog.c:5)

Odczyt pierwszego wiersza

Pierwszy wiersz określa rodzaj i rozmiar błędu: „Invalid write of size 4”.

Rozmiar 4 oznacza dostęp do 4 bajtów, zwykle do wartości typu int. Ten jeden wiersz informuje, jakiej kategorii błędu należy się spodziewać, zanim przeczyta Pan/Pani resztę raportu.

Odczyt śladu stosu

Wiersz at wskazuje najbardziej wewnętrzną ramkę, w której wystąpił błąd. Każdy wiersz by przedstawia wywołującego znajdującego się o jeden poziom wyżej.

Należy czytać od góry do dołu, od najgłębszej do najbardziej zewnętrznej ramki. Pierwsza ramka zawierająca nazwę Państwa pliku jest niemal zawsze miejscem wystąpienia błędu.

==12345==    at 0x4005A1: do_work (work.c:12)
==12345==    by 0x4006F0: main (main.c:8)

Odczyt informacji o adresie

Wiersz Address ... określa położenie dostępu względem znanego bloku:

  • 0 bytes after a block of size 20 alloc'd — przepełnienie następujące bezpośrednio za końcem
  • 4 bytes inside a block of size 4 free'd — użycie po zwolnieniu
  • on thread 1's stack — dostęp do stosu

Pokazuje również miejsce, w którym ten blok został zaalokowany lub zwolniony.

Podsumowanie HEAP

Przy zakończeniu programu wyświetlane jest rozliczenie alokacji:

==12345== HEAP SUMMARY:
==12345== in use at exit: 20 bytes in 1 blocks
==12345== total heap usage: 3 allocs, 2 frees, 1,044 bytes allocated

Wartość większa od zera przy „in use at exit” oznacza, że czegoś nie zwolniono.

Podsumowanie LEAK

Poniżej podsumowania sterty wycieki są pogrupowane:

definitely lost: 20 bytes in 1 blocks
indirectly lost: 0 bytes in 0 blocks
possibly lost: 0 bytes in 0 blocks
still reachable: 0 bytes in 0 blocks

Należy dodać --leak-check=full, aby do każdego utraconego bloku dołączyć ślad wywołań.

Podsumowanie ERROR

Ostatni wiersz zawiera podsumowanie wszystkich błędów:

ERROR SUMMARY: 2 errors from 2 contexts

„Kontekst” oznacza unikalne miejsce wystąpienia błędu. Jeśli wadliwy wiersz wykona się milion razy w pętli, nadal będzie to jeden kontekst. Celem jest uzyskanie 0 errors from 0 contexts.

Kolejność usuwania błędów

Należy analizować raport metodycznie:

  • Najpierw naprawić błędy nieprawidłowego dostępu, ponieważ powodują uszkodzenie danych
  • Następnie błędy dotyczące niezainicjalizowanych wartości
  • Potem wycieki oznaczone jako definitely i indirectly lost
  • Po każdej poprawce uruchomić program ponownie; jedna przyczyna źródłowa często usuwa kilka zgłoszeń

Wyciszanie znanych zakłóceń

Niektóre błędy pochodzą z bibliotek, których nie można naprawić, takich jak środowisko uruchomieniowe C lub sterownik karty graficznej. Należy wygenerować plik wyciszeń, aby ukryć te komunikaty bez maskowania własnych błędów.

--gen-suppressions=all wypisuje gotowe wpisy wyciszeń, które można zapisać, a następnie ponownie przekazać za pomocą --suppressions=file.

valgrind --gen-suppressions=all ./prog
valgrind --suppressions=mine.supp ./prog

Szybkie sprawdzenie

Proszę zinterpretować jeden wiersz raportu.

Podsumowanie

Potrafi już Pan/Pani czytać raporty Valgrind od początku do końca:

  • Prefiksy ==PID== oznaczają wiersze Valgrind i oddzielają je od danych wyjściowych programu
  • Każdy blok błędu zawiera jego rodzaj, rozmiar, ślad stosu oraz informację o adresie
  • Podsumowania HEAP/LEAK rozliczają alokacje i utraconą pamięć
  • ERROR SUMMARY zlicza unikalne konteksty; należy dążyć do zera

Najpierw należy usuwać błędy dostępu, a następnie wycieki, uruchamiając program ponownie po drodze.

Często zadawane pytania

Czy lekcja „Odczytywanie raportów” jest bezpłatna?

Tak — pełny tekst „Odczytywanie raportów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C Academy, przejdź na CoddyKit PRO. Kurs C Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Odczytywanie raportów”?

Interpretowanie danych wyjściowych Ćwiczysz C Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C Academy?

Nie wymagamy żadnego doświadczenia. C Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Odczytywanie raportów”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C Academy?

Tak. Każda lekcja C Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Dlaczego Valgrind
  2. Wykrywanie wycieków
  3. Nieprawidłowy dostęp
  4. Odczytywanie raportów
← Powrót do C Academy