目录
引言
Linux和windows同为操作系统,前者是命令行形式,后者使用图形化界面形式,两者虽然形式不同但操作确实对应的。图形化界面的点击都可以对应命令行指令,自然编写代码时调试也不例外。Windows下的调试方法大家应该都很熟悉了,今天就来介绍一下gdb,作为Linux下的调试工具,它的功能也很强大。
准备工作
写个小程序实际操作一下:
gdb对可执行程序mytest进行调试,发现不能调试。
这是因为Linux下默认发行版本是release版本的。需要在编译时改成debug版才能调试:
这样编译一个debug版本的就可以进行调试了。
为什么debug版就可以调试,release版就不能呢?————因为debug版文件中加了调试信息:
readelf -S查看FILE格式的文件,-S显示节头信息(如果有数据的话)。通过管道grep过滤,找到debug调试信息,这在release版文件中是没有的 。
区分debug版和release版的方法:debug版文件大小 > release版。
gdb操作
1、gdb mytest 进入调试后,l (list) 显示代码,此时不是从第一行开始显示,
想从第一行开始显示,l 0:
想继续往下显示,回车键即可:
2、添加、查看、删除断点:
添加断点:b (break)+行号:
查看断点:info b:
删除断点:d (delete) + Num(断点编号):
3、调试运行相关指令
在Windows下调试,以VS为例,F5是调试运行,如果碰到断点就停下来,没断点就运行到结尾。
Ctrl F5是运行不调试,逐过程是F10,遇到函数不进去执行下一条语句;逐语句是F11,碰到函数进去,跳转到函数实现部分。
Linux下调试运行是 r (run),逐过程是n (next),逐语句是 s (step)
如果要从一个断点跑到下一个断点处,c (continue)
如果既不想在函数内逐语句调试,也不想跳到下一个断点,只想跑完当前这个函数,用 fin (finish)
还有一条指令:bt (查看调用堆栈)
4、常显示
在Windows下(以VS为例),比如想调试一个循环并查看循环过程中变量每次的变化值,可以调用窗口显示:
Linux下需要用到p (printf)指令和display指令:
进入循环后,p +变量就可以打印该变量的值,但是下一次循环则不会继续显示。
所以用display可以做到常显示:
注意display变量前面的编号,想去掉display的变量用undisplay指令时,undisplay + 编号:
5、 until
until + 行号,跳转到该行处。
像上面在循环里想出去,可以直接until跳转出去。
6、set var ,修改变量的值
7、info locals :查看当前栈帧局部变量的值