我已经在Linux平台上覆盖了函数malloc , calloc和free函数,如下所示:
#include <stdio.h> #include <dlfcn.h> #include <stdlib.h> typedef void* (*MALLOCFN)(size_t); typedef void* (*CALLOCFN)(size_t,size_t); typedef void* (*CALLOCFN)(size_t,size_t); typedef void (*FREEFN)(void *); MALLOCFN real_malloc = (MALLOCFN) 0; CALLOCFN real_calloc = (CALLOCFN) 0; FREEFN real_free = (FREEFN) 0; void *get_realfn(const char *fnm) { void *pfunc = (void *) NULL; printf("searching for original %sn",fnm); pfunc = dlsym(RTLD_NEXT,fnm); if (pfunc) printf("found original %sn",fnm); else printf("not found original %sn",fnm); return pfunc; } void *malloc(size_t s) { printf("called mallocn"); if(real_malloc == NULL) real_malloc = (MALLOCFN) get_realfn("malloc"); if (real_malloc) return real_malloc(s); else return NULL; } void *calloc(size_t s1,size_t s2) { printf("called callocn"); if(real_calloc == NULL) real_calloc = (CALLOCFN) get_realfn("calloc"); if (real_calloc) return real_calloc(s1,s2); else return NULL; } void free (void * ptr) { printf("called freen"); if(real_free == NULL) real_free = (FREEFN) get_realfn("free"); if (real_free) real_free(ptr); } int main() { char * c1 = (char *) malloc(400); char * c2 = (char *) malloc(400); free(c2); free(c1); return 0; }
C程序(testalloc.c)是使用g ++ 4.9.2版本的编译器构build的:
g++ -g testalloc.c -ldl -o testalloc;
显示的输出的前几行如下,它进入无限recursion和崩溃:
called malloc searching for original malloc called free searching for original free called free searching for original free called free searching for original free called free searching for original free called free . . . .
请build议如何避免recursion。
Win32 – 获取主要的Wnd应用程序的句柄
我怎样才能让Windows的二进制文件,使非编码器只能得到一个崩溃转储,可以喂给gdb?
如何获取以太网设备列表
现代高分辨率定时器定期调用
如何得到每秒接收和发送的networking字节数用于Windows的C ++中的进程(input:进程ID或句柄)?
如何testing我的应用程序是UNICODE兼容与否?
Web应用程序可以访问和修改Windowsregistry吗?
如何在Windows中使用eclipse编译dlib示例?
64位处理器的uint16_t和unsigned short int incase有什么区别?
printf函数可能会分配内存。 因此,在“真实”函数指针未分配之前调用printf时,它会进入插入的函数,导致无限递归。 所以不要在插入函数中使用printf语句。
如果您确实需要打印某些内容,请使用syscall(2) ,它将绕过stdio库函数。
#include <sys/syscall.h> ... syscall(SYS_write,STDOUT_FILENO,"searching for originaln",sizeof "searching for originaln" - 1);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。