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

Debugging Memory Leak on C/C++ Application running on Embedded Linux Device

本文关键字:c++ 应用程序 内存 调试 泄漏 Linux 运行 嵌入式      更新时间:2023-10-16

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

现在,我对此做了一些研究,并试图实现mtrace,但它并没有给我非常简洁的结果。基本上我会得到这样的东西
Memory not freed:
-----------------
   Address     Size     Caller
0x03aafe18     0x38  at 0x76e73c18
0x53a004a8     0x38  at 0x76e73c18

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

我也不能使用Valgrind(这可能会工作得很好),因为设备上没有足够的空间来安装它和编译器…

所以我担心我只需要遍历代码并寻找可能导致内存使用增长的东西。有这方面的指南吗?在代码中,"malloc"或"new"几乎从未使用过。

如果可以的话,我可以使用gdb。

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

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

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

在代码中有很多。当循环开始,实例化那些变量或指针时,它是继续使用空闲空间,还是使用上次迭代的空间?

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

在c++中,你可以覆盖new和delete操作符来打印一些调试信息。

最好是用gdb调试,看看创建了什么对象,没有删除。

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

提示:对于小对象,在堆栈上分配既快速又安全。