在Linux系統操作中,經常會遇到多進程調試的問題,其實多進程的調試沒有想象中的那麼復雜,下面小編就給大家介紹下Linux如何調試多進程程序,感興趣的朋友不妨來了解下。
多進程的調試:
(1)follow-fork-mode
set follow-fork-mode [parent | child] ———— fork之後選擇調試父進程還是子進程
(parent: fork之後繼續調試父進程;child: fork之後調試父進程。默認的是fork之後調試父進程)
set detach-on-fork [on | off] ———— 指示gdb在fork之後是否斷開某個進程的調試,或交由gdb控制
(on: 斷開調試follow-fork-mode指定的進程;off: gdb將控制父進程和子進程,follow-fork-mode指定的進程將被調試,另一個進程置於暫停狀態)
(2)attach pid
ubuntu下gdb要使用attach pid權限是不夠的,需要切換到root,或者你可以sudo chmod +s /usr/bin/gdb給gdb添加權限。
使用attach需要在父子進程代碼最開始添加sleep()語句,讓進程睡眠,之後在後台運行進程,通過ps獲取子進程pid,最後attach pid進入調試子進程。
eg:
$./test & //使進程test在後台運行
$ps -ef | grep test //查看進程pid
結果中類似下面的形式:
XXX 12345 23456 ———————————————— 。/test //父進程
XXX 12346 12345 ———————————————— 。/test //子進程,這裡的第一個數字就是子進程pid
$ gdb -q test
(gdb)attach 12346 //attach到子進程
添加的sleep()可以是類似這樣的語句:
while(pause) //pause是一個標志變量
sleep(1);
在gdb調試時你只需要set pause=0使條件不滿足即可執行後續代碼。
(3)gdb wrapper
當父進程fork出子進程,子進程會緊接著調用exec函數來執行新的代碼,這時也可以用gdb wrapper。它的優點是不用添加額外代碼。
linux下將一個進程放到後台運行:
(1)。/test &
(2)“。/test” 之後按下 “ctrl+z” , 用“bg %num”返回的數字將該進程放到後台;
linux下將進程拉回前台:
用“fg %num”
上面就是Linux多進程程序調試的方法介紹了,多進程的調試我們通常使用的是gdb,當你在調試的時候多少都會用到gdb調試工具。