리눅스에서 프로그램이 어디에 붙어 있는지 아는 방법?


44

우분투 서버에서 다음 명령을 실행 중입니다.

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

무기한 매달린 것 같습니다. 이것이 AIX에서 발생할 때마다, 단순히 문제의 프로세스의 PID를 가져 와서

$ procstack <pid_of_stuck_process>

프로세스의 전체 콜 스택을 표시하는 데 사용됩니다. 의 동등한 거기 procstack에 리눅스 / 우분투는?

답변:


43

첫 번째 단계는 프로세스에서 strace를 실행하는 것입니다.

 strace -s 99 -ffp 12345

프로세스 ID가 12345 인 경우 프로그램이 수행중인 모든 syscall을 표시합니다. 프로세스를 추적하는 방법 은 더 많은 것을 알려줍니다.

스택 추적을 요구한다고 주장하면 Google은 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)

33

프로그램의 스택 트레이스를 찾는 두 가지 답변이 있습니다 (먼저 디버깅 심볼을 설치해야합니다!). 시스템 호출이 멈추는 위치를 찾으려면 /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

6
참고 : per man7.org/linux/man-pages/man5/proc.5.html ... "/ proc / [pid] / stack (Linux 2.6.29부터)이 파일은 함수 호출의 기호 추적을 제공합니다. 이 프로세스의 커널 스택 이 파일은 커널이 CONFIG_STACKTRACE 구성 옵션으로 빌드 된 경우에만 제공됩니다. "
DocSalvager

또한 해당 파일에 대한 액세스는 수퍼 유저 또는 프로세스 자체 (적어도 시도한 시스템에서)로 제한됩니다.
Stéphane Chazelas

출력 /proc/pid/wchanWCHANps -l또는 ps -o wchan해당 스택의 상단을 참조하십시오 . ( ps부분은 많은 Unices에서 작동하지만 항상 그 자체로는 항상 유용한 것은 아닙니다).
Stéphane Chazelas

27

대부분의 유닉스 시스템에서는 GDB 를 사용할 수 있습니다 .

gdb -batch -ex bt -p 1234

또한 pstack표준 유틸리티가 아니며 수동으로 설치해야 할 수도 있습니다. AIX와 동등한 것으로 보입니다 procstack. 그러나 내 데비안 wheezy amd64에서는 항상 오류가있는 것 같습니다. i386에서 디버깅 심볼없이 컴파일 된 프로그램의 경우 디버깅 심볼을 사용할 수있는 라이브러리에서도 심볼을 인쇄하지 않습니다.

strace -p1234프로세스가 수행 한 시스템 호출을 보는 데 사용할 수도 있습니다 .


1
pstack매번 오류가 발생하는 것 같습니다. 뭔가 같은root@sarai:~# pstack 6312 6312: /usr/bin/python /usr/bin/twistd -n --uid=maas --gid=maas --pidfile=/run/maas-pserv.pid --logfile=/dev/null maas-pserv --conf... (No symbols found) crawl: Input/output error Error tracing through process 6312
파반 Manjunath

@PavanManjunath pstack는 amd64에서 깨지는 것 같습니다. 데비안 wheezy amd64에서도 마찬가지입니다.
Gilles 'SO- 악마 그만해

1
pstack의 README 는 32 비트, ELF, x86, GNU에만 해당한다고 말합니다.
Stéphane Chazelas

1

pstack실행중인 프로세스의 스택 추적을 인쇄합니다. 사용할 수 없거나 배포판 / 아키텍트를 지원하지 않는 gstack경우 일반적인 방법 pstack입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.