2013-11-28 69 views
3

我有一个单线程的unix进程,通过tcp与其他进程进行通信。strace修复挂起进程

问题是以下几点。 当我启动这个进程时,它会挂起(没有忙循环),直到我杀死它。

有趣的是,只要我一直强调它,它就会继续以预期的行为运行,就好像根本没有问题一样。 (始终可重现)

这种行为的原因是什么?国家对进程有什么影响?

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

+0

如果代码是线程化的,则可以通过控制进程来避免争用条件,该代码在代码执行过程中强制执行不同点的上下文更改,而不是在代码本地运行时发生。对有问题的线程代码运行调试器有时会导致代码不能解决问题 - 对我来说。 –

+0

是的,但OP说“单线程”:) – loreb

+0

我也有类似的情况......挂起的过程工作正常,如果我附加strace。任何人都可以详细解释? – ernesto

回答

0

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

0

最有可能的strace输出只会减慢进程,使得死锁的可能性更小。我以前见过这种情况发生在使用strace或在添加其他调试打印或调试调用时可能发生。

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

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

很难一概而论的例子,尤其是不知道自己的不同的进程正在做什么,或者如果他们以某种方式分享资源?我会尝试 。 。 。

  1. 与一个对象/资源应被保护的实施例:
    一个过程开始制造物体上的变化(例如,将项目添加到列表/ db表)
    的另一种方法开始迭代列表/表。
    这些进程之一的危险迭代循环被混淆,从不退出或者做更糟的事情,比如写入无效内存。

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