有一次为了调试ACE的代码打开了ACE_TRACE的开关,除了对蜂拥而出的日志输出有印象外还对ACE的函数进出提示产生了好感。对于后台调试的时候,往往必须使用大量的日志跟踪。而简单的加入函数进出的功能是一个不错的选择。

稍稍看了一下ACE的实现,感觉效果一般,还要自己写跟踪的函数名称。也不是太爽。(ACE估计是苦于大家对C++标准的支持程度)。感觉了一下,其实函数的进出跟踪都可以使用一个结构的构造和析构函数跟踪,而函数的信息完全可以使用各种宏代替。而这些信息可以作为参数传递给这个结构。

GCC实现了如下的函数宏

__func__   C99的标准,但是GCC只输出函数名称。不知道VC.NET 为啥不支持

__FUNCTION__  同__func__,

__PRETTY_FUNCTION__  非标准宏。这个宏比__FUNCTION__功能更强,  若用g++编译C++程序, __FUNCTION__只能输出类的成员名,不会输出类名; 而__PRETTY_FUNCTION__则会以 <return-type>  <class-name>::<member-function-name>(<parameters-list>) 的格式输出成员函数的详悉信息(注: 只会输出parameters-list的形参类型, 而不会输出形参名).若用gcc编译C程序,__PRETTY_FUNCTION__跟__FUNCTION__的功能相同.

而VC.NET提供的函数宏为:

__FUNCTION__ 函数,提供类名和函数名称的输出。

实现代码如下:

//利用一个结构的构造和析构函数进行函数跟踪

struct __zenlib_func_trace_struct

{

public:

//函数名称

const char *func_name_;

//文件名称

const char *file_name_;

//文件的行号,行号是函数体内部的位置,不是函数声明的起始位置,但这又何妨

int         file_line_;

public:

//利用构造函数显示进入函数的输出

__zenlib_func_trace_struct(const char *func_name,const char *file_name,int file_line):

func_name_(func_name),

file_name_(file_name),

file_line_(file_line)

{

ACE_DEBUG((LM_TRACE,"%s entry,File %s|%u /n",func_name_,file_name_,file_line_));

}

//利用析构函数显示进入函数的输出

~__zenlib_func_trace_struct()

{

ACE_DEBUG((LM_TRACE,"%s exit,File %s|%u /n",func_name_,file_name_,file_line_));

}

};

//---------------------------------------------------------------------------------

//ZEN_FUNCTION_TRACE宏用于跟踪函数的进出

//请在函数的开始使用ZEN_FUNCTION_TRACE这个宏,后面必须加分号

#ifndef ZEN_FUNCTION_TRACE

#ifdef WIN32

//这儿定义的是一个结构

#define ZEN_FUNCTION_TRACE        __zenlib_func_trace_struct ____tmp_func_trace_(__FUNCTION__,__FILE__,__LINE__)

//GCC

#else

#define ZEN_FUNCTION_TRACE        __zenlib_func_trace_struct ____tmp_func_trace_(__PRETTY_FUNCTION__,__FILE__,__LINE__)

#endif

#endif //#ifndef ZEN_FUNCTION_TRACE

//ZEN_FILELINE_TRACE用于程序运行到的地方。

#ifdef ZEN_FILELINE_TRACE

#ifdef WIN32

#define ZEN_FILELINE_TRACE        ACE_DEBUG((LM_TRACE,"Goto File %s|%d,function:%s./n",__FILE__,__LINE__,__FUNCTION__));

//GCC

#else

#define ZEN_FILELINE_TRACE        ACE_DEBUG((LM_TRACE,"Goto File %s|%d,function:%s./n",__FILE__,__LINE__,__PRETTY_FUNCTION__));

#endif //#ifndef ZEN_FILELINE_TRACE

#endif

代码的使用如下,只要在函数的开头使用ZEN_FILELINE_TRACE这个宏就可以。

TransactionBase::TRANSACTION_PROCESS MarketBuyItemTrans::OnInit()

{

ZEN_FUNCTION_TRACE;

return NEXT_PROCESS;

}

最后的输出如下:

Feb 12 11:43:59.356 2007@LM_TRACE@int MarketBuyItemTrans::SendBuyItemsRspToClient(int) entry,File market_trans_buy_items.cpp|964

Feb 12 11:43:59.356 2007@LM_DEBUG@Send Rsp To Client: rs_buy_items_.buy_item_num_:1,rs_buy_items_.buy_package_num_:0 .

Feb 12 11:43:59.356 2007@LM_DEBUG@Output AppFrame Head::

Len:108 Framedesc:0x0 Command:8502       Uin:348642895 TransactionID:1          Sendip:0

Rcvsvr:30001|348642895  Sndsvr:5    |1          Proxysvr:0    |0

Feb 12 11:43:59.356 2007@LM_TRACE@int MarketBuyItemTrans::SendBuyItemsRspToClient(int) exit,File market_trans_buy_items.cpp|964

利用小技巧用于跟踪函数的进出过程相关推荐

  1. 20个常用的Python小技巧

    2019 年第 73 篇文章,总第 97 篇文章 原题 | 20 Python Snippets You Should Learn Today 作者 | Chaitanya Baweja 原文 | h ...

  2. cnc数控机床怎么使用计算机,五个数控机床CNC加工中心的编程代码加工小技巧!...

    五个数控机床CNC加工中心的编程代码加工小技巧! CNC加工中心的加工过程中,有一点至关重要,那就是在编制程序和操作加工时,一定要避免使CNC加工中心发生碰撞.因为CNC加工中心的价格非常昂贵,少则几 ...

  3. Widows(win10等等)使用过程中的 问题 与 小技巧 ----- 长期积累

    Widows使用过程中的 问题 与 小技巧 ----- 长期积累 笔者使用的是win10系统,可能较多的针对win10来说的. Windows10操作系统个人觉得挺好用的,主流的主要是win 10和w ...

  4. AD(AltiumDesigner)画图小技巧【一】

    我们在使用AD画图的过程中,灵活的使用一些小技巧可以使我们的工作事半功倍,今天给大家介绍一种在画原理图过程中的小技巧. 我们在画原理图过程中经常会放置网络标号,尤其是很多芯片管脚上,例如现在我需要在这 ...

  5. Excel函数词典(483个函数说明 Excel函数公式Excel小技巧

    Excel函数词典(483个函数说明 Excel函数公式Excel小技巧 函数 类别 属性 新函数 说明 语法 BETADIST 兼容性函数 被替换 BETA.DIST 返回累积 beta 概率密度函 ...

  6. desc excel 公式_Excel小技巧之Power Pivot Generate函数、高级DAX函数与常用筛选器函数...

    一.使用Generate函数创建信息叠加表 [目标:将姓名与月份组合,生成每个月份均有对应姓名对应的表格][基本思路:pivot中创建度量值,利用DAX函数创建链接回表后在EXCEL释放]       ...

  7. python hist函数_虎哥的python小技巧放送之绘制统计图(2)

    先放出第一期让大家回顾一下上次的内容 虎哥的python小技巧放送之绘制统计图(1) 第一期主要给大家讲了一些图形设置的东西.这一次开始正式带大家画图~ 折线图:折线图可以通过matplotlib中的 ...

  8. 效率 用div做表格和tr_表格也能用Word做?别不信,利用这些小技巧分分钟做出完美表格...

    一般我们在说到做表格的时候,很多小伙伴都会想到并选择Excel来制作,但是大家知道吗,其实在Word中也是可以做出非常漂亮的表格的.今天小编将分享几个Word制表小技巧给大家,帮大家轻松完成Word表 ...

  9. python unique函数_每30秒学会一个Python小技巧,GitHub星数4600+

    作者 | xiaoyu,数据爱好者来源 | Python数据科学(ID:PyDataScience)很多学习Python的朋友在项目实战中会遇到不少功能实现上的问题,有些问题并不是很难的问题,或者已经 ...

最新文章

  1. 第一篇:VC连接MySql
  2. java一定时间间隔的定时任务_Java 定时任务---Timer
  3. 【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )
  4. 哪个是更早的时间 date_淘宝用户行为分析(漏斗模型+pv,uv,pv/uv,复购率,用户活跃时间段)...
  5. access后台链接mysql_ASP.NET连接 Access数据库的几种方法
  6. js 字符转换,小驼峰转大写字母开头并且加空格 changeDate -》 Change Date
  7. memmove() -- 拷贝内存内容
  8. 64位linux并行计算大气模型效率优化研究,64位Linux并行计算大气模型效率优化研究...
  9. 服务器漏洞处理_wildfly禁用https和8443端口
  10. cout输出精确小数点
  11. 计算机图形学算法详解,计算机图形学裁剪算法详解
  12. 二十一天学通VC++之创建工作者线程
  13. jmeter的安装和测试
  14. 众信金融8·28开放日:聆听投资人心声
  15. 大写字母转换为小写字母
  16. 密度计算机公式,密度浓度换算公式(浓度和密度的换算关系)
  17. golang的dep和vender
  18. 海康威视错误代码0xf_海康威视错误代码大全
  19. 程序员如何写好简历 一份优秀的程序员简历是什么样的?
  20. 语义分割制作自己的数据集

热门文章

  1. 提供Minimal SD Base Gal/Raf SD基础培养基(含半乳糖/棉子糖)
  2. SCSA❀基础信息安全概述
  3. 研发管理心得,从技术小白做到CTO(研发总监)的辛酸之路
  4. Glide如何加载项目中的图片资源
  5. table数据刷新;v-if刷新el-table表格
  6. LSTM中对time step的理解
  7. android 旋转屏幕 view的调整,Android ViewModel在屏幕旋转时重新创建
  8. 编译原理实验二 自上而下的语法分析器(算术表达式)
  9. Big Faceless Java Pdf报表生成器控件介绍
  10. 2022上半年软考电子证书可以查询拉!