gdb 使用方法详细解析
要调试的文件一定要是一个可执行的文件
gdb调试一个程序的命令格式是:gdb 程序文件名,但是这样会出现一个版权说明
如果不想要版权说明,那么 gdb -q 然后file 文件名
结束调试:quit
显示和查找程序源代码
list命令用于列出程序的源代码
list 显示10行代码,如果再次运行该命令,就会显示接下来的10行代码
list 5,10 显示第五行到第十行代码
list text.c:5,10 显示源文件中的5到10行代码,再调试多个源文件的时候会使用
list get_sum: 显示get_sum 函数周围的代码
list test.c:get_sum 显示源文件中函数周围的代码,在调试多个源文件的程序的时候会使用
如果要运行linux命令,可以输入 shell ls
search 和forward 都是从当前行向后寻找第一个匹配的字符串
search 字符串 forward 字符串
reverse-search 用来从当前行向前寻找一个匹配的字符串
reverse-search 字符串
运行程序用run
clear 行号:删除断点
以某一行设置断点
break 行数
以函数名设置段点
break 函数名
以条件表达式设置段点
break 行号或函数名if条件
例子 list 1,17
break 7 if i ==99 断点在第七行,并且程序中断在第七行
以表达式设置断点的方法
watch 条件表达式
continue 让程序继续执行
print 变量 看变量对应的值是多少
next 语句用于执行下一条的语句
awatch 它用来给表达式设置断点,在表达式的值发生改变或表达式的值被读取的时候,程序暂停执行
查看当前设置的短点
使用info breakpoints 命令可以查看当前所有的中断点
Disp 指示中断点在生效一次后是否就失去作用,如果是的话就是dis 不是的话就是keep
Enb 表明当前中断点是否有效,如果是的话显示的就是y,如果不是的话就是n
address 显示的是中断所处的内存地址
what列出中断发生在哪个函数的第几行
使中断失效或有效
使用"disable 断点编号" 可以使某个断点失效
使用 "enable"可以使某个断点恢复有效
删除断点
clear : 删除程序中所有的断点
clear 行号:删除此行的短点
clear 函数名:删除该函数的断点
delete 断点编号:删除指定编号的断点。如果一次要删除多个断点,各个断点编号以空格隔开
断点编号:就是最前面的那个编号,最后面的哪个是行号
查看和设置变量的值
print 一般用来打印变量或表达式的值,也可以用来打印内存中从某个变量开始的一段内存区域的内容,还可以用来对某个变量进行赋值
格式:
print 变量或表达式
print 变量=值 对变量进行赋值
print 表达式@要打印的值的个数n 打印以表达式值开始的n个数
whatis 命令用来显示某个变量或者表达式的数据类型
格式:whatis 变量或者表达式
set命令:这个命令用来给变量赋值
格式:set variable 变量=值
也就是说 print i=200 和 set variable i=200可以得到同样的效果
控制程序的执行
当程序执行到指定的中断点,查看了变量或表达式的值后,可以让程序继续运行,可以让程序一步一步的执行,也可以让程序一直运行下去直到下一个断点或运行完为止
continue 命令:让程序继续运行,直到下一个断点或运行完为止格式是:continue
kill 命令:这个命令的作用是退出当前程序的调试,按y结束调试,输入n继续调试程序,用这个命令的作用就是让这个程序不再运行
next和step命令:这两个的区别是:如果遇到函数调用,next会吧函数当做一条语句来执行,再次输入next会执行函数调用后的语句,step就会跟踪进入函数,一次一条
地执行函数内的代码,知道函数内的代码执行完,才执行函数调用后的语句
nexti和stepi是单步执行一条执行,不是执行一行指令
例子:for循环需要执行4步才能执行到下一条语句
如果觉得写的好,可以关注我一波,我会写更多的关于linux的文章。还有关于c语言的一些东西。