Linux에서 메모리 문제를 해결하기 위한 강력한 도구

王林
풀어 주다: 2024-02-12 22:20:14
앞으로
1026명이 탐색했습니다.

1. 메모리 누수

메모리 누수란 프로그램에서 동적으로 할당된 힙 메모리가 해제되지 않거나 어떤 이유로 해제될 수 없어 시스템 메모리가 낭비되어 프로그램 실행 속도가 느려지거나 시스템 충돌까지 초래하는 심각한 결과를 초래하는 것을 의미합니다.

Linux에서 메모리 문제를 해결하기 위한 강력한 도구

특징

  • 은폐 메모리 블록이 해제되지 않아 메모리 누수가 발생하므로 결함 결함보다는 누락 결함입니다
  • 누적 메모리 누수는 일반적으로 관찰 가능한 오류 증상을 직접적으로 나타내지 않지만 점차 누적되어 시스템의 전체 성능을 저하시키며, 극단적인 경우 시스템 충돌을 일으킬 수 있습니다. 가장 직관적인 질문은 왜 우리 프로그램이 정상적으로 실행되기 시작했다가 잠시 후에 비정상적으로 종료되는지입니다.

메모리 누수는 메모리가 물리적으로 사라지는 것을 의미하는 것이 아니라 애플리케이션이 특정 메모리 세그먼트를 할당한 후 사용 오류로 인해 해제되기 전에 메모리 세그먼트에 대한 제어권을 잃어 메모리가 해제되지 않는 것을 의미합니다. 그리고 낭비되었습니다.

원인

프로그램 개발 중에 동적 저장 변수를 사용하면 필연적으로 메모리 관리 문제에 직면하게 됩니다. 프로그램에서 동적으로 할당된 저장 공간은 프로그램 실행 후 해제되어야 합니다. 동적으로 할당된 저장 공간을 해제하지 않아 발생하는 메모리 누수는 동적 저장 변수를 사용할 때 발생하는 주요 문제입니다. 정상적인 상황에서 개발자는 malloc、realloc、calloc、free 등과 같이 시스템에서 제공하는 기본 메모리 관리 기능을 사용하여 동적 저장소 가변 저장 공간의 할당 및 해제를 완료하는 경우가 많습니다. 그러나 개발 프로그램에서 동적 저장 변수를 많이 사용하고 함수 호출을 자주 사용하게 되면 메모리 관리 오류가 자주 발생하게 된다.

2. 메모리 누수 문제를 해결하는 방법

일상적인 개발 과정에서 필연적으로 메모리 누수가 발생합니다. 이는 일반적인 문제입니다. 메모리 누수가 발생했기 때문에 메모리 누수 문제를 해결해야 합니다. 메모리 문제를 해결하기 위해 다음과 같은 도구를 자주 사용한다고 생각합니다.

  • 밈워치
  • mtrace
  • dmalloc
  • ccmalloc
  • valgrind
  • debug_new

오늘 뮤롱은 위의 문제 해결 도구가 아닌 또 다른 메모리 누수 문제 해결 도구인 AddressSanitizer(ASan)를 소개합니다. Linux, OS, Android 및 기타 플랫폼을 지원하며 메모리 누수를 감지할 수 있을 뿐만 아니라 많은 일반적인 메모리 문제를 감지할 수 있는 메모리 오류 감지 도구입니다.

일반적인 메모리 문제 감지:

  • 메모리 누수
  • 국경 간 액세스
  • 사용된 메모리 해제

3. AddressSanitizer(ASan) 도구

Address Sanitizer(ASan)은 빠른 메모리 오류 감지 도구입니다. 매우 빠르며 프로그램 속도가 약 두 배 정도 느려집니다(Valgrind보다 훨씬 빠릅니다). 여기에는 컴파일러 계측 모듈과 malloc()/free() 대안을 제공하는 런타임 라이브러리가 포함되어 있습니다. gcc 4.8부터 AddressSanitizer는 gcc의 일부가 됩니다. 물론 더 나은 경험을 얻으려면 버전 4.9 이상을 사용하는 것이 가장 좋습니다. gcc 4.8의 AddressSanitizer는 아직 완벽하지 않으며 가장 큰 단점은 기호 정보가 없다는 것입니다.

사용 방법:

  • -fsanitize=address 옵션을 사용하여 프로그램을 컴파일하고 연결합니다.
  • 보다 이해하기 쉬운 스택 추적을 얻으려면 -fno-omit-frame-pointer로 컴파일하십시오.
  • 선택 사항 -O1 이상의 최적화 수준 컴파일
아아아아

메모리 누수

으아악

컴파일 출력

Linux에서 메모리 문제를 해결하기 위한 강력한 도구

메모리가 범위를 벗어났습니다.

  • 스택 메모리가 범위를 벗어났습니다
아아아아

출력 실행

으아악
  • 전역 메모리가 범위를 벗어났습니다
아아아아

출력 실행

으아악

해제된 메모리 사용

으아악

출력 실행

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$
로그인 후 복사

AddressSanitizer能检测的错误类型

错误类型 错误描述
(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:lxlinux.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!