linux中多进程调试,linux下用gdb调试多进程
今天來學習一下linux下gdb如何調試多進程,在學習之前我我們能先看一張表:
這張表是gdb調試的命令表,這對那些對gdb不熟的同學來說是非常有必要的。
一、多進程調試的命令
1、set follow-fork-mode parent|child
因為gdb在一般情況下,只會調試主進程。這條命令就可以使gdb來實現多進程的調試,進入gdb后默認調試的是parent,要想調試child的話,需要設置set follow-fork-mode child,然后進入調試。當然這種方式只能同時調試一個進程。
show follow-fork-mode就是查看當前調試的fork的模式。
2、detach-on-fork on|off:
設置為on,只調試父進程或子進程其中一個,需要根據follow-fork-mode決定,這是默認模式。
設置成off,父子進程都在gdb的控制之下,其中一個進程正常調試,需要根據follow-fork-mode決定,另一個進程會被設置為暫停狀態。
GDB將每一個被調試程序的執行狀態記錄在一個名為inferior的結構中。一般情況下一個inferior對應一個進程,每個不同的inferior有不同的地址空間。inferior有時候會在進程沒有啟動的時候就存在。
3、info inferiors:
這條語句是為了顯示GDB調試的所有inferior,GDB會為他們分配ID。其中帶有*的進程是正在調試的inferior。
4、inferior num:
切換需要調試的進程的id
5、add-inferior [-copies n] [-exec executable]:
增加n個inferior并執行程序為executable。如果不指定n只增加一個inferior。如果不指定executable,則執行程序留空,增加后可使用file命令重新指定執行程序。這時候創建的inferior其關聯的進程并沒啟動。
6、clone-inferior [-copies n] [infno]:
復制n個編號是infno的inferior。如果不指定n的話,就只復制一個inferior。如果不指定infno,則就復制正在調試的inferior。
7、detach inferior infno:
detach掉編號是infno的inferior。注意這個inferior還存在,可以再次用run命令執行它
8、kill inferior infno:
kill掉infno號inferior。注意這個inferior仍然存在,可以再次用run等命令執行它
9、remove-inferior infno:
刪除一個infno號的inferior。如果inferior正在運行,則不能刪除,所以刪除前需要先kill或者detach這個inferior
10、set schedule-multiple on|off:
設為off:只有當前inferior會執行。
設為on:全部是執行狀態的inferior都會執行。
這個選項類似于多線程調試里的set scheduler-locking選項
如果scheduler-locking是指為on,即使schedule-multiple設置為on,也只有當前進程的當前線程會執行。
11、set follow-exec-mode new|same:
設置same:當發生exec的時候,在執行exec的inferior上控制子進程。
設置為new:新建一個inferior給執行起來的子進程。而父進程的inferior仍然保留,當前保留的inferior的程序狀態是沒有執行。
show follow-exec-mode:查看follow-exec-mode設置的模式。
12、set print inferior-events on|off:用來打開和關閉inferior狀態的提示信息。
show print inferior-events :查看print inferior-events設置的狀態。
13、maint info program-spaces:
用來顯示當前GDB一共管理了多少地址空間。
二、多進程的代碼
#include
#include
#include
#include
#include
int main()
{
pid_t id = fork();
if(id < 0)
{
perror("fork error!");
return -1;
}
else if(id == 0)
{
printf("child is: %d,father is: %dn",getpid(),getppid());
}
else
{
sleep(1);
printf("father is :%dn",getpid());
wait(NULL);
}
return 0;
}
三、調試情況
在編譯的時候別忘了加上 -g(我剛開始就是犯了這樣的錯……)
1、設置調試的模式:
2、這是查看兩個進程的情況:
如果大家需要切換要調試的進程可以使用上面我們提到過得命令:inferior 進程id這樣就可以切換者調試其他的進程了。
注意:我們看見的進程前的*號,就表示當前正在調試的進程。
總結
以上是生活随笔為你收集整理的linux中多进程调试,linux下用gdb调试多进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 香港地铁运营时间
- 下一篇: linux接口 头文件,第一种:1、添加