工作调试ROS底座遇到内存corruption问题,找了一些工具可供试用:
1. gcc的mcheck,没有有效的错误,错误多,但没有研究价值。
2. efence, 可以见测内存越界,但是不支持c++new, delete.结果是会在很多new操作符处crash.
3. Duma, efence的improve版本,支持c++,但是我用的时候跑nodeletmanager就会直接crash到stdc++里面。
efence和duma都有安装包可用。
在编译时,需要修改我们的make文件,比如:
SET(CMAKE_EFENCE_LINK_FLAG "-lefence -umalloc")
SET(CMAKE_EXE_LINKER_FLAGS"${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EFENCE_LINK_FLAG}")
SET(CMAKE_LIB_LINKER_FLAGS"${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EFENCE_LINK_FLAG}")
efence和duma使用方法类似。
都支持在运行程序前export LD_PRELOAD=libefence.so/libduma.so来动态加载,从而不用静态链接。
还可以在makefile里面将libefence.a或者libduma.a直接静态链接进来。
4. Valgrind, 输出一些未初始化的变量使用,经过修改,问题依然没有解决。
valgring输出较多,对C++的reference支持不好,有错报。强项在内存泄漏。
使用注意:因为valgrind不支持树莓派的某些指令,所以需要禁用如下库:
/etc/ld.so.preload文件中注掉下面代码。
#/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so