gcc hello.c -g -o hello
就会生成待调试信息的hello可执行程序
gdb hello
就会进入调试状态
查看源代码:
l
查看main源代码(L的小写,不是数字1),list的缩写
l [filename:linenum]
查看指定文件的指定行的源代码
继续查看按l
l [filename:func]
查看指定文件的指定函数的源代码
继续查看按l
设置断点:
b [linenum]
第几行打断点,或者break的缩写
b [10] if [i==5]
就是在第十行当i等于5时停下
b [func]
在func函数入口处打断点
del/d [num]
删除断点,del即delete,num通过info break查看,没有[num]表示全部删除,num也可以是一个范围,比如(2,8)
disable [num]
禁用断点,num通过info break查看
enable [num]
启用断点,num通过info break查看
查看值:
i b
查看断点,i即info,b即break,
p a
打印变量a的值,p即print
ptype a
打印a的变量类型
display a
追踪变量a,一般循环里面使用
undisplay [num]
不追踪变量,num通过info display查看
set var i=10
直接从i等于10开始执行,一般用于循环里面
运行程序:
start
启动调试,
只执行一行代码
r
即run,启动调试,执行到第一个断点的位置
quit
退出调试状态
n
即next,执行下一步
c
即continue,执行到下一个断点处
u
即util,跳出单次循环
s
即step,进入函数
finish
跳出当前函数,需要先删除该函数的所有断点del [num]
多进程调试:
set follow-fork-mode parent
跟踪父进程
set follow-fork-mode child
跟踪子进程
附:一定要在fork之前设置才有效