编写test2.cexpress
编译成可执行文件vim
gcc test2.c -g -o test2
gdb test2
进入gdb调试数组
run命令格式编辑器
run <arg1...argn>
其中run能够简写成r,gdb中大部分指令能够简写。函数
在gdb中执行优化
run lvyahui blog
能够看到输出ui
再次运行run能够不须要再传递参数,它会使用最后一次调用run命令传递的参数spa
能够看到默认参数3d
能够再次执行带参数的run或者使用set agrs 修改默认参数调试
break <line-number>
能够在vim编辑器中查看行号或者经过list/l指令查看行号
编辑代码文件test1.c
编译好test1
gcc test1.c -g -o test1
gdb test1
进入gdb环境
先查看代码,而后设置一个断点,再run执行,让后continue继续执行
break能够直接在方法前添加短点
break fun_name
在此调试执行
下面看怎么删除以前设置的短点
delete breakpoint <point-number> #删除指定断点
#或者
delete breakpoints #删除全部断点
其中 delete能够简写成d
另外clear命令也能够用来清除断点
break <line number> if expression
按照上面的方法步骤设置断点,发现失败了,提示No symbol var in current context
起初我觉得是这样的设置须要在运行中设置,因而在13行设置断点,运行,当停在13行时,再在第15行设置一个条件断点,但
最后发现问题依旧。显然问题不在这里,后来上网查了下,在编译时加上一个-gstabs+选项
gcc -g -gstabs+ -c test1.c gcc test1.o -o test1
再次进入gdb 调试
发现就能够设置这个条件断点了
可使用readelf看两次不一样方法编译生成的.o文件的符号表有所不一样。
run执行下看看
可是执行发现断点没有起做用
虽然不知道为何,但显然以前是由于编译器作了编译优化,但我明明没有加任何-OX选项啊。后来把i==50换成i>=50,发现能够停下来了。
真是郁闷,i怎么会是这个值呢?
若是是多文件程序,break还能够指定文件添加断点,格式以下
break <filename:line-number> break <filename:fun-name> #例如 break test1.c:15 break test1.c:main
格式
disable/enable breakpoint num
观察点也能够起到断点的做用
编辑test3.c文件
#include <stdio.h> int sum(int a){ int i,res = 0; for(i=0;i < a;i++){ res += i; } return res; } int main(void){ int a = 10; int asum = sum(a); printf("asum is %d \n",asum); return 0; }
编译
gcc -g -gstabs+ -Wall test3.c -o test3
watch 命令须要在运行程序后使用看,因此咱们要先加一个断点让程序停下来
将断点删除,继续执行
在运行时经常使用print命令来查看数据,再次以前,须要先知道如何单步执行,进入函数,运行到下一个断点
再次调试test1程序
为
print <expression>
#或者
p <expression>
其中expression能够是各类形式
表达式
p (i-6)*3+result
函数调用
p func(5)
数组
p *arr_name@arr_length
编写test4.c
#include <stdio.h> #include <string.h> int main(void){ int arr[] = {1,2,3,4,5}; int len = 4,i; int * arr2 = (int *) malloc(len * sizeof(int)); for(i=0;i<len;i++){ arr2[i]= i*2; } free(arr2); return 0; }
进入gdb调试
display/fmt expr
控制格式的字符更printf的很是类似,在此不作赘述
以上是我的总结的gdb的一些基础内容,更多内容会在后续博客中说起