当我在 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]
而不是args0
和args1
。这可能对您的 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 中使用分页分页。网址总是不断变化我如何跟踪网址