嵌入式Linux设备上运行的C/ c++应用程序内存泄漏调试
Debugging Memory Leak on C/C++ Application running on Embedded Linux Device
我有一个在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调试,看看创建了什么对象,没有删除。
在代码中使用不删除内部内容的类是可能的。
提示:对于小对象,在堆栈上分配既快速又安全。
相关文章:
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何从Windows应用程序输出到标准?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?