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

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

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

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

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

$ procstack <pid_of_stuck_process>

它用于显示进程的整个调用堆栈。procstacklinux/ubuntu 中有类似的东西吗?

答案1

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

 strace -s 99 -ffp 12345

如果您的进程 ID 是 12345。这将显示程序正在执行的所有系统调用。如何跟踪进程告诉你更多。

如果你坚持要获取堆栈跟踪,谷歌告诉我相当于 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)

答案2

对于查找程序的堆栈跟踪给出了两个答案(记住首先安装调试符号!)。如果您想找出系统调用被卡住的位置,请检查/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

答案3

在大多数 UNIX 系统上,您可以使用广东发展银行

gdb -batch -ex bt -p 1234

还有pstack(不是标准实用程序,您可能需要手动安装它)。它看起来类似于 AIX 的procstack.但在我的 Debian wheezy amd64 上,似乎总是出错。在 i386 上,对于没有调试符号编译的程序,它不会打印任何符号,甚至不会打印可使用调试符号的库。

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

答案4

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

相关内容