使用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:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值