GDB fork/exec Child Process Debugging

GDB fork/exec Child Process Debugging

in

attach 중인 프로세스에 대해 fork(), exec()가 호출되면 SIGTRAP이 호출되고 분석이 불가능하다.

그러나 아래 옵션들을 설정하면 분석이 가능하다.

fork() 시 child process 디버깅

fork() 이후 parent process 만이 계속 디버깅되며 chlid에 진입하면 SIGTRAP을 받고 종료된다.

만약, child process 를 이어서 분석하기 위해서는 아래 옵션을 세팅한다. 해당 옵션 값을 child로 설정 시 fork() 후 child process를 debugging 상태로 만들고 parrent 는 계속 실행중인 상태가 된다.

(gdb) show follow-fork-mode
(gdb) set follow-fork-mode [parent(default)|child]

parent/child process 모두 디버깅

parent, child process를 모두 디버깅해야한다면 아래 옵션을 설정하면 된다. 기본값은 on이며, off 로 설정한다.

(gdb) show detach-on-fork
(gdb) set detach-on-fork [on(default)|off]

특정 이벤트 발생 시 실행 중지

fork(), vfork(), exec() 등과 같은 함수 호출 시 실행을 중지하고 싶다면 catch point를 설정한다.

(gdb) catch exec

Usage

해당 명령어들을 응용하여 아래와 같이 분석할 수 있다.

(gdb) set follow-fork-mode child
(gdb) catch fork
Catchpoint 1 (fork)
(gdb) c
Continuing.
(gdb) u
[Attaching after Thread 0x235d (LWP 9053) fork to child process 9278]
[New inferior 2 (process 9278)]
[Detaching after fork from parent process 9053]
[Inferior 1 (process 9053) detached]
[Thread debugging using libthread_db enabled]
...

References:

  • https://parknom.tistory.com/entry/gdb-fork