【发布时间】:2015-03-12 00:40:27
【问题描述】:
我正在为用 C 语言编写的自动化系统开发一些模块,我需要使用硬件执行大量工作。而且我认为没有简单的方法(如传统方法)来调试事物而不是跟踪日志。所以我正在寻找一种记录函数调用的好习惯。至少是调用顺序和返回值。
它在应用程序中的执行方式非常简单,实际上用不相关的结构污染了代码,例如
int function (int param){
if(trace_level & LOG_FCALLS){
writelog("Entering function()");
}
/* something useful */
if(trace_level & LOG_FCALLS){
writelog("Exit from function()=%d", ret);
}
}
我决定使用一个宏来完成所有的脏活。现在看起来像这样
#define LOG_E(fn) const char *__fname=fn; printf("LOG: Entry to %s\n",__fname)
#define return(ret) printf("LOG: Exit from %s()=%d\n",__fname,ret)
int testFunc(){
LOG_E("testFunc");
/*do useful things */
return(ret);
}
我发现这段代码有问题
我正在重写 return 语句,它需要一直写
return(ret)而不是return ret。这个问题很容易忘记。我正在宏中定义字符串变量。我知道 C99 中存在
__func__宏,但不幸的是,我的编译器不支持此宏或任何其他相关宏。如何记录函数参数的值?
我很确定这不是一个新问题,我也不是第一个遇到它的人。我也知道 AOP 的事情,但是代码检测对于我的系统来说不是可接受的解决方案,而且我还没有发现用我的编译器来做这件事的任何可能性。
所以我正在寻找如何以最优雅的方式实现跟踪的好主意。
我的环境: 旧代码、C、Watcom 10.x、实时操作系统
【问题讨论】:
-
你实际上根本没有回来的事实呢?即您的
return (ret)被宏吃掉并变成了printf然后该函数没有要执行的返回语句。你没有在宏中返回。 -
Watcom C 支持
__FUNCTION__宏。 -
以防万一您通过
#ifdef测试了__func__的存在:它不是一个宏,而是一个静态数组(就像它在一个开头用static cosnt char __func__[] = "...";声明一样函数)。 -
@ArhujShankar 是的,你是对的。应该有return语句
-
@user4419802 是的,至少谷歌是这么说的。但是在版本 11 中,我有 10.6
标签: c debugging design-patterns trace