调查有问题的流程

调查有问题的流程

当命令或进程似乎挂起、冻结、崩溃或发生其他情况时;有没有办法准确调查它当前在幕后正在做什么(如果有的话)?

对于确定它是否崩溃或者是否只是在执行一项冗长的任务特别有用。如果它的行为不符合预期,它可以帮助排除故障。谢谢。

答案1

您可以使用 2 个低级工具来执行此操作:stracegdb。其可用性strace是假设您使用的是 Linux 或它运行的操作系统。对于其他操作系统,您可能有truss、 或dtrace,但技术类似。

斯特雷斯

因此,strace比 更容易使用gdb,并且通常可以很好地回答“这个应用程序在做什么”的问题。典型用法(对我来说)是这样的:

strace -f -tt -s 200 -p $PID

您需要的唯一真正的选择是-p $PID.其他选项只是向输出行添加更多信息,但实际上并不是必需的。

它的作用是向您显示应用程序正在进行的每个系统调用。应用程序可以做某事而不是显示它的唯一方式strace是它是否纯粹是计算性的。意思是处理数字什么的。像读/写文件、发送数据包、获取当前时间等都需要系统调用并且会显示出来。

数据库

gdb级别低于strace.gdb将显示应用程序实际运行的代码行。然而,这有一些问题。最重要的是您需要应用程序的调试符号。在发行版提供的软件包中,这些通常已被删除。然而,在 RedHat 衍生品等发行版上,它们通常以pkgfoo-debuginfo-1.2.3.rpm.您只需安装此软件包即可恢复符号。另一件事是,wherestrace将向您显示应用程序随着时间的推移正在做什么,gdb向您显示应用程序在那一刻正在做什么,因为它会在您检查它时冻结进程。

所以无论如何,用法看起来像:

gdb -p $PID

...这会将您带到一个交互式 shell,您可以在其中运行以下命令:

where

或者

info threads

我不会详细介绍如何使用gdb,因为根据应用程序的复杂程度,它可能会很复杂,并且互联网上有很多指南。

当您完成对进程的探索并想让它恢复时,只需使用quitor CTRL+ D

答案2

您可以通过附加标志从带有详细输出的终端窗口启动大多数进程-v。这样,当终端窗口似乎挂起时,您将看到终端窗口中发生了什么(如果有的话)。

tophtop提供有关正在运行的进程的有用信息,包括有关内存和 CPU 使用情况的更新信息,以及一些非常有用的摘要信息。

您还可以查看ps命令文档man ps

相关内容