我在多线程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的锁定构造。
答案 0 :(得分:5)
我会使用一个简单的systemtap脚本,这样可以帮助您快速找到争用的futex锁的地址。当我说地址时,我指的是futex系统调用的第一个参数:
http://man7.org/linux/man-pages/man2/futex.2.html
https://sourceware.org/systemtap/examples/process/futexes.stp
因此,如果您的系统上安装了systemtap,只需启动此系统点击脚本:stap futexes.stp
像以前一样捕获strace输出。
如果您通过简单地按Ctrl-C结束系统点击脚本执行,您将获得竞争的互斥体的输出。
最后在你的strace输出中,搜索futex调用,其中第二个参数(操作类型)是FUTEX_WAIT。例如:
futex(0x7f58a31999d0,FUTEX_WAIT,4508,NULL)= 0
然后,您可以在系统点按脚本输出中搜索第一个参数。当我对此进行快速测试时,您会在这里找到相应的系统分接输出:
ome [4489]锁定0x7f58a31999d0争议1次,7807平均值
如果您查看此系统点击脚本,它可以很好地为您打印进程名称和进程/线程ID,从而可以轻松找到您要查找的内容。 但需要注意的是,执行systemtap脚本实际上会挂钩系统调用系统。