我正在调试多线程linux进程中的一个问题,在该问题中,某个线程似乎没有执行几秒钟。查看strace输出显示它正在等待futex,例如
1673109 14:36:28.600329 futex(0x44b8d20,FUTEX_WAIT_PRIVATE,
1673109 14:36:33.221850 )= 0
我如何找出用户空间中的futex(0x44b8d20)指的是什么,即如何将其映射到内部使用futex的锁定结构。
最佳答案
我将使用一个简单的systemtap脚本,以帮助您快速找出有争议的futex锁的地址。当我说地址时,我指的是 futex()
syscall的第一个参数。
https://sourceware.org/systemtap/examples/process/futexes.stp
如果您的系统上安装了systemtap,
只需启动此系统点击脚本:
stap futexes.stp
strace
输出。 您将获得竞争的futex的输出。
搜索第二个参数(操作类型)为
FUTEX_WAIT
的futex调用。例如:
futex(0x7f58a31999d0, FUTEX_WAIT, 4508, NULL) = 0
类似于:
ome[4489] lock 0x7f58a31999d0 contended 1 times, 7807 avg us
如果您查看此系统点击脚本,
它会很好地为您打印进程名称和进程/线程ID。
这样可以轻松找到所需的内容。
但是,需要注意的是,执行systemtap脚本实际上会钩住系统调用系统范围内的。
关于linux - 如何调试strace中显示的futex争用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38623976/