升级Ubuntu 18.04到20.04后snmpd出现Segmentation fault (core dumped)问题的排查求助
升级Ubuntu 18.04到20.04后snmpd出现Segmentation fault (core dumped)问题的排查求助
看起来你已经做了不少扎实的排查工作了——从跟踪版本变化到用gdb获取栈追踪,这个升级后出现的snmpd段错误确实挺闹心的。结合你给出的所有信息,咱们可以从这几个方向继续深入排查:
先解决core文件生成的问题:你已经设置了
ulimit -c unlimited但没看到core文件,大概率是系统用了coredumpctl来管理core文件而不是直接生成在本地目录。可以试试:- 用
coredumpctl list snmpd查看有没有snmpd的崩溃记录; - 用
coredumpctl dump snmpd > snmpd.core导出core文件,方便后续调试; - 也可以修改snmpd的systemd服务配置,在
/lib/systemd/system/snmpd.service里添加LimitCORE=infinity,然后执行systemctl daemon-reload && systemctl restart snmpd,确保启动用户的core限制生效。
- 用
排查ifTable相关的持久化数据冲突:报错里的
ifTable container是SNMP用来存储系统网络接口信息的容器,崩溃发生在释放接口条目内存时,很大概率是升级前后snmp版本的持久化数据不兼容导致的:- 备份
/var/lib/snmp/目录下的所有文件(比如persistent.dat、snmpd.conf等),然后删除这些文件,重启snmpd让它重新生成状态数据; - 可以临时注释掉
/etc/snmp/snmpd.conf里和ifTable相关的配置(比如view systemview included .1.3.6.1.2.1.2,ifTable的OID就是.1.3.6.1.2.1.2),启动snmpd看看还会不会崩溃,以此确认是不是ifTable的遍历触发了问题。
- 备份
用调试工具深挖内存问题:你已经拿到了gdb栈追踪,接下来可以进一步细化调试:
- 安装snmp相关的调试包:
sudo apt install snmpd-dbg libnetsnmpmibs-dbg libnetsnmp-dbg libnetsnmpagent-dbg,这样gdb能显示更详细的函数和变量信息; - 用valgrind检测内存错误:
sudo valgrind --leak-check=full /usr/sbin/snmpd -u Debian-snmp -g Debian-snmp -f -p /run/snmpd.pid,它能帮你找出重复释放、野指针这类导致段错误的根源。
- 安装snmp相关的调试包:
对比全新安装与升级系统的差异:虽然你说snmpd.conf一致,但升级系统可能遗留了其他差异:
- 对比
/lib/systemd/system/snmpd.service文件,看看升级后的启动参数、环境变量和全新安装的20.04机器有没有不同; - 用
ldd /usr/sbin/snmpd查看依赖库版本,和全新安装机器对比,确认所有依赖库都正确升级到了20.04的版本。
- 对比
备注:内容来源于stack exchange,提问作者Hans van Leeuween
相关产品推荐
相关产品推荐

