如何知道程序在linux中卡在哪里?


44

我在ubuntu服务器上运行以下命令

root@slot13:~# lxc-stop --name pavan --logfile=test1.txt --logpriority=trace

它似乎无限期地挂起。每当在AIX上发生这种情况时,我都只是简单地获取有问题的进程的PID,然后说

$ procstack <pid_of_stuck_process>

它用来显示整个过程的调用堆栈。procstack在linux / ubuntu中有什么等效的东西吗?

Answers:


43

我的第一步是在流程上运行strace,最好

 strace -s 99 -ffp 12345

如果您的进程ID为12345。这将向您显示该程序正在执行的所有系统调用。如何跟踪流程可以告诉您更多信息。

如果您坚持要获取stacktrace,则Google会告诉我等效的是pstack。但是由于我没有安装它,所以我使用gdb:

 tweedleburg:~ # sleep 3600 &
 [2] 2621
 tweedleburg:~ # gdb
 (gdb) attach 2621
 (gdb) bt
 #0  0x00007feda374e6b0 in __nanosleep_nocancel () from /lib64/libc.so.6
 #1  0x0000000000403ee7 in ?? ()
 #2  0x0000000000403d70 in ?? ()
 #3  0x000000000040185d in ?? ()
 #4  0x00007feda36b8b05 in __libc_start_main () from /lib64/libc.so.6
 #5  0x0000000000401969 in ?? ()
 (gdb)

33

对于找到程序的堆栈跟踪,给出了两个答案(请记住要先安装调试符号!)。如果要找出系统调用卡住的地方,请检查/proc/PID/stack,其中列出了内核堆栈。例:

$ cat /proc/self/stack
[<ffffffff81012b72>] save_stack_trace_tsk+0x22/0x40
[<ffffffff81213abe>] proc_pid_stack+0x8e/0xe0
[<ffffffff81214960>] proc_single_show+0x50/0x90
[<ffffffff811cd970>] seq_read+0xe0/0x3e0
[<ffffffff811a6a84>] vfs_read+0x94/0x180
[<ffffffff811a7729>] SyS_read+0x49/0xb0
[<ffffffff81623ad2>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

6
注意:per man7.org/linux/man-pages/man5/proc.5.html ...“ / proc / [pid] / stack(自Linux 2.6.29起)此文件提供了对函数调用的符号跟踪此进程的内核堆栈。仅当使用CONFIG_STACKTRACE配置选项构建内核时,才会提供此文件。
DocSalvager 2014年

还要注意,对该文件的访问仅限于超级用户或进程本身(至少在我尝试过的系统上)。
斯特凡Chazelas

另请参见/proc/pid/wchan和输出中的WCHANps -lps -o wchan该堆栈的顶部。(该ps部分可在许多Unices上使用,但本身并不总是(经常)有用)。
斯特凡Chazelas

27

在大多数Unix系统上,您可以使用GDB

gdb -batch -ex bt -p 1234

还有pstack(不是标准实用程序,您可能必须手动安装它)。看起来与AIX的等效procstack。但是在我的Debian狂奔的amd64上,它似乎总是出错。在i386上,对于没有调试符号编译的程序,它甚至不从可用调试符号的库中打印任何符号。

您还可以strace -p1234用来查看该进程执行的系统调用。


1
pstack似乎每次都会抛出错误。像root@sarai:~# pstack 6312 6312: /usr/bin/python /usr/bin/twistd -n --uid=maas --gid=maas --pidfile=/run/maas-pserv.pid --logfile=/dev/null maas-pserv --conf... (No symbols found) crawl: Input/output error Error tracing through process 6312
Pavan Manjunath 2014年

@PavanManjunath pstack在amd64上似乎坏了,我在Debian wheezy amd64上也观察到了同样的情况。
吉尔(Gilles)'所以

1
pstack的README确实说它仅适用于32bit,ELF,x86,GNU。
斯特凡Chazelas

1

pstack将为您打印正在运行的进程的堆栈跟踪。 gstack如果pstack不可用/不支持您的发行版/架构,则是常见的等效项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.