Linux 下用gdb單步除錯多程序方法

2021-05-25 02:29:48 字數 3074 閱讀 5703

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 [email protected]

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是一種基於命令列工作模式下的程式...