我有一个等待 futex 的进程:
# strace -p 5538
Process 5538 attached - interrupt to quit
futex(0x7f86c9ed6a0c, FUTEX_WAIT, 20, NULL
我怎样才能最好地调试这种情况?我可以确定谁持有 futex 吗?是否有任何类似于 ipcs 和 ipcrm 但用于 futexes 的工具?
尝试使用gdb -p *PID*
然后运行where
或bt
查看回溯。
对于已去除调试符号的二进制文件和库,它不会非常有用,但您可以从上下文中推断出相当多的内容。它可能能够向您指示复杂过程的哪个部分挂起,然后您可以检查源的正确部分以搜索锁定。
我对一段 c++ 代码有同样的问题。运行 ubuntu 12.10 64 位。它看起来像 2007 年的类似问题,libc 有问题(也许现在仍然如此?)。
我启动了一个 pthread,它在系统调用中运行 traceroute。printf 前后系统指示,操作系统挂起系统调用,不执行traceroute。
我不确定我的 linux 是否因为 ubuntu 更新而再次损坏,或者它是否是 libc 相关的错误。由于很多应用程序似乎都有“类似”的问题,我认为它被困在用户空间的某个地方。
我的 c++ 代码在 32 位系统甚至 64 位 osx 上完美运行,所以我假设 ubuntu 12.10 + 64 位 libc 组合已损坏。