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

本文分析了一个隐蔽的coredump问题,该问题由多个因素引起,包括服务启动失败后的进程残留及非法内存引用。文章详细探讨了在agent++中requestList指针指向无效内存导致的异常,并提出了解决方案。

问题出在加载偶的动态库的进程,在偶服务初始化失败后,其进程并没有完全退出,这样在下一次的服务启动中,由于仍使用原进程,当初始化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++的使用还得注意啊。

回答: 当使用php-fpm生成core dump时,可以使用gdb进行调试。需要注意的是,由于生成core dump的是php-fpm,所以需要使用php-fpm进行调试。如果是在cli模式下使用php生成的core dump,则需要使用php程序进行调试。在调试过程中,可以查看调用栈信息来定位问题。例如,在调试过程中,可以使用gdb命令查看主函数的调用栈信息,如#17 0x00000000006ed0ba in main (argc=2, argv=0x7fff4efcb2a8) at /root/php-5.3.27/sapi/fpm/fpm/fpm_main.c:1929。同时,还可以使用gdb命令查看php执行脚本的调用栈信息,如#16 0x000000000058056c in php_execute_script (primary_file=0x7fff4efcb080) at /root/php-5.3.27/main/main.c:2316。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [使用GDB调试PHP core dump](https://blog.youkuaiyun.com/weixin_29748637/article/details/115987071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [在php-fpm下,服务器间歇出现core dump 追踪到php代码是include一个php文件](https://blog.youkuaiyun.com/weixin_40004960/article/details/115941227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值