一 linux内置宏
1 __TIME__ 显示当前时间 类型%s
2 __FILE__ 显示当前文件 类型%s
3 __DATE__ 显示当前日期 类型%s
4 __LINE__ 显示当前行数 类型%d
5 __FUNCTION__ 显示当前函数 类型%s
注:“__”是两个下划线
示例代码 demo2.c
#include <stdio.h>
int main(int argc,char **argv)
{
printf("time = %s\n",__TIME__);
printf("file = %s\n",__FILE__);
printf("date = %s\n",__DATE__);
printf("line = %d\n",__LINE__);
printf("func = %s\n",__FUNCTION__);
return 0;
}
结果
二 gdb调试
gdb调试步骤:
1,先把文件编译为可执行文件(如对test.c进行编译:gcc -g -o demo demo2.c);
2,在终端输入gdb 后回车
3,接着输入file test 后回车,之后进入调试过程
4,调试过程,根据需要可对代码进行查看或操作
gdb基本指令:
l 显示源代码
b 设置断点
i 查看信息,如i b查看设置的断点信息
n 执行下条语句
r 运行程序
p 打印变量值,如p sum 打印变量sum的值
q 退出gdb调试
示例代码 demo2.c
#include <stdio.h>
int main(int argc,char **argv)
{
printf("time = %s\n",__TIME__);
printf("file = %s\n",__FILE__);
printf("date = %s\n",__DATE__);
printf("line = %d\n",__LINE__);
printf("func = %s\n",__FUNCTION__);
return 0;
}
gcc -g -o test2 demo2.c
gdb
file test2
l
b 6
r
n
q
三 代码剖析
编译的时候加入-pg选项
gcc -pg demo2.c -o test2
di@ubuntu: ./test2
di@ubuntu: ls
di@ubuntu: test2 gmon.out
gprof test2
注:
其中主要的信息有两个,一个是每个函数执行的时间占程序总时间的百分比,另外一个就是函数被调用的次数。通过这些信息,可以优化核心程序的实现方式来提高效率。
当然这个剖析程序由于它自身特性有一些限制,比较适用于运行时间比较长的程序,因为统计的时间是基于间隔计数这种机制,所以还需要考虑函数执行的相对时间,如果程序执行时间过短,那得到的信息是没有任何参考意义的。
在使用gprof工具的时候,对于一个函数进行gprof方式的剖析,实质上的时间是指除去库函数调用和系统调用之外,纯碎应用部分开发的实际代码运行的时间,也就是说time一项描述的时间值不包括库函数printf、系统调用system等运行的时间。这些实用库函数的程序虽然运行的时候将比最初的程序实用更多的时间,但是对于剖析函数来说并没有影响。