printf 打印 文件名 函数名 行号

输出源文件的标题,目前执行行的行数,编译的日期,编译的时间。

Linux下实现

#include <stdio.h> 

int main()

{

    printf("当前代码行:%d\n", __LINE__); 

    printf("当前源代码文件名:%s\n", __FILE__); 

    printf("当前文件编译的日期%s\n", __DATE__); 

    printf("当前文件编译的时间%s\n", __TIME__); 

    return 0;

}



Windows下实现

#include <stdio.h> 

int main()

{

    printf("当前代码的行数:%d\n", __LINE__);

     printf("当前源文件的文件名:%s\n", __FILE__);

     printf("当前源文件的编译日期:%s\n", __DATE__);

     printf("当前源文件的编译时间:%s\n", __TIME__);

     printf("当前源文件的编译的具体时间:%s\n", __TIMESTAMP__);

     return 0;

}

上面用Linux和Windows两种环境进行了测试,他们的函数还是有区别的,例如Wingdows下有 __TIMESTAMP__这个变量,而Linux下没有。还有__FILE__这个变量在Linux下的运行结果直接是文件名,而Windows下这个变量的结果为其具体的路径。

以上的这两个例子我觉得主要运用在对源文件的调试中,如果用户的程序在执行过程中出错,可以将这些出错信息通过E-mail发送给程序员,程序员能够迅速的定位代码的出错位置。

使用宏

__FILE__               文件名

__LINE__               行号

__FUNCTION__      函数名

即可。


#define debug_msg(fmt,...) printf("%s[%d]:"fmt,__FILE__,__LINE__,##__VA_ARGS__)

#define printf_my(fmt, ...) printf("%s %s %s %s %d:"fmt, __FILE__, __FUNCTION__, __DATE__, __TIME__, __LINE__, ##__VA_ARGS__)


int printf_my(const char *fmt, ...)

{

    #ifdef DEBUG

printf("%s %s %s %s %d:"fmt, __FILE__, __FUNCTION__, __DATE__, __TIME__, __LINE__, ##__VA_ARGS__)

#endif

}

#include "stdarg.h"
int my_printf (const char *format, ...)
{
 va_list arg;
 int done;
 
 va_start (arg, format);
 done = vprintf (format, arg); 
 va_end (arg);
 return done;
}

//引用头文件

debug.h

#ifndef __DEBUG__H_

#define __DEBUG__H_



#include <stdio.h>


#define DEBUG


#ifdef DEBUG

#define printf_debug(fmt, ...) printf("%s %s %s %s %d:"fmt, __FILE__, 

__FUNCTION__, __DATE__, __TIME__, __LINE__, ##__VA_ARGS__)

#else

#define printf_debug(fmt, ...)

#endif




#endif



  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Coreutils 软件包包括一整套基本的 shell 工具。 basename 去掉文件名中的目录和后缀 cat 把文本文件的内容发送到标准输出 chgrp 改变文件和目录属组,属组可以使用组或者组识别号表示 chmod 改变文件和目录的权限,权限可以使用符号或者八进制两种表达方式 chown 改变文件和目录的所有权(包括用户和/或组) chroot 使用特定的目录作为执行某个命令或者交互 shell 的根目录(/)。在多数系统中,只有 root 用户能运行这个命令 cksum 输出指定的每个文件的CRC(循环冗余校验)校验和与字节数 comm 一行一行对两个已经排序的文件进行比较,在第三列中显示同一行是否相同 cp 复制文件 csplit 把一个文件按照给定的模式或者行号分成几块 cut 从指定的文件中提取特定的列送到标准输出 date 以特定的格式显示当前时间,或者设置系统日期 dd 以可选块长度复制文件,默认情况下从标准输入设备输出到标准输出设备。复制过程中,还可以对文件进行一些转换。 df 显示参数中的文件所在分区磁盘空间的使用情况,如果没有给出文件参数就显示所有已经安装的文件系统的可用空间数量。 dir 同 ls dircolors 设置 LS_COLOR 环境变量(用来改变 ls 及相关工具默认颜色组合)。 dirname 显示从文件名去掉非目录后缀之后的内容 du 显示参数使用的磁盘空间的数量,对于参数为目录还会列出每个子目录磁盘空间占用情况。 echo 显示给定字符串或变量值 env 在一个被修改的环境中运行一个程序 expand 把 tab 转换为空格符 expr 执行表达式计算 factor 输出所有指定整数的质因数 false 返回一个不成功或者逻辑假的结果 fmt 重新格式化指定文件的段落 fold 断开指定文件(默认是标准输入)较长的行,在屏幕上显示。 groups 显示一个用户所在的组 head 显示每个指定文件的前几行(默认是10)。 hostid 以16进制方式,显示当前主机的数字标志符。 hostname 显示或设置主机 id 显示某个用户或者当前用户的真实和有效的 UID、GID 。 install 复制文件,设置它们的权限,如果可能还设置拥有它们的用户和组 join 合并两个文件的行 link 创建从指定文件到指定称的硬链接 ln 创建文件之间的硬/软(符号)连接 logname 显示当前用户的登录 ls 列出指定目录的所有内容。缺省是将文件和子目录按字母顺序排列。 md5sum 显示或者校验 MD5 校验码。 mkdir 建立目录,使用给定的参数作为目录。 mkfifo 以给定的参数作为字建立FIFO(又叫"命管道")文件。 mknod 使用给出的文件名,建立一个设备节点,也就是:FIFO、字符特殊文件(special file)或者块特殊文件(special file)。 mv 根据所给参数的不同,把文件或者目录移动到另外的目录或者将其改 nice 修改某个进程的调度优先级 nl 把每个指定文件的内容写到标准输出,在每行加上行号 nohup 使某个命令不被挂起,并将输出重定向到一个日志文件。 od 以数字方式显示指定文件的内容,默认为八进制。 paste 将字段连接在一起,在字段之间自动插入分割符,默认的分割符是 Tab 。 pathchk 检查文件名是否是有效的或者是可移植的 pinky 一个轻量级的 finger 客户端,用来得到某个用户的信息。 pr 将文件分成适当大小的页送到打印机 printenv 显示环境变量 printf 根据给定的参数格式化输出数据,与 C 语言中的该函数相似。 ptx 为指定的文件提供一个排序索引 pwd 显示当前工作目录 readlink 显示指定符号链接的值 rm 删除文件或者目录 rmdir 删除目录(目录必需为空) seq 以指定的步长输出一个数列 sha1sum 显示或校验 160 位的 SHA1 校验码 shred 安全删除一个文件,重写其占用的磁盘空间,使其无法恢复。 sleep 延迟一段时间 sort 对文件进行排序 split 把文件分成固定大小(字节或行数)的片断 stat 显示文件或者文件系统的状态 stty 改变和显示终端行的设置 sum 显示指定文件的校验和及块数 sync 刷新文件系统缓冲区,使磁盘和内存的数据同步。 tac 逆向显示指定的文
google-perftools 简介 google-perftools 是一款针对 C/C++ 程序的性能分析工具,它是一个遵守 BSD 协议的开源项目。使用该工具可以对 CPU 时间片、内存等系统资源的分配和使用进行分析,本文将重点介绍如何进行 CPU 时间片的剖析。 google-perftools 对一个程序的 CPU 性能剖析包括以下几个步骤。 1. 编译目标程序,加入对 google-perftools 库的依赖。 2. 运行目标程序,并用某种方式启动 / 终止剖析函数并产生剖析结果。 3. 运行剖结果转换工具,将不可读的结果数据转化成某种格式的文档(例如 pdf,txt,gv 等)。 安装 您可以在 google-perftools 的网站 (http://code.google.com/p/google-perftools/downloads/list) 上下载最新版的安装包。为完成步骤 3 的工作,您还需要一个将剖析结果转化为程序员可读文档的工具,例如 gv(http://www.gnu.org/software/gv/)。 编译与运行 您需要在原有的编译选项中加入对 libprofiler.so 的引用,这样在目标程序运行时会加载工具的动态库。例如本例中作者的系统中,libprofiler.so 安装在"/usr/lib"目录下,所以需要在 makefile 文件中的编译选项加入“-L/usr/lib -lprofiler”。 google-perftools 需要在目标代码的开始和结尾点分别调用剖析模块的启动和终止函数,这样在目标程序运行时就可以对这段时间内程序实际占用的 CPU 时间片进行统计和分析。工具的启动和终止可以采用以下两种方式。 a. 使用调试工具 gdb 在程序中手动运行性能工具的启动 / 终止函数。 gdb 是 Linux 上广泛使用的调试工具,它提供了强大的命令行功能,使我们可以在程序运行时插入断点并在断点处执行其他函数。具体的文档请参照 http://www.gnu.org/software/gdb/,本文中将只对用到的几个基本功能进行简单介绍。使用以下几个功能就可以满足我们性能调试的基本需求,具体使用请参见下文示例。 命令 功能 ctrl+c 暂停程序的运行 c 继续程序的运行 b 添加函数断点(参数可以是源代码中的行号或者一个函数) p 打印某个量的值或者执行一个函数调用 b. 在目标代码中直接加入性能工具函数的调用,该方法就是在程序代码中直接加入调试函数的调用。 两种方式都需要对目标程序重新编译,加入对性能工具的库依赖。对于前者,他的好处是使用比较灵活,但工具的启动和终止依赖于程序员的手动操作,常常需要一些暂停函数(比如休眠 sleep)的支持才能达到控制程序的目的,因此精度可能受到影响。对于后者,它需要对目标代码的进行修改,需要处理函数声明等问题,但得到的结果精度较高,缺点是每次重新设置启动点都需要重新编译,灵活度不高,读者可以根据自己的实际需求采用有效的方式。 示例详解 该程序是一个简单的例子,文中有两处耗时的无用操作,并且二者间有一定的调用关系。 清单 1. 示例程序 void consumeSomeCPUTime1(int input){ int i = 0; input++; while(i++ < 10000){ i--; i++; i--; i++; } }; void consumeSomeCPUTime2(int input){ input++; consumeSomeCPUTime1(input); int i = 0; while(i++ < 10000){ i--; i++; i--; i++; } }; int stupidComputing(int a, int b){ int i = 0; while( i++ < 10000){ consumeSomeCPUTime1(i); } int j = 0; while(j++ < 5000){ consumeSomeCPUTime2(j); } return a+b; }; int smartComputing(int a, int b){ return a+b; }; void main(){ int i = 0; printf("reached the start point of performance bottle neck\n"); sleep(5); //ProfilerStart("CPUProfile"); while( i++ MyProfile.pdf 转换后产生的结果文档如下图。图中的数字和框体的大小代表了的某个函数的运行时间占整个剖析时间的比例。由代码的逻辑可知,stupidComputing,stupidComputing2 都是费时操作并且它们和 consumeSomeCPUTime 存在着一定的调用关系。 图 1. 剖析结果 结束语 本文介绍了一个 Linux 平台上的性能剖析工具 google-perftools,并结合实例向读者展示了如何使用该工具配置、使用及分析性能瓶颈。
本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 chmod命令的其他例子 6 1.4.5 可以选择使用符号模式或绝对模式 7 1.5 目录 7 1.6 suid/guid 7 1.6.1 为什么要使用suid/guid 8 1.6.2 设置suid/guid的例子 8 1.7 chown和chgrp 9 1.7.1 chown举例 9 1.7.2 chgrp举例 9 1.7.3 找出你所属于的用户组 9 1.7.4 找出其他用户所属于的组 10 1.8 umask 10 1.8.1 如何计算umask值 10 1.8.2 常用的umask值 11 1.9 符号链接 12 1.9.1 使用软链接来保存文件的多个映像 12 1.9.2 符号链接举例 12 1.10 小结 13 第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新或旧的文件 17 2.1.8 使用type选项 17 2.1.9 使用size选项 18 2.1.10 使用depth选项 18 2.1.11 使用mount选项 18 2.1.12 使用cpio选项 18 2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 23 3.1.4 创建一个新的crontab文件 24 3.1.5 列出crontab文件 24 3.1.6 编辑crontab文件 24 3.1.7 删除crontab文件 25 3.1.8 恢复丢失的crontab文件 25 3.2 at命令 25 3.2.1 使用at命令提交命令或脚本 26 3.2.2 列出所提交的作业 27 3.2.3 清除一个作业 27 3.3 &命令 27 3.3.1 向后台提交命令 28 3.3.2 用ps命令查看进程 28 3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 tee 39 5.6 标准输入、输出和错误 40 5.6.1 标准输入 40 5.6.2 标准输出 40 5.6.3 标准错误 40 5.7 文件重定向 40 5.7.1 重定向标准输出 41 5.7.2 重定向标准输入 42 5.7.3 重定向标准错误 42 5.8 结合使用标准输出和标准错误 43 5.9 合并标准输出和标准错误 43 5.10 exec 44 5.11 使用文件描述符 44 5.12 小结 45 第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 50 7.3 在行尾以$匹配字符串或字符 5

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值