본문으로 건너뛰기
pkglog
블로그소개

주제별 글 모음

C++ 오류·메모리·디버깅

C++에서 자주 만나는 컴파일 에러와 링커 에러(undefined reference, multiple definition, LNK2019), 세그멘테이션 폴트, 스택 오버플로우, 힙 손상의 원인을 찾는 순서를 정리합니다. 에러 메시지를 읽는 법과 원인 후보를 좁히는 기준을 중심으로 합니다.

메모리 누수는 Valgrind·AddressSanitizer·Heaptrack으로, 데이터 레이스는 ThreadSanitizer로 찾는 과정을 예제와 함께 다룹니다. 정적 초기화 순서, ODR, 이름 맹글링처럼 빌드와 링크 단계에서 생기는 문제도 포함합니다.

처음 읽기 좋은 글

  • C++ Segmentation fault 원인 5가지와 디버깅 방법 | GDB로 추적하기C++ Segmentation fault의 대표 원인인 널 포인터 역참조, 해제 후 사용, 스택 오버플로, 배열 범위 초과, 잘못된 캐스팅을 코드로 재현하고, core dump를 활성화해 GDB·LLDB로 충돌 위치를 추적하는 방법을 설명합니다.
  • 디버그에선 되고 릴리스에서 죽는 코드: C++ 미정의 동작 15가지 패턴과 UBSan미정의 동작(Undefined Behavior, UB)은 C++ 표준이 결과를 정의하지 않은 코드입니다. 대표적인 UB 패턴 15가지, 디버그와 릴리스에서 동작이 달라지는 이유, UBSan으로 탐지하는 방법을 정리합니다.
  • C++ 메모리 누수 심화 디버깅 | 힙 프로파일링·패턴·스마트포인터·순환참조·프로덕션Valgrind Memcheck와 AddressSanitizer·LeakSanitizer가 무엇을 추적하는지, still reachable 같은 리포트를 어떻게 해석할지부터 unique_ptr::release, 중복 shared_ptr 생성, enable_shared_from_this 오용처럼 스마트 포인터가 숨기는 누수의 진단법을 다룹니다.

전체 글 43편

각 글에 표시된 난이도를 기준으로 초급, 중급, 고급 순으로 나눴습니다. 처음이라면 위쪽부터 읽고, 이미 아는 단계는 건너뛰어도 됩니다.

초급 (8편)

  • 프로그래밍 언어별 흔한 에러 해결 가이드 | C++, Python, Java, JavaScriptC++ 세그폴트와 undefined reference, Python IndentationError·TypeError, Java NullPointerException, JavaScript의 undefined 속성 접근과 this 바인딩까지 언어별로 자주 만나는 에러의 원인과 해결 코드를 보여줍니다.
  • C++ 범위 기반 for문 no begin function 에러: 내부 변환과 커스텀 컨테이너 begin·endfor (auto x : c)에서 no begin function 에러가 나는 이유를 범위 기반 for문의 내부 변환으로 설명하고, 커스텀 컨테이너에 begin()·end()를 붙이는 법과 값 복사, 반복 중 수정, 임시 객체 순회 같은 실수 8가지를 고칩니다.
  • C++ 초보자가 자주 하는 실수 Top 15 | 컴파일 에러부터 런타임 크래시까지C++ 입문자가 가장 자주 겪는 실수(클래스 끝 세미콜론, 헤더 누락, const 참조, 댕글링 포인터, 정수 나눗셈, unsigned 언더플로 등)를 실제 GCC·Clang·MSVC 에러 메시지와 함께 정리하고, 왜 그런 규칙이 있는지와 Sanitizer로 런타임 버그를 잡는 법을 설명합니다.
  • C++ 컴파일 오류 해결 가이드 | 초보자가 자주 겪는 10가지 에러undefined reference, redefinition, no matching function for call, was not declared in this scope, invalid use of incomplete type처럼 C++ 초보자가 자주 만나는 에러 메시지를 읽는 법과 원인, 해결 방법을 하나씩 설명합니다. 실행 중 터지는 segmentation fault도 함께 다룹니다.
  • C++ const 에러: passing as const 컴파일 에러 원인과 const 정합성passing as const, discards qualifiers, read-only variable 대입처럼 const 때문에 나는 컴파일 에러 10가지를 원인별로 풀고, const 멤버 함수와 오버로드, 포인터에서 const 위치를 읽는 법, mutable과 const_cast를 써도 되는 경우를 예제로 설명합니다.
  • C++ include 에러 No such file or directory: 헤더 경로·대소문자·순환 include 해결No such file or directory로 헤더를 못 찾을 때 파일명 오타, -I 경로 누락, Linux의 대소문자 구분, 순환 include 중 무엇이 원인인지 가려내고, CMake·Visual Studio 경로 설정과 전방 선언으로 해결하는 방법을 다룹니다.
  • C++ multiple definition 링커 에러: 헤더 정의 중복의 원인과 해결헤더에 함수나 전역 변수를 정의했다가 링크 단계에서 multiple definition 에러가 날 때, ODR 규칙으로 원인을 짚고 inline·static·extern 중 무엇으로 고칠지 비교표와 헤더/소스 분리 예제로 판단할 수 있게 합니다.
  • CMake Error 자주 나는 10가지: find_package 실패·target not found·캐시 오염 해결find_package가 패키지를 못 찾거나 target not found, 버전 부족, 경로 공백, 오염된 빌드 디렉토리 때문에 CMake가 멈출 때, 에러 메시지별로 원인을 가려내고 CMakeLists.txt를 어떻게 고치면 되는지 수정 코드로 보여줍니다.

중급 (28편)

  • 디버그에선 되고 릴리스에서 죽는 코드: C++ 미정의 동작 15가지 패턴과 UBSan미정의 동작(Undefined Behavior, UB)은 C++ 표준이 결과를 정의하지 않은 코드입니다. 대표적인 UB 패턴 15가지, 디버그와 릴리스에서 동작이 달라지는 이유, UBSan으로 탐지하는 방법을 정리합니다.
  • ASan과 TSan으로 런타임 버그 잡기: 메모리 오류·데이터 레이스 예제와 CI 통합C++ AddressSanitizer와 ThreadSanitizer 정리. 런타임 검증이 필요한 이유, ASan으로 메모리 오류, TSan으로 데이터 레이스를 찾는 예제, MSan·UBSan·LSan과의 관계, CI 통합과 자주 나는 문제를 다룹니다.
  • C++ 가상 소멸자가 없을 때 생기는 누수: virtual·protected 소멸자 선택 기준기반 클래스 포인터로 파생 객체를 delete했는데 파생 소멸자가 불리지 않아 메모리와 파일 핸들이 새는 이유를 보여주고, virtual 소멸자, 순수 가상 소멸자, protected 소멸자 중 언제 무엇을 쓰는지와 vtable 오버헤드를 설명합니다.
  • C++ 객체 슬라이싱 에러: vector<Base>에 담을 때 잘리는 이유와 clone 패턴파생 객체를 기반 클래스 값으로 넘기거나 vector<Base>에 담는 순간 파생 멤버와 가상 함수 동작이 잘려 나가는 슬라이싱이 왜 생기는지 보여주고, 참조·스마트 포인터·clone() 패턴과 복사 생성자 delete로 막는 법을 다룹니다.
  • C++ 동적 초기화와 정적 초기화 순서 문제: Meyers 싱글톤·constinit으로 해결하기C++ 전역·정적 변수가 런타임에 초기화되는 동적 초기화를 정적 초기화와 비교하고, 번역 단위 간 초기화 순서 문제와 순환 의존성, 소멸 순서 문제를 Meyers 싱글톤, 지연 초기화, constinit으로 해결하는 방법을 설명합니다.
  • C++ 람다 캡처로 생기는 dangling reference: 값 캡처·shared_ptr·[*this]로 수명 지키기참조로 캡처한 지역 변수가 스코프를 벗어난 뒤 람다가 실행되면 dangling reference 크래시가 납니다. 값 캡처와 shared_ptr, [*this]로 수명을 지키는 방법과 비동기 콜백이나 람다 반환에서 자주 하는 캡처 실수를 예제로 다룹니다.
  • C++ 링커 에러 심화 가이드 — 심볼 해석·약한 심볼·SIOF·중복 진단컴파일은 통과했는데 링크에서 실패하는 C++ 빌드를 추적하는 방법을 다룹니다. 정적 라이브러리 스캔 순서, 약한·강한 심볼, 정적 초기화 순서 문제(SIOF), 중복 심볼 진단, LTO와 링커 맵 파일 활용까지 설명합니다.
  • C++ 멀티스레드 간헐적 크래시: ThreadSanitizer로 데이터 레이스 찾고 mutex·atomic으로 고치기싱글스레드에선 멀쩡하던 코드가 멀티스레드에서 간헐적으로 죽을 때, ThreadSanitizer로 데이터 레이스를 찾아내고 mutex·lock_guard·atomic 중 무엇으로 동기화할지, 데드락과 거짓 공유는 어떻게 피할지 예제로 설명합니다.
  • C++ 메모리 누수 찾기: Valgrind·ASan·CRT 디버그 힙 사용법과 누수 패턴Valgrind memcheck와 AddressSanitizer, Visual Studio CRT 디버그 힙으로 C++ 메모리 누수를 찾는 방법을 설명하고, new/delete 불일치, 예외 경로, shared_ptr 순환 참조, 컨테이너에 저장한 포인터 같은 누수 원인과 RAII 해결법을 다룹니다.
  • C++ 반복자 무효화: vector iterators incompatible 크래시 원인과 해결vector iterators incompatible 같은 크래시를 일으키는 반복자 무효화를 vector·list·map·unordered_map·deque별 규칙으로 정리하고, 범위 기반 for에서 erase하는 실수를 포함한 10가지 오류 패턴과 안전한 삭제 방법을 설명합니다.
  • C++ 버퍼 오버플로우: strcpy·오프바이원 실수가 생기는 원리와 방지·탐지 방법strcpy·gets·sprintf처럼 경계를 검사하지 않는 함수와 오프바이원 실수가 어떻게 버퍼 오버플로를 일으키는지 예제로 보여 주고, snprintf·std::string 같은 대안, AddressSanitizer 탐지, 스택 보호 컴파일러 옵션으로 막는 방법을 설명합니다.
  • C++ 스택 오버플로우 크래시: 깊은 재귀·큰 지역 배열 진단과 스택 크기 조정깊은 재귀나 큰 지역 배열 때문에 세그폴트로 죽는 스택 오버플로우를 진단하고, 재귀를 반복문이나 명시적 스택으로 바꾸거나 데이터를 힙으로 옮기는 방법, ulimit과 링커 옵션으로 스택 크기를 조정하는 법까지 다룹니다.
  • C++ 이름 은닉(Name Hiding): 파생 클래스에서 기반 오버로드가 안 보일 때 using 선언파생 클래스에 같은 이름의 함수를 하나만 선언해도 기반 클래스의 오버로드 전체가 가려지는 이름 은닉의 원리를 설명하고, using 선언으로 되살리는 법과 오버로딩·오버라이딩·은닉의 차이를 생성자와 연산자 예시로 정리합니다.
  • C++ 정적 초기화 순서 문제(Static Initialization Order Fiasco): 재현과 함수 내 static·constinit 해결다른 .cpp 파일의 전역 객체가 아직 초기화되지 않은 상태에서 쓰여 크래시가 나는 Static Initialization Order Fiasco를 링크 순서만 바꿔 재현하고, 함수 내 static, constinit, Nifty Counter 같은 해결책을 비교합니다.
  • C++ 템플릿 에러 메시지 읽는 법: 첫 줄·note·candidate 순서와 자주 나오는 패턴수백 줄짜리 C++ 템플릿 에러에서 맨 위 첫 줄, note: because, candidate 목록 순으로 원인을 찾는 방법을 설명하고, no matching function이나 incomplete type 같은 10가지 패턴과 GCC·Clang·MSVC 메시지 차이를 비교합니다.
  • C++ 헤더 온리 라이브러리 만들기: inline·템플릿·constexpr과 ODR, multiple definition 피하기구현을 헤더에 두면서도 multiple definition 링커 에러 없이 배포하려면 inline, 템플릿, constexpr가 ODR과 어떻게 맞물리는지 알아야 합니다. extern template로 인스턴스화를 줄이는 법과 컴파일 시간, ABI 관점의 비용도 짚습니다.
  • C++ 힙 손상: 버퍼 오버플로우·이중 delete·use-after-free 원인과 ASan·Valgrind 탐지C++ 힙 손상이 버퍼 오버플로우, 이중 delete, delete/delete[] 혼용, use-after-free로 발생하는 원리를 힙 메타데이터 구조로 설명합니다. AddressSanitizer·Valgrind 탐지법과 스마트 포인터·RAII 방지책까지 다룹니다.
  • C++ auto 타입 추론 실수: 참조·const가 떨어지는 복사, vector<bool> 프록시, 중괄호 추론auto가 참조와 최상위 const를 떼어 내 의도치 않은 복사가 생기는 문제부터 초기화 누락, vector<bool> 프록시, 중괄호 초기화 추론까지 auto 관련 에러 8가지를 짚고, auto&·const auto&·auto&&를 고르는 기준을 정리합니다.
  • C++ CMake 링크 에러 LNK2019 | 원인과 해결컴파일은 되는데 링크에서 undefined reference나 LNK2019가 날 때 에러 메시지를 읽는 법부터 원인별 해결까지 다룹니다. 정의 누락, target_link_libraries 누락, 라이브러리를 못 찾는 경우, C 함수 호출 시 extern "C", 링크 순서와 중복 정의를 다룹니다.
  • C++ ODR(단일 정의 규칙): 헤더 정의 링크 에러, inline·템플릿 예외, 링커가 못 잡는 위반변수와 함수는 프로그램 전체에서 정의가 하나여야 한다는 ODR을 기준으로, 헤더에 함수를 정의해 생기는 링크 에러와 inline, 템플릿, constexpr 변수가 예외가 되는 이유, 번역 단위마다 정의가 달라 링커가 못 잡는 위반을 nm으로 확인하는 방법을 설명합니다.
  • C++ RVO와 NRVO: C++17 보장 복사 생략과 return std::move가 NRVO를 막는 경우return 문에서 복사가 언제 생략되는지 RVO와 NRVO를 나눠 설명하고, C++17이 보장하는 복사 생략의 범위와 여러 반환 경로나 return std::move 때문에 NRVO가 깨지는 경우를 GCC로 직접 확인한 결과와 함께 보여줍니다.
  • C++ Segmentation fault 원인 5가지와 디버깅 방법 | GDB로 추적하기C++ Segmentation fault의 대표 원인인 널 포인터 역참조, 해제 후 사용, 스택 오버플로, 배열 범위 초과, 잘못된 캐스팅을 코드로 재현하고, core dump를 활성화해 GDB·LLDB로 충돌 위치를 추적하는 방법을 설명합니다.
  • C++ shared_ptr 순환 참조 누수: weak_ptr로 끊는 기준과 디버깅 방법두 객체가 서로를 shared_ptr로 가리키면 참조 카운트가 0이 되지 않아 소멸자가 불리지 않습니다. 부모-자식 트리, 캐시, 옵저버에서 한쪽을 weak_ptr로 바꾸는 기준과 use_count(), Valgrind, AddressSanitizer로 누수를 확인하는 법을 다룹니다.
  • C++ undefined reference to vtable: 첫 비인라인 가상 함수 정의 누락과 해결undefined reference to vtable 링커 에러는 대개 클래스의 첫 번째 비인라인 가상 함수나 소멸자의 정의가 빠졌을 때 납니다. vtable이 어느 번역 단위에 생성되는지부터 설명하고, .cpp 정의 추가, 인라인 정의, = default로 고치는 방법을 보여줍니다.
  • C++ use-after-move 버그: std::move가 캐스팅일 뿐인 이유와 이동 의미론 실수 10가지std::move는 캐스팅일 뿐이라는 사실에서 출발해 이동된 객체를 다시 쓰는 use-after-move 버그, const 객체 이동, return에 std::move를 붙여 RVO를 막는 실수 등 이동 의미론 에러 10가지와 고치는 방법을 다룹니다.
  • CMake 3.28+ 프리셋과 모듈로 크로스 플랫폼 빌드 구성하기팀원마다, 플랫폼마다 달라지는 C++ 빌드 설정을 CMake로 통일하는 방법입니다. 최소 CMakeLists.txt와 타겟 기반 설계, PUBLIC·PRIVATE·INTERFACE 전파, CMakePresets.json, find_package와 FetchContent, 3.28부터 지원되는 C++20 모듈 빌드를 다룹니다.
  • CMake 에러 해결: 컴파일러·find_package·링커·캐시 문제를 단계별로 좁히는 법CMake 에러를 configure·generate·build·실행 단계로 나눠 원인을 좁히는 방법을 정리합니다. CMake 4.0의 "Compatibility with CMake < 3.5 has been removed", FindBoost 제거, Conan 2 연동, undefined reference, 공유 라이브러리 로딩 실패까지 실제 에러 메시지 기준으로 다룹니다.
  • CMake find_package로 외부 라이브러리 연결하기: Config vs Module 모드와 커스텀 Find 모듈CMake find_package로 외부 라이브러리를 통합하는 방법. 기본 사용법, 주요 라이브러리 예제, Config 모드와 Module 모드의 차이, 커스텀 FindModule 작성과 자주 생기는 오류를 정리합니다.

고급 (5편)

  • C++ 메모리 누수 심화 디버깅 | 힙 프로파일링·패턴·스마트포인터·순환참조·프로덕션Valgrind Memcheck와 AddressSanitizer·LeakSanitizer가 무엇을 추적하는지, still reachable 같은 리포트를 어떻게 해석할지부터 unique_ptr::release, 중복 shared_ptr 생성, enable_shared_from_this 오용처럼 스마트 포인터가 숨기는 누수의 진단법을 다룹니다.
  • C++ 서버 메모리 누수 디버깅 사례: Valgrind·ASan·Heaptrack으로 리스너 누적 찾기계속 늘어나는 C++ 채팅 서버 메모리를 예로, RSS 지표로 누수 여부를 판단하고 Valgrind, ASan, Heaptrack을 각각 어디에 쓰는지, 해제되지 않는 이벤트 리스너를 어떻게 찾아 RAII로 고치는지 설명합니다. CI에 ASan을 넣을 때 잡히지 않는 누수의 종류도 다룹니다.
  • C++ 이름 맹글링: _Z 심볼 읽기, nm·c++filt로 디맹글링, extern C 링크 에러C++ 컴파일러가 오버로딩과 네임스페이스를 구분하려고 함수 이름을 _Z로 시작하는 심볼로 바꾸는 방식, nm과 c++filt로 심볼을 확인하고 디맹글링하는 방법, extern "C"로 C와 연결할 때 생기는 링크 에러 해결법을 설명합니다.
  • C++ 크래시 디버깅 실전 사례 | 간헐적 Segmentation Fault 해결기가끔만 터지는 C++ 채팅 서버 세그폴트를 예제로 꾸며, 코어 덤프와 gdb로 크래시 지점부터 잡고 로컬 재현이 안 되면 rr 역방향 디버깅으로 데이터 경쟁을 찾는 과정을 따라갑니다. 뮤텍스, shared_ptr·weak_ptr, Asio strand 세 가지 수정안과 TSan 검증을 다룹니다.
  • C++ REST API 성능 최적화 예제: perf로 병목 찾고 해시맵 인덱스·참조 반환으로 응답 시간 줄이기사용자 목록을 반환하는 C++ REST API를 예로 들어, 벤치마크 기준선을 잡고 perf로 핫스팟을 찾은 뒤 요청마다 전체를 훑던 탐색을 해시맵 인덱스로 바꾸고, User 복사를 참조 반환으로 없애고, JSON 직렬화를 정리하는 과정을 연산 횟수 기준으로 설명합니다. 요청 안에서의 병렬화가 왜 위험한지도 다룹니다.

난이도 표시가 없는 글 (2편)

  • C++ LNK2019 | 'unresolved external symbol' 링커 에러 원인 5가지와 해결법MSVC LNK2019 unresolved external symbol 오류를 선언만 있고 정의가 없는 경우, .cpp 파일 빌드 누락, 라이브러리 링크 누락, 네임스페이스 불일치, 헤더에 없는 템플릿 정의라는 다섯 가지 원인별로 재현하고 해결합니다.
  • Visual Studio C++ 빌드가 느릴 때: PCH·/MP 병렬 컴파일·증분 링크·Unity Build 설정느린 Visual Studio C++ 빌드를 프리컴파일 헤더(PCH), /MP 병렬 컴파일, /INCREMENTAL 증분 링크, 전방 선언으로 include 줄이기, Unity Build, C++20 모듈로 단축하는 설정 방법과 각 기법의 주의사항을 설명합니다.
pkglog

0xmote가 쓰고 관리하는 C++·백엔드·DevOps 문제 해결 기록입니다.

콘텐츠

블로그 주제별 모음 용어사전

정보

소개 연락처 Sitemap

법적 고지

개인정보처리방침 이용약관 면책 조항 편집 방침·정정 이력

© 2026 pkglog. All rights reserved.

Built with Astro

이 사이트는 Google AdSense 광고 게재 및 방문 통계 분석을 위해 쿠키를 사용합니다. 자세한 내용은 개인정보처리방침에서 확인하세요.