'gdb'에 해당되는 글 3건

  1. 2017.04.10 gdb - 실행 중인 프로세스 & 스레드 디버깅 하기
  2. 2013.03.03 gdb - breakpoint (2)
  3. 2008.08.19 GDB Tutorial

개발을 하다 보면 딱히 프로세스가 죽는 것은 아닌데 과도하게 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





[도구의발견] - gdb - breakpoint

[도구의발견] - GDB Tutorial


Posted by kukuta
TAG gdb

댓글을 달아 주세요

gdb - breakpoint

도구의발견 2013. 3. 3. 00:00

[breakpoint 설정]

(gdb) break                                      현재줄 breakpoint 설정

(gdb) break 22                                 22라인에 breakpoint 설정

(gdb) break func_name                      func라는 이름의 함수에 breakpoint 설정

(gdb) break class_name::func_name   class_name 이라는 클래스 func_name 멤버 함수에 breakpoint 설정

(gdb) break main.cpp:main                main.cpp 파일의 main 함수에 breakpoint 설정

(gdb) break main.cpp:10                   main.cpp 파일의 10번째 라인에 breakpoint 설정


[regular expression breakpoint 설정]

(gdb) rbreak fu*                                fu*를 만족하는 모든 함수에 breakpoint 설정

(gdb) rbreak class_name::                 class_name 클래스의 모든 멤버 함수에 breakpoint 설정


[breakpoint 리스트 보기]

(gdb) info break


[breakpoint 활성화/비활성화]

(gdb) enable                          전체 breakpoint 활성화

(gdb) disable                          전체 breakpoint 비 활성화

(gdb) enable 1                       1번 breakpoint 활성화(breakpoint 번호는 info 명령어로 확인)

(gdb) enable 1 2                    1번 2번 breakpoint 활성화

(gdb) enable 1-3                    1번에서 3번 breakpoint까지 활성화

(gdb) enable once 1                1번 breakpoint를 한번 hit하고 난 후 비활성화

(gdb) enable delete 1               1번 breakpoint를 한번 hit하고 난 후 삭제


[condition breakpoint]

(gdb) cond 1 i==10                 1번 breakpoint에서 i가 10인 경우에만 멈춤

(gdb) ignore 1 100                  1번 breakpoint가 100번 hit 될때 까지 무시


http://kldp.org/node/71806 <- 여기 가면 더 많은 자료가!!

Posted by kukuta
TAG gdb

댓글을 달아 주세요

  1. Favicon of http://blog.ggamsso.wo.tc BlogIcon 깜쏘 2013.03.03 12:10  댓글주소  수정/삭제  댓글쓰기

    gdb를 처음 써 보시는 척 하시다니...

GDB Tutorial

도구의발견 2008. 8. 19. 12:30

GDB Tutorial

디버거는 다른 프로그램을 라인 단위 또는 변수 단위로 실행 시키면서 메모리에서 일어나고 있는 일을들 확인 할 수 있는 프로그램이다. 그 중 가장 유명한 디버거로는 UNIX의 GDB가 있다. 다음의 링크에는 GDB에 관한 보다 자세한 온라인 문서가 있다(documentation for GDB online), 또는 man 페이지에서 보다 빨리 GDB에 대한 정보를 얻을 수 있을 것이다.

Starting GDB

GDB를 사용하기 위해서는 컴파일 시에 -g 플래그를 사용하여야 한다.
$ gcc -g trees.c   ※ c++ 사용자라면 g++ -g trees.cpp 라고 해도 된다.
위와 같은 작업 후엔 a.out 이라는 실행 가능 파일이 생성 된다(만일 -o 플래그로 다른 이름을 줄 수도 있다) 이 프로그램을 gdb의 컨트롤 하에 실행 시키기 위해서는 다음과 같이 커맨드 창에 입력 한다. $ gdb a.out
이것은 텍스트 기반 gdb를 사용 할 수 있게 해준다.

GDB commands 

GDB가실행 된다고 해도, 실질적으로 프로그램(a.out)이 실행 되고 있는 것은 아니다. 사용자가 run이라는 명령어로 gdb가 어떻게 동작 할지에 대한 지정을 해주기 전 까지는 gdb는 동작하지 않는다.
  • run command-line-arguments
    위에서 입력했던 프로그램(a.out)을 실행 시킨다.
    a.out command-line-arguments 
    또는 아래와 같이 칠수 도 잇다.
    a.out < somefile 
  • break place
    브레이크 포인터를 생성해 주는 명령어다. 브레이크 포인터란 프로그램이 실행되면서 강제적으로 멈추어지기 전의 위치이다. 대부분의 브레이크 포인터는 아래와 같이 함수의 이름으로 지정할 수 있다. 
    (gdb) break Traverse
    Breakpoint 2 at 0x2290: file main.c, line 20
    또는 브레이크 포인터를 소스 파일의 특정한 라인 자체로 지정할 수 있는 방법도 있다.
    (gdb) break 20
    Breakpoint 2 at 0x2290: file main.c, line 20
    프로그램이 브레이크 포인트 까지 실행 되면, 아래와 같은 메시지를 볼 수 있다.
    Breakpoint 1, Traverse(head=0x6110, NumNodes=4)
    at main.c:16
    (gdb)
    http://kukuta.tistory.com/163 <- more info for breakpoint
  • delete N
    지정되어 있는 번호의 브레이크 포인트를 제거한다. 현재 지정되어 있는 브레이크 포인터에 대한 정보를 보고 싶다면 info break 를 치면 된다(맨 앞에 Num 이라는 컬럼을 N에 적어 주면 된다)

  • help command
    현재 GDB에 명령어에 대한 도움말을 출력 한다. 단순 help 만을 치게 된다면 help에서 보여 줄 수 있는 도움말의 리스트를 보여 준다.

  • step
    현재 라인을 수행한다. 만일 함수 호출이 있다면 해당 함수로 포인터를 넘긴다.

  • next
    step과 비슷하다. 하지만 현재 라인이 함수 호출을 하고 있다면 이 명령어는 함수를 수행하고 다음 라인에서 멈추게 된다.

  • finish
    next 커맨드를 계속 유지 시켜 포인터를 함수의 끝까지 보낸다.

  • Continue
    브레이크 포인터를 만날때 까지나 프로그램의 스톱이 될때 까지 프로그램을 수행 한다.
    첫번째가 대문자임에 유의 하도록 하자.

  • where
    함수 호출 스택에 따른 현재 위치를 보여준다.
    예를 들어 현재 main에서 호출한 func1 이라는 함수에 있다면 이 커맨드는 현재 호출 된 main-func1 순서의 함수 호출 스택을 보여 준다. 이 명령어는 backtrace와 똑같다.

  • print E
    변수에 들어 있는 값을 출력한다. display와 비슷하다.

  • display E
    변수에 들어 있는 값을 출력함은 print와 동일하지만 print은 한번만 출력하고 그치는 반면에, display는 매 스탭마다 변수에 들어 있는 값을 출력한다.

  • list
    소스 코드를 출력 한다.
    기본적으로 0라인 부터 출력을 10라인씩 출력하며, list 명령을 내릴 때마다 10라인 씩 뒤의 코드를 출력한다.
    list 명령 뒤에 출력이 시작 될 라인을 지정해 줄 수 있다.

  • quit
    GDB를 끝낸다
원문 보기 : http://www.cs.princeton.edu/~benjasik/gdb/gdbtut.html

email : kukuta@gmail.com

'도구의발견' 카테고리의 다른 글

Handle leak 찾기  (3) 2008.10.02
cvs 파일 상태 기호  (2) 2008.08.19
GDB Tutorial  (0) 2008.08.19
Break point  (0) 2008.08.18
vim Undo & Redo  (3) 2008.08.06
개발자를 위한 .vimrc 설정  (0) 2008.07.15
Posted by kukuta
TAG debugging, gdb

댓글을 달아 주세요