GDB是一个命令行下的调试工具,他非常强大 有着一些图形界面调试程序没有的功能。下面雅乐网为大家介绍一下gdb调试程序的基本用法。
环境安装
windows环境下安装gdb,可以参考sublime text 3配置c/c++编译环境,将mingw添加到系统环境变量即可。
单步调试
下面雅乐网以一个例子为例给大家介绍一下gdb的基本命令和用法。首先我们新建一个c文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <stdio.h> int cal_sum(int a, int b); int main(void) { int result[10]; result[0] = cal_sum(1, 10); result[1] = cal_sum(1, 100); printf("cal(1, 10) = %d\n", result[0]); printf("cal(1, 100) = %d", result[1]); return 0; } int cal_sum(int a, int b) { int i, sum = 0; for (i = a; i <= b; i++) { sum = sum + i; } return sum; } |
要想用gdb进行调试,在编译的时候就要加上-g选项 这个可以把编译调试的信息加到可执行文件中,方便调试。如果没有-g选项,调试的时候就没有相应的变量名和内存地址的对应信息。
因此 我们来到该目录下 编译
可以看到生成了一个main.exe文件
使用命令 gdb 文件名 可以调试该执行文件
(gdb)就表示现在进入了gdb的命令界面,可以使用gdb的一些命令了。
查看源代码 list命令 简写l
默认每次查看10行。直接按回车 可以重复上次的命令。
开始执行 start命令
start命令开始执行程序 程序将停在变量声明后的第一条语句的地方
单步执行 next 简写n
执行n命令可以执行下一步,如果包含函数将直接跳过 而不进入函数内部 相当于图形界面下的step over
step into命令 step简写s
s命令可以进入到函数内部
backtrace
命令(简写为bt
)可以查看函数调用的栈帧
可见当前函数cal_sum是被main函数调用 传递的参数是 a=1 b=10
查看变量值 info 简写i
使用i locals可以查看当前栈的局部变量
也可以查看main函数的局部变量 先用frame
命令(简写为f
)选择1号栈帧然后再查看局部变量:先用frame
命令(简写为f
)选择1号栈帧然后再查看局部变量:
用print
命令(简写为p
)打印出变量的值:
使用finish命令跳出函数
使用p命令查看变量
总结
命令 | 描述 |
---|---|
backtrace(或bt) | 查看各级函数调用及参数 |
finish | 连续运行到当前函数返回为止,然后停下来等待命令 |
frame(或f) 帧编号 | 选择栈帧 |
info(或i) locals | 查看当前栈帧局部变量的值 |
list(或l) | 列出源代码,接着上次的位置往下列,每次列10行 |
list 行号 | 列出从第几行开始的源代码 |
list 函数名 | 列出某个函数的源代码 |
next(或n) | 执行下一行语句 |
print(或p) | 打印表达式的值,通过表达式可以修改变量的值或者调用函数 |
quit(或q) | 退出gdb 调试环境 |
set var | 修改变量的值 |
start | 开始执行程序,停在main 函数第一行语句前面等待命令 |
step(或s) | 执行下一行语句,如果有函数调用则进入到函数中 |