как узнать, какой оператор выполняет запущенный процесс - PullRequest
4 голосов
/ 24 ноября 2011

У меня есть процесс, который внезапно завис и не дает никакого дампа памяти, а также не уничтожен. Я могу видеть, что он все еще работает с помощью команды 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> 

Ответы [ 2 ]

7 голосов
/ 24 ноября 2011

У вас есть несколько вариантов: проще всего проверить 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) может сделать лот больше, чем просто показать вам обратные следы, но полное руководство выходит за рамки переполнения стека.

3 голосов
/ 24 ноября 2011

вы можете попробовать с pstack передачей pid в качестве параметра.Вы можете использовать ps , чтобы получить идентификатор процесса (pid)

Например: pstack 1267

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...