1

我需要检查嵌入式系统中的内存泄漏。

IDE 是 HEW,我们使用的是 uCOSIII RTOS。

Valgrind 不支持上述配置。您能否建议一种工具或方法来检查内存泄漏?

4

4 回答 4

5

在嵌入式系统中动态分配内存的第一条规则是“不要”。在执行开始时将其全部分配一次,然后不理会。malloc否则,您必须评估并决定在(或类似操作)失败 时该怎么做。

如果您必须在运行时动态分配内存,那么在最简单的情况下,您可以使用日志基础设施来跟踪对malloc/free的调用,方法是在它们周围编写包装器。然后,您可以跟踪分配和解除分配发生的地点和时间,并希望看到缺少的内容。

于 2013-02-19T13:49:27.197 回答
1

我一直在考虑它,这里随机尝试一下如何在嵌入式系统上做到这一点: * 首先你需要检查发生在哪个线程泄漏。在进行分配时,您还应该计算每个线程有多少活动分配。如果分配数量在没有释放的情况下不断增长,这是一个可疑的任务 * 其次,您需要计算来自该线程的分配的分配数量。为此,请将 alloc 替换为宏。使用宏,您可以保存发起呼叫的文件名和行号。

例如

#define alloc(x) my_alloc(x, __LINE__, __FILE__)

void * my_alloc(size_t size, int line, char * file)
{
     // increase number of allocations and dealocations for each combination line/file
}

同样,您需要定义 my_free。

在此之后,运行程序和 printf 不时地不断增长的分配。这应该有助于发现内存泄漏。

PS我没有对此进行测试,但我看到有人在我们的代码中做了类似的事情:)

于 2013-10-23T10:30:07.137 回答
0

您的要求并不完全清楚。如果您正在寻找能够在您的环境中找到内存泄漏的“valgrind”工具;这很难找到。

如果您有一些代码,则可以检查特定应用程序中的所有内存分配和内存释放。作为链接 1 链接 2

还有一些文件可以通过执行它们来找到内存泄漏。

http://code.axter.com/debugalloc.cpp
http://code.axter.com/debugalloc.h

http://code.axter.com/debuglogger.cpp
http://code.axter.com/debuglogger.h

http://code.axter.com/debuglog.c
http://code.axter.com/debuglog.h
  1. debugalloc.* 代码具有跟踪内存泄漏的能力,并且在注释中有描述和使用信息。

  2. debuglogger.* 代码有一些用于分析代码的代码。

  3. debuglog.* 是代码的一些受限 C 版本。

于 2013-02-19T13:16:54.060 回答
0

看看libtalloc,它是 Samba 中使用的核心内存分配器。如果您没有atexit()or stdio.h,它可能无法为您开箱即用,但将其移植到您的环境应该不需要太多工作。

查看talloc_enable_leak_report_full()talloc_report_full()(以及其他)以帮助您入门。

于 2013-02-22T03:45:32.713 回答