gpt4 book ai didi

xcode - 我如何在 OS X 下覆盖 malloc()、calloc()、free() 等?

转载 作者:行者123 更新时间:2023-12-03 14:40:10 31 4
gpt4 key购买 nike

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

我知道由于钩子(Hook)在 Linux 中它很容易,十年前我在编写 HeapManager 时,这在 codewarrior 中是微不足道的。

可悲的是 smartheap 不再有 mac 版本。

最佳答案

我会为此任务使用库预加载,因为它不需要修改正在运行的程序。如果您熟悉执行此操作的常用 Unix 方法,则几乎只需将 LD_PRELOAD 替换为 DYLD_INSERT_LIBRARIES。

第一步是使用这样的代码创建一个库,然后使用常规共享库链接选项(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

the dyld manual page有关动态链接器环境变量的更多信息。

这个方法很通用。但是有一些限制:

  • 您将无法转移直接系统调用
  • 如果应用程序本身使用 dlsym() 欺骗您加载 malloc的地址,电话不会被转移。但是,除非您还通过转移 dlsym 来欺骗它。 !
  • 关于xcode - 我如何在 OS X 下覆盖 malloc()、calloc()、free() 等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/929893/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com