튜기's blogggg

gdb - multi process debugging

by St1tch

GDB에서는 fork/exec() 이후에도 프로그램을 계속 디버깅 할 수 있는 기능을 제공한다.
(GNU/Linux, HP-UX only)

기본적으로는 fork() 이후에는 parent process 만이 계속 디버깅되며
child에 breakpoint를 설정하면 SIGTRAP을 받고 종료되어 버린다.
이를 해결하기 위한 전통적인 방법은 child에 sleep을 걸고
ps 명령 등으로 child의 pid를 알아낸 후에 attach 하는 방식이 사용되었다.

하지만 Linux (커널 2.5.60 이상) 에서는 다음과 같이 GDB에서 직접 처리할 수 있다.

set follow-fork-mode child


위와 같이 설정하면 fork() 후에 child process를 디버깅 상태로 만들고 parent는 계속 실행시킨다.
follow-fork-mode의 기본값은 parent이며 이는 다음과 같이 확인할 수 있다.

show follow-fork-mode


만약 parent와 child process를 모두 디버깅해야한다면
이들을 모두 제어하기 위해 다음 명령을 이용할 수 있다.

set detach-on-fork off


만약 fork/vfork/exec와 같은 특정 이벤트 발생 시 실행을 중지시키고 싶다면
catchpoint를 설정할 수 있다.

catch exec


아니면 exec()가 수행된 후에도 gdb breakpoint 등은 그대로 남아있게 되므로
공통으로 사용되는 main() 등의 함수에 break를 걸어둘 수도 있다.




출처 : http://egloos.zum.com/studyfoss/v/5120049

블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기