一:起因
(1)也许我们非常熟悉Windows下的VC6.0 和 CodeBlocks的调试工具 —— 界面化的调试,但是你是否想过你的每一个按键或者快捷键的背后指令是什么,让我们一起走进Linux的gcc动态调试工具GDB
(2)程序调试无非就是:debug(gcc -g -o target source);设置断点(b n);观察变脸(info locals);观察特定值(print expr);执行(start);执行下一行(next);进入子函数(step);执行到当前函数结尾(finish);查看源代码(list)等等操作
(3)gcc 的过程:C程序的编辑 用到vim; 程序的编译和运行用到gcc; 程序的调试用到gdb (kdbg是可视化的调试工具)
二:实例讲解
(1)调试步骤分为两步
1)编译时一定到 加上 -g 产生调试信息,让调试信息包含在可执行文件中exe —— 命令行下:
gcc -g -o target source
2)把可执行文件exe加载到调试环境中:
gdb target
3) gdb为调试命令提示符,即可键入调试命令
(2)调试常用命令
1)基本调试命令(重要)
list 行号:列出产品从第几行开始的源代码
list 函数名:列出某个函数的源代码
start:开始执行程序,停在main函数第一行语句前面等待命令
next(n):执行下一列语句
step(s):执行下一行语句,如果有函数调用则进入到函数中
breaktrace(或bt):查看各级函数调用及参数
frame(f) 帧编号:选择栈帧
info(i) locals:查看当前栈帧局部变量的值
finish:执行到当前函数返回,然后挺下来等待命令
print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
set var:修改变量的值
quit:退出gdb
2)高级调试命令
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
break...if...:设置条件断点
continue(或c):从当前位置开始连续而非单步执行程序
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
info(或i) breakpoints:参看当前设置了哪些断点
run(或r):从开始连续而非单步执行程序
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
3)格式化输入查看变量 print(p)
输出格式:
一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。
例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要
做到这样,你可以使用GDB的数据显示格式:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。