目录
在Linux下调试程序用的是gdb。
debug与release
- 调试要使用debug模式
- 程序的发布方式有两种,debug模式和release模式
- Linux gcc/g++出来的二进制程序,默认是release模式
- 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
如果我们对直接gcc出来的可执行程序使用gdb调试,则会显示:
编译生成debug版本的方法
只需要在gcc的时候加上-g即以debug模式编译可执行程序。
release版本没有很多调试信息,debug版本包含很多调试信息,所以release版本运行更快,供给客户使用。debug版本的大小也比release大,也是因为加入了很多调试信息。
readelf:读取可执行程序的二进制构成
Linux可执行程序遵守的规则是elf格式。
使用方法:
readelf -S mytest
输入后显示:
再输入
readelf -S mytest | grep -i debug
可以查找debug调试信息:
以上操作对release版本就查不到调试信息。
调试指令
l/list
- list/l [行号]:显示源代码,接着上次的位置往下列,每次列10行。
- list/l [函数名]:列出某个函数的源代码。
注:第一次输入l指令后,后续可以直接连续按Enter来打印源代码,不用每次都输入l
断点设置相关指令
- b/break [行号]:在某一行设置断点。
- break [函数名]:在某个函数开头设置断点。
- break 文件名:[行号]:指定文件的某一行设置断点。
- break 文件名:[函数名]:指定文件的函数开头设置断点。
- info b:查看断点信息。
- d [n]:删除编号为n的断点。
- delete breakpoints:删除所有断点
- disable breakpoints [n]:禁用编号为n的断点(断点保留,但是不生效)
- enable breakpoints [n]:启用编号为n的断点
断点使用:
1.在19行设置断点并查看。
2.图中Num为断点的编号,下图可以看到,在删除第一个断点以后,再添加一个断点,断点的编号并不是从1开始的,而是在本次调试中依次递增的。
3.Enb表示的是断点是否启用,n为禁用、y为启用。
r/run
- run/r:从头连续执行程序,有断点执行到断点处,没有断点执行到结束。
s和n这种单步调试要先用r运行再调试。
n/next
- n/nest:逐过程调试。不进入函数,直接将函数执行完,与vs下的F10调试类似,执行到函数结束的下一行停止。
s/step
- s/step:逐语句调试。进入函数,一句一句调试,与vs下的F11调试类似。
✳ until
- until [行号]:直接执行到指定行号停止。
将当前位置和until指定的行号之间的代码执行完。
✳ finish
- finish:在一个函数内直接运行到函数结束。
进入一个函数,执行完该函数就停下来。
✳ c/continue
- c/continue:从一个断点处运行到下一个断点处停下来。
display监视
- display [变量名]:跟踪查看一个变量,调试的时候常显示它的值,一直显示在命令行中。与vs下的监视类似。
- undispaly [编号]:监视变量会有一个编号,删除这个监视,之后不再显示。
- p [变量名]:查看一个变量,只看一次,之后调试不会显示,查一次看一次。
监视变量的编号:
set ver
- set ver:在编译时直接修改变量的值。
比如在循环中将循环改到某个值。
bt/breaktrace
- bt/breaktrace:查看各级函数调用及参数。
退出调试
- ctrl+d或quit:退出调试