ASAN排查程序中內存問題使用總結

簡介

谷歌有一系列Sanitizer工具,可用于排查程序中內存相關的問題。常用的Sanitizer工具包括:

  1. Address Sanitizer(ASan):用于檢測內存使用錯誤。
  2. Leak Sanitizer(LSan):用于檢測內存泄漏。
  3. Thread Sanitizer(TSan):用于檢測多線程間的數據競爭和死鎖。
  4. Memory Sanitizer(MSan):用于檢測使用未初始化內存的行為。
    本文重點介紹ASan工具的使用。

ASAN工具作用

ASan工具可以檢測出程序不可理使用內存的行為,主要包括:

注:ASan內部包含LSan,故ASan也可以用來檢測內存泄漏相關問題。

ASAN工具原理

  1. 在編譯時,ASan會替換malloc/free接口;
  2. 在程序申請內存時,ASan會額外分配一部分內存(影子內存)來標識改內存的狀態;
  3. 在程序使用內存時,ASan會額外進行判斷,確認該內存是否可以被訪問,并在訪問異常時給出錯誤信息。

ASAN工具安裝

ASan已經集成在GCC 4.8中,但GCC 4.9及以上版本才支持 Address Sanitizer 的所有功能。
在這里插入圖片描述
可知,當前GCC版本已支持ASan,故無須再安裝。

ASAN工具使用

GCC編譯選項

-fsanitize=address:開啟內存越界檢測;
-fsanitize-recover=address:一般后臺程序為保證穩定性,不能遇到錯誤就簡單退出,而是繼續運行,采用該選項支持內存出錯之后程序繼續運行,需要疊加設置ASAN_OPTIONS=halt_on_error=0才會生效;若未設置此選項,則內存出錯即報錯退出;
-fno-stack-protector:去使能棧溢出保護;
-fno-omit-frame-pointer:去使能棧溢出保護

ASAN調試示例

測試示例一

測試程序

  1 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>4 5 void func(void)6 {7         char* str = NULL;8         memcpy(str, "test", sizeof("test"));9 }10 11 int main(void)12 {13         printf("hello world!\n");14 15         func();16 17         return 0;18 }

按如下方式編譯,并執行測試

lx@lx-virtual-machine:~/asan$ gcc main.c -fsanitize=address -fsanitize-recover=address -fno-stack-protector -fno-omit-frame-pointer
lx@lx-virtual-machine:~/asan$ 
lx@lx-virtual-machine:~/asan$ ./a.out 
hello world!
ASAN:DEADLYSIGNAL
=================================================================
==6880==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000001 (pc 0x7fd7df251255 bp 0x7ffc24aea420 sp 0x7ffc24ae9b88 T0)
==6880==The signal is caused by a WRITE memory access.
==6880==Hint: address points to the zero page.#0 0x7fd7df251254  (/lib/x86_64-linux-gnu/libc.so.6+0xbb254)#1 0x7fd7df6006ce  (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x796ce)#2 0x5637740ca9b1 in func (/home/lx/asan/a.out+0x9b1)#3 0x5637740ca9c9 in main (/home/lx/asan/a.out+0x9c9)#4 0x7fd7df1b7c86 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21c86)#5 0x5637740ca8a9 in _start (/home/lx/asan/a.out+0x8a9)AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/lib/x86_64-linux-gnu/libc.so.6+0xbb254) 
==6880==ABORTING

在這里插入圖片描述
可知,測試結果符合分析預期。

參考

https://blog.csdn.net/qq_15437629/article/details/114440930

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42065.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42065.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42065.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【9-2:RPC設計】

RPC 1. 基礎1.1 定義&特點1.2 具體實現框架1.3 應用場景2. RPC的關鍵技術點&一次調用rpc流程2.1 RPC流程流程兩個網絡模塊如何連接的呢?其它特性RPC優勢2.2 序列化技術序列化方式PRC如何選擇序列化框架考慮因素2.3 應用層的通信協議-http什么是IO操作系統的IO模型有哪…

數據結構第14節 加權圖

加權圖是在圖論中一種更為復雜的圖結構&#xff0c;它擴展了無向圖和有向圖的概念&#xff0c;通過給圖中的邊附加一個數值來表示邊的某種屬性&#xff0c;如成本、距離、容量或相似度等。這個數值被稱為邊的“權重”。 定義 加權圖可以被形式化地定義為一個三元組 ( G (V, …

Vortex GPGPU的硬件設計和代碼結構分析

文章目錄 前言一、GPGPU是什么&#xff1f;1.1 GPU和GPGPU之間的差異1.2 GPU和CPU之間的集成方式1.3 GPU包含什么&#xff08;列舉和VMIPS向量體系結構的差異&#xff09; 二、Vortex GPGPU是什么&#xff1f;2.1 Vortex GPGPU的技術邊界和驗證環境2.2 Vortex GPGPU的指令集設計…

安卓穩定性之crash詳解

目錄 前言一、Crash 的基本原理二、Crash 分析思路三、實例分析四、預防措施五、參考鏈接 前言 在開發和測試 Android 應用程序時&#xff0c;遇到應用程序崩潰是很常見的情況。 Android 崩潰指的是應用程序因為異常或錯誤而無法正常執行&#xff0c;并且導致應用強制關閉。 一…

p11函數和遞歸

遞歸與迭代 求n的階乘。&#xff08;不考慮溢出&#xff09; int Fac1(int n) {int i0;int ret1;for(i1;i<n;i){ret*i;}return ret; } int main(){//求n的階乘int n0;int ret0;scanf("%d",&n);retFac1(n);printf("%d\n",ret);return 0; } int Fac…

什么是激光導航和視覺導航技術

激光導航和視覺導航技術是現代導航系統中的兩種重要技術&#xff0c;它們在多個領域&#xff0c;如掃地機器人、無人機、機器人導航等中都有廣泛應用。以下是對這兩種技術的詳細介紹&#xff1a; 一、激光導航技術 1. 定義與原理 激光導航技術是一種利用激光束進行精確測量和…

ChatGPT:||是短路運算符,那么|、、是什么?

ChatGPT&#xff1a;||是短路運算符&#xff0c;那么|、&、&&是什么? 在Java中&#xff0c;邏輯運算符&&和||是短路邏輯運算符&#xff0c;而&和|是非短路邏輯運算符。 && 和 || 是短路邏輯運算符。當使用這些運算符時&#xff0c;如果第一個…

解決 Docker 容器鏡像拉取難題:全面指南

一、引言 在使用 Docker 容器的過程中&#xff0c;經常會遇到鏡像拉取慢甚至無法下載的問題&#xff0c;這給開發和部署工作帶來了不小的困擾。本文將深入探討這一問題的原因&#xff0c;并提供多種有效的解決方案。 二、問題原因分析 網絡限制 本地網絡帶寬不足或存在網絡擁…

unity知識點 專項四 一文徹底說清楚(錨點(anchor)、中心點(pivot)、位置(position)之間的關系)

一 概述 想要使UI控件在屏幕中達到正確的顯示效果&#xff0c;比如自適應屏幕尺寸、固定邊距等等&#xff0c;首先要理清楚幾個基本概念和設置&#xff1a;錨點(anchor)、中心點(pivot)、位置(position)、UI縮放模式、父物件的transform設置 二 Anchor、Pivot與Position 2…

網絡連接線相關問題

問題1&#xff1b; 直通線為什么兩頭都是T568B&#xff1f;是否可以兩臺T5568A&#xff1f;或者任意線序&#xff0c;只需兩頭一致&#xff1f; 不行&#xff0c;施工規范規定。&#xff08;原因&#xff1b;網線最長距離100m&#xff0c;實際用起來要把網線包管&#xff0c;走…

【分布式系統】Filebeat+Kafka+ELK 的服務部署

目錄 一.實驗準備 二.配置部署 Filebeat 三.配置Logstash 四.驗證 一.實驗準備 結合之前的博客中的實驗 主機名ip地址主要軟件es01192.168.80.101ElasticSearches02192.168.80.102ElasticSearches03192.168.80.103ElasticSearch、Kibananginx01192.168.80.104nginx、Logs…

iperf3: error - unable to connect to server: No route to host

1.確認iperf3版本是否統一。 2.確認防火墻是否關閉。 關閉防火墻 : systemctl stop firewalld 查看防火墻狀態: systemctl status firewalld 3.重新建起鏈接

Java進階----接口interface

接口 接口概述 接口是一種規范&#xff0c;使用接口就代表著要在程序中制定規范. 制定規范可以給不同類型的事物定義功能&#xff0c;例如&#xff1a; 利用接口&#xff0c;給飛機、小鳥制定飛行規范&#xff0c;讓其都具備飛行的功能&#xff1b;利用接口&#xff0c;給鼠…

SMU Summer 2024 Contest Round 1

A.Hcode OnlineJudge 給出一個N面骰子和整數K&#xff0c;擲出1-N之間的每個數的概率相同&#xff0c;每次擲出一次&#xff0c;記為成績&#xff0c;若成績小于K&#xff0c;則開始拋硬幣&#xff0c;硬幣朝上則數翻倍&#xff0c;反之則為0&#xff0c;概率都為0.5。當數大于…

自動駕駛算法———車道檢測(一)

“ 在本章中&#xff0c;我將指導您構建一個簡單但有效的車道檢測管道&#xff0c;并將其應用于Carla 模擬器中捕獲的圖像。管道將圖像作為輸入&#xff0c;并產生車道邊界的數學模型作為輸出。圖像由行車記錄儀&#xff08;固定在車輛擋風玻璃后面的攝像頭&#xff09;捕獲。…

【ZIP壓縮大揭秘】輕松掌握ZIP分卷壓縮包的高效解壓秘籍!

在這個信息爆炸的時代&#xff0c;文件大小常常成為我們分享與存儲的絆腳石。幸運的是&#xff0c;ZIP分卷壓縮技術如同一把鑰匙&#xff0c;巧妙地將龐然大物分解成小巧易管理的部分。但面對這一串分卷壓縮包&#xff0c;你是否也曾迷茫于如何高效解壓&#xff0c;恢復文件的完…

解碼Python字符串:‘r‘、‘b‘、‘u‘和‘f‘前綴的全面指南

&#x1f4d6; 正文 1 字符串前加’r’ 表示原始字符串&#xff0c;消除轉義 print(abc\nde) # abc # deprint(rabc\nde) # abc\nde在下面這個列子中&#xff0c;如果不在路徑字符串前面加r那么&#xff0c;路徑中的空格就會出現問題 print(rD:\01 programming\09python\py…

全志A527 T527 cat /proc/cupinfo沒有Serial問題

1.前言 我們有些客戶是使用cpuinfo節點去獲取系統的cpuid的,如下: cat /proc/cupinfo processor : 0 BogoMIPS : 48.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp CPU impleme…

系統吃swap問題排查

目錄 背景 問題 分析并解決 1.控制線程數 2.更換IO組件 3.Linux進程信息文件分析 總結加餐 參考文檔 背景 隔壁業務組系統是簡單的主從結構&#xff0c;寫索引的服務(主)叫primary&#xff0c; 讀索引并提供搜索功能的服務(從)叫replica。業務線同步數據并不是平滑的&…

離散化及其在 Pandas 中的實現方法

目錄 1.什么是離散化&#xff1f; 2.離散化類型 3.示例代碼 3.1連續變量離散化 3.2定性變量離散化 4.運行結果 4.1連續變量離散化 4.2定性變量離散化 1.什么是離散化&#xff1f; 離散化是將連續數據或分類數據轉換為離散類別的過程&#xff0c;方便后續的數據分析和機…