我有一个单线程的unix进程,通过tcp与其他进程进行通信。strace修复挂起进程
问题是以下几点。 当我启动这个进程时,它会挂起(没有忙循环),直到我杀死它。
有趣的是,只要我一直强调它,它就会继续以预期的行为运行,就好像根本没有问题一样。 (始终可重现)
这种行为的原因是什么?国家对进程有什么影响?
更新: strace改变行为的原因是,因为我们用一个bug的openonload。一旦我们连接了strace,堆栈被移回内核,问题就消失了。
我有一个单线程的unix进程,通过tcp与其他进程进行通信。strace修复挂起进程
问题是以下几点。 当我启动这个进程时,它会挂起(没有忙循环),直到我杀死它。
有趣的是,只要我一直强调它,它就会继续以预期的行为运行,就好像根本没有问题一样。 (始终可重现)
这种行为的原因是什么?国家对进程有什么影响?
更新: strace改变行为的原因是,因为我们用一个bug的openonload。一旦我们连接了strace,堆栈被移回内核,问题就消失了。
只有一次这个问题,它与信号处理有关,它是单线程代码中竞争条件的一个来源。
最有可能的strace输出只会减慢进程,使得死锁的可能性更小。我以前见过这种情况发生在使用strace或在添加其他调试打印或调试调用时可能发生。
死锁最常见于多线程交互。但在你的情况下,你有多个进程。如果strace每次都释放进程,那么我想你打开套接字或握手的方式就是挂起。在套接字上缓冲和阻塞我认为可能会使您陷入进程死锁状态。
类似的问题,但有一个多线程程序,线程死锁,而不是单独的进程之间:Using strace fixes hung memory issue
很难一概而论的例子,尤其是不知道自己的不同的进程正在做什么,或者如果他们以某种方式分享资源?我会尝试 。 。 。
与一个对象/资源应被保护的实施例:
一个过程开始制造物体上的变化(例如,将项目添加到列表/ db表)
的另一种方法开始迭代列表/表。
这些进程之一的危险迭代循环被混淆,从不退出或者做更糟的事情,比如写入无效内存。
对象/资源受互斥锁保护的示例
带有两个资源问题的经典简单死锁。 〜比餐饮哲学家简单
一个线程/进程获取对象A上的互斥锁,做了一些工作。
另一个线程/进程在对象B上获取互斥量,做一些工作。
同一个线程/进程需要更新对象A,等待A的互斥体。
原始线程/进程需要访问对象B,等待B上的互斥体。
。 。 。 。 。 。 。 。 。 。 。 。 @。 。 。 。 。 。 。 。 。 。 。
除了风的噪音和横扫风景的风滚草之外,他们都沉默了。
僵局。
如果代码是线程化的,则可以通过控制进程来避免争用条件,该代码在代码执行过程中强制执行不同点的上下文更改,而不是在代码本地运行时发生。对有问题的线程代码运行调试器有时会导致代码不能解决问题 - 对我来说。 –
是的,但OP说“单线程”:) – loreb
我也有类似的情况......挂起的过程工作正常,如果我附加strace。任何人都可以详细解释? – ernesto