Linux 如何调试strace中显示的futex争用?
我正在调试多线程linux进程中的一个问题,其中某个线程在几秒钟内似乎不执行。查看strace输出显示它正在等待futex,例如Linux 如何调试strace中显示的futex争用?,linux,multithreading,futex,Linux,Multithreading,Futex,我正在调试多线程linux进程中的一个问题,其中某个线程在几秒钟内似乎不执行。查看strace输出显示它正在等待futex,例如 1673109 14:36:28.600329 futex(0x44b8d20,futex_WAIT_PRIVATE, 1673109 14:36:33.221850)=0 我如何找出这个futex(0x44b8d20)在用户空间中指的是什么,即如何将其映射到内部使用futex的锁定结构。我将使用一个简单的systemtap脚本,以便帮助您快速找到争用futex锁的地
1673109 14:36:28.600329 futex(0x44b8d20,futex_WAIT_PRIVATE,
1673109 14:36:33.221850)=0
我如何找出这个futex(0x44b8d20)在用户空间中指的是什么,即如何将其映射到内部使用futex的锁定结构。我将使用一个简单的systemtap脚本,以便帮助您快速找到争用futex锁的地址。当我说地址时,我指的是第一个论点
如果系统上安装了systemtap,
只需启动此系统点击脚本:
stap futexes.stp
strace
输出您将获得竞争Futex的输出
搜索第二个参数(操作类型)为
futex\u WAIT
的futex调用例如:
futex(0x7f58a31999d0,futex_WAIT,4508,NULL)=0
类似于:
ome[4489]锁0x7f58a31999d0争用了1次,平均7807个us
它可以很好地为您打印进程名称和进程/线程id。
这使得你很容易找到你想要的东西
不过需要注意的是,执行systemtap脚本实际上会钩住系统范围内的系统调用,这真的很聪明,但不幸的是,我使用的是OS X。多亏了你的文章,我现在已经开始研究将DTrace与Ruby探测器结合使用。这绝对是一条我以前从未想过要探索的道路。回答得好!不幸的是,我似乎对它有一个问题,因为它是在ubuntu lts 14.04.05
sudo./futexes.stp上编写的。语义错误:在解析探测点时:标识符“syscall”位于./futexes.stp:15:7来源:probe>syscall.futex{语义错误:没有匹配传递2:分析失败。[人工错误::传递2]抑制的类似错误消息数:1.使用-v重新运行以查看它们。
@thorcouller您需要使用systemtap
实用程序运行futexes.stp
。在Ubuntu上,这可以通过apt get install systemtap
安装,然后以root身份执行stap futexes.stp
。更多信息如下: