zoukankan      html  css  js  c++  java
  • chklib0.2 release notes——windows平台的c++日志系统

    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

  • 相关阅读:
    用C#来开发CAD插件,含源代码
    C#自定义工业控件开发
    判断点是否在多边形内部
    在C#中使用属性控件添加属性窗口
    Java TreeMap 介绍和使用
    Java中异常处理之try和catch代码块的使用
    Class.forName()的作用与使用总结
    web.xml文件详解
    Java中普通代码块,构造代码块,静态代码块区别及代码示例
    详解JSP九个内置对象
  • 原文地址:https://www.cnblogs.com/raymon/p/2699152.html
Copyright © 2011-2022 走看看