如何调试DPDK库来诊断分段错误?

How to debug DPDK libraries to diagnose segmentation fault?

我正在 Linux 上使用稳定版 DPDK 18.11.8,使用 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
'[=10=]0', 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

但这在回溯中没有提供额外信息。

编辑:发现错误更新为 Fixed and running without crashing now

使用聊天室 dpdk-debug,我们能够使用适当的 CFLAGS 重建库和应用程序。使用 gdb 已经确定可能的原因是 rte_eth_rx_burst 没有通过 mbuf 的指针数组传递。

根据框架 1 的 GDB 详细信息,应用程序似乎不是使用 EXTRA_CFLAGS 构建的(假设您使用的是 DPDK 示例 Makefile)。构建用于调试的 DPDK 应用程序的正确方法是按照

中的步骤操作
  1. cd [dpdk目标文件夹]
  2. 清洁
  3. 制作EXTRA_CFLAGS='-O0 -ggdb'
  4. cd [应用文件夹]
  5. 制作EXTRA_CFLAGS='-O0 -ggdb'

然后在TUI或非TUI模式下使用GDB分析错误。

注意:

  1. 我在 rx_burst 中犯的最常见错误之一是传递 *mbuf_array 而不是 **mbuf_array 作为参数。
  2. 如果自定义 Makefile 用于应用程序,请将 EXTRA_CFLAGS 作为 CFLAGS+="-O0 -ggdb"
  3. 传递