11

我正在调试多线程 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 的锁定结构。

4

1 回答 1

10

我会使用一个简单的 systemtap 脚本,这样可以帮助您快速找出竞争 futex 锁的地址。当我说地址时,我指的是futex()syscall的第一个参数。

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

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

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

  3. 如果您通过简单地按 Ctrl-C 来结束系统 Tap 脚本执行,
    您将获得竞争 futex 的输出。

  4. 最后,在您的 strace 输出中,
    搜索第二个参数(操作类型)为 的 futex 调用FUTEX_WAIT
    例如 :futex(0x7f58a31999d0, FUTEX_WAIT, 4508, NULL) = 0

  5. 然后您可以在系统点击脚本输出中搜索第一个参数。
    就像是 :ome[4489] lock 0x7f58a31999d0 contended 1 times, 7807 avg us

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

然而,需要注意的是,执行 systemtap 脚本实际上会挂钩系统范围的系统调用

于 2016-07-28T23:05:00.690 回答