[TOC]

1、Assert

引用自的函数assert(int expression),当表达式的值为0则返回failed。

2、GDB

gdb是GUN的提供在unix上的调试工具。

安装:sudo apt install gdb

如果是windows,则寻找对应的exe安装即可,同时需要配置环境变量

2.1 使用流程

# 编译,得到executable程序
# -g指令会列出行号、注释信息
gcc -g -o executable one.c two.c other.c
# gdb调试
gdb executable
# 指定某行打断点,或者指定某个函数为断点
break one:17
break main
#运行
run [args]
# 显示待验证的变量值,此后每次停下来都会显示这些变量值
display var1
display var2
# 快进到下一个断点/或者运行到结尾
continue
# 退出
quit

2.2 断点和条件中断

着重说一下断点的标识和查询。

怎么打断点

# 直接在函数上打断点
break 
# 作用在指定行上,如果是多文件,可以使用filename指定特定的源文件
break :line_num
断点信息查询以及断点的删除、禁用等
# 查询全部的断点,显示信息的第一列是每一个断点id
info breakpoints
#删除断点
delete break_id
# 禁用断点
disable break_id
#重启被禁用的断点
enable break_id
#忽略断点times次
#也就意味着,在运行到断点times次以后,断点会再次生效

ignore break_id times

条件中断

条件中断,即满足指定条件才会触发中断的断点,某些时候这非常有用,譬如某些信号量达到预定值才会触发中断,如果Java中的异常中断一样。

# 设置条件断点
break line_num if [expression]

譬如,break swap if m > 100,需要注意只有在断点处m变量生效,该条件才会生效。

对于已经设置的断点可以使用condition指定:

# 给break_id断点设置中断条件
condition break_id [expresion]
# 取消中断条件,只要后面什么条件也不跟即可

condition break_id

2.3 常用的指令

help-帮助指令

run-运行

quit-退出

break-打断点,可以断某个行或者某个函数如`break main`

next-下一行,简写`n`

step-也是下一行,不同于next的是,如果某个行本身引用了函数,则会step into到该函数内部去,简写`s`

finish-跳出当前函数/或者打到下一个断点

continue,下一个断点或者运行到结尾,简写`c`

display-跟踪打印某个变量的值

print-一次打印当前状态下所指定变量的值

detele-删除全部断点

info breakpoint-全部断点信息

clear-清楚断点,clear function,清楚函数断点

until-类似于next,但是在循环中时,它可以一步到位直接到循环结束,而不像next一样执行每一次迭代

list-列出当前行上下的代码,list function列出函数的代码