如何知道正在运行的进程正在执行哪条语句
how to know which statement the running process is executing
我有一个进程突然挂起,没有给出任何核心转储,也没有被杀死。我可以看到它仍然运行使用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>
您有几个选择:最简单的是检查进程正在休眠的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)
可以做很多不仅仅是向您展示回溯,但是完整的教程远远超出了Stack Overflow的范围。
您可以尝试使用pstack传递pid作为参数。您可以使用ps来获取进程id (pid)
例如: pstack 1267
相关文章:
- 如何及时执行if语句?
- 获取上次执行的返回语句的行
- 如何仅在父循环的所有迭代都为真时才执行嵌套的 if 语句?
- 表单显示对话框函数错误,并且不执行下面的语句
- 如何知道调试时执行了哪个语句
- 在可变函数调用中执行一次语句
- 在多个对象上执行同一语句的零成本抽象
- 我怎样才能接受输入作为双精度值并执行 IF ELSE 语句
- c++:if 语句无法正常运行,并继续执行无效输出
- 为什么 cout 语句在传递指向函数的指针时没有执行?
- c++ IF 语句执行,但添加 ELSE 会显示错误
- C 程序如果功能中的语句不执行.在逻辑上似乎是错误的
- 当您希望在Arduino Uno编程中同时执行不同函数时,使用什么代码/语句
- OR 语句执行所有评估
- C++ Switch 语句在中断后执行
- C++ goto 语句执行而不调用
- 对条件语句执行逐位AND XOR
- 两个语句执行之间的时间差不一致
- 使用cout语句执行while循环
- 在c++中使用嵌套的if语句执行while循环