使用Valgrind对ros工程进行debug
问题:
在ros开发过程中出现了内存问题,系统报错
malloc(): invalid size (unsorted)这种问题非常常见,但是整个项目太大,虽然保存了任务进度,复现了问题,但是依然找不到问题的原因。
代码片段。
// An highlighted block
void DynamicVoronoi::initializeEmpty(int _sizeX, int _sizeY)
{
sizeX = _sizeX;
sizeY = _sizeY;
if (data)
delete[] data;
dataCell c;
c.dist = INFINITY;
c.sqdist = INT_MAX;
c.obstX = invalidObstData;
c.obstY = invalidObstData;
c.voronoi = free;
c.queueing = fwNotQueued;
c.needsRaise = false;
// if(sizeY==105) data = new dataCell[10];
// delete[] data;
data = new dataCell[sizeX*sizeY];//问题行
for (int x=0; x<sizeX*sizeY; x++) data[x] = c;
}
利用指令htop查看内存占用情况,发现内存5/16G,裕量不小,怀疑是其他地方的内存泄漏。
valgrind debug
ros系统中一般采用catkin_make 对工程进行编译。本工程由两个节点,一个是plane_oct,一个planner_server.
在devel/lib/planner_server文件夹下找到可执行文件,直接通过valgrind ./planner_server启动。其他节点正常采用sh文件启动。
记得planner_server包编译的时候CmakeList必须是debug模式
# SET(CMAKE_BUILD_TYPE Debug) #debug模式
SET(CMAKE_BUILD_TYPE Release) #Release
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall")#一定要有-g
运行过程中即可得到内存相关的报错信息
==218072== Invalid write of size 1
==218072== at 0x393739: Local_planner::Optimize_Bspline() (planner.cpp:650)
==218072== by 0x39452B: main (planner.cpp:742)
==218072== Address 0x2922eb69 is 0 bytes after a block of size 6,825 alloc'd
==218072== at 0x483BE63: operator new(unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==218072== by 0x3B1C49: __gnu_cxx::new_allocator<signed char>::allocate(unsigned long, void const*) (new_allocator.h:114)
==218072== by 0x3AF053: std::allocator_traits<std::allocator<signed char> >::allocate(std::allocator<signed char>&, unsigned long) (alloc_traits.h:443)
==218072== by 0x3AB555: std::_Vector_base<signed char, std::allocator<signed char> >::_M_allocate(unsigned long) (stl_vector.h:343)
==218072== by 0x3A5757: std: