我正在调试多线程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输出。
  • 如果您仅通过执行Ctrl-C来结束系统点击脚本的执行,
    您将获得竞争的futex的输出。
  • 最后在您的strace输出中,
    搜索第二个参数(操作类型)为FUTEX_WAIT的futex调用。
    例如:futex(0x7f58a31999d0, FUTEX_WAIT, 4508, NULL) = 0
  • 然后,您可以在系统Tap脚本输出中搜索第一个参数。
    类似于:ome[4489] lock 0x7f58a31999d0 contended 1 times, 7807 avg us

  • 如果您查看此系统点击脚本,
    它会很好地为您打印进程名称和进程/线程ID。
    这样可以轻松找到所需的内容。

    但是,需要注意的是,执行systemtap脚本实际上会钩住系统调用系统范围内的

    关于linux - 如何调试strace中显示的futex争用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38623976/

    10-11 02:38