[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 會掛掉囉~^^
(本頁面已被瀏覽過 3,998 次)
One thought on “[GDB] 使用 gdb 除錯 fork 出來的子進程”
你好,这个如何设置为默认值