当我在 MacOS 中跟踪“malloc:return”时,DTrace 报告不正确的值

Posted

技术标签:

【中文标题】当我在 MacOS 中跟踪“malloc:return”时,DTrace 报告不正确的值【英文标题】:DTrace report uncorrect value when I tracing "malloc:return" in MacOS 【发布时间】:2022-01-15 19:00:03 【问题描述】:

我要获取malloc的返回值,我的DTrace命令是:

sudo dtrace -n 'pid32519::malloc:return printf("%p %p %p %p %p %p %p %p %p %p %s\n",arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,probefunc);'

provider的pid是一个小程序,如下:

printf("%d\n",getpid());
getchar();
int cnt=50;
void* a = malloc(1000);
printf("%llx\n",a);
a = malloc(1000);
printf("%llx\n",a);
a = malloc(1000);
printf("%llx\n",a);
a = malloc(1000);
printf("%llx\n",a);
getchar();
return 0;

我发现一些文档说“arg1 持有返回值”,但结果是:

CPU     ID                    FUNCTION:NAME
  8  10499                    malloc:return f a 1 0 0 0 0 0 0 60000000a malloc

  8  10499                    malloc:return f f 1 0 0 0 0 0 f00000000 60000000a malloc

  8  10499                    malloc:return f 10 1 0 0 0 0 0 f00000010 60000000a malloc

  8  10499                    malloc:return f 10 1 0 0 0 0 1000000000 f00000010 60000000a malloc

没有一个args等于malloc的返回值,它在哪里?

【问题讨论】:

【参考方案1】:

根据DTrace Guide, FBT provider:

20.2.2.返回探针

虽然给定函数只有一个入口点,但它可能有 它返回给调用者的许多不同点。你通常是 对函数返回的值或事实感兴趣 函数完全返回而不是特定的返回路径 采取。因此,FBT 将一个函数的多个返回站点收集到 单个返回探针。如果您对确切的返回路径感兴趣,您 可以检查返回探针args[0] 的值,该值表示 函数文本中返回指令的偏移量(以字节为单位)。

如果函数有返回值,则返回值存储在 args[1]。如果函数没有返回值,args[1] 是 未定义。

注意使用args[0]args[1] 而不是args0args1。这可能对您的 dTrace 实施很重要。

【讨论】:

感谢您对“args”的建议,但函数“malloc”显然返回了一个地址。为什么没有定义“args[1]”? @jin 你没有使用arg[1] - 你使用的是arg1。这些不是一回事。 我试过arg[1],我的系统报错如下:dtrace: invalid probe specifier pid80785::malloc:return printf("%p\n",args[1] );:在操作列表中:索引 1 超出 pid80785::malloc:return args[] 的范围

以上是关于当我在 MacOS 中跟踪“malloc:return”时,DTrace 报告不正确的值的主要内容,如果未能解决你的问题,请参考以下文章

当我在本地主机中删除谷歌分析时,如何忽略整个网站的 ga() 事件跟踪代码?

当我在 macOS 上使用 py++ 生成 boost.Python 包装器时,出现关于 std::string 的错误?

当我在基于类的视图中应用过滤器时,如何在 django 中使用分页分页。网址总是不断变化我如何跟踪网址

MacOS Safari 11“防止跨站点跟踪”破坏了网站的谷歌登录

终端 Git 跟踪与 VS Code git 跟踪不同步

macOS - 任何人都知道在为 macOS 编程时如何在 Xcode 中缩放视图?