我有一些C代码,我想做一些测试。它使用malloc、calloc,并通过代码释放。我希望将这些函数更改为内部调用原始函数的自定义函数。例如:
emxArray->size = (int *)malloc((unsigned int)(sizeof(int) * numDimensions));将成为:
emxArray->size = (int *)myMalloc((unsigned int)(sizeof(int) * numDimensions));其中myMalloc是:
void* myMalloc(unsigned size)
{
if (size < 8)
{
//printf("*** Bumped from %d....\n", size);
size = 8;
}
allocated += size;
return malloc(size);
}如您所见,myMalloc内部调用malloc。只是做了些额外的事情。我想用myMalloc替换malloc的用法。我已经通过遍历所有代码并用myMalloc手动替换malloc,成功地做到了这一点,但这远非理想。我将只在测试的基础上替换这个代码,因此生产代码应该只包含malloc调用。我意识到我也可以用一个脚本来完成这个任务,但是我只想在Makefile中使用一个定义语句:
-Dmalloc=myMalloc但这也取代了myMalloc函数中的malloc,这将导致无限递归情况。我尝试将myMalloc函数中的malloc调用更改为malloc_d,并向Makefile添加了第二个定义。
-Dmalloc=myMalloc -Dmalloc_d=malloc我认为第一个定义不会取代malloc_d (它没有),而第二个定义只会更改malloc_d (它没有)。我也有同样的递归情况。是否需要使用Makefile定义来完成此操作?还是多路预编译的情况总是搞砸这件事?
更新:
好的,我已经开始研究已经指出的LD_PRELOAD选项。我认为我有一个可行的解决办法,然而,我仍然有麻烦!我就是这么做的..。
如你所见,他们什么也不做。
但是,我仍然没有让它与在myMalloc文件中定义的libMyMalloc.so函数一起运行。
发布于 2014-09-23 18:56:52
我找到了我的解决方案,想和大家分享。感谢所有为我做出贡献并指出正确方向的人。
最后,我创建了我的自定义库代码并将其编译成一个共享库:
gcc -shared -o libtmalloc.so -fPIC tmalloc.c然后,我修改了makefile以使用共享库,并且全局地将'malloc‘定义为我的自定义函数名(在内部调用malloc()到malloc_t,以及calloc()和free()):
gcc -L/home/path/to/mallocTrace -Wall -o test test.c lib/coder/*.c -lm -ltmalloc \
-Dmalloc=malloc_t \
-Dcalloc=calloc_t \
-Dfree=free_t定义更改了对我的所有函数调用,这些函数调用链接到共享库中的实现。因为我使用的是共享库(已经编译好了),所以不必担心makefile定义会导致自定义函数中的递归调用情况。通过这种使用,我可以从其他工具中获取任何预先生成的C代码,并通过这些简单的makefile更改和使用我的定制malloc跟踪库来观察内存的使用情况。
发布于 2014-09-17 20:06:02
最简单的解决方案是在代码中不直接调用malloc:如果选择不同的名称(例如MALLOC),切换到自定义分配器就很简单。
示例代码:
#ifndef MALLOC
#define MALLOC malloc
#endif对于测试构建,您可以使用-DMALLOC=myMalloc。
如果出于某种原因,希望保留对malloc的调用,情况就会变得更加复杂。然后,在所有标准库头都包含了之后,您必须添加类似于下面的
#ifdef USE_MY_MALLOC
#undef malloc
#define malloc(SIZE) myMalloc(SIZE)
#endif您可以通过使用parens调用标准库函数
void* myMalloc(unsigned size)
{
...
return (malloc)(size);
}并通过-DUSE_MY_MALLOC启用它。
考虑到评论中提出的额外要求,提出了两种办法:
malloc的调用。stdlib.h的包含(假设MATLAB从那里获取其malloc声明)您自己版本的stdlib.h应该如下所示:
#ifndef MY_STDLIB_H_
#define MY_STDLIB_H_
#include "/usr/include/stdlib.h"
#undef malloc
#define malloc(SIZE) myMalloc(SIZE)
#endif然后,可以有条件地将放置该文件的目录添加到包含路径。还请注意,这不是一个特别健壮的解决方案,但无论如何,它可能对您有用。
发布于 2014-09-17 18:22:33
可以使用指向函数的指针。在正常情况下,让它指向malloc。在调试模式中,让它指向您的函数。
在某些h文件中:
extern void *(*myMalloc)(size_t size);在你们中的一个c文件中:
#ifdef DEBUG
void *(*myMalloc)(size_t size) = dMalloc;
#else
void *(*myMalloc)(size_t size) = malloc; // derived from libc
#endifhttps://stackoverflow.com/questions/25896217
复制相似问题