歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 下用gdb單步調試多進程方法

Linux 下用gdb單步調試多進程方法

日期:2017/2/28 16:17:12   编辑:Linux教程

當你在程序中使用fork(),如果用gdb來調試.不管是你在子進程是否設置斷點.你都只能在父進程單步調試,而沒辦法進入到子進程當中進行單步調試.因為gdb的所有處理(查看堆棧,內存,變量值)都是針對當前進程空間.

那麼是否就沒辦法調試多進程程序的子進程代碼呢?辦法還是有的,一般的標准方法是再打開一個gdb用attach功能來調試子進程.gdb attach 功能是不執行被調試程序,而是把gdb“掛”到一個已經運行的進程之上來進行調試,這掛載的動作稱為attach.當然也包括掛載子進程。

首先我們看一個如下簡單的多進程程序。

/*
Author: Andrew Huang [email protected]
debug multi-process by gdb.
*/
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#define PRINT_INT(e) printf("%s=%d\n",#e,e)

int main()
{
pid_t pid;
int i,val = 100;

printf("process id %d\n",getpid());

pid = fork();

PRINT_INT(val);

if(pid == 0)
{/* child process */

val+=100;
printf("child process id %d,parent id %d\n",getpid(),getppid());

PRINT_INT(val);

i = 0;

while(1)
{
printf("child [%d]\n",i++);
sleep(1);
}
}
else if(pid >0)
{/* parent child */
printf("parent process id %d\n",getpid());

for(i=0 ; i < 5 ; i++)
{
printf("parent [%d]\n",i);
}

val+=10;

PRINT_INT(val);

wait(NULL);


}
else /* error */
{
exit(-1);
}


PRINT_INT(val);

return 0;
}

這個程序很簡單,就是子進程在無限循環打印屏幕,而父進程在用wait等待.

編譯 gcc test_fork.c -o test_fork -g

Copyright © Linux教程網 All Rights Reserved