Linux中gdb调试。
一、背景知识
-
程序发布方式有两种,debug模式和release模式。debug模式可以调试,release模式不可以调试。
-
在debug模式下,编译器形成可执行程序时,会给程序添加调试信息。(验证:不同模式下, debug形成的可执行程序比release模式下形成的可执行程序大。即,添加的可调试信息)
-
在Linux中,gcc/g++默认采用的是release模式。
-
使用指令: gcc test.c -o test_debug.exe -g ——[-g]选项可使gcc以debug模式编译。
-
readelf -S 可执行程序 —— 读取可执行程序的符号表(汇编指令)。
-
readelf -S 可执行程序 | grep -i debug ——从可执行程序中找到有关debug关键字的信息、
-
readelf 可以读取elf格式的内容。可执行程序是elf 格式的,所以可以读取。
-
-i 是忽略大小写。
二、指令
-
test.cc 源文件, test_debug.exe 是可执行程序
-
gdb test_debug.exe —— 进入gdb调试
-
quit (q) —— 退出调试
list (l) [文件名:]行号/函数名
1. list test.cc:main ——查看文件main函数所在位置的源代码。
2. list test.cc:3 —— 查看文件的第3行源代码。
3. list(l) main —— 从main函数位置开始查看。
4. list(l) 0 —— 从文件起始位置开始查看。
-
list 默认只会打印10行,且要打印位置的源代码一般在中间位置,一直回车即可看到后面的全部代码。
-
因为gdb 会记录最近一次运行的指令。
-
run ® —— 让程序跑起来,然后才可以调试。因为没有打断点,所以会直接把程序跑完。
-
break (b) [文件名]:行号/函数名 ——给文件的第几行打断点。(参考上面的list指令)
-
断点是在查找问题时缩小范围用的。
info(i) b —— 显示所有的断点
-
info i —— 查看进程
-
ps ajx | grep gdb ——查看gdb的进程
-
info locals —— 查看当前栈帧局部变量(相当于VS中的查看自动变量)
delete breakpoints(d)—— 删除所有的断点。
-
delete breakpoints(d) n断点编号—— 删除断点编号为n的断点
- d 1 —— 删除断点编号为1的断点。
-
disable 断点编号 —— 禁用断点
-
enable 断点编号 —— 启用断点(与disable统称:使能断点。标识为:Enb,通过info b 可以看到)
-
next(n) —— 逐过程调试(F10)
-
step(s) —— 逐语句调试(F11)
-
finish —— 逐函数,前提是进入函数内部。将所在函数执行完毕就停下来。用于跳过循环。
-
continue© —— 从当前断点运行到下一个断点处。
-
print§ 变量名/地址 —— 打印变量的值或地址
-
display 变量名 —— 让变量一直显示
-
undisplay 编号 —— 取消变量一直显示
-
until X行号 —— 从当前位置运行到第X行。
-
set var i=100 —— 修改变量的值,如果是循环,中间的过程不会运行。
-
breaktrace(bt)——查看各级函数调用及参数。