调试嵌入式Linux设备上运行的C / C ++应用程序的内存泄漏

时间:2016-10-28 23:01:16

标签: c++ linux

我在ARM Cortex-A9上运行了一个应用程序。当我输入代码的某一部分时,我可以在Linux任务视图中看到' top'应用程序在内存使用量增长,直到由于物理内存耗尽而被杀死。

现在,我已对此进行了一些研究,并尝试实施mtrace,但它并没有给我非常简洁的结果。基本上我得到这样的东西

Memory not freed:
-----------------
   Address     Size     Caller
0x03aafe18     0x38  at 0x76e73c18
0x53a004a8     0x38  at 0x76e73c18

我甚至不认为这是一个大问题(也许是另一个小问题)。

我也不能使用Valgrind(可能效果很好),因为设备上没有足够的空间来安装它和编译器......

所以我担心我只需要查看代码并寻找可能导致内存使用量增加的内容。这个地方有指南吗?在代码中," malloc"或"新"几乎从未使用过。

我有权使用gdb,如果可以帮助的话。

我不清楚的一件事是,如果以下是一个问题:

while(someloop){
...
   double *someptr;
...
}

或喜欢

while(someloop){
...
   int32 someArray[100] = {0};
...
}

其中有很多代码。当循环出现并实例化那些变量或指针时,它是继续使用自由空间,还是使用上一次迭代中的空格?

1 个答案:

答案 0 :(得分:1)

如果它在堆栈上被分配,则重用内存。但是,通过在堆上进行分配,您需要删除。 如果你使用double * ptr; ... ptr = new double [5],你需要删除[] ptr。

在C ++中,你可以覆盖new和delete操作符来打印一些用于debuging的消息。

最好是使用gdb进行调试,看看创建了哪个对象而没有删除。

您可能在代码中使用了不删除内部内容的类。

提示:对于在堆栈上进行定位的小对象,既快又安全。