前言
在程序运行中,为了了解程序的性能或者定位问题,我们需要了解程序的动态运行情况,也就是了解程序的一些关键变量的值是多少。但是程序运行起来,不方便去操作程序,那就要求我们在程序中添加好打印代码,程序运行中能不断的打印关键变量的值。但是要打印的关键变量可能不在一个源文件里,并且打印不能刷屏,导致打印太多,覆盖掉有用信息。
实现思路:
1.首先我们需要创建一个线程,该线程的作用就是定时调用注册的函数;
2.在每一个.c源文件里,写一个统计函数,该函数就是统计关键字的信息并打印;
3.编写函数注册的函数,需要打印的统计函数,就调用一下注册函数,将该统计函数注册一下;
4.将第二步的统计函数,注册到第一步创建的线程里,让线程每隔一段时间就去调用。
实现代码:logonPrintf.c
本源文件就是按照上面的思路实现,里面包括注册函数功能的函数和打印统计函数的线程。需要注册的打印函数就通过DebugLogon()函数注册,但是本源文件只是便于理解实现思路,并没有去实际编译运行过,如果有需要的小伙伴请自己调试,主体部分代码都编写完成,稍加调试就可以使用。
#include <stdio.h>
typedef struct LogPrintFun
{
int enable; //使能,1:允许;0:禁止
void* args; //函数的传参
int (*statFun)(void* args); //函数指针
} LogPrintFun;
typedef struct debugInfo
{
int runStatus; //线程的运行状态
int cnt; //注册函数的个数
LogPrintFun logFun[10]; //保存注册函数的信息
} debugInfo;
//静态全局变量
static debugInfo gDebugLog;
//注册函数:调用此函数注册
int DebugLogon(int (*statFun)(void* args), void *arg, int enAble)
{
debugInfo* pObj = &gDebugLog;
LogPrintFun* pFunList = pObj->logFun;
//注册函数个数已经达到上限
if(pObj->cnt >= 10)
{
printf("[DebugLogon] The limit has been reached\n");
return -1;
}
else
{
pFunList[pObj->cnt].enable = arg;
pFunList[pObj->cnt].args = enAble;
pFunList[pObj->cnt].statFun = statFun;
pObj->cnt++;
}
return 0;
}
//打印统计函数的线程函数
static int logThread(void * arg)
{
debugInfo* pObj = &gDebugLog;
LogPrintFun* pFunList = pObj->logFun;
int i = 0;
while (1)
{
//可以有一个变量来控制线程是否运行
if(pObj->runStatus == -1)
{
sleep(1);
continue;
}
else
{
//打印注册的函数
for(i = 0; i < pObj->cnt; i++)
{
if(pFunList->enable)
{
pFunList->statFun(pFunList->args);
}
pFunList++;
}
sleep(1);
}
}
}