多程序除錯

2022-05-03 03:06:10 字數 4903 閱讀 7183

實際上,gdb 沒有對多程序程式除錯提供直接支援。例如,使用gdb除錯某個程序,如果該程序fork了子程序,gdb會繼續除錯該程序,子程序會不受干擾地執行下去。如果你事先在子程序**裡設定了斷點,子程序會收到sigtrap訊號並終止。那麼該如何除錯子程序呢?其實我們可以利用gdb的特點或者其他一些輔助手段來達到目的。此外,gdb 也在較新核心上加入一些多程序除錯支援。

本文介紹的方法能讓你把斷點設在子程序中,單步檢視子程序的運**況。但問題,如果我想在一次除錯中同時在父子程序中設定斷點,單步執行該怎麼做呢?

1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7 #include

8 #include

9 #include

1011 main()

19 pid_t pid;

20if((pid=fork())<0)

24if(pid==0)

30 arr[0]='

a';arr[1]='

b';arr[2]='

c';arr[3]='

\0';

31if(shmdt(arr)==-1)

35 }

36else

43 printf("

%s\n

",arr);

44if(shmdt(arr)==-1)

48 }

49 }

方法一:attach pid

ubuntu預設情況下你在gdb中使用attach id是許可權不夠的,所以你需要:sudo chmod +s /usr/bin/gdb

在父子程序中加一句while(pause) sleep(1);,讓其暫停,然後後台執行程式,通過ps獲取子程序的pid。(如下所示,ps顯示的./fork有兩個,orisun是程序的有效使用者,第乙個數字是程序id,第二個數字是其父程序id)

執行gdb,attach 子程序id

orisun@zcypc:~$ ./fork &

[1] 13294

orisun@zcypc:~$ ps -ef|grep fork

10279010

09:00 ? 00:00:01 dbus-daemon --

system --fork --activation=upstart

orisun 154610

09:00 ? 00:00:03 //bin/dbus-daemon --

fork --print-pid 5 --print-address 7 --session

orisun 1258410

20:23 ? 00:00:12 gedit /home/orisun/fork.c

orisun 13294

13239

020:53 pts/0

00:00:00 ./fork

orisun 13295

13294

020:53 pts/0

00:00:00 ./fork

orisun 13297

13239

020:54 pts/0

00:00:00 grep --

color=auto fork

orisun@zcypc:~$ gdb

gnu gdb (ubuntu/linaro 7.2-1ubuntu11) 7.2

or later

this is free software: you are free to change and redistribute it.

there is no warranty, to the extent permitted by law. type "

show copying

"and

"show warranty

"for details.

this gdb was configured as "

i686-linux-gnu

".for bug reporting instructions, please see:

.(gdb) attach 13295

attaching to process 13295

reading symbols from /home/orisun/fork...done.

reading symbols from /lib/i386-linux-gnu/libc.so.6...reading symbols from /usr/lib/debug/lib/i386-linux-gnu/libc-2.13.so...done.

done.

loaded symbols for /lib/i386-linux-gnu/libc.so.6

reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.

loaded symbols for /lib/ld-linux.so.2

0x00bd8416 in __kernel_vsyscall ()

(gdb) backtrace

#0 0x00bd8416 in __kernel_vsyscall ()

#1 0x0049bfc0 in __nanosleep_nocancel ()

at ../sysdeps/unix/syscall-template.s:82

#2 0x0049bde2 in __sleep (seconds=)

at ../sysdeps/unix/sysv/linux/sleep.c:138

#3 0x08048595 in main () at fork.c:25

(gdb) up 3

#3 0x08048595 in main () at fork.c:25

25while(pause) sleep(1);

(gdb) list

20if((pid=fork())<0)

24if(pid==0)

(gdb) break

31breakpoint 1 at 0x8048600: file fork.c, line 31.

(gdb) set pause=0

(gdb) continue

continuing.

breakpoint 1, main () at fork.c:31

31if(shmdt(arr)==-1){

(gdb) p arr

$1 = 0xb77fb000 "

abc"

(gdb)

方法二:follow-fork-mode

不需要專門加while(pause) sleep(1);這種**了。

follow-fork-mode的用法為:

set follow-fork-mode [parent|child] 

* parent: fork之後繼續除錯父程序,子程序不受影響。

* child: fork之後除錯子程序,父程序不受影響。 

因此如果需要除錯子程序,在啟動gdb後:

(gdb) set follow-fork-mode child

並在子程序**設定斷點。 

此外還有detach-on-fork引數,指示gdb在fork之後是否斷開(detach)某個程序的除錯,或者都交由gdb控制:

set detach-on-fork [on|off] 

* on: 斷開除錯follow-fork-mode指定的程序。

* off: gdb將控制父程序和子程序。follow-fork-mode指定的程序將被除錯,另乙個程序置於暫停(suspended)狀態。

orisun@zcypc:~$ gdb ./fork

gnu gdb (ubuntu/linaro 7.2-1ubuntu11) 7.2

or later

this is free software: you are free to change and redistribute it.

there is no warranty, to the extent permitted by law. type "

show copying

"and

"show warranty

"for details.

this gdb was configured as "

i686-linux-gnu

".for bug reporting instructions, please see:

...reading symbols from /home/orisun/fork...done.

(gdb) set follow-fork-mode child

(gdb) set detach-on-fork off

(gdb) break

31breakpoint 1 at 0x80485e3: file fork.c, line 31.

(gdb) r

starting program: /home/orisun/fork

[new process 13534]

[switching to process 13534]

breakpoint 1, main () at fork.c:31

31if(shmdt(arr)==-1){

(gdb) p arr

$1 = 0xb7ffd000 "

abc"

(gdb) c

continuing.

program exited normally.

(gdb)

gdb多程序除錯

使用gdb最好的文件就是其名為 debugging with gdb 的參考手冊。手冊中有一小章節提到了如何除錯多程序程式。一般情況下,如果被gdb除錯的程式中呼叫fork派生出乙個新的子程序,這時gdb除錯的仍然還是父程序,其子程序的執行不被理會。如果之前你在子程序的執行routine上設定了斷點...

gdb除錯多程序

在大多數系統,gdb對使用fork建立的程序沒有進行特別的支援。當父程序使用fork建立子程序,gdb仍然只會除錯父程序,而子程序沒有得到控制和除錯。這個時候,如果你在子程序執行到的 中設定了斷點,那麼當子程序執行到這個斷點的時候,會產生乙個sigtrap的訊號,如果沒有對此訊號進行捕捉處理,就會按...

gdb除錯多程序

gdb 是 linux 系統上常用的 c c 除錯工具,功能十分強大。對於較為複雜的系統,比如多程序系統,如何使用 gdb 除錯呢?實際上,gdb 沒有對多程序程式除錯提供直接支援。例如,使用gdb除錯某個程序,如果該程序fork了子程序,gdb會繼續除錯該程序,子程序會不受干擾地執行下去。如果你事...