在 ARM64 系统上使用 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/44226.shtml

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

相关文章

新版FMEA培训未能达到预期效果怎么办?

在制造业的质量管理中&#xff0c;FMEA&#xff08;Failure Mode and Effects Analysis&#xff0c;失效模式与影响分析&#xff09;是一项至关重要的工具&#xff0c;它帮助企业识别和评估产品或过程中潜在的失效模式&#xff0c;以及这些失效模式可能导致的后果。然而&#x…

查看操作系统版本

查看操作系统版本 cat /etc/os-release 显示操作系统相关信息&#xff0c;包括发行版、版本号、ID等NAME"kos"VERSION"5.8"ID"kos"ID_LIKE"anolis rhel fedora centos"VERSION_ID"5.8"PLATFORM_ID"platform:an8"P…

FastAPI 学习之路(三十六)引入APIRouter

本次调整后的目录如下&#xff1a; 我们可以使用APIRouter来声明路径操作&#xff0c;我们先看下如何去使用。 我们根据选择划分为users和items来细分。 具体实现如下&#xff1a; ①先看items实现 from fastapi import APIRouter from fastapi import Depends from models.…

对称加密与非对称加密如何实现密钥交换

目录 一、对称加密中的密钥交换二、非对称加密中的密钥交换三、结合使用 对称加密与非对称加密在实现密钥交换时有着本质的不同方法。 一、对称加密中的密钥交换 由于对称加密使用相同的密钥进行加密和解密&#xff0c;因此密钥本身的安全传输是一个挑战。以下是一些常用的方…

面试题009-Java-MyBatis

面试题009-Java-MyBatis 目录 面试题009-Java-MyBatis题目自测题目答案1. 什么是MyBatis&#xff1f;它与Hibernate有什么区别&#xff1f;2. 说一下MyBatis的执行流程&#xff1f;3. MyBatis是否支持延迟加载&#xff1f;4. MyBatis中一级缓存和二级缓存的区别&#xff1f;5. …

Unity AssetsBundle 详解

文章目录 1.AssetBundle 概念2.AssetBundle 优势3.AssetBundle 特性4.AssetBundle 使用流程4.1 分组4.2 打包4.3 加载包4.4 加载资源4.5 卸载资源 5.AssetBundleManifest6.AssetBundle的内存占用7.AB包资源加密 1.AssetBundle 概念 AssetBundle又称AB包&#xff0c;是Unity提供…

【TORCH】查看dataloader里的数据,通过dataloader.dataset或enumerate

文章目录 dataloader.dataset示例代码使用自定义数据集使用 MNIST 数据集 说明 enumerate示例代码说明使用 MNIST 数据集的例子 dataloader.dataset 是的&#xff0c;您可以直接访问 train_loader 的数据集来查看数据&#xff0c;而不必通过 enumerate 遍历数据加载器。可以通…

如何用Vue3和Plotly.js创建交互式表格?

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Plotly.js 动态生成 HTML 表格 应用场景介绍 在数据分析和可视化领域&#xff0c;经常需要以表格的形式展示数据。Plotly.js 是一款功能强大的 JavaScript 库&#xff0c;不仅可以创建交互式图表&#xff0c;…

基于Java的飞机大战游戏的设计与实现论文

点击下载源码 基于Java的飞机大战游戏的设计与实现 摘 要 现如今&#xff0c;随着智能手机的兴起与普及&#xff0c;加上4G&#xff08;the 4th Generation mobile communication &#xff0c;第四代移动通信技术&#xff09;网络的深入&#xff0c;越来越多的IT行业开始向手机…

【SVN-CornerStone客户端使用SVN-多人开发-解决冲突 Objective-C语言】

一、接下来,我们来说第三方的图形化界面啊, 1.Corner Stone:图形化界面,使用SVN, Corner Stone的界面,大概就是这样的, 1)左下角:是我们远程的一个仓库, 2)右上角:是我们本地的一些东西, 首先,在我的服务器上,再开一个仓库,叫做wechat, 我在这个里边,新建…

Stable Diffusion / huggingface 相关配置问题汇总

目录 1 OSError: Cant load tokenizer for openai/clip-vit-large-patch14.报错解决方法方法1——手动下载方法2——自动下载其他方法&#xff08;待研究&#xff09; 2 huggingface_hub.utils._errors.LocalEntryNotFoundError:报错解决方法 笔者在配置SD的时候遭遇了许多bug&…

NestJs实现各种请求与参数解析

NestJs中的各种请求与携带参数的解析 demo.controller.ts import { Body, Param, Controller, Delete, Get, Post, Patch } from nestjs/common; import { DemoService } from ./demo.service; import { adduser, updateuser } from "./types/index" Controller(de…

用Racket做一个拼图游戏——4 实现工具

4 实现工具 思路理清楚了&#xff0c;接下来就一个一个功能实现。在阐述实现功能的编程过程中&#xff0c;会延伸讲解编程思路、相关的Racket函数及相关知识点&#xff0c;力图达到在实践中的学习目的。 在编程实现过程中&#xff0c;首先实现图片操作功能&#xff0c;再通过…

告别混乱,可道云企业网盘个人标签,让文件管理更轻松

在信息爆炸的时代&#xff0c;你是不是常常觉得自己的大脑就像一台过载的处理器&#xff0c;各种文件、资料、想法在脑海中“打架”&#xff0c;让你焦头烂额&#xff1f; 别担心&#xff0c;可道云企业网盘个人标签功能来拯救你的“大脑内存”了&#xff01; 我们需要告别无…

Docker 容器出现 IP 冲突

Docker 容器出现 IP 冲突的情况可能由以下几个原因导致&#xff1a; 静态 IP 分配&#xff1a;如果你在 docker-compose.yml 文件中为多个容器手动设置了相同的静态 IP 地址&#xff0c;那么这些容器在启动时就会出现 IP 冲突。确保每个容器分配的静态 IP 地址是唯一的。桥接网…

求函数最小值-torch版

目标&#xff1a;torch实现下面链接中的梯度下降法 先计算 的导函数 &#xff0c;然后计算导函数 在处的梯度 (导数) 让 沿着 梯度的负方向移动&#xff0c; 自变量 的更新过程如下 torch代码实现如下 import torchx torch.tensor([7.5],requires_gradTrue) # print(x.gr…

【保姆级教程】CenterNet的目标检测、3D检测、关键点检测使用教程

一、代码下载 仓库地址:https://github.com/xingyizhou/CenterNet?tab=readme-ov-file 二、目标检测 2.1 下载预训练权重 下载预训练权重ctdet_coco_dla_2x.pth放到models文件夹下 下载链接:https://drive.google.com/file/d/18Q3fzzAsha_3Qid6mn4jcIFPeOGUaj1d/edit …

Elasticsearch 搜索模板:重用和共享查询

在Elasticsearch&#xff08;ES&#xff09;的日常开发和运维中&#xff0c;我们经常会遇到需要频繁执行相似查询的场景。这些查询可能因业务逻辑的复杂性而涉及多个字段、过滤条件和聚合分析。为了优化这些操作&#xff0c;提高开发效率&#xff0c;Elasticsearch提供了搜索模…

连续6年夺冠 6项细分领域第一,中电金信持续领跑中国银行业IT解决方案市场

7月9日&#xff0c;工信部赛迪顾问发布《2023年度中国银行业IT解决方案市场分析报告》&#xff08;简称《报告》&#xff09;。中电金信以7.38%的市场份额再度蝉联2023中国银行业IT解决方案市场份额第一&#xff0c;以显著优势持续领跑中国银行业IT解决方案市场。在细分领域&am…

最小生成树prim优先队列优化版

动态数组加结构体省空间&#xff0c;重载结构体排序写队列优先级。 #include<iostream> #include<queue> #include<vector> using namespace std; int n,m; int vis[5001]; struct edge{int v,w; }; vector<edge> G[5001];struct node{int id,d; };st…