Я работаю со стабильной версией DPDK 18.11.8 в Linux, используя сборку gcc x64.
Во время выполнения я получаю ошибку сегментации. Запуск gdb на дампе ядра дает такую обратную трассировку:
#0 0x0000000000f65680 in rte_eth_devices ()
#1 0x000000000048a03a in rte_eth_rx_burst (nb_pkts=7,
rx_pkts=0x7fab40620480, queue_id=0, port_id=<optimized out>)
at
/opt/dpdk/dpdk-18.08/x86_64-native-linuxapp-gcc/include/rte_ethdev.h:3825
#2 Socket_poll (ucRxPortId=<optimized out>, ucRxQueId=ucRxQueId at entry=0
'\000', uiMaxNumOfRxFrm=uiMaxNumOfRxFrm at entry=7,
pISocketListener=pISocketListener at entry=0xf635d0 <FH_gtFrontHaulObj+16>)
at /data/<snip>/SocketClass.c:2188
#3 0x000000000048b941 in FH_perform (args_ptr=<optimized out>) at
/data/<snip>/FrontHaul.c:281
#4 0x00000000005788e4 in eal_thread_loop ()
#5 0x00007fab419fae65 in start_thread () from /lib64/libpthread.so.0
#6 0x00007fab4172388d in clone () from /lib64/libc.so.6
Похоже, что rte_eth_rx_burst () вызывает rte_eth_devices (), и эта функция дает сбой, предположительно из-за незаконного доступа к памяти. Возможно проблема с огромными страницами?
Я хочу включить больше отладочной информации в DPDK. Я создаю DPDK, используя:
usertools/dpdk-setup.sh
Правильно ли я считаю, что команды сборки в этом скрипте используют make, и я должен изменить соответствующие:
config/defconfig_*
файл (defconfig_x86_64-native-linuxapp-gcc в моем случае)?
Если да, будут ли эти значения подходящими?
CONFIG_RTE_LIBRTE_ETHDEV_DEBUG=y
RTE_LOG_LEVEL=RTE_LOG_DEBUG
RTE_LIBRTE_ETHDEV_DEBUG=y
(не уверен, должны ли все значения иметь префикс 'CONFIG_'?)
Я пробовал собрать DPDK, используя:
$ export EXTRA_CFLAGS='-O0 -g'
$ make install T=x86_64-native-linuxapp-gcc
но это не дало дополнительной информации в трассировке.