如何调试strace中显示的futex争用?

时间:2016-07-27 22:05:51

标签: linux multithreading futex

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

如何找出此futex(0x44b8d20)在用户空间中引用的内容,即如何将其映射到内部使用futex的锁定构造。

1 个答案:

答案 0 :(得分:5)

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

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

  1. 在这里,您可以下载找到争用用户空间锁的简单系统点击脚本:
  2. https://sourceware.org/systemtap/examples/process/futexes.stp

    因此,如果您的系统上安装了systemtap,只需启动此系统点击脚本:stap futexes.stp

    1. 像以前一样捕获strace输出。

    2. 如果您通过简单地按Ctrl-C结束系统点击脚本执行,您将获得竞争的互斥体的输出。

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

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

      然后,您可以在系统点按脚本输出中搜索第一个参数。当我对此进行快速测试时,您会在这里找到相应的系统分接输出:

      ome [4489]锁定0x7f58a31999d0争议1次,7807平均值

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