ps:一些gdb命令可简写,如li(list),c(cont)(continue),q(quit),b(break),s(step),n(next),p(print)等
常用调试方法:
gdb 程序文件名 调试一个程序的命令格式(会显示版权说明)
gdb -q
(gdb)file 程序文件名 调试一个程序的命令格式(不会显示版权说明)
list 5,10 显示第5行到第10行的代码
list test.c:5,10 显示源文件test.c中的第5行到第10行的代码,在调试含有多个源文件的程序时使用。
list get_sum 显示get_sum函数周围的代码
list test.c:get_sum 显示源文件test.c中get_sum函数周围的代码,在调试含有多个源文件的程序时使用。
help 列出对应命令帮助信息,+all则列出所有gdb命令的帮助信息
search/forward 字符串 从当前行向后查找第一个匹配的字符串
reverse-search 字符串 从当前行向前查找第一个匹配的字符串
run 运行打开的可执行文件
break 设置断点,支持的形式有break 行号、break 函数名称、break 行号或函数名 if 条件
watch 条件表达式 在程序中设置观测点(与break的三种用法相似)
awatch 条件表达式 在程序中设置观测点,在表达式的值发生改变或表达式的值被读取时,程序暂停执行
clear 行号/函数名 删除设置在指定行号或函数上的断点
delete 断点编号 删除设置的某个断点或观测点
disable 断点编号 使断点失效
enable 断点编号 使断点恢复有效
info 查看和可执行程序相关的各种信息(如:info breakpoints)
print 变量或表达式 打印变量或表达式的值
print 变量=值 对变量进行赋值
//print 表达式@要打印的值的个数 打印以表达式值开始的n个数
whatis 变量名/表达式 查看变量或表达式值的数据类型
set variable 变量=值 给变量赋值(set variable i = 200和print i = 200效果相同)
//ps:set命令还有一些其他的用法,比如可以针对远程调试进行设置,可以用来设置gdb一行的字符数等
//set args 设置调试程序的运行参数
continue 让程序继续运行,直到下一个断点或运行完为止
kill 终止正在调试的程序
next 单步执行程序(相当于VS2010里的F10)
step 进入所调用的函数内部,查看执行情况(相当于VS2010里的F11)
nexti 单步执行一条指令(如 :for(i=0;i<n;i++)要输入4次才能进入下一条语句)
stepi 单步执行一条指令,进入所调用的函数内部,查看执行情况
quit 退出GDB
//ptype 显示数据结构定义情况
//make 编译程序
Num Type Disp End Address What
Num:断点的编号
Type:指明类型,类型为breakpoints说明是中断
Disp:指示中断点在生效一次后是否就失去作用,如果是则为dis,不是则为keep
End:表明当前中断点是否有效,如果是为y,不是则为n
Address:表示中断所处的内存地址
What:列出中断发生在哪个函数的第几行
如果调试int main(int argc, char *argv[]);
......
printf("argc = %d\n", argc);
此类代码主函数需要传参数进去有两种方法:
1.在运行时直接加上参数:
run aa bb cc dd ...2.设置参数 再打断点
set args=aa bb cc dd ...
b 14(行号)