• winCE DEBUGZONE


    对于实时系统,如何调试是一个很难解决的问题,包括对系统内核的调试,对驱动程序的调试,对应用程序的调试等。对于应用程序,通常各集成开发环境都提供了 常规的单步跟踪等调试手段。而对于另两个的调试,Platform Builder除了为我们提供了常规的断点跟踪等手段以外,还和系统的源程序配合使用了一种新的调试手段——Debug Zones调试区。
    通常,我们都是利用OutpubDebugString函数来实现调试信息的输出的,但是由于系统底层的调试信息非常繁多,如果这样大量的调试信息用于实 时输出的话一定会影响到系统的性能和实时性,也就影响到了系统的运行。如果有一种方式能允许开发人员自己选择输出哪些调试信息,不输出哪些调试信息的话, 那么就可以让开发人员只看到关心的调试信息,而把诸如键盘按键、鼠标移动等无用的调试信息隐去,则可以更好的提高开发效率,迅速找到问题所在。
    调试区就是为了解决以上提出的问题的,对某一个驱动程序,它规定好自己向外输出的调试信息的分类,比如初始化时的信息,出错时的信息,释放时的信息,激活 时的信息等,然后分成几个调试区,在现有的CE版本中最多允许16个调试区。开发人员通过Platform Builder中Target菜单下的CE Debug Zones命令来决定想要得到哪一个或哪几个调试区的信息,在驱动程序中则可以根据开发人员的选择来输出指定调试区的信息。这就是调试区大体上的工作原 理。
    接下来,我们就来看一下调试区的定义,声明,注册及使用。
    在程序中使用调试区之前必须先定义它们,一个程序的16个调试区编号分别为0-15。代码样例如下所示:
    #ifdef DEBUG
    //
    // For debug builds, use the real zones.
    //
    #define ZONE_TEST DEBUGZONE(0)
    #define ZONE_PARAMS DEBUGZONE(1)
    #define ZONE_VERBOSE DEBUGZONE(2)
    ……
    #define ZONE_WARN DEBUGZONE(14)
    #define ZONE_ERROR DEBUGZONE(15)

    #else
    //
    // For retail builds, use forced messages based on the zones turned on below.
    //
    #define ZONE_TEST 0
    #define ZONE_PARAMS 0
    #define ZONE_VERBOSE 0
    ……
    #define ZONE_WARN 0
    #define ZONE_ERROR 0

    #endif

    这样,就可以程序的DEBUG版本中使用调试区了,而在RELEASE版本中则将其全部定义为0,调试信息即不再输出。
    在程序中,除了以上的定义以外,还要声明几个专用的调试信息输出函数,这些函数与OutputDebugString函数的区别就在于在调用时需要指定对 应的调试区,这些函数以及以上用到的DEBUGZONE宏的定义都在DbgApi.h头文件中,因此只要在源程序中包含此头文件即可。除此以外,还需要一 个全局的DEBPARAM类型的变量命名为dpCurSettings,以供集成开发环境和调试信息输出函数使用。其代码样例如下:
    #ifdef DEBUG
    DBGPARAM dpCurSettings = {
    TEXT("WaveDriver"), {
    TEXT("Test") // 0
    ,TEXT("Params") // 1
    ,TEXT("Verbose") // 2
    ,TEXT("Interrupt") // 3
    ,TEXT("WODM") // 4
    ,TEXT("WIDM") // 5
    ,TEXT("PDD") // 6
    ,TEXT("MDD") // 7
    ,TEXT("Regs") // 8
    ,TEXT("Misc") // 9
    ,TEXT("Init") // 10
    ,TEXT("IOcontrol") // 11
    ,TEXT("Alloc") // 12
    ,TEXT("Function") // 13
    ,TEXT("Warning") // 14
    ,TEXT("Error") // 15
    }
    ,
    (1 << 15) // Errors
    | (1 << 14) // Warnings
    };
    #endif
    此例中还把ERROR和WARN调试区作为默认被开发人员选中的调试区。
    要想使用调试区,还需要做的最后一件准备的事情就是在程序中进行注册,也就是在程序启动时通知集成开发环境本程序中要使用调试区,这个注册很简单,只要在程序的入口处使用DEBUGREGISTER宏即可,样例如下:
    DllEntry (
    HANDLE hinstDLL,
    DWORD Op,
    LPVOID lpvReserved
    )
    {
    switch (Op) {case DLL_PROCESS_ATTACH :
    DEBUGREGISTER((HINSTANCE)hinstDLL);
    break;
    ……
    至于调试区的使用,完全是几个宏的使用而已,我想做程序的人都会用的,常用的宏如下:
    DEBUGMSG(),DEBUGLED(),RETAILMSG(),RETAILLED(),ERRORMSG(),DEBUGCHK()

    好了,调试区就概要的说了这么多,如此复杂的机制在自己的程序中写起来是烦琐了点,不过如果你需要的话,可以从CE现有的例程序中复制过来,这样就省了很 多麻烦事,也不会出错。下图是在PB中使用调试区的截图,当选中某一个调试区后,如果该调试区有调试信息则会在DEBUG窗口输出的。自己试试吧!

    转载自teren.itpub.net/category/15914/27044
    
  • 相关阅读:
    20201015-3 每周例行报告
    20201008-1 每周例行报告
    20200924-1 每周例行报告
    20200924-3 单元测试,结对
    刷题-Leetcode-120. 三角形最小路径和
    刷题-Leetcode-1025. 除数博弈
    刷题-Leetcode-217. 存在重复元素
    刷题-Leetcode-24.两两交换链表中的节点
    刷题-AcWing-104. 货仓选址
    ARP报文抓包解析实验报告
  • 原文地址:https://www.cnblogs.com/flypiggy/p/3113628.html
Copyright © 2020-2023  润新知