ホームページ  >  記事  >  システムチュートリアル  >  Linux でのメモリ問題のトラブルシューティングのための強力なツール

Linux でのメモリ問題のトラブルシューティングのための強力なツール

王林
王林転載
2024-02-12 22:20:141021ブラウズ

1. メモリ リーク

メモリ リークとは、プログラム内で動的に割り当てられたヒープ メモリが解放されないか、何らかの理由でプログラムによって解放できないことを意味します。その結果、システム メモリが無駄に消費され、プログラムの実行速度やシステムの速度が低下するなどの深刻な結果につながります。クラッシュ。

Linux でのメモリ問題のトラブルシューティングのための強力なツール

######特徴######

Concealment メモリリークはメモリブロックが解放されないために発生するため、フォールト欠陥ではなく省略欠陥です。

    累積メモリ リークは通常、目に見えるエラー症状を直接的に引き起こしませんが、徐々に蓄積してシステム全体のパフォーマンスを低下させ、極端な場合にはシステムのクラッシュを引き起こす可能性があります。最も直観的な疑問は、なぜプログラムが正常に実行を開始し、しばらく後に異常終了するのかということです。
  • メモリ リークはメモリの物理的な消失を意味するのではなく、アプリケーションがメモリの特定のセグメントを割り当てた後、使用エラーによりメモリ セグメントが解放される前にメモリ セグメントの制御が失われることを意味します。結果として、メモリは解放されず、無駄になります。
原因

#「

プログラム開発中に動的ストレージ変数を使用すると、必然的にメモリ管理の問題に直面します。プログラム内で動的に割り当てられた記憶域は、プログラムの実行後に解放する必要があります。動的に割り当てられた記憶域スペースを解放しないことによって発生するメモリ リークは、動的記憶域変数を使用する場合の主な問題です。通常の状況では、開発者は多くの場合、

malloc、realloc、calloc、free など、システムによって提供される基本的なメモリ管理関数を使用して、動的ストレージ変数のストレージ領域の割り当てと解放を完了します。ただし、動的ストレージ変数を多く使用し、関数呼び出しを頻繁に使用するプログラムを開発すると、メモリ管理エラーが頻繁に発生します。

#2. メモリ リークのトラブルシューティング方法

#「

日々の開発プロセスではメモリ リークが必ず発生しますが、これはよくある問題です。メモリ リークが発生したため、メモリ リークの問題をトラブルシューティングする必要があります。メモリの問題のトラブルシューティングには、誰もがよく次のツールを使用すると思います。

  • メモリウォッチ
  • mtrace
  • dmalloc
  • ccmalloc
  • ヴァルグリンド
  • debug_new

#「

今日、Mu Rong は上記のトラブルシューティング ツールを紹介するのではなく、別のメモリ リーク トラブルシューティング ツールである AddressSanitizer (ASan) を紹介します。 Linux、OS、Android などのプラットフォームをサポートしており、メモリ リークを検出するだけでなく、多くの一般的なメモリ問題を検出できるメモリ エラー検出ツールです。

#一般的なメモリ問題の検出:

メモリーリーク######
    国境を越えたアクセス
  • 解放された使用済みメモリ
  • 3. AddressSanitizer(ASan) ツール

#「

Address Sanitizer(ASan) は、高速メモリ エラー検出ツールです。これは非常に高速で、プログラムの速度が約 2 倍遅くなるだけです (Valgrind よりもはるかに高速です)。これには、コンパイラ計測モジュールと、malloc()/free() の代替手段を提供するランタイム ライブラリが含まれています。 gcc 4.8 以降、AddressSanitizer は gcc の一部になりました。もちろん、より良いエクスペリエンスを得るには、バージョン 4.9 以降を使用するのが最善です。gcc 4.8 の AddressSanitizer はまだ完全ではなく、最大の欠点はシンボル情報がないことです。

# ###説明書:###

-fsanitize=address オプションを使用してプログラムをコンパイルし、リンクします。

-fno-omit-frame-pointer を指定してコンパイルすると、よりわかりやすいスタック トレースが得られます。

    ## をコンパイルするには、-O1 以上の最適化レベルを選択できます。
  • rree ######メモリーリーク###### リーリー コンパイル出力
  • メモリが範囲外です
スタックメモリが範囲外です

rree

実行出力

リーリー

Linux でのメモリ問題のトラブルシューティングのための強力なツール グローバル メモリが範囲外です

rree

実行出力
    リーリー
  • 解放されたメモリを使用する
リーリー

実行出力

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlxlinux.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。