内存越界|内存泄漏检测方法

内存泄漏检测可在CMakeLists.txt 文件中,添加 -fsanitize=leak

set(CMAKE_CXX_FLAGS "-fsanitize=leak -std=c++11 -g -Wall -Wno-unused-result -DROS ${CMAKE_CXX_FLAGS}")

g++ 加上 -fsanitize=leak 选项后,能打印内存泄漏时的堆栈。【进程运行结束或用 SIGINT 杀掉后,会打印内存泄漏的堆栈信息到标准出错】

内存错误操作可在CMakeLists.txt里面加上如下编译选项

set(CMAKE_CXX_FLAGS "-fsanitize=address -fno-omit-frame-pointer ${CMAKE_CXX_FLAGS}" )

当然,上述编译选项可以输出leak信息

内存错误操作:-fsanitize=address

多线程竞争:-fsanitize=thread

内存泄漏:-fsanitize=leak

未定义操作:-fsanitize=undefined(如:除0、空指针解引用、枚举值超范围、使用未初始化的变量值等)

#告诉address检测到异常不退出进程

set(ENV{ASAN_OPTIONS} "halt_on_error=0")

运行时可能会出现以下内存问题

对输出的ERROR重定向报错日志: roslaunch perception_lidar.launch 2> /home/mogo/data/yangdaiyu/address.log

1、AddressSanitizer: stack-use-after-scope on address

2、AddressSanitizer: attempting free on address which was not malloc()-ed

  • /data/autocar/yangdaiyu/perception_ws/src/perception/lidar/robosense/modules/perception/lidar/ai_detection/src/pointpillars/pointpillars_ai_detection.cpp
    msg_ptr->scan_ptr.reset(new PointCloud)
    改:msg_ptr->resetMsg();

3、AddressSanitizer: alloc-dealloc-mismatch (operator new \[\] vs operator delete)

  • /data/autocar/yangdaiyu/perception_ws/src/perception/lidar/robosense/modules/perception/lidar/ai_detection/src/pointpillars/postprocess_cuda.cu

    auto output = std::shared_ptr(new floatnum_obj \* 9);

    改:

    auto output = std::shared_ptr(new floatnum_obj \* 9, \[\](float* p) { delete\[\] p; });

  • /data/autocar/yangdaiyu/perception_ws/src/perception/lidar/robosense/modules/perception/lidar/util/segmentor/src/rs_segmentor.cpp

    seg_scan_x_mat.reset(new intgrid_size);

    seg_scan_y_mat.reset(new intgrid_size);
    智能指针对new的空间,若不指定释放方式,默认采用delete去释放,对于new数组空间无法全部释放,因此需要指定释放方式,如下:

    seg_scan_x_mat.reset(new intgrid_size, \[\](int* p) { delete\[\] p; });

    seg_scan_y_mat.reset(new intgrid_size, \[\](int* p) { delete\[\] p; });

    seed_mat.reset(new intgrid_size, \[\](int* p) { delete\[\] p; });

    bin_mat.reset(new intgrid_size, \[\](int* p) { delete\[\] p; });

    label_mat.reset(new intgrid_size, \[\](int* p) { delete\[\] p; });

  • perception/lidar/robosense/modules/common/src/basic_type/rotate_box.cpp:198 std::shared_ptr distPt;

    distPt.reset(new doubleN \* N, \[\](int* p) { delete\[\] p;});

    std::shared_ptr ptDistRemap;

    ptDistRemap.reset(new intN, \[\](int* p) { delete\[\] p;});

4、AddressSanitizer: heap-buffer-overflow on address 堆缓冲区溢出

  • size越界保护
    if(track_object->track_type != ObjectType::UNKNOW) //加上类型判断,AI的polygon是4个点,但RB目标可能只有3个点,会超出界限

    {

    for(int i = 1; i < 4; ++i){

    if(track_object->object->polygonsi.norm() < track_object->object->polygonsindex_corner_cur.norm()){

    index_corner_cur = i;

    index_corner_last = i;

    }

    }

    }

  • Eigen::internal::handmade_aligned_free(void*)
    在CMakeLists.txt里面加上add_definitions(-DPCL_NO_PRECOMPILE=ON)可以通过
    此问题时PCL里的bug,升级PCL版本也可以解

5、LeakSanitizer: detected memory leaks

  • perception/lidar/robosense/modules/perception/infer/src/rs_trt_infer.cpp:156

    #0 0x7fb54b343b in operator new(unsigned long) (/usr/lib/aarch64-linux-gnu/libasan.so.4+0xd243b)

    #1 0x7f9ef34143 (/usr/lib/aarch64-linux-gnu/libnvinfer.so.7+0x4e7143)

    #2 0x7f9f01dc77 in nvinfer1::rt::SafeEngine::deserializeCoreEngine(nvinfer1::rt::CoreReadArchive&, std::vector<nvinfer1::rt::EngineLayerAttribute, std::allocatornvinfer1::rt::EngineLayerAttribute >&) (/usr/lib/aarch64-linux-gnu/libnvinfer.so.7+0x5d0c77)

    #3 0x7f9ed9f3b7 in nvinfer1::rt::Engine::deserialize(void const*, unsigned long, nvinfer1::IGpuAllocator&, nvinfer1::IPluginFactory*) (/usr/lib/aarch64-linux-gnu/libnvinfer.so.7+0x3523b7)

    #4 0x7f9eda7f53 in nvinfer1::Runtime::deserializeCudaEngine(void const*, unsigned long, nvinfer1::IPluginFactory*) (/usr/lib/aarch64-linux-gnu/libnvinfer.so.7+0x35af53)

    infer->deserializeCudaEngine(cahce_engine.c_str(), cahce_engine.size(), nullptr);

相关推荐
Ruiery5 小时前
Linux 6.6内核内存管理深度解析(十六):mmap — 用户态“申请内存“的真相
linux·运维·服务器
第九序言T5 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
欧米欧5 小时前
Linux系统篇(七),环境变量的底层溯源,核心获取机制与安全应用
linux·运维·服务器
Ruiery6 小时前
Linux 6.6内核内存管理深度解析(十八):KASLR 内核地址空间随机化
linux·运维·服务器·安全
qetfw6 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
龙亘川6 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人7 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Raas1007 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
专注仿真8 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
逆风的蚂蚁8 小时前
linux服务器性能调整怎么落地?我把 CPU 调度、I/O 优先级和内核参数这几个旋钮都拧了一遍
linux·运维·服务器