메모리 누수란 프로그램에서 동적으로 할당된 힙 메모리가 해제되지 않거나 어떤 이유로 해제될 수 없어 시스템 메모리가 낭비되어 프로그램 실행 속도가 느려지거나 시스템 충돌까지 초래하는 심각한 결과를 초래하는 것을 의미합니다.
메모리 누수는 메모리가 물리적으로 사라지는 것을 의미하는 것이 아니라 애플리케이션이 특정 메모리 세그먼트를 할당한 후 사용 오류로 인해 해제되기 전에 메모리 세그먼트에 대한 제어권을 잃어 메모리가 해제되지 않는 것을 의미합니다. 그리고 낭비되었습니다.
“
프로그램 개발 중에 동적 저장 변수를 사용하면 필연적으로 메모리 관리 문제에 직면하게 됩니다. 프로그램에서 동적으로 할당된 저장 공간은 프로그램 실행 후 해제되어야 합니다. 동적으로 할당된 저장 공간을 해제하지 않아 발생하는 메모리 누수는 동적 저장 변수를 사용할 때 발생하는 주요 문제입니다. 정상적인 상황에서 개발자는
malloc、realloc、calloc、free
등과 같이 시스템에서 제공하는 기본 메모리 관리 기능을 사용하여 동적 저장소 가변 저장 공간의 할당 및 해제를 완료하는 경우가 많습니다. 그러나 개발 프로그램에서 동적 저장 변수를 많이 사용하고 함수 호출을 자주 사용하게 되면 메모리 관리 오류가 자주 발생하게 된다.”
“
일상적인 개발 과정에서 필연적으로 메모리 누수가 발생합니다. 이는 일반적인 문제입니다. 메모리 누수가 발생했기 때문에 메모리 누수 문제를 해결해야 합니다. 메모리 문제를 해결하기 위해 다음과 같은 도구를 자주 사용한다고 생각합니다.
”
“
오늘 뮤롱은 위의 문제 해결 도구가 아닌 또 다른 메모리 누수 문제 해결 도구인 AddressSanitizer(ASan)를 소개합니다. Linux, OS, Android 및 기타 플랫폼을 지원하며 메모리 누수를 감지할 수 있을 뿐만 아니라 많은 일반적인 메모리 문제를 감지할 수 있는 메모리 오류 감지 도구입니다.
”
일반적인 메모리 문제 감지:
“
Address Sanitizer(ASan)은 빠른 메모리 오류 감지 도구입니다. 매우 빠르며 프로그램 속도가 약 두 배 정도 느려집니다(Valgrind보다 훨씬 빠릅니다). 여기에는 컴파일러 계측 모듈과 malloc()/free() 대안을 제공하는 런타임 라이브러리가 포함되어 있습니다. gcc 4.8부터 AddressSanitizer는 gcc의 일부가 됩니다. 물론 더 나은 경험을 얻으려면 버전 4.9 이상을 사용하는 것이 가장 좋습니다. gcc 4.8의 AddressSanitizer는 아직 완벽하지 않으며 가장 큰 단점은 기호 정보가 없다는 것입니다.
”
사용 방법:
컴파일 출력
출력 실행
으아악출력 실행
으아악출력 실행
ubuntu@ubuntu:~/workspace_ex/Linux/ASan$ gcc -fsanitize=address -o main -g main.c ubuntu@ubuntu:~/workspace_ex/Linux/ASan$ ./main ================================================================= ==4954==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60400000dff8 at pc 0x000000400b68 bp 0x7ffefbe3b170 sp 0x7ffefbe3b160 READ of size 4 at 0x60400000dff8 thread T0 #0 0x400b67 in main /home/ubuntu/workspace_ex/Linux/ASan/main.c:28 #1 0x7f1bbb78983f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2083f) #2 0x400928 in _start (/home/ubuntu/workspace_ex/Linux/ASan/main+0x400928) 0x60400000dff8 is located 0 bytes to the right of 40-byte region [0x60400000dfd0,0x60400000dff8) allocated by thread T0 here: #0 0x7f1bbbbcb602 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98602) #1 0x400b0b in main /home/ubuntu/workspace_ex/Linux/ASan/main.c:23 #2 0x7f1bbb78983f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2083f) SUMMARY: AddressSanitizer: heap-buffer-overflow /home/ubuntu/workspace_ex/Linux/ASan/main.c:28 main Shadow bytes around the buggy address: 0x0c087fff9ba0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9bb0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9bc0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9bd0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9be0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa =>0x0c087fff9bf0: fa fa fa fa fa fa fa fa fa fa 00 00 00 00 00[fa] 0x0c087fff9c00: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9c10: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9c20: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9c30: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c087fff9c40: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa Shadow byte legend (one shadow byte represents 8 application bytes): Addressable: 00 Partially addressable: 01 02 03 04 05 06 07 Heap left redzone: fa Heap right redzone: fb Freed heap region: fd Stack left redzone: f1 Stack mid redzone: f2 Stack right redzone: f3 Stack partial redzone: f4 Stack after return: f5 Stack use after scope: f8 Global redzone: f9 Global init order: f6 Poisoned by user: f7 Container overflow: fc Array cookie: ac Intra object redzone: bb ASan internal: fe ==4954==ABORTING ubuntu@ubuntu:~/workspace_ex/Linux/ASan$
错误类型 | 错误描述 |
---|---|
(heap) Use after free | 访问堆上已被释放的内存 |
Heap buffer overflow | 堆上缓冲区访问溢出 |
Stack buffer overflow | 栈上缓冲区访问溢出 |
Global buffer overflow | 全局缓冲区访问溢出 |
Use after return | 访问栈上已被释放的内存 |
Use after scope | 栈对象使用超过定义范围 |
Initialization order bugs | 初始化命令错误 |
Memory leaks | 内存泄漏 |
자세한 내용은 Google의 공식 문서를 참조하세요: https://github.com/google/sanitizers/wiki/AddressSanitizer
“
ASan은 메모리 문제를 감지하는 데 매우 유용한 도구입니다. 환경 구성이 필요하지 않으며 컴파일할 때 -fsanitize=address -g만 있으면 됩니다. ASAN_OPTIONS 환경 변수는 많은 메모리 문제를 감지합니다. 불분명한 부분이 있으면 공식 지침을 확인하여 교환하고 배울 수 있습니다.
”
위 내용은 Linux에서 메모리 문제를 해결하기 위한 강력한 도구의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!