asan检测内存泄漏

前言

ASAN是一个内存问题检测工具
类似的还有valgrind, 但是valgrind运行时会占用非常多的内存

初始代码

#include<stdio.h>
#include"arcojson.h"

int leak_func()
{
    arco_json* jtest = new_json_object();
    json_object_add(jtest, "name", new_json_string("arco~"));
    printf("%s\n", json_to_string(jtest));
}

int main()
{
    leak_func();
    return 0;
}

初始CMakeLists.txt

project(asantest)
cmake_minimum_required(VERSION 3.16)
add_executable(asantest main.c arcojson.c)

这个arcojson.c来源于另一篇文章,是一个简单的c json库
https://blog.csdn.net/weixin_44919664/article/details/136113774

暂时还没有链接asan库
编译运行, 输出

./asantest
{"name":"arco~"}

链接asan动态库

更改CMakeLists.txt

project(asantest)
cmake_minimum_required(VERSION 3.16)
add_executable(asantest main.c arcojson.c)
set_target_properties(asantest PROPERTIES LINK_FLAGS "-Wl,-rpath,.:./lib:/lib64 -fsanitize=address -fno-omit-frame-pointer -fsanitize-recover=all")
target_link_libraries(asantest asan)

注意:-Wl,-rpath之间没有空格

参数说明:我使用的是CMake,Makefile原理也一样, 就是增加gcc的编译选项
-static-libasan 用于链接asan的静态库
-fsanitize=address 检测各种内存错误
同类参数:leak undefined thread memory dataflow
-fno-omit-frame-pointer:保留函数调用栈指针,用于asan更准确的定位错误位置
-fsanitize-recover=all:检测到错误时继续运行
(只检测内存泄漏的话可以用lsan

编译运行: 这将直接在控制台上打印检测信息

也可以导出环境变量
export LSAN_OPTIONS=“verbosity=1:log_threads=1:log_path=/home/asan.log:print_cmdline=1:log_exe_name=1”
这将把输出记录在日志文件里
在这里插入图片描述

静态方式链接

我记录这篇文档用的是本地环境,但实际开发的时候用的是交叉编译环境,还需要拷贝asan库到运行环境上
因此也试了一下链接静态库的方式

# 动态库大小26k
-rwxr-xr-x 1 root root  26K  77 16:58 asantest
# 静态库大小
-rwxr-xr-x 1 root root 1.4M  77 17:04 asantest

更改CMAke

project(asantest)
cmake_minimum_required(VERSION 3.16)
add_executable(asantest main.c arcojson.c)
set_target_properties(asantest PROPERTIES LINK_FLAGS "-Wl,-rpath,.:./lib:/lib64 -fsanitize=address -fno-omit-frame-pointer -fsanitize-recover=all")
target_link_libraries(asantest asan)

重新编译运行
输出和环境变量同动态库

额外说明

还有个ASAN option但我不确定是干啥的

export ASAN_OPTIONS="halt_on_error=0:use_sigaltstack=0:detect_leaks=1:symbolize=1:malloc_content_size=15:log_path=/home/asan.log:print_cmdline=1:log_exe_name=1"

如果环境上没有ASAN库, 是拷贝来的, 那么运行时还要在终端上导出LD_PRELOAD环境变量(预加载库路径)

export LD_PRELOAD=/xxx/libasan.so.4

小结

个人觉得,内存检测工具也就图一乐,内存泄漏根本无法解决
自己写的代码检查下还行,公司里我负责的模块(约50w行代码)内存泄漏遍地,用asan和valgrind愣是扫不出来

相关推荐

  1. 4、内存泄漏检测(多线程)

    2024-07-10 11:36:01       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 11:36:01       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 11:36:01       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 11:36:01       90 阅读
  4. Python语言-面向对象

    2024-07-10 11:36:01       98 阅读

热门阅读

  1. FPGA之术语

    2024-07-10 11:36:01       26 阅读
  2. 【Axure视频教程】页面滚动距离函数

    2024-07-10 11:36:01       26 阅读
  3. 如何判断服务器是否被攻击

    2024-07-10 11:36:01       29 阅读
  4. 网络服务器都包含哪些方面需要维护?

    2024-07-10 11:36:01       22 阅读
  5. 定制化正则化:在Mojo模型中动态应用自定义方法

    2024-07-10 11:36:01       28 阅读
  6. 稀疏之美:在Mojo模型中实现特征的稀疏表示

    2024-07-10 11:36:01       34 阅读
  7. AI开发者的编程语言Mojo:入门指南

    2024-07-10 11:36:01       31 阅读
  8. 跨语言的智能:在多种编程环境中部署Mojo模型

    2024-07-10 11:36:01       30 阅读
  9. Mojo编程语言详细介绍

    2024-07-10 11:36:01       29 阅读
  10. 掌握MOJO命令行:参数解析的艺术

    2024-07-10 11:36:01       29 阅读
  11. 运营商二三要素是什么?有什么意义

    2024-07-10 11:36:01       25 阅读
  12. 3102. 最小化曼哈顿距离

    2024-07-10 11:36:01       24 阅读
  13. PHP String manipulation: A comprehensive guide

    2024-07-10 11:36:01       29 阅读
  14. Qt5 Ubuntu18 QStackedWidget

    2024-07-10 11:36:01       27 阅读