[GDB] 使用 gdb 除錯 fork 出來的子進程

[GDB] 使用 gdb 除錯 fork 出來的子進程

今天在幫忙查一個 process 一直重覆啟動 child process 的問題,

程式在 fork() 附近的 code 是像這樣:

pid = fork();
if (pid == 0) {
spawn_child();
exit(0);
}
// free resouce
close_resource();

 

用 gdb 先 attach 上 parent process (用 gdb -p <pid>),

執行到 fork() 之後,可以看到 gdb 預設是繼續 debug parent process,

而不會去 debug fork 出來的 child process:

711  pid = fork();
(gdb) n
Detaching after fork from child process 28024.
712  if (pid == 0) {
(gdb) p pid
$1 = 28024

 

以我這個 case 來說,是因為觀察到 child process 好像一直掛掉,

因此想 debug 的是 child process~

想要在 fork 後去 debug child process,

可以設定 follow-fork-mode (可參考 gdb: Debugging Forks)~

在設定前可以先用 show follow-fork-mode 看一下現在的設定值:

(gdb) show follow-fork-mode
Debugger response to a program call of fork or vfork is "parent".

 

在 fork 之前,執行 set follow-fork-mode child,

就可以 debug fork 後的 child process:

(gdb) set follow-fork-mode child
711  pid = fork();
(gdb) n
[Thread debugging using libthread_db enabled]
[New Thread 0xf7eec6d0 (LWP 5698)]
[Switching to Thread 0xf7eec6d0 (LWP 5698)]
712  if (pid == 0) {
(gdb) n
713  spawn_child();
(gdb) p pid
$2 = 0

 

這樣子就可以繼續接下去,debug 為什麼 child process 會掛掉囉~^^

 

(本頁面已被瀏覽過 895 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料