当命令或进程似乎挂起、冻结、崩溃或发生其他情况时;有没有办法准确调查它当前在幕后正在做什么(如果有的话)?
对于确定它是否崩溃或者是否只是在执行一项冗长的任务特别有用。如果它的行为不符合预期,它可以帮助排除故障。谢谢。
答案1
您可以使用 2 个低级工具来执行此操作:strace
和gdb
。其可用性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
,因为根据应用程序的复杂程度,它可能会很复杂,并且互联网上有很多指南。
当您完成对进程的探索并想让它恢复时,只需使用quit
or CTRL+ D。
答案2
您可以通过附加标志从带有详细输出的终端窗口启动大多数进程-v
。这样,当终端窗口似乎挂起时,您将看到终端窗口中发生了什么(如果有的话)。
top
并htop
提供有关正在运行的进程的有用信息,包括有关内存和 CPU 使用情况的更新信息,以及一些非常有用的摘要信息。
您还可以查看ps
命令文档man ps
。