1. 编译时允许gdb: 在编译命令中加入-g
gcc/g++ filename.c/cpp -Wall -o a.out -g
2. 启动gdb
gdb
3.调试某文件
file a.out
最常用的10个命令
1) file <文件名>:加载被调试的可执行程序文件。
2) start: 启动程序并在主程序入口处等待。
3) r: run的缩写,从头运行被调试的程序。如果程序中没有断点,执行完整个程序;如果有断点,程序暂停在第一个运行到的断点处。
4) c: continue的缩写,继续执行被调试程序,直至下一个断点或程序结束。
5) b: breakpoint的缩写, 设置断点,断点编号从1开始递增。 用法包括:
b <行号>
b <函数名称>
b *<函数名称>
b *<代码地址>
其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。
d: delete breakpoint 的缩写。删除指定编号的某个断点,或删除所有断点。
举个栗子:
b 8 【第八行加入一个断点,编译器会显示加入第一个断点1, e.g. Breakpoint 1 at 0x400581: file a.c, line 8.】
b main【main函数入口加入一个断点,会被自动编号为2】
b foo 【foo函数入口加入新断点,自动编号为3】
d 1【删除第一个breakpoint】
d 【删除全部breakpoints,命令行会有提醒。。。】
6)s: step的缩写, 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;s 相当于其它调试器中的“Step Into (单步跟踪进入)”。
n: next的缩写,执行一行源程序代码,此行代码中的函数调用也一并执行。n 相当于其它调试器中的“Step Over (单步跟踪)”。
这两个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)。
si, ni
si命令类似于s命令,ni命令类似于n命令。所不同的是,这两个命令(si/ni)所针对的是汇编指令,而s/n针对的是源代码。
7)p <变量名称>:print的缩写,显示指定变量(临时变量或全局变量)的值。
8)l:list的缩写,查看当前位置代码。
9)q:quit的缩写,退出GDB调试环境。
10) layout src显示源码窗口! 比list好用!
Ctrl-x a回到传统模式
----------------------------------------------分割线-----------------------------------------------------------------
GDB Layout命令
命令功能
layout src显示源码窗口
layout asm显示汇编窗口
layout split显示源码 & 汇编窗口
layout regs显示汇编 & 寄存器窗口
layout next下一个layout
layout prev上一个layout
C-x 1单窗口模式
C-x 2双窗口模式
C-x a回到传统模式
GDB 跳转执行命令
命令功能
start开始启动程序,并停在main第一句等待命令
step执行下一行语句, 如语句为函数调用, 进入函数中
next执行下一行语句, 如语句为函数调用, 不进入函数中
finish连续运行到当前函数返回为止
continue从当前位置继续运行程序
return强制令当前函数返回
call func()强制调用函数, 也可以用print func()
run从头开始运行程序
quit退出程序
注: call func() 与 print func() 的区别,在于调用void函数时, call func()没有返回值, 而print有~~
GDB调试输出命令
命令功能
print输出变量值 & 调用函数 & 通过表达式改变变量值
info var查看全局 & 静态变量
info locals查看当前函数局部变量
list查看当前位置代码
backtrace查看各级堆栈的函数调用及参数
set var 变量=xx将变量赋值为xx
注:
p/x 3*i -- x for hexadecimal, o for octal, d for decimal, f for float, c for char, s for string
断点
命令功能
b N_LINE在第N_LINE行上设置断点
b func在func函数上设置端点
delete breakpoints删除断点
disable breakpoints禁用断点
enable 断点号启动端点
info breakpoints查看断点列表
break foo if x>0设置条件断点
观察点
当待观察点被读 或 被写时,程序停下来,并输出相关信息
命令功能
watch设置写观察点
rwatch设置读观察点
awatch设置读写观察点
info watchpoints查看观察点列表
Display跟踪点
命令功能
display var每次停下来时,显示设置的变量var的值
undisplay取消跟踪显示
info display设置读写观察点
info watchpoints查看跟踪列表
分割线前源自:
https://blog.csdn.net/liigo/article/details/582231
分割线后部分来自:
作者:rh_Jameson
链接:https://www.jianshu.com/p/6cdd79ed7dfb
來源:简书
------------------------------------newly added @20180705------------------------------------------
查看栈信息
bt: backtrace的缩写