Valgrind 기초
누수와 오류 감지하기
Valgrind 기초은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Valgrind란 무엇인가요
Valgrind는 계측 프레임워크입니다. 기본 도구인 Memcheck는 프로그램을 가상의 CPU에서 실행하여, 다시 컴파일하지 않고도 메모리 누수와 오류를 탐지합니다.
Memcheck 실행하기
프로그램 앞에 Valgrind를 붙여 실행하세요. 먼저 줄 번호가 표시되도록 -g로 빌드합니다.
g++ -g main.cpp -o app
valgrind --leak-check=full ./app누수 탐지
Memcheck는 프로그램 종료 시에도 할당된 메모리를 보고하고, 완전히 손실됨, 간접적으로 손실됨, 또는 여전히 도달 가능함으로 분류합니다.
#include <cstdlib>
int main() {
int* p = (int*)malloc(40); // never freed -> definitely lost
return 0;
}누수 범주
보고서의 범주를 이해해 보세요.
- 완전히 손실됨: 포인터가 남아 있지 않음. 실제 누수입니다
- 간접적으로 손실됨: 손실된 블록을 통해서만 접근 가능함
- 여전히 도달 가능함: 종료 시 포인터가 존재함(대개 문제가 없음)
유효하지 않은 읽기와 쓰기
Memcheck는 할당되지 않았거나 해제된 메모리에 대한 접근을 표시하고, 주소와 크기를 보고합니다.
#include <cstdlib>
int main() {
int* a = (int*)malloc(2 * sizeof(int));
a[5] = 1; // invalid write past the block
free(a);
return 0;
}초기화되지 않은 값
Memcheck는 조건문이나 출력이 초기화되지 않은 값에 의존할 때 경고합니다. 이는 비결정적 버그의 흔한 원인입니다.
#include <iostream>
int main() {
int x; // uninitialized
if (x == 42) // use of uninitialized value
std::cout << "hi\n";
return 0;
}출력 읽기
각 오류 블록에는 수행된 작업, 문제가 발생한 호출 스택, 그리고 힙 블록의 경우 메모리가 할당된 위치가 표시됩니다. HEAP SUMMARY에는 전체 할당량과 누수량이 집계됩니다.
유용한 플래그
일반적인 옵션은 다음과 같습니다.
--leak-check=full: 각 누수의 상세 정보 표시--show-leak-kinds=all--track-origins=yes: 초기화되지 않은 값의 출처 추적--error-exitcode=1: 오류가 발생하면 CI 실패 처리
Valgrind와 ASan 비교
두 도구 모두 메모리 버그를 찾지만 서로 다른 장단점이 있습니다.
- Valgrind: 다시 컴파일할 필요가 없지만 느림(10~50배), 초기화되지 않은 읽기를 잘 탐지함
- ASan: 다시 컴파일해야 하지만 훨씬 빠르고, 스택 오버플로 탐지에 더 뛰어남
알려진 문제 무시하기
타사 라이브러리에서 불필요한 보고서가 발생할 수 있습니다. --gen-suppressions=all과 --suppressions=file로 억제 파일을 생성하고 적용하여 이미 알려진 문제가 없는 보고서를 숨길 수 있습니다.
Valgrind를 사용할 때
새니타이저를 사용하여 다시 컴파일할 수 없거나, 초기화되지 않은 값을 정밀하게 추적해야 하거나, 다른 도구로 한 번 더 확인하고 싶을 때 Valgrind를 사용하세요. 그 외의 경우에는 일반적인 CI에서 ASan이 대개 더 빠릅니다.
빠른 확인
누수 범주를 떠올려 보세요.
복습
Valgrind의 기초를 배웠습니다.
- Memcheck는 다시 컴파일하지 않고도 누수, 유효하지 않은 접근, 초기화되지 않은 읽기를 찾습니다
--leak-check=full --track-origins=yes로 실행합니다- 누수 종류: 완전히 손실됨, 간접적으로 손실됨, 여전히 도달 가능함
- ASan보다 느리지만 초기화되지 않은 값으로 인한 버그를 찾는 데 뛰어납니다
자주 묻는 질문
“Valgrind 기초” 강의는 무료인가요?
네 — “Valgrind 기초” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Valgrind 기초”에서 뭘 배우나요?
누수와 오류 감지하기 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“Valgrind 기초” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- gdb와 lldb 사용하기
- AddressSanitizer
- UBSan과 TSan
- Valgrind 기초