如何debuggingstrace中显示的futex争用?

我在multithreading的linux进程中debugging一个问题,其中某个线程似乎不会执行几秒钟。 看strace输出显示它等待futex例如
1673109 14:36:28.600329 futex(0x44b8d20,FUTEX_WAIT_PRIVATE,
1673109 14:36:33.221850 <… futex恢复>)= 0 <4.621514>

我怎样才能找出这futex(0x44b8d20)在用户空间引用,即如何映射到一个locking使用futex内部结构。

Solutions Collecting From Web of "如何debuggingstrace中显示的futex争用?"

我会使用一个简单的systemtap脚本,这样可以帮助您快速找到争用futex锁的地址。 当我说地址时,我指的是futex系统调用的第一个参数:

http://man7.org/linux/man-pages/man2/futex.2.html

  1. 在这里,您可以下载简单的系统抽头脚本来查找争用的用户空间锁:

https://sourceware.org/systemtap/examples/process/futexes.stp

所以如果你的系统上安装了systemtap,只需启动这个系统的tap脚本:stap futexes.stp

  1. 捕捉strace输出,就像以前一样。

  2. 如果您通过简单地按Ctrl-C来结束系统脚本执行,则会得到相关的futexes输出。

  3. 最后在你的strace输出中,搜索第二个参数(操作类型)为FUTEX_WAIT的futex调用。 例如 :

futex(0x7f58a31999d0,FUTEX_WAIT,4508,NULL)= 0

然后您可以搜索系统抽头脚本输出中的第一个参数。 正如我对此做了一个快速测试,在这里您将找到相应的系统分路输出:

ome [4489]锁定0x7f58a31999d0争用1次,7807平均我们

如果你看看这个系统的抽头脚本,它很好地打印进程名称和进程/线程ID为你很容易找到你要找的东西。 但是,需要注意的是,执行systemtap脚本实际上会挂钩一个系统调用系统。