嵌入式技术
在嵌入式设备中,计划使用malloc hook来进行内存跟踪,以便测试程序的内存使用。
试验1:
在程序开始,增加了mtrace函数,定义环境变量MALLOC_TRACE。
发现了两个问题:1、程序运行很慢 2、日志文件大小上升的很快,在嵌入式设备中,这样基本不可用。
考虑变通方法,能否将mtrace的环境变量 MALLOC_TRACE定义为stdout,这样既不用写内存,又不会占用磁盘空间,输出可以通过telnet客户端来进行记录。
解决方法:
通过glibc的源代码可以看到,glibc通过fopen打开MALLOC_TRACE对应的文件。
将MALLOC_TRACE=/dev/stdout,这样mtrace的所记录的日志,就全部打印在终端上。
在有些嵌入式linux中,没有stdout。可以发现,/dev/stdout为一个连接文件,其真实指向是/proc/self/fd/1。我们将MALLOC_TRACE=/proc/self/fd/1也是可以的。
试验2:
在MALLOC_TRACE=/proc/self/fd/1后,运行测试程序。
问题还是速度慢,看来速度的瓶颈不在于写磁盘。通过查看glibc的源代码,速度的瓶颈,主要在于
{
char *buf = (char *) "";
if (info.dli_sname != NULL)
{
size_t len = strlen (info.dli_sname);
buf = alloca (len + 6 + 2 * sizeof (void *));
buf[0] = '(';
__stpcpy (_fitoa (caller >= (const __ptr_t) info.dli_saddr
? caller - (const __ptr_t) info.dli_saddr
: (const __ptr_t) info.dli_saddr - caller,
__stpcpy (__mempcpy (buf + 1, info.dli_sname,
len),
caller >= (__ptr_t) info.dli_saddr
? "+0x" : "-0x"),
16, 0),
")");
}
fprintf (mallstream, "@ %s%s%s[%p] ",
info.dli_fname ?: "", info.dli_fname ? ":" : "",
buf, caller);
}
立刻解析对应的代码。
那么我们可以考虑,在程序运行的时候,不去做相应的解析,只是记录下当时的指针,事后再通过其他软件对数据解析。
那么只能自己来写hook函数。
static void* (* old_malloc_hook) (size_t,const void *);
static void (* old_free_hook)(void *,const void *);
static void my_init_hook(void);
static void* my_malloc_hook(size_t,const void*);
static void my_free_hook(void*,const void *);
void(*__malloc_initialize_hook)(void) = my_init_hook;
static void my_init_hook(void)
{
old_malloc_hook = __malloc_hook;
old_free_hook = __free_hook;
__malloc_hook = my_malloc_hook;
__free_hook = my_free_hook;
}
static void* my_malloc_hook(size_t size,const void *caller)
{
void *result;
__malloc_hook = old_malloc_hook;
result = malloc(size);
old_malloc_hook = __malloc_hook;
printf("@%p + %p %#lx\n",caller,result,(unsigned long int)size);
__malloc_hook = my_malloc_hook;
return result;
}
static void my_free_hook(void *ptr,const void *caller)
{
__free_hook = old_free_hook;
free(ptr);
old_free_hook = __free_hook;
printf("@%p - %p\n",caller,ptr);
__free_hook = my_free_hook;
}
全部0条评论
快来发表一下你的评论吧 !