在使用gdb调试器之前,必须在编译程序时加上-g选项。
gcc -o build -g test.c
gdb
file build
list
run aaaaaaaaa bbbbbbbbbb
list 1
break 10
run
quit
1、列出源程序 list
不带参数:list
带一个参数:list <line-number>
带两个参数:list <line1, line2>,line1为显示的起始行,line2为结束行。例,“list 2, 6”
======================================================
2、运行程序 run
run <arg1 arg2 ...>。例,“run aaaaaaaaaa bbbbbbbbb”
"show args" "set args bbbbbbbbb aaaaaaaa"
****************************************************************************************
3、操作断点 break
在源程序中指定的行上设置断点:break <line-number>。通常要和list命令联合使用。
在指定的函数前设置断点:break <function-name>
使用表达式设置断点:break <line-number> if <conditional expression>。用于 当需要知道一个for循环体第n次执行时各变量的值,并在此时使用断点功能使程序暂停运行。<line-number>为设置断点的行号,也可以是函数名。
在指定例程的入口处设置断点:break <filename: line-number> 或 break <filename: function-name>。用于 当程序是由很多源文件构成,则可以在各个源文件中设置断点。
显示当前gdb断点信息:info break
删除指定的断点:delete breakpoint <point-number>。经常与“info break”命令搭配使用。
禁止或启用断点:enable breakpoint <point-number>;disable breakpoint <point-number>。
清除断点:clear,删除程序上次停止处的断点;clear <number>,删除源文件指定行上设置的所有断点。
观察点:watch <condition>。观察点的用法与断点很相似,所有操作breakpoint的命令对watchpoint都适用。但区别在于,断点是在CPU到某一地址取指令时中断,而观察点是在CPU到某一地址读写数据时中断。例:
break 7 // 使用break命令设置断点
watch i==3 // 设置观察点表达式为i==3
delete breakpoint 1 // 删除断点1
continue // 继续运行程序
设置断点实例:
// <1> 编译程序并生成调试信息
gcc -o build -g test.c
// <2> 执行程序
./build
// <3> 使用gdb调试程序
gdb build
// 或
gdb
file build
// <4> 使用run命令运行程序
run
// <5> 使用list命令列出源程序
list
// <6> 使用break命令设置断点
break 18
// <7> 输入run命令运行程序
run 或 run argv[1] ...
// <8> 使用watch命令设置观察点
watch mystr[len-i]
// <9> 使用next命令来一步步地执行for循环
next
// <10> contiune循环继续执行下去,根据已经设置好的观察点,找出问题所在
// <11> 在gdb下使用shell命令,利用vim修改源文件
shell vi test.c
// <12> 使用shell命令重新编译源文件
shell gcc -g test.c -o build
// <14> 运行程序
run
##############################################################
4、查看运行时数据 print
print <varable-name>
在gdb中,可以随时查看全局变量(所有文件可见的)、静态全局变量(当前文件可见的)和局部变量(当前Scope可见的)这3种变量的值。如果希望查看全局变量的值或位于其他文件或其他函数的变量值时,可以使用“::”操作符。
print <file::variable>
print <function::variable>。 例,print 'f2.c'::sum::x
对程序中函数的调用:print func(arg1, arg2, ...)。 例,print func(5)
查看表达式的值:print <expression>。例,print a-b
查看数组的值:print <array-name>。例,print a。有时,需要查看一段连续的内存空间的值,如数组的一段,或是动态分配数据的大小。可以使用gdb的@操作符,@的左边是第一个内存的地址的值,@的右边则是需要查看内存的长度。例,程序中有下列一行代码:int *array = (int *)malloc(len * sizeof(int)); 在gdb调试过程中,可以用如下命令显示这个动态数组的取值:p *array@len
变量的输出格式:gdb会根据变量的类型输出变量的值,但也可以自定义gdb的输出格式。例,"break 10" "print/x i"十六进制x
查看内存:examine /nfu <address>。例,从内存地址0x54320读取内容 examine/3uh 0x54320
自动显示变量:display /fmt expr。例,"break 10" "run" "display/x i"十六进制格式x "step"执行下一步(逐行运行代码)
查看所有的局部变量:info locals
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5、改变程序的执行
修改变量的值:print <expr> 或 set <expr>
跳转执行:jump <location>
信号的产生及处理
强制调用函数
强制函数返回
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
6、gdb高级应用
产生core文件
跟踪栈上数据
绑定运行进程
源文件搜索
机器语言工具:$ip 程序当前运行的指令地址; $pc 程序计数器; $fp 帧指针(当前堆栈帧); $sp 栈指针; $ps 处理器状态
其他调试命令:pwd、cd、quit、shell、show language、info frame 查看当前函数的程序语言、info source 查看当前文件的程序语言