2016-07-27 71 views
2

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

我如何找出什么这个futex的(0x44b8d20 )是指在用户空间中,即如何将其映射到内部使用futex的锁定结构。

回答

1

我会使用一个简单的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

然后可以搜索在系统抽头脚本输出的第一个参数。当我做了一个快速的测试,在这里你会找到相应的系统抽头输出:

青梅[4489]锁0x7f58a31999d0争1次,7807平均我们

如果你看一下这个系统龙头脚本,它很好地为您打印进程名称和进程/线程ID,从而可以轻松找到要查找的内容。 但是需要注意的是,执行systemtap脚本实际上会挂钩系统调用系统。

+0

这真的很聪明,但不幸的是我使用的是OS X.感谢你的帖子,我现在已经开始调查使用DTrace和Ruby探测器了。这绝对是我以前从未想过探索的一种途径。 – Reck