【问题标题】:strace fixes hung processstrace 修复挂起的进程
【发布时间】:2013-12-14 21:18:37
【问题描述】:

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

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

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

这种行为的原因可能是什么? strace对进程的状态有什么影响?

更新: strace 改变行为的原因是,因为我们使用了带有错误的 openonload。一旦我们附加了 strace,堆栈就被移回内核,问题就消失了。

【问题讨论】:

  • 如果代码是线程化的,则控制进程可能会避免竞争条件,该控制进程会在代码执行的不同点强制上下文更改,而不是在代码本机运行时发生。在有问题的线程代码上运行调试器有时会导致代码无法显示问题 - 对我来说。
  • 没错,但 OP 说“单线程” :)
  • 我有类似的情况......如果我附加到 strace,挂起的进程可以正常工作。谁能详细解释一下?

标签: unix process rhel strace


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    很难概括示例,尤其是在不知道您的不同进程在做什么或它们是否以某种方式共享资源的情况下?我会尝试 。 . .

    1. 一个应受保护的对象/资源的示例:
      一个进程开始对对象进行更改(例如,将项目添加到列表/数据库表)
      另一个进程开始迭代列表/表。
      其中一个迭代循环的进程存在混淆并且永远不会退出或执行更糟糕的操作(例如写入无效内存)的危险。

    2. 对象/资源受互斥体保护的示例
      两个资源问题的经典简单死锁问题。 ~ 比用餐哲学家简单
      一个线程/进程在对象 A 上获取互斥体,做了一些工作。
      另一个线程/进程在对象 B 上获取互斥锁,做了一些工作。
      同一线程/进程需要更新对象 A,等待 A 的互斥锁。
      原来的线程/进程需要访问对象B,等待B上的互斥锁。
      . . . . . . . . . . . . @ . . . . . . . . . . .
      除了风的噪音和风滚草吹过景观的声音外,一片寂静。
      死锁。

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 1970-01-01
      • 2014-10-23
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多