当前位置:  开发笔记 > 运维 > 正文

如何在OS X下覆盖malloc(),calloc(),free()等?

如何解决《如何在OSX下覆盖malloc(),calloc(),free()等?》经验,为你挑选了1个好方法。

假设最新的XCode和GCC,覆盖内存分配函数的正确方法是什么(我猜运算符new/delete也是如此).调试内存分配器对于游戏来说太慢了,我只需要一些基本的统计数据,我可以自己做,影响最小.

我知道它在Linux中很容易因为钩子而存在,而且在十年前编写HeapManager时,这在codewarrior下是微不足道的.

可悲的是,smartheap不再有mac版本.



1> sam hocevar..:

我会使用库预加载来完成此任务,因为它不需要修改正在运行的程序.如果您熟悉通常的Unix方法,那么几乎就是用DYLD_INSERT_LIBRARIES替换LD_PRELOAD.

第一步是创建一个包含此类代码的库,然后使用常规共享库链接选项(gcc -dynamiclib)构建它:

void *malloc(size_t size)
{
    void * (*real_malloc)(size_t);
    real_malloc = dlsym(RTLD_NEXT, "malloc");

    fprintf(stderr, "allocating %lu bytes\n", (unsigned long)size);
    /* Do your stuff here */

    return real_malloc(size);
}

请注意,如果您也转移calloc()及其实现调用malloc(),则可能需要其他代码来检查您的调用方式.C++程序应该非常安全,因为new操作员malloc()无论如何都要调用,但要注意没有标准强制执行.但是,我从未遇到过没有使用的实现malloc().

最后,为程序设置运行环境并启动它(可能需要根据shell处理环境变量的方式进行调整):

export DYLD_INSERT_LIBRARIES=./yourlibrary.dylib
export DYLD_FORCE_FLAT_NAMESPACE=1
yourprogram --yourargs

有关动态链接器环境变量的更多信息,请参见dyld手册页.

这种方法非常通用.但是有一些限制:

您将无法转移直接系统呼叫

如果应用程序本身通过使用dlsym()加载malloc的地址欺骗您,则不会转移呼叫.但是,除非你通过转移来欺骗它dlsym!

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有