Linux에서 프로그램이 멈추는 위치를 어떻게 알 수 있나요?

Linux에서 프로그램이 멈추는 위치를 어떻게 알 수 있나요?

내 우분투 서버에서 다음 명령을 실행하고 있습니다

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

무기한 매달릴 것 같습니다. AIX에서 이런 일이 발생할 때마다 나는 문제의 프로세스의 PID를 얻고 다음과 같이 말합니다.

$ procstack <pid_of_stuck_process>

프로세스의 전체 호출 스택을 표시하는 데 사용됩니다. procstackLinux/ubuntu에도 비슷한 것이 있나요?

답변1

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

 strace -s 99 -ffp 12345

프로세스 ID가 12345인 경우. 그러면 프로그램이 실행 중인 모든 시스템 호출이 표시됩니다.진행 상황을 추적하는 방법더 말해 보세요.

스택 추적을 요구한다면 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)

답변2

프로그램의 스택 추적을 찾기 위해 두 가지 답변이 제공되었습니다(먼저 디버깅 기호를 설치하는 것을 기억하십시오!). 시스템 호출이 중단된 위치를 찾으려면 /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

답변3

대부분의 UNIX 시스템에서는 다음을 사용할 수 있습니다.광둥개발은행.

gdb -batch -ex bt -p 1234

게다가pstack(표준 유틸리티가 아니므로 수동으로 설치해야 할 수도 있습니다.) AIX와 비슷해 보이지만 procstack내 Debian wheezy amd64에서는 항상 잘못된 것 같습니다. i386에서는 디버깅 기호 없이 컴파일된 프로그램의 경우 디버깅 기호를 사용할 수 있는 라이브러리는 물론 어떤 기호도 인쇄하지 않습니다.

strace -p1234또한 이를 사용하여 프로세스에서 실행된 시스템 호출을 볼 수도 있습니다 .

답변4

pstack실행 중인 프로세스의 스택 추적이 인쇄됩니다. 배포/아키텍처에 사용할 수 없거나 지원되지 않는 경우 gstack공통적으로 동등한 것이 있습니다.pstack

관련 정보