snmp 使用DEBUGMSGTL,进行debug调试信息

本文介绍如何通过修改Net-SNMP配置文件启用调试功能,并详细解释了如何使用-D参数指定调试标记来过滤输出信息。此外还提供了启动snmpd服务时避免fork的方法以便于观察调试信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、修改:/net-snmp-5.6.1.1/include/net-snmp/Net-snmp-config.h文件中


Net-snmp-config.h文件中,必须注释掉NETSNMP_NO_DEBUGGING的宏定义,并把NETSNMP_ALWAYS_DEBUG改为0,才能是-Dtoken生效。
/* debugging stuff */
/* if defined, we optimize the code to exclude all debugging calls. */
//#define NETSNMP_NO_DEBUGGING 1
/* ignore the -D flag and always print debugging information */
#define NETSNMP_ALWAYS_DEBUG 0


举例,DEBUGMSGTL(("trap", "sending trap %ld\n",count));
上面这句的调试token就是第一个“trap”,则./snmp -f -Dtrap就可以只输出token为trap的所有调试信息了。

snmpd启动时默认会fork一个进程执行,因此,shell中是看不到任何输出的,可以加 -f,表示do not fork from the shell,这样,才会看到snmpd的输出信息。snmpd -h 可以查看所有的选项,-f是这些当中比较实用的。



二、注意事项:
//编包时,使能debugging  ./configure  --enable-debugging



三、使用启动方法:
DEBUGMSGTL(("xxx", "sending trap %ld\n",count));

snmpd -c /etc/snmp/snmp.conf -d -f  -L  -Dxxx
 
-d 打印数据包
-L 打印指定xxx


### Net-SNMP 服务端代码实现示例 Net-SNMP 的服务器部分主要由 `snmpd` 守护进程处理。为了扩展或自定义 `snmpd` 功能,通常会编写 MIB 文件并将其转换为 C 代码,之后这些代码会被编译到 `snmpd` 中。 #### 创建和注册一个新的 MIB 对象 下面是一个简单的例子,展示如何创建一个标量对象并将其实现添加到 `snmpd`: 1. **MIB 文件** 假设有一个名为 `MY-MIB.mib` 的简单 MIB 文件,其中定义了一个整数类型的标量对象 `myScalarObject`: ```text MY-MIB DEFINITIONS ::= BEGIN IMPORTS OBJECT-TYPE FROM SNMPv2-SMI; myObjects OBJECT IDENTIFIER ::= { 1 3 6 1 4 1 } myScalarObject OBJECT-TYPE SYNTAX INTEGER MAX-ACCESS read-write STATUS current DESCRIPTION "A simple scalar object." ::= { myObjects 1 } END ``` 2. **生成C代码模板** 使用命令将上述 MIB 转换成 C 代码框架[^3]: ```bash mib2c -c mib2c.scalar.conf MY-MIB::myScalarObject ``` 这会在当前目录下生成一系列用于访问该 MIB 对象的函数原型和其他辅助结构体声明。 3. **实现读写操作** 编辑生成的 `.c` 和 `.h` 文件来提供具体的逻辑以响应 GET/SET 请求。例如,在 `myScalarObject.c` 中可以这样设置初始值以及处理请求的方法: ```c #include <net-snmp/net-snmp-config.h> #include <net-snmp/library/snmp_api.h> #include <net-snmp/mib_module_config.h> static int my_scalar_value = 0; /* 初始值 */ void init_myScalarObject(void) { DEBUGMSGTL(("init", "Initializing myScalarObject\n")); } int handle_myScalarObject(int action, u_char *var_val, size_t var_val_len, WriteMethod method) { switch(action){ case RESERVE1: break; case ACTION: if(method == MODE_SET_RESERVE1 || method == MODE_SET_ACTION) *(long *)var_val = my_scalar_value; else if(method == MODE_GET) memcpy(var_val, &my_scalar_value, sizeof(my_scalar_value)); break; case COMMIT: if(method == MODE_SET_COMMIT) my_scalar_value = *(long *)var_val; break; default: break; } return SNMP_ERR_NOERROR; } ``` 4. **注册新模块** 最后一步是在初始化时向 `snmpd` 注册这个新的子代理程序。可以在 `init_myModule.c` 或类似的文件里完成此工作: ```c #include <net-snmp/net-snmp-includes.h> extern void init_myScalarObject(void); extern oid myScalarObject_oid[] = {1,3,6,1,4,1}; void init_myModule(void) { static oid my_objects_oid[] = {1,3,6,1,4,1}; init_myScalarObject(); REGISTER_MIB("my-module", my_objects_oid, module_identifier); netsnmp_register_scalar_instance( netsnmp_create_handler_registration("myScalarObject", handle_myScalarObject, myScalarObject_oid, OID_LENGTH(myScalarObject_oid), HANDLER_CAN_RWRITE)); snmp_log(LOG_NOTICE,"My Module initialized.\n"); } ``` 5. **重新编译安装 net-snmp** 为了让修改生效,需要按照官方文档中的指导重新构建整个项目,并确保所有必要的配置选项都已启用[^4]。 通过以上步骤就可以成功地将自己的 MIB 实现在 Net-SNMP 服务端中运行起来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值