Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何调试strace中显示的futex争用?_Linux_Multithreading_Futex - Fatal编程技术网

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

Linux 如何调试strace中显示的futex争用?,linux,multithreading,futex,Linux,Multithreading,Futex,我正在调试多线程linux进程中的一个问题,其中某个线程在几秒钟内似乎不执行。查看strace输出显示它正在等待futex,例如 1673109 14:36:28.600329 futex(0x44b8d20,futex_WAIT_PRIVATE, 1673109 14:36:33.221850)=0 我如何找出这个futex(0x44b8d20)在用户空间中指的是什么,即如何将其映射到内部使用futex的锁定结构。我将使用一个简单的systemtap脚本,以便帮助您快速找到争用futex锁的地

我正在调试多线程linux进程中的一个问题,其中某个线程在几秒钟内似乎不执行。查看strace输出显示它正在等待futex,例如
1673109 14:36:28.600329 futex(0x44b8d20,futex_WAIT_PRIVATE,
1673109 14:36:33.221850)=0


我如何找出这个futex(0x44b8d20)在用户空间中指的是什么,即如何将其映射到内部使用futex的锁定结构。

我将使用一个简单的systemtap脚本,以便帮助您快速找到争用futex锁的地址。当我说地址时,我指的是第一个论点

  • 您可以在此处下载查找争用用户空间锁的简单system tap脚本:

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

  • 像以前一样捕获
    strace
    输出

  • 如果通过简单地执行Ctrl-C来结束系统点击脚本执行,
    您将获得竞争Futex的输出

  • 最后,在strace输出中,
    搜索第二个参数(操作类型)为
    futex\u WAIT
    的futex调用
    例如:
    futex(0x7f58a31999d0,futex_WAIT,4508,NULL)=0

  • 然后,您可以在系统点击脚本输出中搜索第一个参数。
    类似于:
    ome[4489]锁0x7f58a31999d0争用了1次,平均7807个us

  • 如果查看此系统点击脚本,
    它可以很好地为您打印进程名称和进程/线程id。
    这使得你很容易找到你想要的东西


    不过需要注意的是,执行systemtap脚本实际上会钩住系统范围内的系统调用,这真的很聪明,但不幸的是,我使用的是OS X。多亏了你的文章,我现在已经开始研究将DTrace与Ruby探测器结合使用。这绝对是一条我以前从未想过要探索的道路。回答得好!不幸的是,我似乎对它有一个问题,因为它是在ubuntu lts 14.04.05
    sudo./futexes.stp上编写的。语义错误:在解析探测点时:标识符“syscall”位于./futexes.stp:15:7来源:probe>syscall.futex{语义错误:没有匹配传递2:分析失败。[人工错误::传递2]抑制的类似错误消息数:1.使用-v重新运行以查看它们。
    @thorcouller您需要使用
    systemtap
    实用程序运行
    futexes.stp
    。在Ubuntu上,这可以通过
    apt get install systemtap
    安装,然后以root身份执行
    stap futexes.stp
    。更多信息如下: