Linux 如何调试处于不间断睡眠状态的进程?

Linux 如何调试处于不间断睡眠状态的进程?,linux,process,sleep,Linux,Process,Sleep,这是在Linux系统上(Red Hat发行版) 我用Perl实现了一个守护进程。它监视一个作业表,当它找到一个新的作业时,它会派生一个子作业来执行作业 我发现孩子们以不可中断的状态在进程表中徘徊: 682 16658 100 dumpdeco dumpdeco ? 0:27.62 0.0 1.8 D perl /root/runObjectBrowserJobs.pl 1453 16658 100 dumpdeco dumpdeco ? 0:13.

这是在Linux系统上(Red Hat发行版)

我用Perl实现了一个守护进程。它监视一个作业表,当它找到一个新的作业时,它会派生一个子作业来执行作业

我发现孩子们以不可中断的状态在进程表中徘徊:

 682 16658  100 dumpdeco dumpdeco ?          0:27.62  0.0  1.8 D perl /root/runObjectBrowserJobs.pl
 1453 16658  100 dumpdeco dumpdeco ?          0:13.34  0.0  1.5 D perl /root/runObjectBrowserJobs.pl
 1458 16658  100 dumpdeco dumpdeco ?          0:12.42  0.0  1.5 D perl /root/runObjectBrowserJobs.pl
 1467 16658  100 dumpdeco dumpdeco ?          0:13.35  2.9  1.8 D perl /root/runObjectBrowserJobs.pl
 1474 16658  100 dumpdeco dumpdeco ?          0:14.31  0.0  2.1 D perl /root/runObjectBrowserJobs.pl
 1479 16658  100 dumpdeco dumpdeco ?          0:13.73  0.0  2.1 D perl /root/runObjectBrowserJobs.pl
 1496 16658  100 dumpdeco dumpdeco ?          0:13.97  0.0  2.0 D perl /root/runObjectBrowserJobs.pl
 1499 16658  100 dumpdeco dumpdeco ?          0:13.93  0.0  2.2 D perl /root/runObjectBrowserJobs.pl
 1501 16658  100 dumpdeco dumpdeco ?          0:14.47  0.0  1.4 D perl /root/runObjectBrowserJobs.pl
 1503 16658  100 dumpdeco dumpdeco ?          0:14.86  2.0  2.2 D perl /root/runObjectBrowserJobs.pl
 1505 16658  100 dumpdeco dumpdeco ?          0:13.88  1.0  2.0 D perl /root/runObjectBrowserJobs.pl
 1520 16658  100 dumpdeco dumpdeco ?          0:14.39  0.0  1.5 D perl /root/runObjectBrowserJobs.pl
 1522 16658  100 dumpdeco dumpdeco ?          0:14.12  1.0  1.8 D perl /root/runObjectBrowserJobs.pl
 1531 16658  100 dumpdeco dumpdeco ?          0:16.45  0.0  1.7 D perl /root/runObjectBrowserJobs.pl
 3619 16658  100 dumpdeco dumpdeco ?          2:03.59  0.0  4.5 D perl /root/runObjectBrowserJobs.pl
我从日志中知道孩子们已经完成了分配给他们的工作。他们已对此进行了记录,作业已从挂起队列中删除。所以,从代码检查来看,除了退出,他们没有什么可做的了

这似乎是一种新现象。这是一段古老的代码,我已经完成了僵尸进程之舞,所以我很确定这不是错误收获的问题

我想弄清楚的是,如何找出这些过程所依赖的东西。我尝试了
strace
,但它没有返回任何内容。老实说,这并不奇怪,因为这个过程(我猜)实际上除了睡觉,等待一些系统调用返回之外,什么都没有做

所以,我在想:

  • 是否有方法打印正在运行的进程的当前调用堆栈
  • 是否有方法转储进程并在转储时查看其调用堆栈
  • 关于我应该寻找什么,有什么建议吗?我在想一个坏了的存储驱动程序(最近我们的存储出现了其他问题),但对我来说,责备驱动程序似乎总是一个懒惰的选择

    • 你难道不知道吗,我偶然发现了答案。命令是
      pstack
      。这里有更多信息:

      我想看看存储设备。状态为D的进程通常表示它们正在等待IO。由于进程本身没有发生任何事情(IO是内核区),因此strace不会显示任何使用gdb实现的.pstack,并且在尝试连接到我的不间断进程时两者都会挂起