#define DEBUG_VARIABLE "SNORT_DEBUG"
在系统的环境变量里存在名为SNORT_DEBUG的变量。
紧接着是各个模块的debug_lever的宏定义
#define DEBUG_ALL             0xffffffff2
#define DEBUG_INIT            0x00000001  /* 1 */3
#define DEBUG_CONFIGRULES     0x00000002  /* 2 */4
#define DEBUG_PLUGIN          0x00000004  /* 4 */5
#define DEBUG_DATALINK        0x00000008  /* 8 */6
#define DEBUG_IP              0x00000010  /* 16 */7
#define DEBUG_TCPUDP          0x00000020  /* 32 */8
#define DEBUG_DECODE          0x00000040  /* 64 */9
#define DEBUG_LOG             0x00000080  /* 128 */10
#define DEBUG_MSTRING         0x00000100  /* 256 */11
#define DEBUG_PARSER          0x00000200  /* 512 */12
#define DEBUG_PLUGBASE        0x00000400  /* 1024 */13
#define DEBUG_RULES           0x00000800  /* 2048 */14
#define DEBUG_FLOW            0x00001000  /* 4096 */15
#define DEBUG_STREAM          0x00002000  /* 8192 */16
#define DEBUG_PATTERN_MATCH   0x00004000  /* 16384 */17
#define DEBUG_DETECT          0x00008000  /* 32768 */18
#define DEBUG_CONVERSATION    0x00010000  /* 65536 */19
#define DEBUG_FRAG2           0x00020000  /* 131072 */20
#define DEBUG_HTTP_DECODE     0x00040000  /* 262144 */21
#define DEBUG_PORTSCAN2       0x00080000  /* 524288 / (+ conv2 ) 589824 */22
#define DEBUG_RPC             0x00100000  /* 1048576 */23
#define DEBUG_FLOWSYS         0x00200000  /* 2097152 */24
#define DEBUG_HTTPINSPECT     0x00400000  /* 4194304 */25
#define DEBUG_STREAM_STATE    0x00800000  /* 8388608 */26
#define DEBUG_ASN1            0x01000000  /* 16777216 */int GetDebugLevel (void);的说明。
int GetDebugLevel (void)2
{3
    static int debug_init = 0;4
    static int debug_level = 0;5

6
    if(debug_init) {7
    return debug_level;//如果被初始化过,直接返回debug_level8
    }9
    //没有被初始化,就从环境变量里取出debug_level10
    if (getenv(DEBUG_VARIABLE))11
        debug_level = atoi(getenv(DEBUG_VARIABLE));12
    else13
    debug_level = 0;//如果没有设置环境变量,则debug_lever=014
    //设置完调试等级过后debug_init=115
    debug_init = 1;16
    return debug_level;17
}
int DebugThis(int level)
{//判断系统是否需要调试本模块
//方法:就是用本模块的level与系统设置的DEBUG_VARIABLE
    if (!(level & GetDebugLevel()))
    {
        return 0;
    }
    return 1;
}
    #define    DebugMessage    DebugMessageFile = __FILE__; DebugMessageLine = __LINE__; DebugMessageFunc
    void DebugMessageFunc(int , char *, ...);
以上联合使用的就是DebugMessage(int,char *,...);
void DebugMessageFunc(int level, char *fmt, 
)
{
    va_list ap;
    char buf[STD_BUF+1];
    if (!(level & GetDebugLevel()))
    {
        return;
    }
    /* filename and line number information */
    if (DebugMessageFile != NULL)
        printf("%s:%d: ", DebugMessageFile, DebugMessageLine);
    va_start(ap, fmt);
        
    if(pv.daemon_flag)
    {
        vsnprintf(buf, STD_BUF, fmt, ap);
        syslog(LOG_DAEMON | LOG_DEBUG, "%s", buf);
    }
    else
    {
        vprintf(fmt, ap);
    }
    va_end(ap);
}这里引出了以前我对几个问题的不理解,查资料后总结如下:
关于va可变参数的几个宏,使用va必须include <stdarg.h>
va_list 是指向参数的指针
void va_start( va_list arg_ptr, prev_param ); 
type va_arg( va_list arg_ptr, type ); 返回可变的参数,type指定返回的类型
void va_end( va_list arg_ptr );
另外是一些输入输出的东东。。。。所有的输入是用scanf替换printf
#include <stdio.h> 
int printf(const char *format, ...); 
int fprintf(FILE *stream, const char *format, ...); 
int sprintf(char *str, const char *format, ...); 
int snprintf(char *str, size_t size, const char *format, ...); 
#include <stdarg.h>
int vprintf(const char *format, va_list ap); 
int vfprintf(FILE *stream, const char *format, va_list ap); 
int vsprintf(char *str, const char *format, va_list ap); 
int vsnprintf(char *str, size_t size, const char *format, va_list ap);   
描述 (DESCRIPTION)
printf 系列 函数 根据 下述的 format 参数 生成 输出内容. printf 和 vprintf 函数 把 输出内容 写到 stdout, 即 标准输出流; fprintf 和 vfprintf 函数 把 输出内容 写到 给定的 stream 流; sprintf, snprintf, vsprintf 和 vsnprintf 函数 把 输出内容 存放到 字符串 str 中. 
这些 函数 由 格式字符串 format 参数 控制 输出内容, 它 指出 怎么样 把 后面的 参数 (或 通过 stdarg(3) 的 变长参数机制 访问的 参数) 转换成 输出内容. 这些 函数 返回 打印的 字符 数量 (不包括 字符串 结尾用的 `\0'). snprintf 和 vsnprintf 的 输出 不会 超过 size 字节 (包括了 结尾的 `\0'), 如果 因为 这个 限制 导致 输出内容 被截断, 则 函数 返回 -1. 
格式字符串 (format 参数) 由 零到多个 指令 组成: 普通字符 (除 % 外), 它们 被 原封不动的 送到 输出流; 以及 格式转换说明 (conversion specification), 每个 格式转换说明 都会 从后面 提取 零到多个 参数. 格式转换说明 由 % 字符 引导开始. 参数 必须 正确的 对应到 格式转换符 (conversion specifier) 上.
                    
                

    
                
            
        
浙公网安备 33010602011771号