链接了dpdk的进程启动core在 Illegal instruction

本文分析了一起因CPU指令集不匹配导致的DPDK程序非法指令异常(core dump)问题。核心原因是编译DPDK库的CPU支持bmi2指令集,而运行DPDK的应用程序所在CPU却不支持。文中提供了通过调整编译环境来解决问题的方法。
摘要由CSDN通过智能技术生成

失败后的core栈像下面这样:

Program terminated with signal SIGILL, Illegal instruction.
#0  0x00000000036a3fdd in rte_cpu_get_flag_enabled ()
[Current thread is 1 (Thread 0x7fc26fda21a0 (LWP 10988))]
(gdb) bt
#0  0x00000000036a3fdd in rte_cpu_get_flag_enabled ()
#1  0x0000000003694f4e in rte_hash_crc_init_alg ()
#2  0x000000000388074f in __libc_csu_init ()
#3  0x00007fc26df6092e in __libc_start_main () from /lib64/libc.so.6
#4  0x0000000000bec929 in _start ()

core的原因很显然:"Illegal instruction",指令非法,查看core处的汇编代码:

shrx指令属于bmi2指令集,查看运行该binary的机器上有无bmi2指令集:

cat /proc/cpuinfo | grep flags

发现该CPU上没有bmi2指令集,所以core掉了。

 

所以根源是:编译dpdk library的机器的CPU版本更高,支持了bmi2指令,但是运行dpdk的机器的CPU版本更低,不支持bmi2指令。

网上有博文说在编译dpdk的时候将CONFIG_RTE_MACHINE设置成default能解,我们尝试了无果,最后找了一个CPU版本较低的机器编译了整套dpdk library,core未出现。不过这个解法只是权宜之计,长期来看,还是要做好不同CPU和机型的适配工作。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值