strace修复了挂起过程

时间:2013-11-28 18:35:20

标签: unix process rhel strace

我有一个单线程unix进程,它通过tcp与其他进程通信。

问题如下。 当我启动它的过程时它会挂起(没有繁忙的循环),直到我杀了它。

有趣的是,一旦我附加了strace,它就会继续以预期的行为运行,好像根本没有问题。 (总是可以重复的)

这种行为可能是什么原因?是什么影响了国家的过程?

更新的 strace改变行为的原因是,因为我们使用openonload和bug。一旦我们连接了strace,堆栈就会被移回内核并且问题就消失了。

2 个答案:

答案 0 :(得分:0)

这个问题只有一次而且它与信号处理有关,它是单线程代码中竞争条件的一个来源。

答案 1 :(得分:0)

最有可能的是,strace输出只会减慢进程,从而使死锁的可能性大大降低。我在使用strace之前已经看到过这种情况,或者在添加其他调试打印或调试调用时会发生这种情况。

最常见于多线程交互的死锁。但在您的情况下,您有多个进程。如果strace每次释放进程,那么我猜你打开套接字的方式或套接字上的握手就是悬挂的东西。我认为套接字上的缓冲和阻塞可能会让你陷入进程陷入僵局的状态。

类似的问题但是使用多线程进程,线程之间的死锁而不是单独的进程之间的死锁:Using strace fixes hung memory issue

难以概括示例,特别是不知道您的不同流程正在做什么,或者他们是否以某种方式共享资源?我会尝试 。 。

  1. 一个应受保护的对象/资源的示例:
    一个进程开始对对象进行更改(例如,将项添加到list / db表)
    另一个进程开始迭代列表/表。
    其中一个进程的危险,迭代循环被混淆,永远不会退出或做一些更糟糕的事情,如写入无效的内存。

  2. 对象/资源受互斥锁保护的示例
    经典的简单僵局有两个资源问题。 〜比餐饮哲学家更简单
    一个线程/进程在对象A上抓取互斥锁,做一些工作。
    另一个线程/进程在对象B上抓取互斥锁,做了一些工作。
    相同的线程/进程需要更新对象A,等待A的互斥。
    原始线程/进程需要访问对象B,等待B上的互斥。
    。 。 。 。 。 。 。 。 。 。 。 。 @。 。 。 。 。 。 。 。 。 。 。 除了风的噪音和风吹过的景观之外,沉默。
    死锁。