ホームページ >システムチュートリアル >Linux >Linux でのメモリ問題のトラブルシューティングのための強力なツール
メモリ リークとは、プログラム内で動的に割り当てられたヒープ メモリが解放されないか、何らかの理由でプログラムによって解放できないことを意味します。その結果、システム メモリが無駄に消費され、プログラムの実行速度やシステムの速度が低下するなどの深刻な結果につながります。クラッシュ。
######特徴######プログラム開発中に動的ストレージ変数を使用すると、必然的にメモリ管理の問題に直面します。プログラム内で動的に割り当てられた記憶域は、プログラムの実行後に解放する必要があります。動的に割り当てられた記憶域スペースを解放しないことによって発生するメモリ リークは、動的記憶域変数を使用する場合の主な問題です。通常の状況では、開発者は多くの場合、#「malloc、realloc、calloc、free など、システムによって提供される基本的なメモリ管理関数を使用して、動的ストレージ変数のストレージ領域の割り当てと解放を完了します。ただし、動的ストレージ変数を多く使用し、関数呼び出しを頻繁に使用するプログラムを開発すると、メモリ管理エラーが頻繁に発生します。
」
#2. メモリ リークのトラブルシューティング方法
」
メモリーリーク#######「」
今日、Mu Rong は上記のトラブルシューティング ツールを紹介するのではなく、別のメモリ リーク トラブルシューティング ツールである AddressSanitizer (ASan) を紹介します。 Linux、OS、Android などのプラットフォームをサポートしており、メモリ リークを検出するだけでなく、多くの一般的なメモリ問題を検出できるメモリ エラー検出ツールです。
」
#一般的なメモリ問題の検出:
Address Sanitizer(ASan) は、高速メモリ エラー検出ツールです。これは非常に高速で、プログラムの速度が約 2 倍遅くなるだけです (Valgrind よりもはるかに高速です)。これには、コンパイラ計測モジュールと、malloc()/free() の代替手段を提供するランタイム ライブラリが含まれています。 gcc 4.8 以降、AddressSanitizer は gcc の一部になりました。もちろん、より良いエクスペリエンスを得るには、バージョン 4.9 以降を使用するのが最善です。gcc 4.8 の AddressSanitizer はまだ完全ではなく、最大の欠点はシンボル情報がないことです。
」# ###説明書:###
-fsanitize=address オプションを使用してプログラムをコンパイルし、リンクします。
-fno-omit-frame-pointer を指定してコンパイルすると、よりわかりやすいスタック トレースが得られます。
リーリー
グローバル メモリが範囲外です実行出力
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 中国語 Web サイトの他の関連記事を参照してください。