보고서 읽기
출력을 해석합니다
보고서 읽기은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
보고서의 구조
Valgrind 보고서는 세 부분으로 구성됩니다.
- 모든 줄에 붙는 프로세스 ID 접두사
- 발생한 순서대로 표시되는 하나 이상의 오류 블록
- 종료 시 표시되는 최종 HEAP 및 LEAK SUMMARY
각 부분을 읽는 법을 익히면 긴 텍스트가 정확한 할 일 목록으로 바뀝니다.
PID 접두사
모든 Valgrind 줄은 ==PID==로 시작합니다. 예를 들면 ==12345==과 같습니다.
이는 프로그램 출력의 일부가 아니라 프로세스 ID입니다. 프로그램의 printf와 Valgrind의 메시지가 같은 터미널에 표시될 때 둘을 구분할 수 있게 해 줍니다.
==12345== Memcheck, a memory error detector
==12345== Command: ./prog
==12345==오류 블록 예시
다음은 실제 잘못된 쓰기 오류 블록입니다.
==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)
첫 번째 줄 읽기
첫 번째 줄에는 오류 종류와 크기가 표시됩니다. 'Invalid write of size 4'와 같습니다.
크기 4는 일반적으로 int에 해당하는 4바이트 접근을 의미합니다. 이 한 줄만으로도 더 읽어 보기 전에 예상되는 버그의 범주를 알 수 있습니다.
호출 스택 추적 읽기
at 줄은 오류가 발생한 가장 안쪽 프레임입니다. 각 by 줄은 한 단계 위의 호출자입니다.
위에서 아래로 읽되, 가장 깊은 프레임부터 가장 얕은 프레임 순서라고 생각하면 됩니다. 작성한 파일 이름이 처음 나타나는 프레임이 거의 항상 버그가 발생한 위치입니다.
==12345== at 0x4005A1: do_work (work.c:12)
==12345== by 0x4006F0: main (main.c:8)주소 설명 읽기
Address ... 줄은 알려진 블록을 기준으로 접근 위치를 나타냅니다.
0 bytes after a block of size 20 alloc'd— 끝을 막 넘어선 오버플로4 bytes inside a block of size 4 free'd— 해제 후 사용on thread 1's stack— 스택 접근
해당 블록이 할당되거나 해제된 위치까지 표시됩니다.
HEAP SUMMARY
종료할 때 할당 내역이 표시됩니다.
==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
'in use at exit'가 0보다 크면 해제되지 않은 항목이 있다는 뜻입니다.
LEAK SUMMARY
HEAP SUMMARY 아래에는 누수가 다음과 같이 분류됩니다.
definitely lost: 20 bytes in 1 blocksindirectly lost: 0 bytes in 0 blockspossibly lost: 0 bytes in 0 blocksstill reachable: 0 bytes in 0 blocks
각 손실된 블록에 추적 정보를 추가하려면 --leak-check=full을 사용합니다.
ERROR SUMMARY
마지막 줄에는 모든 항목의 개수가 표시됩니다.
ERROR SUMMARY: 2 errors from 2 contexts
'context'는 고유한 오류 위치를 의미합니다. 문제가 있는 줄이 반복문에서 백만 번 실행되어도 context는 하나입니다. 목표는 0 errors from 0 contexts입니다.
처리 순서
보고서를 체계적으로 처리합니다.
- 먼저 손상을 일으키는 잘못된 접근 오류를 수정합니다.
- 그다음 초기화되지 않은 값 오류를 수정합니다.
- 이후 definitely 및 indirectly lost 누수를 수정합니다.
- 각 수정 후 다시 실행합니다. 하나의 근본 원인이 여러 보고서를 없애는 경우가 많습니다.
이미 알려진 불필요한 경고 숨기기
일부 오류는 C 실행 환경이나 그래픽 드라이버처럼 수정할 수 없는 라이브러리에서 발생합니다. 억제 파일을 생성하면 이러한 오류를 숨길 수 있으며, 직접 만든 버그는 그대로 확인할 수 있습니다.
--gen-suppressions=all은 바로 사용할 수 있는 억제 항목을 출력합니다. 이를 저장한 뒤 --suppressions=file로 다시 전달합니다.
valgrind --gen-suppressions=all ./prog
valgrind --suppressions=mine.supp ./prog빠른 확인
보고서의 한 줄을 해석해 보세요.
복습
이제 Valgrind 보고서를 처음부터 끝까지 읽을 수 있습니다.
==PID==는 Valgrind 줄의 접두사로, 프로그램 출력과 구분해 줍니다.- 각 오류 블록에는 종류, 크기, 호출 스택 추적, 주소 설명이 표시됩니다.
- HEAP/LEAK 요약에는 할당과 손실된 메모리의 내역이 표시됩니다.
- ERROR SUMMARY에는 고유한 context의 개수가 표시됩니다. 0을 목표로 하세요.
접근 오류를 먼저 처리한 다음 누수를 처리하고, 진행하면서 계속 다시 실행하세요.
자주 묻는 질문
“보고서 읽기” 강의는 무료인가요?
네 — “보고서 읽기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“보고서 읽기”에서 뭘 배우나요?
출력을 해석합니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“보고서 읽기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.