實際上,gdb 沒有對多程序程式除錯提供直接支援。例如,使用gdb除錯某個程序,如果該程序fork了子程序,gdb會繼續除錯該程序,子程序會不受干擾地執行下去。如果你事先在子程序**裡設定了斷點,子程序會收到sigtrap訊號並終止。那麼該如何除錯子程序呢?其實我們可以利用gdb的特點或者其他一些輔助手段來達到目的。此外,gdb 也在較新核心上加入一些多程序除錯支援。
本文介紹的方法能讓你把斷點設在子程序中,單步檢視子程序的運**況。但問題,如果我想在一次除錯中同時在父子程序中設定斷點,單步執行該怎麼做呢?
1 #include2 #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 ./forkgnu 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會繼續除錯該程序,子程序會不受干擾地執行下去。如果你事...