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