想一想,自己写的程序不会调,那也太难受了吧
自己在Windows编程的时候,界面化的调式都搞不定,还能做命令行的调式?相信我。Linuxgdb调试比你想象的要好玩得多!!!!
在Linux中,gdb的调试功能十分强大。在这里可以安装一个小插件:wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh
#include<stdio.h> #include<stdlib.h> int add_num(int a,int b) { printf("this is a test!"); return a+b; } int main(int args,char*argv[]) { int a=12,b=13; pid_t pid; pid = fork(); if(pid<0) { perror("fork"); exit(1); } if(pid==0) { int c=add_num(a,b); print("%d+%d=%d",a,b,c); exit(1); } int c = b-a; int *d = &c; print("%d-%d=%d",b,a,*d); return 0; }
这里fork()是创建子进程。插入一下:子进程和父进程拥有同样的代码段。也就是会有两个进程来执行同一段代码。不过,子进程进程号pid在这个程序中是为0的。而父进程的pid是大于0的。这样就可以区分了。pid==0是执行子进程,子进程在调用一个函数就退出了。而父进程会执行最后几行代码。
通过gdb ./gdb_test 启动gdb
1. b 是打上断点 b 代码行数 或者 b 函数名 查看断点信息:info breakpoints 取消断点:delete 断点号
1 l是查看代码 用法与b一样
3. 运行程序:r 执行下一行:n
4. 查看变量的值:p /d 是十进制
5. 多进程多线程调试 :由于子进程和父进程执行不同的代码。先选择跟着子进程执行 :set follow-fork-mode child 查看有几个进程:info inferiors 可以通过attach 进程号跟进程
6. 进入函数:s 快速完成函数:finish
7. 查看栈空间:bt
8.查看堆:heap
9. 查看地址 :x /20 是查看20个
一点点gdb基础,希望有所帮助。。