本文主要介绍了几个比较有用的调试工具或工具
1 取样法
用C语言的预编译器有选择的加上取样代码
而后我们只需要编译时加上-DDEBUG这个选项就能启动这些内容
上面这种情况为我们提供了更加复杂的格式,在这种情况下我们必须总是定义DEBUG的值如 :-DDEBUG=1我们就启动了BASIC——DEBUG的内容
下面是我们在可以在这些预编译器可以使用的一些变量
然后是gdb的使用,gdb是个很强大的工具
你可以通过 gdb test(待调试的程序名)
通过输入help能查看gdb的使用
gdb运行程序时会在发生错误的地方停下来
我们可以通过命令backtrace来查看我们是如何到达这个地方的(栈追踪)
print用来查询变量,结果会保持在$!,$2......这些临时变量中,其中最后一个变量一般为$,倒数第二个为$$
list用来列出一个行号附近的所有代码
break 用来设置断点
cont用于继续执行
display使得到达断点时不会停止而只是输出内容但是不会停止
commands由用于指定到达断点时要执行的命令
i
disable用来禁用断点和display命令
如: dilsable break 1
command 可以用来打补丁 ,也就是用来执行某些代码 使得错误被改正
ctags 用来输出每个函数的信息,包括:函数名,位于哪个文件,可以在这个文件找到他的正则表达式
cflows输出一个函数调用树(加-i反向输出)
在调试时加上-p或者-pg能产生执行存档
断言asser这个好像就是对表达式进行求值,如果为非零就会在标准错误里写入一些错误信息,要注意的是如果已经定义了NDEBUG宏就不要再定义assert了
ElectricFence和valgrindf两个都是用来调试内存的
ElectricFence是对函数库libefence.a的连接,会将所有malloc和与之相关的函数全部变为虚拟内存机制的版本
而如果要检查内存泄露一定要用的是valgrind
用法例子
valgrind --leak-check=yes -v ../check