如何在日志中输出调用函数的名字,参数等信息,方便定位问题!

KHacker_001 2012-05-23 10:54:27
代码:

#ifndef CHECKTRUE
#define CHECKTRUE(fun) \
{\
if ((fun) == false)\
{\
LogFile("false=%s\r\n",#fun); \
assert(0);\
}\
else\
{\
LogFile("false=%s\r\n",#fun); \
}\
\
}
#endif

#ifndef PRINT_GAMELIB_CALL_INFO
#define PRINT_GAMELIB_CALL_INFO(fun) \
{\
LogFile("%s\r\n",#fun); \
}
#endif

void Test(int a, int y)
{
;
}
bool TestBool(int a,const char * p)
{
return true;
}
char *p = "----------------------";
int a = 5;
int b = a;
int c = 6;
int _tmain(int argc, _TCHAR* argv[])
{
PRINT_GAMELIB_CALL_INFO(Test(a,b));
CHECKTRUE(TestBool(5,p));
getchar();
return 0;
}
输出:
[2012-05-23 10:46:37.736]开始记录本次LOG!
[2012-05-23 10:46:37.799]Test(a,b)
[2012-05-23 10:46:37.799]false=TestBool(5,p)

我先在日志中显示具体的a的值,b的值,还有字符串p的值?
请问各位大侠,有可能做到吗?
...全文
412 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-05-23
  • 打赏
  • 举报
回复
没法实现.
prohibit 2012-05-23
  • 打赏
  • 举报
回复
常用下面这个,根据需要可以自己封装一下
#ifndef __FUNC__
#define __FUNC__ __PRETTY_FUNCTION__
#endif
...
cout << "FILE: " << __FILE__ << ", " << "FUNC: " << __FUNC__ << ", "
<< "LINE: " << __LINE__ << endl;
cout << " MSG: " << msg << endl;
...
帅得不敢出门 2012-05-23
  • 打赏
  • 举报
回复
在原有的宏上做应该不行了,
#fun 把你转入的函数原型转成字符串了, 已经不能再依赖#fun来打印出真正的参数值。

你必须额外再添加些代码,打印参数
KHacker_001 2012-05-23
  • 打赏
  • 举报
回复
#ifndef PRINT_GAMELIB_CALL_FUN
#define PRINT_GAMELIB_CALL_FUN(fun,pFormat,...) \
{\
LogFile("%s%s",#fun,OutPutGamelibCallInfo(pFormat,__VA_ARGS__).c_str()); \
}
#endif
我能判断出fun的返回值类型吗?
Saleayas 2012-05-23
  • 打赏
  • 举报
回复
查看 DbgHelp Functions
赵4老师 2012-05-23
  • 打赏
  • 举报
回复
Windows
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

Linux
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈
KHacker_001 2012-05-23
  • 打赏
  • 举报
回复
PRINT_GAMELIB_CALL_FUN(TestBool(a,p),"%d%s",56,"fdasf");

#ifndef PRINT_GAMELIB_CALL_FUN
#define PRINT_GAMELIB_CALL_FUN(fun,pFormat,...) \
{\
LogFile("%s%s",#fun,OutPutGamelibCallInfo(pFormat,__VA_ARGS__).c_str()); \
}
#endif

std::string OutPutGamelibCallInfo(char *pFormat,...)
{
std::string rRet = "";
char szBuf[128] ={0};
const char *p, *sval;
double dval;
int iVal;
va_list ap;
va_start(ap, pFormat);
for(p = pFormat; *p; p++)
{
if(*p != '%')
{
continue;
}
switch(*++p)
{
case 'd':
iVal = va_arg(ap, int);
NB2STRING(szBuf,iVal);
rRet += (std::string)szBuf;
break;
case 'f':
dval = va_arg(ap, double);
FNB2STRING(szBuf,dval);
rRet += (std::string)szBuf;
break;
case 's':
sval = va_arg(ap,char*);
rRet += (std::string)sval;
break;
default:
break;
}
}
return rRet;
}

用可变参数可以吗?
只是看起来比较2b

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧