您的位置:首页 > 编程语言 > C语言/C++

chklib0.2 release notes——windows平台的c++日志系统

2012-09-23 20:17 411 查看
chklib是一个用C++编写的Windows平台的日志系统,提供给c++ developer日志调试的功能。

程序员在调试程序时,可用该库输出相关信息,辅助调试。

对于界面编程中,调试程序不可能做到频繁的下断点、弹MessageBox来打断界面运行。

在上下文切换后,有些断点是不会被命中的。难道马上就开虚拟机,remote debug?

对于有一定规模的数据处理,在一个循环中,我们不可能重复让循环中断,看内存,再运行,再中断,再看内存。一个20次的循环足够让人手抖了。

其实只要在写代码时,加入一套日志系统,将函数调用堆栈、一些关注的变量值、循环中的一些判断条件输出到一个文本文件、控制台、或者windows log中。而开销,只是在你函数体头部、循环体头部加一句不超过10个字母的代码而已。

0.2版本更新如下:

将当前执行体所在进程、线程ID输出到每一条打印的log中。多进程、多线程调试不发愁!

增加循环体监视功能。在一个大循环中,指定从第几次循环到第几次循环,每个几次循环打印一条log。log内容可以包括循环次数、循环中变量的值。调试大循环中的内存溢出不用怕!

每次启动日志系统,都会提前打印当前时间,方便与上一次调试区分!

0.1版本中的一些逻辑错误已得到修正

部分代码重构

----------------------------------------------------------------------------------------------------------------------------------

0.1版本更新如下:

1.可选择日志信息(log)的输出方式:Console控制台输出、Win Log输出, 文件输出;

2.全局参数配置:日志输出方式、输出文件位置。

3.跟踪函数调用情况,快速跟踪函数调用错误:任意函数调用时,函数调用开始输出函数进入信息,调用结束输出函数退出信息。

4.输出函数参数表。

一个简单的包含循环、多线程、有自定义函数调用的代码的调试信息输出样例(因网络排版原因,可能会略显混乱,但是在实际生成的文件中,是相当规整的):

[ProcessID:0x00000EF8 | ThreadID:0x00000984] --------------------------------------------------------------
[ProcessID:0x00000EF8 | ThreadID:0x00000984] [2012-9-23 20:08:36]
[ProcessID:0x00000EF8 | ThreadID:0x00000984] --------------------------------------------------------------
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Enter->main
[ProcessID:0x00000EF8 | ThreadID:0x00000984] use global log output
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Enter-->Function
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Function | a = 0x6, b = 0xA
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Leave-->Function
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Enter-->ThreadFunc
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=5
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=5
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=15
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=10
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=15
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=20
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=25
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=25
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=30
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=35
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=40
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=35
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=45
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=50
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=45
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=55
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=55
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=65
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=75
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=60
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=65
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=70
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Thread Function i=75
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=85
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=95
[ProcessID:0x00000EF8 | ThreadID:0x000016D4] Leave-->ThreadFunc
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=105
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=115
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=125
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=135
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=145
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=155
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=165
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=175
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=185
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Main Function i=195
[ProcessID:0x00000EF8 | ThreadID:0x00000984] Leave->main

对应代码如下:

#include "../chklib_lib/chklib.h"
#pragma comment(lib,"http://www.cnblogs.com/04.Binary/chklib_lib.lib")

#include <iostream>
#include <process.h>

using namespace std;

OLOG_SETTING(OLOG_FILE, "./log.txt");

void Function(int a,char b)
{
FuncTrace;
OutputFuncValueTable("Function | a = 0x%X, b = 0x%X", a, b);

cout<<"In Function"<<endl; //函数执行体
}

void ThreadFunc(void* param)
{
FuncTrace;
for(int i = 0;i < 100;++i)
{
OutputCyclVarValues(5, 80, 5, "%s i=%d", "Thread Function", i);

cout<<"in thread"<<endl; //循环执行体
}
}

int main()
{
FuncTrace;
OutputDbgLog("%s", "use global log output");

Function(6,10);

_beginthread(ThreadFunc, 0, NULL);

for(int i = 0;i < 10000;++i)
{
OutputCyclVarValues(5, 200, 10, "%s i=%d", "Main Function", i);

cout<<"in main"<<endl; //循环执行体
}

system("pause");
return 0;
}


chklib不只是一个日志输出系统,还是内存监控利器。

数组越界、函数调用溢出、非法内存读写,都将会被chklib发现并记录。(二期计划)

欢迎关注代码仓库:

svn://114.213.255.162/chklib , everybody read-only 权限。

如在试用中发现重大bug,请及时联系我jinyang.wong@gmail.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐