如何知道正在运行的进程正在执行哪条语句

how to know which statement the running process is executing

本文关键字:语句 执行 何知道 运行 进程      更新时间:2023-10-16

我有一个进程突然挂起,没有给出任何核心转储,也没有被杀死。我可以看到它仍然运行使用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

这可以很好地指示进程正在做什么,并且非常容易获得。

您可以使用ktrussktraceDTrace来跟踪您的过程。(对不起,这里没有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