各位好久不见哈!最近有点忙,好久没写博客了。今天我想和大家分享一下,用gdb简单调试多进程和多线程程序的代码和方法。
我们知道gdb是Linux环境下的代码调试工具。使用时,需要在源代码生成时加上-g选项。默认设置下,在调试多进程程序时gdb只会调试主进程。调试的结果会是这样,我以多进程调试来举例:
但是gdb(>V7.0)支持多进程的分别以及同时调试,换句话说,gdb可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。
关于多线程多进程调试
set follow-fork-mode+ [parent|child] ——设定调试对象(默认为parent)
set detach-on-fork [on|off] ——设定调试状态(默认值:on)
具体如下表:
follow-fork-mode | detach-on-fork | 说明 |
parent | on | 只调试主进程(gdb默认) |
parent | off | 只调试子进程 |
child | on | 同时调试两个进程,gdb跟主进程,子进程block在fork位置 |
child | off | 同时调试两个进程,gdb跟子进程,主进程block在fork位置 |
info inferiors ——查询正在调试的进程
inferior +进程号 ——切换调试的进程
remove+进程号 ——移动调试的进程
detach +进程号 ——删除调试的进程
常用调试命令(部分)
gdb + 待调试的可执行文件名 ——进入gdb调试
ctrl+d或者quit ——退出gdb调试
help ——显示帮助
r ——运行程序到断点处
s ——进入函数调用
l ——看到代码 l+行号i 从第i行开始显示
b ——打断点 b+行号
Info b ——查看所有断点
disable+断点号 ——关闭断点
enable+断点号 ——打开断点
n ——单步执行(next)
p ——打印p后所指的内容(print)
until+行号 ——跳转到哪一行
c ——直接运行到下一断点
bt ——查看堆栈信息
set var i=11 ——改变i的值
finish ——运行完一个函数停下来
cont ——跳过当前断点继续运行
jump ——让程序跳到指定行开始调试
本文以set follow-fork-mode为parent,set detach-on-fork [on|off] 为off进行gdb调试,而进行gdb调试的多进程多线程的源程序如下所示:
gdb.c——多进程程序
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<sys/wait.h>
4
5 int main(){
6 pid_t id = fork();
7 if(id<0){
8 perror("fork");
9 return -1;
10 }
11 else if(id == 0){//child
12 printf("i am a child,id is:%d,my parent id is:%d\n", getpid(),getppi d());
13 return 1;
14 }
15 else
16 {
17 printf("i am parent,id is:%d,my parent id is:%d\n", getpid(),getppid ());
18
19 pid_t ret = waitpid(id, NULL, 0);
20 if(ret>0){
21 printf("wait success!\n");
22 }
23 }
24 return 0;
25 }
gdb1.c——多线程程序
1 #include<stdio.h>
2 #include<pthread.h>
3 #include<unistd.h>
4 #include<sys/wait.h>
5
6 void* fun(void* arg){
7 printf("fun:the pthread is %d\n",pthread_self());
8 }
9
10 void* sad(void* arg){
11 printf("sad:the pthread is %d\n",pthread_self());
12 }
13
14 int main(){
15 printf("i am main!id:%d,pid:%d\n", getpid(),getppid());
16 pthread_t first;
17 pthread_t second;
18
19 printf("first pid:%d, ppid:%d\n", getpid(), getppid());
20 pthread_create(&first, NULL, fun, NULL);
21 printf("second pid:%d, ppid:%d\n", getpid(), getppid());
22 pthread_create(&second, NULL, sad, NULL);
23
24 pthread_join(first, NULL);
25 pthread_join(second, NULL);
26 return 0;
27 }
Makefile
1 .PHONY:
2 all:run run1
3
4 run:gdb.c
5 gcc -o $@ $^ -g -lpthread
6 run1:gdb1.c
7 gcc -o $@ $^ -g -lpthread
8
9 .PHONY:
10 clean:
11 rm -f run run1
直接运行结果
对gdb(多进程程序)进行调试的截图如下:
对gdb1(多线程程序)进行调试的截图如下:
分享如上,望多多交流,如有错误,望交流指正,愿各位学习开心快乐!^_^