Как отлаживать библиотеки DPDK для диагностики ошибки сегментации?

Я работаю со стабильной версией 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

но это не дало дополнительной информации в трассировке.


person DavidA    schedule 11.06.2020    source источник


Ответы (1)


РЕДАКТИРОВАТЬ: обнаружена ошибка, обновление Fixed and running without crashing now

используя чат-комнату dpdk-debug, мы смогли перестроить библиотеки и приложение с правильными CFLAGS. Использование gdb выявило вероятную причину в том, что rte_eth_rx_burst не передается с массивом указателей для mbuf.

Основываясь на деталях GDB для фрейма 1, похоже, что приложение создано не с EXTRA_CFLAGS (при условии, что вы используете пример файла Makefile DPDK). Правильный способ создания приложения DPDK для отладки - выполнить следующие действия:

  1. cd [целевая папка dpdk]
  2. очистить
  3. сделать EXTRA_CFLAGS = '- O0 -ggdb'
  4. cd [папка приложения]
  5. сделать EXTRA_CFLAGS = '- O0 -ggdb'

затем используйте GDB в режиме TUI или без TUI для анализа ошибки.

Заметка:

  1. одна из наиболее частых ошибок, которые я совершаю в rx_burst, - это передача * mbuf_array вместо ** mbuf_array в качестве аргумента.
  2. если для приложения используется пользовательский Makefile, передайте EXTRA_CFLAGS как CFLAGS+="-O0 -ggdb"
person Vipin Varghese    schedule 11.06.2020
comment
Большое спасибо за эту информацию. К сожалению, добавленные флаги отладки не добавили к информации обратной трассировки. И я считаю, что правильно указываю ** mbuf_array. - person DavidA; 12.06.2020
comment
Я удивлен, не хотите ли настроить чат или отладить то же самое? - person Vipin Varghese; 12.06.2020
comment
Да, пожалуйста, как мне начать чат? - person DavidA; 12.06.2020
comment
хорошо, мы можем начать чат для отладки, чтобы определить, почему флаги отладки через flags не отражаются - person Vipin Varghese; 12.06.2020
comment
Не знаете, как начать чат, поэтому добавьте здесь комментарий, чтобы запустить автоматический процесс. - person DavidA; 12.06.2020
comment
Можете ли вы добавить себя в чат dpdk-debug. Я тебя добавил - person Vipin Varghese; 12.06.2020
comment
Привет @DavidA на основе отладки, похоже, что ошибка возникла из-за передачи неправильного аргумента. Ответ поделился также выделить то же самое. Если проблема решена, проголосуйте за и примите ответ. - person Vipin Varghese; 04.07.2020