Linux编程:使用 AddressSanitizer (ASan) 进行C/C++内存错误检测

文章目录

    • 概要
    • ASan 的配置与运行时优化
      • CMake 配置
      • 运行时环境变量
    • ARM64 ASan库交叉编译
    • 动态链接 VS 静态链接
    • 示例:内存泄漏检测
      • ASan 检测结果

概要

AddressSanitizer(ASan)是内存错误检测的强大工具,本文将介绍如何在 ARM64 系统中有效配置和使用 ASan,同时提供一个示例程序的检测流程。

ASan 的配置与运行时优化

CMake 配置

在 ARM64 平台,通过 CMake 启用 ASan 的配置如下:

option(USE_ASAN "Enable AddressSanitizer for ARM64" OFF)if(USE_ASAN)add_compile_options(-fsanitize=address -fsanitize-recover=address)add_link_options(-lasan)
endif()

运行时环境变量

在 ARM64 上运行 ASan 编译的程序时,环境变量的设置至关重要:

export ASAN_OPTIONS="\
halt_on_error=0:\
log_path=/logs/asan.log:\
quarantine_size_mb=128"
export LD_PRELOAD=/path/to/libasan.so.5
  • halt_on_error=0 默认情况下,运行检测到异常,Asan会将程序Abort,并打印出错误时的堆栈信息。
    如果要检测出错误时程序不退出,则需要在编译时设置-fsanitize-recover=address,并且在环境变量halt_on_error=0。防止 ASan 在首次检测到错误时立即终止程序,便于观察更多错误。
  • log_path 设置 ASan 日志的存储路径。
  • quarantine_size_mb 控制 ASan 的缓存大小,Asan默认需要的缓存大小是256M,开发板不一定有足够的空间,因此考虑修改为128M;
  • LD_PRELOAD表示libasan.so.5需要在程序启动前加载。

ARM64 ASan库交叉编译

准备工作
在llvm-project中下载LLVM相应版本的源码。需要编译的模块在compiler-rt/lib目录,因此,只需要在compiler目录下进行操作。

  • 采用gcc交叉编译的shell脚本:
mkdir -p buildcd build && cmake .. \
-DCOMPILER_RT_BUILD_BUILTINS=ON \
-DCOMPILER_RT_BUILD_SANITIZERS=ON \
-DCOMPILER_RT_BUILD_XRAY=ON \
-DCOMPILER_RT_BUILD_LIBFUZZER=ON \
-DCOMPILER_RT_BUILD_PROFILE=ON \
-DCMAKE_SYSROOT=/path/to/aarch64-linux-gnu/libc \
-DCMAKE_ASM_COMPILER_TARGET="aarch64-linux-gnu" \
-DCMAKE_C_COMPILER_TARGET="aarch64-linux-gnu" \
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
-DCMAKE_C_COMPILER=/path/to/bin/aarch64-linux-gccmake -j10

动态链接 VS 静态链接

在 ARM64 系统上,动态链接 ASan 运行时库更为推荐,因为它:

  • 减少可执行文件的体积。
  • 提高了与其他动态库的兼容性。
  • 方便更新 ASan 库而无需重新编译应用程序。
  • 例如,使用 LD_PRELOAD 环境变量来加载 ASan 运行时库:
LD_PRELOAD=/path/to/libasan.so.5 ./my_program

示例:内存泄漏检测

下面是一个包含内存泄漏的 C++ 程序示例:

#include <iostream>void memoryLeak() {int* ptr = new int(5);// 忽略 delete ptr;
}int main() {std::cout << "Starting program..." << std::endl;memoryLeak();std::cout << "Program finished." << std::endl;return 0;
}

编译并运行程序,使用 ASan 查找内存泄漏:

g++ -fsanitize=address -fsanitize-recover=address -g -o my_program my_program.cpp
LD_PRELOAD=/path/to/libasan.so.5 ./my_program

ASan 检测结果

当运行程序时,ASan 将会检测到内存泄漏,并输出详细的报告。例如,ASan 的输出可能会类似于:

=================================================================
==1==ERROR: LeakSanitizer: detected memory leaksDirect leak of 4 byte(s) in 1 object(s) allocated from:#0 0x7f906e857e60 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.5+0xe8e60)#1 0x5555555560dc in memoryLeak() /path/to/my_program.cpp:5#2 0x5555555560f4 in main /path/to/my_program.cpp:11#3 0x7f906e61a0b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)SUMMARY: AddressSanitizer: 4 byte(s) leaked in 1 allocation(s).

这个报告指出了程序中发生的内存泄漏,包括泄漏的字节数、分配的位置和泄漏发生的调用栈信息。开发者可以根据这些信息来定位并修复内存泄漏问题,从而提高程序的内存管理效率和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/44696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

福克斯波罗FOXBOROFBM202处理器 控制器 模块

福克斯波罗FOXBOROFBM202电梯是现代建筑内关系到人民生命财产安全的重要交通工具。如何提高电梯的运行效率、降低电梯能耗以及减少机械磨损、延长电梯的使用寿命&#xff0c;都是非常重要的研究课题。电梯是楼层用以固定提升的成套设备&#xff0c;具有安全可靠、乘坐舒适、停层…

ConditionalOnMissingClass注解使用介绍、应用场景以及示例代码

概述 ConditionalOnMissingClass 是 Spring Framework 中的一个条件注解&#xff0c;它用于在类路径中缺少指定的类时决定是否创建一个 bean 或配置一个 bean。这个注解允许开发者根据类的存在与否来动态地配置应用程序上下文中的组件。 应用场景 兼容性处理: 当需要在不同的运…

工程化-vue3+ts:代码检测工具 ESLint

一、理解ESLint ESLint是一个开源的JavaScript代码检查工具&#xff0c;用于帮助开发人员规范和统一编码风格。它可以检查代码中的潜在错误、不一致的编码习惯以及一些常见的代码问题。 ESLint使用基于规则的插件体系&#xff0c;可以根据项目的需求和个人的偏好配置不同的规…

数据库数据恢复—SQL Server数据库由于存放空间不足报错的数据恢复案例

SQL Server数据库数据恢复环境&#xff1a; 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库&#xff0c;SQL Server数据库存放在D盘分区中。 SQL Server数据库故障&#xff1a; 存放SQL Server数据库的D盘分区容量不足&#xff0c;管理员在E盘中生…

MacOS如何切换shell类型

切换 shell 类型 如果你想在不同的 shell 之间切换&#xff0c;以探索它们的不同之处&#xff0c;或者因为你知道自己需要其中的一个或另一个&#xff0c;可以使用如下命令&#xff1a; 切换到 bash chsh -s $(which bash)切换到 zsh chsh -s $(which zsh)$()语法的作用是运…

FastGPT:给 GPT 插上知识库的翅膀!0基础搭建本地私有知识库,有手就行

写在前面 上一篇&#xff0c;我们部署了接口管理和分发神器-OneAPI&#xff0c;将所有大模型一键封装成OpenAI协议。见&#xff1a;[OneAPI)。 基于此&#xff0c;本篇继续带领大家搭建一个基于本地知识库检索的问答系统。 有同学说 Coze 不也可以实现同样功能么&#xff1f…

51单片机:电脑通过串口控制LED亮灭(附溢出率和波特率详解)

一、功能实现 1.电脑通过串口发送数据&#xff1a;0F 2.点亮4个LED 二、注意事项 1.发送和接受数据的文本模式 2.串口要对应 3.注意串口的波特率要和程序中的波特率保持一致 4.有无校验位和停止位 三、如何使用串口波特率计算器 1.以本程序为例 2.生成代码如下 void Uar…

[论文笔记]涨点近5%! 以内容中心的检索增强生成可扩展的级联框架:Pistis-RAG

引言 今天带来一篇较新RAG的论文笔记&#xff1a;Pistis-RAG: A Scalable Cascading Framework Towards Content-Centric Retrieval-Augmented Generation。 在希腊神话中&#xff0c;Pistis象征着诚信、信任和可靠性。受到这些原则的启发&#xff0c;Pistis-RAG是一个可扩展…

windows远程桌面到 Linux系统(Ubuntu:22.04)—— 安装xrdp软件

1、在Linux系统上安装xrdp软件 sudo apt update sudo apt install xrdp2、安装完成后&#xff0c;需要开启xrdp服务 sudo systemctl start xrdp sudo systemctl enable xrdp打印返回 Synchronizing state of xrdp.service with SysV service script with /lib/systemd/system…

一键叫车|开发打车小程序,随时随地便利出行!

随着移动互联网的普及&#xff0c;人们出行的方式也在不断发生变化。对于出行多样化和便捷化的需求&#xff0c;一款打车小程序可以方便人们的出行&#xff0c;提高出行效率和便捷性。打车小程序能够根据用户的出行需求为其打造个性化的出行方案&#xff0c;从而让用户的出行生…

【DevOps】在云原生时代的角色与重要性探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是云原生 2、云原生的核心特性 3、什么是DevOps…

网络建设与运维python脚本应用

python 脚本 &#xff08;1&#xff09;在linux4 上编写/root/createfile.py 的 python3 脚 本&#xff0c;创建20 个 文 件 /root/python/file00 至 /root/python/file19&#xff0c;如果文件存在&#xff0c;则删除再创建&#xff1b;每个文 件的内容同文件名&#xff0c;如…

【高中数学/指数、对数】已知9^m=10,a=10^m-11,b=8^m-9,则ab两数和0的大小关系是?(2022年全国统考高考真题)

【问题】 已知9^m10,a10^m-11,b8^m-9,则&#xff08;&#xff09; A.a>0>b B.a>b>0 C.b>a>0 D.b>0>a 【解答】 首先注意到10^log10_11-110,8^log8_9-90&#xff0c; 问题就转化为log8_9,log9_10,log10_11谁大谁小的问题&#xff0c; 再进一步…

Spring Data MongoDB 自定义转换器:写入和读取 LocalDateTime

Spring Data MongoDB 自定义转换器&#xff1a;写入和读取 LocalDateTime 引言 在使用 Spring Data MongoDB 时&#xff0c;有时需要将特定类型&#xff08;如 LocalDateTime&#xff09;与 MongoDB 文档中的特定格式&#xff08;如时间戳&#xff09;之间进行自定义转换。本…

C++ //练习 14.50 在初始化ex1和ex2的过程中,可能用到哪些类类型的转换序列呢?说明初始化是否正确并解释原因。

C Primer&#xff08;第5版&#xff09; 练习 14.50 练习 14.50 在初始化ex1和ex2的过程中&#xff0c;可能用到哪些类类型的转换序列呢&#xff1f;说明初始化是否正确并解释原因。 struct LongDouble{LongDouble(double 0.0);operator double();operator float(); }; Long…

在 C# .NET 中,首选静态 HashData 方法而不是 ComputeHash

在 .NET 中&#xff0c;哈希处理是一项常见任务&#xff0c;无论是用于数据完整性检查、密码哈希处理还是其他加密目的。传统上&#xff0c;开发人员使用各种哈希算法&#xff08;例如 SHA256、MD5&#xff09;提供的 ComputeHash 方法。但是&#xff0c;随着静态 HashData 方法…

Python面试题:如何在 Python 中解析 XML 文件?

在 Python 中解析 XML 文件可以使用内置的 xml.etree.ElementTree 模块。以下是一个示例&#xff0c;展示了如何使用这个模块解析 XML 文件&#xff1a; 读取 XML 文件&#xff1a; import xml.etree.ElementTree as ET# 读取 XML 文件 tree ET.parse(example.xml) root tr…

springboot+vue项目实战2024第四集修改文章信息

1.添加文章信息 PostMappingpublic Result add(RequestBody Validated Article article){articleService.add(article);return Result.success();}void add(Article article); Override public void add(Article article) {article.setCreateTime(LocalDateTime.now());article…

openssl等库降级到系统原生安装镜像版本

在安装开发库时&#xff0c;看到curl glib2 libcurl openssl库被更新了&#xff0c;这不是我想要的。如下所示&#xff1a; Verifying : curl-8.4.0-5.oe2403.x86_64 29/38 Verifying : curl-8.4.0-3.oe2403.x86_64 …

如何将Docker镜像源更改为阿里云的镜像加速地址

在使用Docker时&#xff0c;尤其是在国内环境下&#xff0c;由于网络原因&#xff0c;从Docker Hub拉取镜像可能会遇到速度较慢的问题。为了提高拉取速度&#xff0c;我们可以将Docker的镜像源更改为阿里云等国内镜像源。下面详细介绍如何获取并配置阿里云的Docker镜像加速地址…