首页 运维 网络学院 查看内容

在嵌入式设备中使用Malloc Hook的试验

2005-6-13 05:10 800 0

摘要:   在嵌入式设备中,计划使用malloc hook来进行内存跟踪,以便测试程序的内存使用。  试验1:  在程序开始,增加了mtrace函数,定义环境变量MALLOC_TRACE。  ...
关键词: hook malloc void free caller const static info dli size

  在嵌入式设备中,计划使用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的源代码,速度的瓶颈,主要在于if (_dl_addr (caller, &info, NULL, NULL)){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函数。#include <malloc.h>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",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",caller,ptr);  __free_hook = my_free_hook;}
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部