检测内存泄露<------>通过asan的方式
1) 首先,我们看一下个asan_check.patch
diff --git a/CMakeLists.txt b/CMakeLists.txt index 1630200..fa00a93 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,10 @@ IF(CPPBUILD_TARGET_ARCH STREQUAL "X86_64") ADD_DEFINITIONS( -DQUALIFICATION_TEST ) ENDIF() +ADD_COMPILE_OPTIONS( -fsanitize=address -fno-stack-protector -fno-omit-frame-pointer -fno-var-tracking ) +ADD_LINK_OPTIONS( -fsanitize=address ) +LINK_LIBRARIES( asan ) + set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) FILE(GLOB_RECURSE SRC ${PROJECT_SOURCE_DIR}/src/*.cpp) SET(TARGET_NAME sensevehicle) diff --git a/demos/integration_test/CMakeLists.txt b/demos/integration_test/CMakeLists.txt index bd589c0..ddcacd0 100644 --- a/demos/integration_test/CMakeLists.txt +++ b/demos/integration_test/CMakeLists.txt @@ -1,6 +1,10 @@ cmake_minimum_required(VERSION 3.12) project(test C CXX) +ADD_COMPILE_OPTIONS( -fsanitize=address -fno-stack-protector -fno-omit-frame-pointer -fno-var-tracking ) +ADD_LINK_OPTIONS( -fsanitize=address ) +LINK_LIBRARIES( asan ) + SET(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG -std=c++11 -ffunction-sections -fdata-sections ") SET(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG -ffunction-sections -fdata-sections ") #set(CMAKE_SOURCE_DIR "/data1/luomincheng/A02/autovehicle") diff --git a/samples_CAPI/CMakeLists.txt b/samples_CAPI/CMakeLists.txt index d5c88bb..f30c7e9 100644 --- a/samples_CAPI/CMakeLists.txt +++ b/samples_CAPI/CMakeLists.txt @@ -14,6 +14,10 @@ SET(CMAKE_EXE_LINKER_FLAGS -pie) PROJECT(vehicle_samples) +ADD_COMPILE_OPTIONS( -g -fsanitize=address -fno-stack-protector -fno-omit-frame-pointer -fno-var-tracking ) +ADD_LINK_OPTIONS( -fsanitize=address ) +LINK_LIBRARIES( asan ) + FILE(GLOB samples ${PROJECT_SOURCE_DIR}/*.cpp) message("PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}") message(STATUS ${samples})
这个 patch 是修改 CMake 配置文件的三个不同模块,主要是为了启用 **AddressSanitizer** (ASan) 进行内存错误检查。具体的修改包括:
### 1. 启用 AddressSanitizer (ASan)
**AddressSanitizer** 是一个快速的内存错误检测工具,可以帮助开发人员检测到很多常见的内存问题,如越界访问、内存泄漏、使用已释放的内存等。
在 patch 中,`ADD_COMPILE_OPTIONS` 和 `ADD_LINK_OPTIONS` 用于将 ASan 相关的编译和链接选项添加到 CMake 构建过程中。
### 2. 具体修改的文件
#### a. **`CMakeLists.txt`(主项目根目录)**
在根目录的 `CMakeLists.txt` 中,添加了以下内容:
```cmake
ADD_COMPILE_OPTIONS( -fsanitize=address -fno-stack-protector -fno-omit-frame-pointer -fno-var-tracking )
ADD_LINK_OPTIONS( -fsanitize=address )
LINK_LIBRARIES( asan )
```
- `ADD_COMPILE_OPTIONS( -fsanitize=address ... )`:添加了编译时选项,启用了 AddressSanitizer,关闭了栈保护、去掉了帧指针优化等选项,以确保 ASan 的正常工作。
- `ADD_LINK_OPTIONS( -fsanitize=address )`:为链接器添加了 `-fsanitize=address` 选项,这样在程序链接时会链接 ASan 的相关库。
- `LINK_LIBRARIES( asan )`:链接 `asan` 库,确保 AddressSanitizer 能够正常工作。
#### b. **`demos/integration_test/CMakeLists.txt`**
在 `demos/integration_test/CMakeLists.txt` 文件中也做了类似的修改:
```cmake
ADD_COMPILE_OPTIONS( -fsanitize=address -fno-stack-protector -fno-omit-frame-pointer -fno-var-tracking )
ADD_LINK_OPTIONS( -fsanitize=address )
LINK_LIBRARIES( asan )
```
这些修改与根目录 `CMakeLists.txt` 中的修改相同,启用 AddressSanitizer,并链接 `asan` 库。这样,`integration_test` 模块中的代码也会启用 AddressSanitizer。
#### c. **`samples_CAPI/CMakeLists.txt`**
在 `samples_CAPI/CMakeLists.txt` 文件中,同样添加了这些选项:
```cmake
ADD_COMPILE_OPTIONS( -g -fsanitize=address -fno-stack-protector -fno-omit-frame-pointer -fno-var-tracking )
ADD_LINK_OPTIONS( -fsanitize=address )
LINK_LIBRARIES( asan )
```
这里的改动与上面两者类似,但是 `ADD_COMPILE_OPTIONS` 中额外增加了 `-g` 选项,表示启用调试符号生成,这对调试时查看 ASan 报告中的堆栈跟踪非常有帮助。
### 3. 解释各个编译选项
- `-fsanitize=address`:启用 AddressSanitizer 检查,主要用于检测内存错误。
- `-fno-stack-protector`:禁用栈保护,栈保护通常会与 AddressSanitizer 冲突,禁用它可以确保 ASan 正常工作。
- `-fno-omit-frame-pointer`:禁用帧指针优化。帧指针优化会移除函数的帧指针,这可能会影响 ASan 的错误检测,因此禁用它以确保 ASan 能正确报告错误。
- `-fno-var-tracking`:禁用变量追踪,变量追踪可能会影响 AddressSanitizer 的正确性,禁用它可以提高稳定性。
- `-g`:生成调试信息,方便在调试时查看详细的堆栈信息,通常与 `-fsanitize=address` 一起使用时非常有用。
### 4. 目标
这些更改的主要目标是:
1. 启用 AddressSanitizer 来检测和报告内存相关的错误,如越界访问、内存泄漏、双重释放等。
2. 在编译和链接时设置适当的选项,确保 AddressSanitizer 的正常工作。
3. 使得主项目、集成测试和示例项目都可以受益于 AddressSanitizer 的内存错误检测功能。
### 总结
这个 patch 的目的是在 CMake 构建过程中启用 AddressSanitizer,目的是在代码运行时检查和检测内存错误。通过对多个 CMake 配置文件的修改,确保了项目的多个模块(主项目、集成测试和示例项目)都启用了内存错误检查。
2) 当需要检测内存泄露时,只需要一条命令,加入编译
git apply asan_check.patch
./scripts/build_noriker.sh linux x86_64 ppl build
git apply
是 Git 中用来应用补丁(patch)文件的命令。补丁文件通常是一些记录了源代码更改的文件,包含对代码库的修改(如添加、删除或更改文件的内容)。
asan_check.patch
是一个补丁文件,它记录了启用 AddressSanitizer(ASan)检查的相关代码更改,具体来说,它修改了 CMake 配置文件来启用 ASan 编译选项。git apply
命令将会把这个补丁应用到当前的 Git 工作区,即修改相应的源代码文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现