最常用的调试工具是gdb,在此就不多说了,家庭常备。下面主要介绍一些其他的工具,满足一些特殊需要的。
(对于一些工具只是简单介绍功能,如果感兴趣或觉得有用可以查阅相关资料)
ctags:
作用:
为程序中所有函数建立索引,就像书籍总的目录一样。在当前目录创建tags,
文件中每行由函数名,声明该函数的文件和一个可以在文件中查找该函数定义的正则表达式。
cxref:(很有用)
作用:
分析c语言源程序并生成一个交叉引用表。它显示每个符号(变量,#define,函数)都在程序中哪些地方使用过。
它生成一个经过排序的列表,每个符号的定义位置用星号(*)坐标记,。
事例:
cxref *.c *.h
cflow
作用:
打印出一个函数调用库。
prog/gprof:(极其有用)
作用:
当我们试着追踪一个程序的性能问题时一个十分有用的技术就是执行性能测试 (execution profiling)。
通常被特殊的编译器选项以及辅助程序所支持,一个程序的性能显示他在哪里花费时间。
使用:
先要在编译的时候加上-pg选项 (-pg(gprof) -p(prof) )
cc -pg -o myapp myapp.c
运行myapp会生成一个gmon.out文件
这时可以用gprof分析myapp,会在终端显示信息
gprof myapp
为了方便阅读,可以这样使用gprof -b myapp gmon.out | less
选项:
-b 不再输出统计图表中每个字段的详细描述。
-p 只输出函数的调用图(Call graph的那部分信息)。
-q 只输出函数的时间消耗列表。
-e Name 不再输出函数Name 及其子函数的调用图(除非它们有未被限制的其它父函数)。可以给定多个 -e 标志。
一个 -e 标志只能指定一个函数。
-E Name 不再输出函数Name 及其子函数的调用图,此标志类似于 -e 标志,但它在总时间和百分比时间的计算中
排除了由函数Name 及其子函数所用的时间。
-f Name 输出函数Name 及其子函数的调用图。可以指定多个 -f 标志。一个 -f 标志只能指定一个函数。
-F Name 输出函数Name 及其子函数的调用图,它类似于 -f 标志,但它在总时间和百分比时间计算中仅使用所打印的例程的时
间。可以指定多个 -F 标志。一个 -F 标志只能指定一个函数。-F 标志覆盖 -E 标志。
-z 显示使用次数为零的例程(按照调用计数和累积时间计算)
使用注意:
1)一般gprof只能查看用户函数信息。如果想查看库函数的信息,需要在编译是再加入“-lc_p”编译参数代替“-lc”编译参数,这样程序
会链接libc_p.a库,才可以产生库函数的profiling信息。
2) gprof只能在程序正常结束退出之后才能生成程序测评报告,原因是gprof通过在atexit()里注册了一个函数来产生结果信息,任何
非正常退出都不会执行atexit()的动作,所以不会产生gmon.out文件。如果你的程序是一个不会退出的服务程序,那就只有修改代码来
达到目的。如果不想改变程序的运行方式,可以添加一个信号处理函数解决问题(这样对代码修改最少),例如:
static void sighandler( int sig_no )
{
exit(0);
}
signal( SIGUSR1, sighandler );
当使用kill -USR1 pid 后,程序退出,生成gmon.out文件。
链接资料:
http://www.ibm.com/developerworks/cn/linux/l-gnuprof.html
http://hujw0710.blog.163.com/blog/static/8797282200952324755785/
ElectricFence:
作用:
它尝试用linux的虚拟内存机制来保护malloc和free所使用的内存,当它发现内存被破坏时就停止程序的使用。
使用:
编译时要加上-efence选项
gcc myapp.c -o myapp -efence
然后运行程序,如果出现错误就会得到提示,运行gdb会得到更多信息(加上-g)