记录动态内存分配用法

时间:2016-04-20 03:09:44

标签: c memory memory-management

最近我参与了微控制器上的C项目。 我们的项目中有许多malloc()或calloc()。   我的问题是,是否可以在运行时使用数组或其他动态分配数组来记录分配的内存现有持续时间,即从内存分配到释放之前的时间,以及释放它的位置。   谢谢你的帮助。

3 个答案:

答案 0 :(得分:4)

要“手动”执行此操作,首先,您需要使用自己的函数替换malloc,calloc和free的所有实例(例如_malloc,_calloc和_free)。对于生产,这些可以定义为原始功能,从而不会产生任何开销,但对于调试代码,您可以将它们称为自己的功能:

#ifdef _DEBUG
#define _malloc(s) myMalloc(s,__FILE__, __LINE__)
#define _calloc(b,n) myCalloc (b,n,__FILE__, __LINE__)
#define _free(p) myFree (p, __FILE__, __LINE__)
#else
#define _malloc malloc   //  If not debugging, just use the default
#define _calloc calloc
#define _free   free
#endif

#ifdef _DEBUG // Or whatever your compiler preset is
void *myMalloc (size_t sz, const char *pszFile, unsigned long line)
{
    //  Save the details in a table with the time
    ...
    return malloc (sz);
}
void myFree (void *ptr, const char *pszFile, unsigned long line)
{
    //  Process the table, do time calculations etc and then remove it
    free (ptr);
}
#endif

这是真正重载malloc和free的唯一方法。常量 FILE LINE 将告诉您内存的分配和释放位置。 NB。如果要在myMalloc中分配表空间,请使用malloc,而不是_malloc,否则可能会出现无限循环。

答案 1 :(得分:4)

如果您正在使用glibc,则可以使用其mtrace函数和工具来跟踪所有内存分配和发布,而无需更改源代码。

  

mtrace()函数为内存分配函数安装钩子函数(malloc(3),realloc(3)memalign(3),free(3))。这些钩子函数记录了跟踪信息          关于内存分配和释放。跟踪信息可用于发现内存泄漏并尝试释放程序中的未分配内存。

     

当调用mtrace()时,它会检查环境变量MALLOC_TRACE的值,该值应该包含跟踪信息所在的文件的路径名。          记录。如果路径名成功打开,则会将其截断为零长度。

它提供了一个命令行工具来解释跟踪文件,也称为mtrace

参考:

http://linux.die.net/man/3/mtrace

http://linux.die.net/man/1/mtrace

答案 2 :(得分:2)

您可以尝试使用像this one这样的库,但这实际上取决于特定控制器的开发环境的类型。它可能是一个先进的,可供开发人员使用的所有可能的铃声和wistles,同样可能在功能上非常有限,所以你可能会结束像@Mike建议的自定义解决方案。