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
对应代码如下:
1 #include "../chklib_lib/chklib.h" 2 #pragma comment(lib,"http://www.cnblogs.com/04.Binary/chklib_lib.lib") 3 4 #include <iostream> 5 #include <process.h> 6 7 using namespace std; 8 9 OLOG_SETTING(OLOG_FILE, "./log.txt"); 10 11 void Function(int a,char b) 12 { 13 FuncTrace; 14 OutputFuncValueTable("Function | a = 0x%X, b = 0x%X", a, b); 15 16 cout<<"In Function"<<endl; //函数执行体 17 } 18 19 void ThreadFunc(void* param) 20 { 21 FuncTrace; 22 for(int i = 0;i < 100;++i) 23 { 24 OutputCyclVarValues(5, 80, 5, "%s i=%d", "Thread Function", i); 25 26 cout<<"in thread"<<endl; //循环执行体 27 } 28 } 29 30 int main() 31 { 32 FuncTrace; 33 OutputDbgLog("%s", "use global log output"); 34 35 Function(6,10); 36 37 _beginthread(ThreadFunc, 0, NULL); 38 39 for(int i = 0;i < 10000;++i) 40 { 41 OutputCyclVarValues(5, 200, 10, "%s i=%d", "Main Function", i); 42 43 cout<<"in main"<<endl; //循环执行体 44 } 45 46 47 system("pause"); 48 return 0; 49 }
chklib不只是一个日志输出系统,还是内存监控利器。
数组越界、函数调用溢出、非法内存读写,都将会被chklib发现并记录。(二期计划)
欢迎关注代码仓库:
svn://114.213.255.162/chklib , everybody read-only 权限。
如在试用中发现重大bug,请及时联系我jinyang.wong@gmail.com