gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:31:56 29 4
gpt4 key购买 nike

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

最佳答案

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

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

    如果你的系统上安装了systemtap,
    只需启动这个系统 tap 脚本:stap futexes.stp

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

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

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

  5. 然后您可以在系统tap脚本输出中搜索第一个参数。
    类似的东西:ome[4489] lock 0x7f58a31999d0 contented 1 times, 7807 avg us

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

但是需要注意的是,执行 systemtap 脚本实际上会在系统范围内挂接一个系统调用

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com