前期准备,gdb调试的程序需要 g++的-g参数
例子:
g++ -g main.cpp -o main
-g参数是为了保留一系列的调试参数,例如程序源文件的名字,以便于查找。
GDB基础指令:()内为缩写
gdb mian(可执行程序) #运行gdb调试main程序
start #开始调试,停在程序执行的第一行。
next(n) #单步执行,不进函数。注意:必须先执行程序(start or run)
step(s) #单步执行,会进入函数。同上
run (r) #从头执行程序,直到碰到断点或程序结束。
continue(c) #继续执行程序,直到碰到断点或程序结束。
until(u) #运行程序直到循环结束
until 行号 #运行至某行
finish #运行至当前函数结束,并打印函数的堆栈地址和返回值和参数值等
call 函数(参数) #调用程序中可用的函数,并传递参数。例如call test(10)
quit(q) #退出gdb
bread (b) #设置断点,例如:b 10;在第十行的位置设置一个断点
b 文件名 :行号 #在指定源文件中设置断点,例如:b test.c :10
b fn1 if a > b #条件断点设置
b func #在函数func()的入口处设置断点,如:break cb_button
delete 断点号n #删除第n个断点
disable 断点号n #暂停第n个断点
enable 断点号n #开启第n个断点
clear 行号n #删除第n行的断点
info breakpoints(info b) #显示当前程序的断点设置情况
delete breakpoints #删除所有断点
dir #设置默认源码查找路径。
list(l) #查看源码,如果在本机编译的程序可直接显示源码。编译时需要-g参数
l 行号 #将显示当前文件以“行号”为中心的前后10行代码,如:list 12
l 函数名 #将显示“函数名”所在函数的源代码,如:list main
l #不带参数,将接着上一次 list 命令的,输出下边的内容。
watch #设置内存断点,当内存被改写时终止程序。例如:watch *(int *)0x2b32782a 这说明我们只需要知道内存地址就可以监控它
awatch #设置内存断点,读写都会终止程序。例子同上,awatch i 也可以直接用变量名。
rwatch #设置内存断点,读取会终止程序。例子同上
print(p) #打印变量值,用法和c语言的printf差不多。print &i;打印变量 i 的地址
attch pid #将GDB挂载到正在运行的程序,pid
set #设置内存值
set variable #设置参数值 例:set var g=10;
p func(参数1,参数2) #调用函数func(),打印返回值
参考文档: