GDB调试 | 简单的单个文件、多个参数、多进程调试


```bash
gdb cPP可执行文件

list/l	查看代码


b 10  在第10行设置断点 

i b 查看断点情况

r	运行
continue/c	程序继续运行,遇到下一个断点,会挺在断点处

n	下一个步
set val a = 10 		设置变量a 的值为10
p a				
或者
p strcpy(a , 10)	#p 后面可用表达式
又如
p a + 10
总结就是: p + 表达式

#设置主程序参数
int main(int argc, char* argv[]){}

set argv 参数1 参数2

对于复杂参数 如 aa bb.c 
会以为是3各参数
应该修改如下
set argv "aaa bb.c" 

p argv[1]
会输出如下内容	"aaa bb.c"

step  缩写为 s		
执行当前行语句,如果该语句函数为函数调用,则进入函数执行其中的第一条语句。注意:如果函数是库函数或者第三方提供的函数,用s也是进不去的,因为没有源代码,如果是自己定义的函数,只有源码就可以进入。

/*fork函数
程序冲一开始运行就会产生一个进程,当这个进程运行到fork()函数时,fork就会复制一份原来的进程
也就是创建一个新进程,这个新进程也叫子进程。而原来的进程叫做父进程。此时父子进程是共存的,他们一起向下执行代码。(注意:当调用fork函数之后,一定是两个进程同时执行fork函数之后的代码,而之前的代码由父进程执行)
补充知识:PCB(进程控制块,用一个结构体struct task_struct实现)
简单举例
 void func(){
	fork();		//fork1
	fork();		//fork2
	printf("明天会更好\n");
}
运行过程:
	main()、fork1()、fork2()
	 main()、fork2()		fork1()、fork2()
	 main()->printf("明天会更好\n") fork2()->printf("明天会更好\n")      fork1()->printf("明天会更好\n")  fork2()->printf("明天会更好\n")
看到有几个printf()执行就有几个进程

父子进程相同时:
	刚fork后,代码段、text段、堆段、环境变量、全局变量、宿主目录位置、进程工作目录、信号处理方式
父子进程不同:
		进程id 、返回值、各自父进程、进程创建时间、闹钟、未决信号
父子进程共享:
	文件描述符、mmap映射区、读时共享,写时赋值(全局变量)
fork之后父进程先执行还是子进程先执行不确定,取决于内核所调用的调度算法


调试父进程/子进程
	调试父进程:set follow-fork-mode parent
	调试子进程:set follow-fork-mode child
	
设置调试模式:set detach-on-fork [on/off]	缺省是on
	表示调试当前进程的时候,其他的进程继续运行,如果用off,调试当前进程的时候,其他的进程被gdb挂起.
	查看调试的进程:info inferiors
	切换当前调试的进程:inferior 进程id

*/
 int main(){
     printf("开始运行\n");
     if(fork() != 0){
		printf("父进程: pid = %d, ppid = %d\n", getpid(), getppid());
         int i = 0;
         for(i = 0; i <10; ++i){
			printf("i = %d\n", i);
         	sleep(1);
         }
         exit(0);
     }else{
		printf("子进程: pid = %d, ppid = %d\n", getpid(), getppid()); 
         int j = 0;
         for(j = 0; j <10; ++j){
             printf("j = %d", j);
             sleep(1);
         }
         
     }
     
     
	return 0
 }
/*多线程调试*/
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

int x = 0, y = 0;		//x用于线程1,y用于线程2
pthread_t pthid1, pthid2;

//1.第一个线程的主函数
void *pth1_main(void *arg);

//第二个线程主函数
void *pth2_main(void *arg);

int main(){
	//创建线程1
    if(pthread_create(&pthid1, NULL, pth1_main, (void*) 0) != 0){
		printf("pthread_create pthid1 failded.\n");
        return -1;
    }
    if(pthread_create(&pthid2, NULL, pth2_main, (void*) 0) != 0){
        printf("pthread_create pthid2 failded.\n");
        return -1;
    }
    printf("111\n");
    pthread_join(pthid1, NULL);
    
    printf("222\n");
    pthread_join(pthid2, NULL);
    
    printf("333\n");
    
    return 0;
}
void *pth1_main(void *arg){
        for(x = 0; x < 100; ++x){
            printf("x = %d\n", x);
            sleep(1);
        }
        pthread_exit(NULL);
}
    
void *pth2_main(void *arg){
        for(y = 0; y < 100; ++y){
            printf("y = %d\n", y);
            sleep(1);
        }
        pthread_exit(NULL);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值