본문 바로가기

도구의발견

gdb - 실행 중인 프로세스 & 스레드 디버깅 하기

개발을 하다 보면 딱히 프로세스가 죽는 것은 아닌데 과도하게 cpu를 먹는 다던지(특정 스레드 무한루프), 프로세스가 살아는 있지만 아무런 응답을 하지 않는다던지(데드락)하는 경우가 있다. 이런 경우 실행 중인 프로세스에 직접 붙어 현재 상태를 체크 해 볼수 있다면 문제 해결에 많은 도움이 될수 있다.

이번 포스팅에서는 실행 중인 프로세스에 gdb 디버거를 붙이고 각 스레드의 상태를 확인, 문제가 되는 스레드의 스택을 트레이싱하는 방법에 대해 알아 보도록 하겠다.

스레드 상태 확인하기

$ ps -eLf | grep <process name>
UID     PID    PPID  LWP   C NLWP  STIME TTY       TIME        CMD
kukuta  11048  1    11048  0  8    10:52 pts/0    00:00:00 <process name>
kukuta  11048  1    11050  1  8    10:52 pts/0    00:00:27 <process name>
kukuta  11048  1    11051  0  8    10:52 pts/0    00:00:19 <process name>
kukuta  11048  1    11052  0  8    10:52 pts/0    00:00:19 <process name>
kukuta  11048  1    11053  0  8    10:52 pts/0    00:00:00 <process name>
kukuta  11048  1    11054  0  8    10:52 pts/0    00:00:00 <process name>
kukuta  11048  1    11055  0  8    10:52 pts/0    00:00:00 <process name>
kukuta  11048  1    11056  0  8    10:52 pts/0    00:00:00 <process name>
ps의 e 옵션은 전체 프로세스를 출력, L은 스레드 상태, f는 출력할수 잇는 모든 내용을 출력하라는 의미다.
LWP(Light Weight Process) 컬럼은 스레드의 아이디를 나타내는 것이다.

실행 중인 프로세스에 gdb 붙이기(Attaching 'gdb' on running process)

$ gdb - p <pid>

만일 실행 권한이 충분치 않다는 에러 메시지가 나오면 sudo로 실행 한다. 위 외에도 다양한 방법이 있다. 다음 링크를 참고 하도록 하자. 위의 예에서는 pid에 11048이 들어가야 한다.

참고 : http://stackoverflow.com/questions/14370972/how-to-attach-a-process-in-gdb

스레드의 상태 보기

(gdb) info threads

  Id   Target Id         Frame
  8    Thread 0x7f0ec8fcc700 (LWP 11050) "<process name>" 0x00007f0ecdb81dbd in nanosleep () from /lib/x86_64-linux-gnu/libc.so.6
  7    Thread 0x7f0ec3fff700 (LWP 11051) "<process name>" 0x00007f0ecdbb69b3 in epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
  6    Thread 0x7f0ec37fe700 (LWP 11052) "<process name>" 0x00007f0ecdbb69b3 in epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
  5    Thread 0x7f0ec2ffd700 (LWP 11053) "<process name>" 0x00007f0ecdbb69b3 in epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
  4    Thread 0x7f0ec27fc700 (LWP 11054) "<process name>" 0x00007f0ecee09d84 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0
  3    Thread 0x7f0ec1ffb700 (LWP 11055) "<process name>" 0x00007f0ecee09d84 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0
  2    Thread 0x7f0ec17fa700 (LWP 11056) "<process name>" 0x00007f0ecee09d84 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0
* 1    Thread 0x7f0ecf67db00 (LWP 11048) "<process name>" 0x00007f0ecee09d84 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0

모든 스레드들의 호출 스택 보기

(gdb) thread apply all bt

디버거가 붙어 있는 스레드 변경하기

(gdb) thread <tid>

스레드의 호출 스택 보기

(gdb) bt

부록 1. 같이 읽으면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!