调试工具:
gdb
splint(lint)
cxref
cflow
gprof(prof)
程序调试的五个阶段:
测试
固化
定位
纠正
验证
1.C语言定义的预处理器可以用来调试:
_LINE_
_FILE_
_DATE_
_TIME_
2.用库函数断言调试:
如果假设不成立就停止程序运行
#include<assert.h>
voidassert(initexpression)
expression表达式的值不为0,就发送错误信息,调用abort结束程序。
#defineNDEBUG //定义这个宏可以关闭断言
###################################################################
3.Gnu的调试器gdb:
要想用gdb进行调试,需要在gcc进行编译时指定为可调式:
gcc -g 指定程序在编译时包含调试信息,才能使用gdb。
gdb -options executable-file
strip filename 调试完后删除调试信息
进入gdb后可使用的gdb命令:
gdb:进入gdb
help:查看gdb命令的分类
help $commands_of_classes:查看同类命令
help $command:查看命令详细信息
quit:退出gdb
------------------------------------------------------
list number 显示number行附近的内容
list main 显示main函数附近的行
list 从上次显示结束位置开始再次显示listsize行
showlistsize 查看默认list命令显示的行数listsize
search string 在源代码中查找字符串
break number 在number行设置断点
breakmain 在main函数开始运行时停止
breakfilename:number 在文件filename的number行设置断点
clearmain 删除main函数上的断点
clearnumber 删除number行上的断点
clearfilename:number 删除filename文件中的number行的断点
info breakpoints 查看断点信息
watch var 设置监视点,当var变量值改变后,gdb停止
catch function 程序调用function函数gdb停止
run args 运行待调试的程序,传递参数
run arg1 arg2 给程序传递参数运行
continue继续运行停止的程序
next单条语句执行
finish 退出函数
printvar 查看变量
start args 开始运行函数到main这里停止,传递参数。
step 单步调试
###################################################################
4.内存调试
unix和linux程序运行失败时,会产生一个核心转储(core dump),保存在core文件中,这个文件是程序的内存映像文件。
段错误(segmentationfault)是内存的错误。
electricFence函数库:
可以发现隐含的内存错误
gcc -o myapp -lefence
gdb myapp
valgrind工具:
可以发现内存泄漏和下标越界
valgrind --leak-check=yes -v ./myapp
未完待续......