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

Ama*_*ain 8 linux multithreading futex

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

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

小智 6

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

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

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

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

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

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

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

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

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

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

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

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