我会使用一个简单的systemtap脚本,这样可以帮助您快速找到争用futex锁的地址。当我说的地址,我指的是futex的系统调用的第一个参数:
http://man7.org/linux/man-pages/man2/futex.2.html
- 在这里,您可以下载的认定争用户空间锁了简单的系统龙头脚本:
https://sourceware.org/systemtap/examples/process/futexes.stp
所以如果你的系统上安装了systemtap,只需启动这个系统的tap脚本:stap futexes.stp
捕捉strace输出,就像你之前做过的一样。
如果您通过简单地按Ctrl-C来结束系统触碰脚本执行,您将获得争用futexes的输出。
最后,在strace输出中搜索其中第二个参数(操作类型)为FUTEX_WAIT的futex调用。例如:
futex的(0x7f58a31999d0,FUTEX_WAIT,4508,NULL)= 0
然后可以搜索在系统抽头脚本输出的第一个参数。当我做了一个快速的测试,在这里你会找到相应的系统抽头输出:
青梅[4489]锁0x7f58a31999d0争1次,7807平均我们
如果你看一下这个系统龙头脚本,它很好地为您打印进程名称和进程/线程ID,从而可以轻松找到要查找的内容。 但是需要注意的是,执行systemtap脚本实际上会挂钩系统调用系统。
这真的很聪明,但不幸的是我使用的是OS X.感谢你的帖子,我现在已经开始调查使用DTrace和Ruby探测器了。这绝对是我以前从未想过探索的一种途径。 – Reck