我有一个突然挂起的进程,并没有给出任何核心转储,也没有被杀死。我可以看到它仍然使用ps命令运行。
我怎么知道它当前在代码中执行的语句。
基本上我想知道它被绞死的地方。
语言是c ++,平台是solaris unix。
demos.283> cat test3.cc
#include<stdio.h>
#include<unistd.h>
int main()
{
sleep(100);
return 0;
}
demos.284> CC test3.cc
demos.285> ./a.out &
[1] 2231
demos.286> ps -o "pid,wchan,comm"
PID WCHAN COMMAND
23420 fffffe86e9a5aff6 -tcsh
2345 - ps
2231 ffffffffb8ca3376 ./a.out
demos.290> ps
PID TTY TIME CMD
3823 pts/36 0:00 ps
23420 pts/36 0:00 tcsh
3822 pts/36 0:00 a.out
demos.291> pstack 3822
3822: ./a.out
fed1a215 nanosleep (80478c0, 80478c8)
080508ff main (1, 8047920, 8047928, fed93ec0) + f
0805085d _start (1, 8047a4c, 0, 8047a54, 8047a67, 8047c05) + 7d
demos.292>
答案 0 :(得分:7)
您有几种选择:最简单的方法是检查进程正在等待的WCHAN
等待通道:
$ ps -o "pid,wchan,comm"
PID WCHAN COMMAND
2350 wait bash
20639 hrtime i3status
20640 poll_s dzen2
28821 - ps
这可以很好地指示过程正在做什么,并且非常容易获得。
您可以使用ktruss
和ktrace
或DTrace
来跟踪您的流程。 (对不起,这里没有Solaris,所以没有例子。)
您还可以将gdb(1)
附加到您的流程:
# gdb -p 20640
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
...
(gdb) bt
#0 0x00007fd1a99fd123 in __select_nocancel () at ../sysdeps/unix/syscall-template.S:82
#1 0x0000000000405533 in ?? ()
#2 0x00007fd1a993deff in __libc_start_main (main=0x4043e3, argc=13, ubp_av=0x7fff25e7b478,
...
回溯通常是您可以从流程获得的最有用的错误报告,因此如果尚未安装,则值得安装gdb(1)
。 gdb(1)
可以执行 lot ,而不仅仅是向您展示回溯,但完整的教程远远超出了Stack Overflow的范围。
答案 1 :(得分:3)
您可以尝试使用 pstack 传递pid作为参数。您可以使用 ps 来获取进程ID(pid)
例如: pstack 1267