【发布时间】:2013-12-14 21:18:37
【问题描述】:
我有一个通过 tcp 与其他进程通信的单线程 unix 进程。
问题如下。 当我启动进程时,它会挂起(没有繁忙的循环),直到我杀死它。
有趣的是,只要我将 strace 附加到它,它就会继续以预期的行为运行,就好像根本没有问题一样。 (总是可重复的)
这种行为的原因可能是什么? strace对进程的状态有什么影响?
更新: strace 改变行为的原因是,因为我们使用了带有错误的 openonload。一旦我们附加了 strace,堆栈就被移回内核,问题就消失了。
【问题讨论】:
-
如果代码是线程化的,则控制进程可能会避免竞争条件,该控制进程会在代码执行的不同点强制上下文更改,而不是在代码本机运行时发生。在有问题的线程代码上运行调试器有时会导致代码无法显示问题 - 对我来说。
-
没错,但 OP 说“单线程” :)
-
我有类似的情况......如果我附加到 strace,挂起的进程可以正常工作。谁能详细解释一下?