首先要生产带调试信息的可执行文件,然后gdb filename打开gdb调试. gcc *.o -o 可执行文件 -g
语法
gdb (选项)(参数)
选项
-cd:设置工作目录;
-q:安静模式,不打印介绍信息和版本信息;
-d:添加文件查找路径;
-x:从指定文件中执行GDB指令;
-s:设置读取的符号表文件 .
参数
文件:二进制可执行文件.
命令 | 解释 | 示例 |
---|---|---|
file <文件名> | 加载被调试的可执行程序文件 | (gdb) file gdb |
l | 显示带main函数的文件的前10行. | (gdb) l |
l 文件名:要查看的行 | 直接显示指定文件的某行 | (gdb) l filename:line_number |
l 文件名:函数名 | 直接显示指定文件的函数(然后l可以向后看) | (gdb) l filename:func |
b/break 行号 | 在某行设置断点 | (gdb) b line_number |
break/b 指定的文件 行号 | 给指定的文件某行设置断点 | (gdb) b filename line_number |
break/b 函数名 | 在某函数设置断点 | (gdb) func |
info/i break/b | 查看断点信息 | (gdb) i b |
r | run的简写,运行被调试的程序,如果无断点,则执行完整个程序,否则执行到断点处 | (gdb) r |
start | 开始执行程序(只执行一步) | (gdb) s |
next/n | 单步调试(跳过函数体) | (gdb) n/next |
s | (单步)进入函数体的内部(l可以查看函数内容) | (gdb) s |
sl,nl | sl,nl命令类似s,n命令. 不同的是,这两个命令所针对的是汇编指令,而s/n针对的是源代码 | (gdb) sl/nl |
continue/c | 运行到断点处 | (gdb) c/continue |
p 变量 | 查看变量的值 | (gdb) p variable |
ptype 变量 | 查看变量类型 | (gdb) ptype variable |
display 变量 | 追踪变量的值(在循环中每次循环都会打印出变量的值) | (gdb) display variable |
info/i display | 获取追踪变量编号 | (gdb) i/info display |
undisplsy 变量编号 | 取消追踪变量的值(undisplay跟的是info display的编号) | (gdb) undisplay vari_num |
s | 进入函数体内部 | (gdb) s |
u | 退出当前循环 | (gdb) u |
finish | 跳出当前的函数,回到打开的位置(循环执行完成,或将断点删除后才能跳出) | (gdb) finish |
delete/d 断点编号 | 删除断点(通过info break查看编号) | (gdb) delete/d 断点编号 |
set var i=10 | 设置变量的值 | (gdb) set var i=10 ? |
quit | 退出gdb | (gdb) quit |