chklib是一个用C++编写的Windows平台的日志系统,提供给c++ developer日志调试的功能。

  • 程序员在调试程序时,可用该库输出相关信息,辅助调试。
  • 对于界面编程中,调试程序不可能做到频繁的下断点、弹MessageBox来打断界面运行。
  • 在上下文切换后,有些断点是不会被命中的。难道马上就开虚拟机,remote debug?
  • 对于有一定规模的数据处理,在一个循环中,我们不可能重复让循环中断,看内存,再运行,再中断,再看内存。一个20次的循环足够让人手抖了。

 

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

 

0.2版本更新如下:

  1. 将当前执行体所在进程、线程ID输出到每一条打印的log中。多进程、多线程调试不发愁!
  2. 增加循环体监视功能。在一个大循环中,指定从第几次循环到第几次循环,每个几次循环打印一条log。log内容可以包括循环次数、循环中变量的值。调试大循环中的内存溢出不用怕!
  3. 每次启动日志系统,都会提前打印当前时间,方便与上一次调试区分!
  4. 0.1版本中的一些逻辑错误已得到修正
  5. 部分代码重构

 

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

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