```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);
}