终于解决了昨天AGENT++中的coredump问题

问题出在加载偶的动态库的进程,在偶服务初始化失败后,其进程并没有完全退出,这样在下一次的服务启动中,由于仍使用原进程,当初始化MIB时,就有下面的问题:

void Mib::construct(const OctetStr& path)
{
... ...
#ifndef STATIC_REQUEST_LIST
requestList = 0;
#endif
#ifdef _SNMPv3
bootCounterFile = DEFAULT_ENGINE_BOOTS_FILE;
#ifdef _PROXY_FORWARDER
if ((requestList) && (requestList->get_v3mp()))
requestList->get_v3mp()->get_local_engine_id(myEngineID);
#endif
#endif
... ...
}

大家注意这句:if ((requestList) && (requestList->get_v3mp()))。实际的coredump就发生在这。

可以看到在agent++.h中,硬性定义了宏

#define _PROXY_FORWARDER

所以这句会执行。同时,由于我的工程在编译时加入了STATIC_REQUEST_LIST宏,所以requestList = 0;不会被执行,这样requestList如果指向非法内存就会coredump。而且,由于这个宏的存在,请看mib.h文件中requestList的定义:

#ifndef STATIC_REQUEST_LIST
RequestList*requestList;
#else
static RequestList*requestList;
#endif

显然requestList是个静态全局变量。

这样在启动过程中,恰好刚初始化MIB完成时,依赖的FM服务被KILL掉,找不到该服务,服务启动失败,做完清理工作后,这时静态指针requestList已经不为空。但进程并没有完全结束,导致该变量仍然有值存在,但实际却已指向无效内存。所以在下次启动后,加载偶服务动态库,就会在agent++中coredump。

较隐蔽的问题,多个原因导致了coredump,解决办法是服务启动失败后如果进程不结束,必须将Mib中的requestList指针置为空。看来对agent++的使用还得注意啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值