使用 Asan 调试 ros package

本文介绍使用Asan(AddressSanitizer)来定位和解决ROS包中的内存泄漏问题。通过配置CMake选项并利用rosparam工具保存及加载参数,帮助开发者有效地进行调试。同时,提供了具体的调试步骤和命令。

Asan 与 ros

  • 背景: 在调试 ros package 的 memory leak
  • 方案:
    • 在 CMake 中添加
    set(CMAKE_CXX_FLAGS "-std=c++14 ${CMAKE_CXX_FLAGS} -fsanitize=address -g -fno-omit-frame-pointer")
    
    • 如果是 roslaunch 启动的(param 较多),正常启动一遍节点,无视 ASan 报错信息,新开一个 terminal,保存参数到文件
    rosparam dump filename
    
    • 加载参数
    rosparam load filename
    
    • 找到 libasan:
    find /usr -name "libasan.so"
    
    • 调试:
    LD_PRELOAD=/usr/lib/gcc/x86_64-linux-gnu/9/libasan.so ./devel/lib/pkg_name/exec_name
    
### 在 Unity 中配置和使用 AddressSanitizer (asan) 进行调试 AddressSanitizer (asan) 是一种快速的内存错误检测工具,用于检测 C 和 C++ 程序中的内存访问错误。它能够发现诸如越界访问、使用已释放的内存以及未初始化的内存读取等问题[^1]。在 Unity 中集成 asan 可以帮助开发者更有效地检测和修复内存相关问题。 以下是关于如何在 Unity 中配置和使用 AddressSanitizer 的详细说明: #### 1. 确保开发环境支持 Unity 使用 C# 作为主要脚本语言,但其底层引擎是用 C++ 编写的。因此,若要启用 asan,需要确保目标平台支持该工具,并且编译器支持 asan 的链接选项[^2]。通常情况下,Linux 和 macOS 平台更容易实现此功能。 #### 2. 配置编译器选项 在 Unity 的构建流程中,可以通过修改 `CMakeLists.txt` 或其他自定义构建脚本来添加 asan 的编译器标志。例如,在 Linux 平台上,可以将以下标志传递给 GCC 或 Clang 编译器: ```bash -fsanitize=address -fsanitize-address-use-after-scope -fno-omit-frame-pointer -g ``` 这些标志的作用分别是: - `-fsanitize=address`: 启用 AddressSanitizer。 - `-fsanitize-address-use-after-scope`: 检测超出作用域后的内存访问。 - `-fno-omit-frame-pointer`: 禁用帧指针省略优化,以便生成更精确的堆栈跟踪信息。 - `-g`: 添加调试符号[^3]。 #### 3. 修改 Unity 的构建设置 Unity 提供了多种方法来修改底层引擎的构建设置。如果需要对引擎进行深度修改,可以通过以下步骤实现: - 创建一个自定义的构建脚本或插件,用于修改引擎的编译选项。 - 在 Unity 的 `PlayerSettings` 或 `BuildPipeline` 中指定目标平台为支持 asan 的平台(如 Linux 或 macOS)。 - 将上述编译器标志通过命令行参数传递给构建系统。 #### 4. 运行与调试 完成配置后,运行项目时会自动启用 asan。当检测到内存错误时,asan 会在终端输出详细的错误信息,包括错误类型、发生位置以及相关的堆栈跟踪信息[^4]。 #### 5. 注意事项 - **性能开销**: asan 会对程序性能产生显著影响,因此建议仅在开发调试阶段启用。 - **兼容性**: 某些第三方库可能不完全兼容 asan,需单独测试。 - **资源限制**: 在资源受限的设备上(如移动设备),可能无法有效运行 asan。 ```python # 示例:通过 Python 脚本调用 Unity 构建并传递编译器标志 import subprocess def build_with_asan(): command = [ "unity", "-batchmode", "-executeMethod", "CustomBuild.BuildForLinux", "-sanitizerFlags", "-fsanitize=address -fsanitize-address-use-after-scope -fno-omit-frame-pointer -g" ] subprocess.run(command) build_with_asan() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值