现在的位置: 首页 > 综合 > 正文

snort里的debug(debug.h,debug.c)

2012年07月04日 ⁄ 综合 ⁄ 共 3970字 ⁄ 字号 评论关闭

#define DEBUG_VARIABLE "SNORT_DEBUG"
在系统的环境变量里存在名为SNORT_DEBUG的变量。
紧接着是各个模块的debug_lever的宏定义

 1#define DEBUG_ALL             0xffffffff
 2#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);的说明。

 1int 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_level
 8    }

 9    //没有被初始化,就从环境变量里取出debug_level
10    if (getenv(DEBUG_VARIABLE))
11        debug_level = atoi(getenv(DEBUG_VARIABLE));
12    else
13    debug_level = 0;//如果没有设置环境变量,则debug_lever=0
14    //设置完调试等级过后debug_init=1
15    debug_init = 1;
16    return debug_level;
17}

int DebugThis(int level);的说明

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) 上.

抱歉!评论已关闭.