ps -ef|grep ./my_main|grep -v grep| cut -c 9-15|xargs kill;
當你在程式中使用fork(),如果用gdb來除錯.不管是你在子程序是否設定斷點.你都只能在父程序單步除錯,而沒辦法進入到子程序當中進行單步除錯.因為gdb的所有處理(檢視堆疊,記憶體,變數值)都是針對當前程序空間.
當你在程式中使用fork(),如果用gdb來除錯.不管是你在子程序是否設定斷點.你都只能在父程序單步除錯,而沒辦法進入到子程序當中進行單步除錯.因為gdb的所有處理(檢視堆疊,記憶體,變數值)都是針對當前程序空間.
那麼是否就沒辦法除錯多程序程式的子程序**呢?辦法還是有的,一般的標準方法是再開啟乙個gdb用attach功能來除錯子程序.gdb attach 功能是不執行被除錯程式,而是把gdb「掛」到乙個已經執行的程序之上來進行除錯,這掛載的動作稱為attach.當然也包括掛載子程序。
首先我們看乙個如下簡單的多程序程式。
/* author: andrew huang bluedrum@163.com
debug multi-process by gdb.
*/#include
#include
#include
#include
#define print_int(e) printf("%s=%d/n",#e,e)
int main()
}else if(pid >0)
val+=10;
print_int(val);
wait(null);
}else /* error */
print_int(val);
return 0;
}這個程式很簡單,就是子程序在無限迴圈列印螢幕,而父程序在用wait等待.
編譯 gcc test_fork.c -o test_fork -g
1.雙gdb除錯
首先用常規方法gdb test_fork.c 除錯程式,分別在31行,41行設斷點,然後用run執行程式,可以看到gdb在41行父程序的斷點停下來.但是子程序在自行執行,無法在31斷點停下.
這時用gdb attach功能來除錯子程序,首先用ps -aux | grep test_fork找出子程序號.
然後用 gdb test_fork 《程序號》掛入已經知程序.這時就可以看到在子程序的斷點可以停下來,而且父程序的gdb視窗裡,子程序輸出停下並受子程序的gdb控制,這裡你可以用常規除錯手段來看程式了.(如看memory,watch,stack等)
操作步驟,進入gdb首先用b 31 設定子程序中斷點.然後用c(這裡要用continue,因為attach的程序已經在執行了,不能用run)
然後可以看到斷點在生效了.至此可以常規除錯方法即可
[root@localhost src]#ps -aux | grep test_fork
breakpoint 1 at 0x8048541: file test_fork.c, line 31.
(gdb) c
continuing.
breakpoint 1, main () at test_fork.c:31
31 printf("child [%d]/n",i++);
(gdb) n
32 sleep(1);
(gdb)n
33 }
(gdb)
2.圖形介面kdbg的除錯
命令列介面gdb還是太麻煩了,一般我們還是採用介面前端來進行除錯程式,一般用kde自帶kdbg最為方便.
2.1 首先用乙個kdbg開啟程式
在圖形介面設定斷點,然後執行,可以看到主程式的斷點已經進入並停下來了.
2.2 再開啟乙個kdbg,並且開啟test_fork,設定好子程序的斷點,選擇主選單的execution->attach,這時會出現如下介面,從程序列表選擇子程序或用ps查到子程序id直接輸入即可
2.3 此時兩個kdbg在同時調乙個程式不同程序,注意所有標準輸入輸出都發生在除錯主程序的kdbg的終端視窗裡
來自:[root@localhost src]# gdb test_fork
gnu gdb fedora (6.8-27.el5)
(gdb)b 31
breakpoint 1 at 0x8048541: file test_fork.c, line 31.
(gdb)b 41
breakpoint 2 at 0x804858e: file test_fork.c, line 41.
(gdb)r
starting program: /home/hxy/src/test_fork
process id 3959
detaching after fork from child process 3962.
val=100
parent process id 3959
breakpoint 2, main () at test_fork.c:41
41 printf("parent [%d]/n",i);
(gdb) val=100
child process id 3962,parent id 3959
val=200
child [0]
child [1]
child [2]
child [3]
child [4]
child [5]
child [6]
child [7]
nchild [8]
child [9]
parent [0]
39 for(i=0 ; i < 5 ; i++)
(gdb) child [10]
n
gdb單步除錯c應用程式
0 報錯資訊 2019 12 28 14 59 34 023 kms server.c 0178 get the sign sigse 2019 12 28 14 59 34 023 kms server.c 0180 kms exit by signal 11 1 檢視程序號 imipay ips...
單步除錯 番外篇 使用gdb對程式進行除錯
在微控制器開發中,如keil或者iar,我們可以直接插上我們的jlink,很輕鬆的在開發環境上設定斷點,單步執行,檢視變數等除錯動作,所以就有好多從微控制器轉到linux上的使用者感覺很不習慣,上篇的番外對makefile的介紹也是由於這個原因,因為我們在整合開發環境中點一下編譯就可以了。完全把我們...
Linux下GDB的初步除錯 例項
四 總結 五 參考資料 gnu debugger,是gnu工程為gnu作業系統開發的偵錯程式,但它的使用不侷限於gnu作業系統,gdb可以執行在unix linux甚至microsoft windows。使用者能在程式執行時觀察程式的內部結構和記憶體的使用情況。gdb是一種基於命令列工作模式下的程式...